emacs使用本地emacs server模式打開遠程文件


使用emacs的用戶都知道,一般要打開遠程機器上的文件要使用TrampMode模式,調用方式例如以下:

C-x C-f /remotehost:filename  RET (or /method:user@remotehost:filename)

但,這樣打開有點麻煩,你必要輸入username和機器ip等 

emacs提供了一種client/server的模式,當我們在本地打開一個emacs,能夠將它作為server執行

然后,在本地機器的其它都方要用emacs的時候,如在terminal中要調用emacs,僅僅須要使用emacsclient就能夠了.

我希望的情形是這種:

1. 把本地機器的emacs當成一個server

2. 用ssh登錄一台遠程機器

3. 在遠程機器上使用emacsclient 調用本地的emacs server

4. 然后,我們就能夠在本地機器上編輯遠程機器上的文件了

在網上找了一個人給出的解決方法,鏈接 (牆外),現把步驟整理例如以下:

注:這里我遠程機器HOST名為:yoks 登錄的username為:lisp

1. 設置Port Forwarding(或者稱為SSH Tunneling),編輯本都機器的 ~/.ssh/config 增加下面內容

Host yoks
User lisp
ControlMaster auto
ControlPath ~/.ssh/yoks.sock
RemoteForward 9999 localhost:9999

這里將本地的9999port與遠程的9999port進行影射(map)


2. 配制本地機器的emacs,將下面代碼增加到你的emacs配制文件(.emacs 或 init.el)中

(setq server-use-tcp t
      server-port 9999)
(require 'server)
(defun server-start-and-copy ()
  "start server and copy auth files"
  (when (and (fboundp 'server-running-p)   ; function exists.
             (not (server-running-p)))
    (server-start)                       ; emacs as server mode
    (when (file-exists-p "/lisp@yoks:~/.emacs.d/server/server")
      (delete-file "/lisp@yoks:~/.emacs.d/server/server"))
    (copy-file "~/.emacs.d/server/server" "/lisp@yoks:~/.emacs.d/server/server")
    ))
(add-hook 'emacs-startup-hook 'server-start-and-copy)

這里一方面啟動emacs server模式,將其tcpport設置為9999. 然后將server文件復制到遠程機器(lisp@yoks)上

同一時候在本地機器上重新啟動emacs


3. 在遠程機器上編輯一個下面腳本,名字為 ec, 並增加可運行權限

#!/bin/bash

params=()
for p in "$@"; do
	if [ "$p" == "-n" ]; then
		params+=( "$p" )
	elif [ "${p:0:1}" == "+" ]; then
		params+=( "$p" )
	else
		params+=( "/ssh:yoks:"$(readlink -f $p) )
	fi
done

emacsclient "${params[@]}"

4. 用ssh登錄遠程機器,然后用ec打開一個文件,我們發現,文件內容出如今了本地機器的emacs中了,例如以下:


本地的emacs截圖例如以下,這樣就方便在本地機器上編輯這個文件了


能夠看到它的地址為: /ssh:yoks:/home/lisp 這個地址和我們用TRAMP模式打開的一模一樣.


注意:我的機器環境為Linux


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM