題 在屏幕內運行emacs


  1. 我有一個screenrc文件,但是當我在屏幕內運行emacs時,我發現了一些衝突。例如,在emacs中移動緩衝區,按Ctrl-向右箭頭/向左箭頭,而不是前後移動將一些字符發送到緩衝區,如5C,5D等。即使我在沒有任何screenrc文件的情況下調用屏幕,這個問題也存在。但至少其他衝突並不存在。但如果有人能告訴我如何解決這個問題,我將非常感激?

  2. 由於我在我的screenrc文件中有自己的綁定,我想繼續使用它,所以我想我會保留我的screenrc文件但是當我想在新的屏幕上啟動emacs時,我不會使用我的screenrc。有沒有辦法在調用屏幕時不使用screenrc?到目前為止,我一直在通過在啟動emacs時將我的screenrc文件重命名為其他內容來進行管理。

  3. 有沒有什麼方法可以將emacs本身作為屏幕工作,就像在我使用屏幕一樣,這樣我的emacs會話就不會在遠程ssh會話失敗時終止。我找到了一些關於emacs客戶端和emacs服務器的文檔但是無法理解。如果有人可以告訴如何在emacs中保存會話並恢復它們以便我不需要使用emacs屏幕,如果可能的話,我會很感激,因為在一個應該能夠再次恢復emacs過程。


4
2017-07-10 13:18


起源


我建議您下次發布三個單獨的問題,以便讓人們可以獲得回答(僅)其中一個問題,並且更容易搜索每個問題嗎?


答案:


我只對你的問題#3有所了解。

從emacs 23開始,emacs有一個守護進程模式,對我而言,它避免了在屏幕內運行emacs的需要。在我第一次登錄後,我開始了 emacs --daemon 在一個終端。這將在後台啟動emacs。然後,每當我需要使用emacs時,我都會運行 emacsclient -nc 獲取X窗口到我的emacs會話,或 emacsclient -t 得到一個終端會議。

多個客戶可以愉快地共存。我經常在我的工作站屏幕上運行X客戶端,通過ssh從家裡登錄X客戶端,在手機上運行終端客戶端。所有人都在談論同一個emacs進程,所有緩衝區和其他狀態都完好無損。如果我的手機上的ssh連接死了,我可以繼續再次登錄後繼續我離開的地方。

我對屏幕中的鍵綁定知之甚少,無法幫助您解決前兩個問題。


9
2017-07-10 13:50



非常感謝emacs客戶端的事情。現在我不再需要屏幕了emacs。至少它不會與emacs鍵綁定衝突:-) - pineapple
這如何解決持久會話的問題?如果您最初調用的shell emacs --daemon 恰好退出(例如,ssh連接的隨機斷開管道),然後在重新連接時,原始emacs會話將不可用。以前打開的緩衝區不會出現在客戶端會話等中。這實際上不是在屏幕內運行emacs的整個用例嗎?我想念它是如何解決它的。好像你必須跑步 emacs --daemon  內 一個屏幕會話,以確保它是持久的,這違背了目的。 - ely
@ely如果客戶端shell因任何原因退出後您的emacs不可用,那麼您的emacs就會出錯。我剛剛測試過,這對我有用:登錄; emacs --daemon; emacsclient -t;做東西;登出;重新登錄; emacsclient -t;看到以前的東西;登錄備用終端;使用emacsclient殺死-9 shell;再次登錄; emacsclient -t;我的東西還在那裡。 - Peder Klingenberg
我覺得你很誤。如果shell運行怎麼辦? emacs --daemon 下跌降落。如果那個shell保持不動,那麼我可以登錄和退出其他的shell,每個shell都只是困擾著 emacsclient,它就像你說的那樣工作。但是如果連接到原始shell死掉了,那麼shell就在其中 emacs --daemon 執行,然後守護進程和所有客戶端都使用它。你如何在不同的日誌中堅持運行守護進程?背景還不夠。你必須運行它 nohup或某事,這是做你應該使用屏幕或tmux的壞方法。 - ely
@ely如果它需要來自nohup,screen或tmux的幫助,它不會是一個守護進程。不需要那就是重點 --daemon。 emacs --daemon 正確地從終端和reparents分離到pid 1.它不依賴於它的原始shell。在我之前的評論中,我試圖顯示一個序列,其中我確實退出了我從中啟動守護進程的emacs的shell,但也許這一點並不清楚。為了我, emacs --daemon 完全按照你聲稱的方式工作。調用一個守護進程而不讓它在調用shell中存活將是愚蠢的。所以開發者沒有這樣做。 - Peder Klingenberg


1)這與Emacs交換終端發送的轉義序列的方式有關。這很有趣!你應該配置你的 輸入 - 譯碼 - 地圖例如,通過在.emacs文件中定義以下函數:

(defun terminal-init-screen ()
  "Terminal initialization function for GNU screen."
  (when (boundp 'input-decode-map)
    (define-key input-decode-map "^[[1;5C" [(control right)])
    (define-key input-decode-map "^[[1;5D" [(control left)])))

(注意 ^[ 在上面的例子中是  一個插入符號,後面是一個開口括號,它是一個單一的 逃逸 你輸入的字符如下: C-q ESC。)

這個功能被Emacs在屏幕內運行神奇地調用。

2)你可以調用它的屏幕 -c 選項,指定與默認文件不同的文件 .screenrc。因此,如果您在屏幕中運行Emacs時只需要應用屏幕的特殊配置,則可以將它們放在文件中 .emacs-screenrc,並在屏幕內運行emacs,如下所示:

screen -c .emacs-screenrc emacs

請注意,此文件可能為空。

3)管理emacs中的會話有時會很乏味。現貨供應,Emacs提供 桌面保存模式 我個人不使用它,但我讀過它的混合報導。你可能想嘗試一下。可以在上面找到關於替代方法的一個很好的概述 Emacs維基

首先,會話管理的一種替代方法是將Emacs作為服務器運行並與之連接 emacsclient。我不知道你看到了哪些文檔,但GNU的官方Emacs文檔通常非常好。看看它:

http://www.gnu.org/software/libtool/manual/emacs/Emacs-Server.html#Emacs-Server


8
2017-07-10 16:21





對於#1

嘗試從屏幕內部調用emacs:

TERM=xterm emacs -nw somefile

CTRL +箭頭現在應該像預期的那樣工作


3
2018-05-20 08:35





另一種方法是使用tramp:使用tramp,您可以使用計算機上運行的Emacs編輯服務器上的文件。剛開 /ssh:user@host:/path/to/remote/file

例如,這也可以用於其他“遠程”使用

  • /sudo::/etc/bla 使用sudo進行編輯
  • /ftp:user@host:/path/to/remote/file 使用ftp編輯遠程文件...

tramp將在需要時重新打開ssh連接,你甚至可以使用tramp在遠程主機上運行程序(例如VCS)。


0
2017-10-31 08:32