我的远程主机上的路径中有一个小脚本~/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
且+
args不变地传递给emacsclient,否则args被视为本地Emacs打开的文件。每个文件都以TRAMP协议和主机为前缀,因此Emacs知道如何打开它。ssh:
如果愿意,您可以更改为其他TRAMP协议。
您必须替换z
为远程计算机的主机名。本地Emacs使用它通过TRAMP连接。(您也许可以hostname
在这里使用该标记符。为了简洁起见,我更喜欢z
在本地使用一些微小的条目ssh_config
,而遥控器不知道我正在这样做。尝试一下!)
用法:
ec file
在远程Shell中打开本地Emacs中的文件并等待
ec -n file
在远程Shell中打开本地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
库与问题的关系?听起来很有用