У меня есть крошечный скрипт в моем пути на удаленном хосте ~/bin/ec, сокращенное обозначение emacsclient.
#!/bin/bash
params=()
for p in "$@"; do
if [ "$p" == "-n" ]; then
params+=( "$p" )
elif [ "${p:0:1}" == "+" ]; then
params+=( "$p" )
else
params+=( "/ssh:z:"$(readlink -f $p) )
fi
done
emacsclient --server-file=$HOME/.emacs.d/server/server "${params[@]}"
Этот скрипт передает -nи +аргументы без изменений в emacsclient, в противном случае аргументы обрабатываются как файлы для открытия в вашем локальном Emacs. Каждый файл имеет префикс протокола TRAMP и хоста, поэтому Emacs знает, как его открыть. При ssh:желании вы можете перейти на другой протокол TRAMP.
Вы должны заменить zимя хоста вашей удаленной машины. Это используется локальными Emacs для подключения через TRAMP. (Вы можете использовать hostnameздесь для общности. Для краткости я предпочитаю использовать крошечные записи, например, zв моем локальном сообщении ssh_config, и пульт не имеет ни малейшего представления, что я это делаю. Попробуйте!)
Использование:
ec file в удаленной оболочке открывает файл в локальном Emacs и ждет
ec -n file в удаленной оболочке открывает файл в локальном Emacs и возвращает
export EDITOR=~/bin/ecв дистанционном .bashrcрежиме происходит волшебство
Чтобы убедиться, что мой serverфайл в порядке, у меня есть это локально .emacs, снова используя крошечное имя хоста z:
(setq server-use-tcp t
server-port 9999)
(defun server-start-and-copy ()
"Start server and copy server file to remote box."
(interactive)
(server-start)
(copy-file "~/.emacs.d/server/server" "/z:.emacs.d/server/server" t)
(chmod "/z:.emacs.d/server/server" (string-to-number "644" 8))
)
(add-hook 'emacs-startup-hook 'server-start-and-copy)
Порт 9999 является RemoteForward. Я поместил это в мой локальный, ~/.ssh/ssh_configчтобы автоматизировать пересылку, плюс вещи ControlMaster для скорости.
Host z
HostName dev.example.com
User dev
ControlMaster auto
ControlPath ~/.ssh/z.sock
RemoteForward 9999 localhost:9999
Наконец, убедитесь, что TRAMP знает о вашем, ssh_configесли вы используете его:
(require 'tramp)
(tramp-set-completion-function "ssh"
'((tramp-parse-sconfig "~/.ssh/config")))
with-editorбиблиотека относится к этому вопросу? Звучит полезно