summaryrefslogtreecommitdiff
path: root/plugins/emacs
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/emacs')
-rw-r--r--plugins/emacs/README.md30
-rw-r--r--plugins/emacs/emacs.plugin.zsh7
-rwxr-xr-xplugins/emacs/emacsclient.sh31
3 files changed, 57 insertions, 11 deletions
diff --git a/plugins/emacs/README.md b/plugins/emacs/README.md
new file mode 100644
index 000000000..c8e33b5ab
--- /dev/null
+++ b/plugins/emacs/README.md
@@ -0,0 +1,30 @@
+# Emacs plugin
+
+This plugin utilizes the Emacs daemon capability, allowing the user to quickly open frames, whether they are opened in a terminal via a ssh connection, or X frames opened on the same host. The plugin also provides some aliases for such operations.
+
+- You don't have the cost of starting Emacs all the time anymore
+- Opening a file is as fast as Emacs does not have anything else to do.
+- You can share opened buffered across opened frames.
+- Configuration changes made at runtime are applied to all frames.
+
+**NOTE:** requires Emacs 24 and newer.
+
+To use it, add emacs to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... emacs)
+```
+
+## Aliases
+
+The plugin uses a custom launcher (which we'll call here `$EMACS_LAUNCHER`) that is just a wrapper around [`emacsclient`](https://www.emacswiki.org/emacs/EmacsClient).
+
+| Alias | Command | Description |
+|--------|----------------------------------------------------|----------------------------------------------------------------|
+| emacs | `$EMACS_LAUNCHER --no-wait` | Opens a temporary emacsclient frame |
+| e | `emacs` | Same as emacs alias |
+| te | `$EMACS_LAUNCHER -nw` | Open terminal emacsclient |
+| eeval | `$EMACS_LAUNCHER --eval` | Same as `M-x eval` but from outside Emacs |
+| eframe | `emacsclient --alternate-editor "" --create-frame` | Create new X frame |
+| efile | - | Print the path to the file open in the current buffer |
+| ecd | - | Print the directory of the file open in the the current buffer |
diff --git a/plugins/emacs/emacs.plugin.zsh b/plugins/emacs/emacs.plugin.zsh
index a3f0085a8..db0ab13af 100644
--- a/plugins/emacs/emacs.plugin.zsh
+++ b/plugins/emacs/emacs.plugin.zsh
@@ -10,7 +10,7 @@
# - Configuration changes made at runtime are applied to all frames.
-if "$ZSH/tools/require_tool.sh" emacs 23 2>/dev/null ; then
+if "$ZSH/tools/require_tool.sh" emacsclient 24 2>/dev/null ; then
export EMACS_PLUGIN_LAUNCHER="$ZSH/plugins/emacs/emacsclient.sh"
# set EDITOR if not already defined.
@@ -18,15 +18,14 @@ if "$ZSH/tools/require_tool.sh" emacs 23 2>/dev/null ; then
alias emacs="$EMACS_PLUGIN_LAUNCHER --no-wait"
alias e=emacs
+ # open terminal emacsclient
+ alias te="$EMACS_PLUGIN_LAUNCHER -nw"
# same than M-x eval but from outside Emacs.
alias eeval="$EMACS_PLUGIN_LAUNCHER --eval"
# create a new X frame
alias eframe='emacsclient --alternate-editor "" --create-frame'
- # to code all night long
- alias emasc=emacs
- alias emcas=emacs
# Write to standard output the path to the file
# opened in the current buffer.
diff --git a/plugins/emacs/emacsclient.sh b/plugins/emacs/emacsclient.sh
index 625201a16..0aa8d6f40 100755
--- a/plugins/emacs/emacsclient.sh
+++ b/plugins/emacs/emacsclient.sh
@@ -1,12 +1,29 @@
#!/bin/sh
-# get list of available X windows.
-x=`emacsclient --alternate-editor '' --eval '(x-display-list)' 2>/dev/null`
+_emacsfun()
+{
+ # get list of emacs frames.
+ frameslist=`emacsclient --alternate-editor '' --eval '(frame-list)' 2>/dev/null | egrep -o '(frame)+'`
-if [ -z "$x" ] || [ "$x" = "nil" ] ;then
- # Create one if there is no X window yet.
- emacsclient --alternate-editor "" --create-frame "$@"
+ if [ "$(echo "$frameslist" | sed -n '$=')" -ge 2 ] ;then
+ # prevent creating another X frame if there is at least one present.
+ emacsclient --alternate-editor "" "$@"
+ else
+ # Create one if there is no X window yet.
+ emacsclient --alternate-editor "" --create-frame "$@"
+ fi
+}
+
+
+# adopted from https://github.com/davidshepherd7/emacs-read-stdin/blob/master/emacs-read-stdin.sh
+# If the second argument is - then write stdin to a tempfile and open the
+# tempfile. (first argument will be `--no-wait` passed in by the plugin.zsh)
+if [ "$#" -ge "2" -a "$2" = "-" ]
+then
+ tempfile="$(mktemp --tmpdir emacs-stdin-$USER.XXXXXXX 2>/dev/null \
+ || mktemp -t emacs-stdin-$USER)" # support BSD mktemp
+ cat - > "$tempfile"
+ _emacsfun --no-wait $tempfile
else
- # prevent creating another X frame if there is at least one present.
- emacsclient --alternate-editor "" "$@"
+ _emacsfun "$@"
fi