2016-08-03 127 views
1

工作,我已經設置了以下主要綁定在我的.emacs文件:emacs的鍵綁定不會在終端

(global-set-key (kbd "C-S-M-w") 'windmove-up) 
(global-set-key (kbd "C-S-M-s") 'windmove-down) 
(global-set-key (kbd "C-S-M-d") 'windmove-right) 
(global-set-key (kbd "C-S-M-a") 'windmove-left) 

(global-set-key (kbd "C-S-a") 'shrink-window-horizontally) 
(global-set-key (kbd "C-S-d") 'enlarge-window-horizontally) 
(global-set-key (kbd "C-S-s") 'shrink-window) 
(global-set-key (kbd "C-S-w") 'enlarge-window) 

他們工作得很好,當他們在自己的窗口。但是,如果我在終端(emacs-nw)中運行它,鍵盤綁定不會被加載。即使在加載.emacs文件後,我仍然沒有鍵盤綁定。

當我使用emacs守護進程並在客戶端vs終端中打開時,情況也是如此。如果有問題,我在Linux機器上。

回答

3

問題不在emacs中,問題是修改鍵(Control,Shift和Alt)的組合在大多數終端程序中表現得相當差。在這裏和其他許多地方也會出現類似的問題,包括超級用戶,例如:emacs - [control shift up] doesn't workhttps://superuser.com/q/230852。你需要測試它在特定的終端 - 但檢查如GNOME終端顯示C-S-從剛剛C-別無二致,所以大部分的綁定甚至不使它正確emacs的

如果你需要說服自己使用C-h k,然後你缺少的組合。你會看到,當你在終端中運行時,這些組合會被刪除一些修飾符。

我已經經歷過類似的經歷,得出的結論是與終端的對抗是不值得的。我建議你在終端中重新映射需要多個修飾符的鍵組合。 (例如,我最終將windmove命令重新映射到F鍵)。或者,我可以推薦使用evil leader鍵(如果使用邪惡),否則使用God mode。這大大減少了對多個修飾符的需求。

0

第一步是讓您的終端發送轉義碼,您可以稍後在emacs中指定含義。編輯您的.Xdefaults文件,根據需要添加儘可能多的文件。下面是一個例子使用的xterm(錯別字可能的,因爲我不能剪切和粘貼從我的工作PC):

*VT100*translations: #override \n\ 
    ~Ctrl ~Shift <KeyPress> BackSpace: string(0x7F)\n\ 
    Ctrl ~Shift <KeyPress> BackSpace: string("\033[27;5;8~")\n\ 
    Ctrl Shift <KeyPress> BackSpace: string("\033[27;6;8~")\n 

    Ctrl Shift ~Meta <KeyPress> A: string("\033[27;6;65~")\n\ 
    ... 
    Ctrl Shift ~Meta <KeyPress> Z: string("\033[27;6;90~")\n\ 

    Ctrl Shift Meta <KeyPress> A: string("\033[27;8;65~")\n\ 
    ... 
    Ctrl Shift Meta <KeyPress> Z: string("\033[27;8;90~")\n\ 

XTerm*vt100.modifyOtherKeys: 1 
XTerm*vt100.formatOtherKeys: 0 

的組合鍵也可以是任何東西(我已經看到了很多無證鍵序列),但最接近「標準」的可以在這裏找到:http://invisible-island.net/xterm/ctlseqs/ctlseqs.html

第二步是讓emacs的分配這些新的轉義序列組合鍵就明白:

; xterm-specific options 
(unless window-system 
    (define-key key-translation-map "\C-[[27;6;65~" (kbd "C-S-a")) 
    ... 
    (define-key key-translation-map "\C-[[27;6;90~" (kbd "C-S-z")) 

    (define-key key-translation-map "\C-[[27;8;65~" (kbd "C-M-S-a")) 
    ... 
    (define-key key-translation-map "\C-[[27;8;90~" (kbd "C-M-S-z")) 

    ; other xterm-specific options here 
) 

...,遞增~由一個前的最後一個數字,所以A = 65,B = 66,...,Z = 90。

+0

就是這樣的。但它只適用於xterm,OP可能認爲「終端」是一個不同的程序。 –

+0

@ThomasDickey正如你在答案中提到的,許多終端模擬器在某種程度上複製了xterm的行爲,儘管它們經常爲了他們自己的目的捕獲鍵組合。這可能是OP沒有意識到終端的限制,並可能想嘗試其他終端(如xterm),看看它們是否更合適。 – Teajay

+0

這就是爲什麼我回答(比發表評論更好)。 –

1

xterm可以做到這一點;其他終端不能。

如果更改使用功能鍵的目標,可以進一步得到,因爲沒有更改配置,xterm的發送不同的轉義序列的修飾的各種組合轉變控制ALTmeta應用於函數和光標鍵時。

「Terminal」的可能嫌疑人將是基於VTE的終端仿真器之一,如gnome-terminal。這複製了xterm的這部分行爲的一個相當大的塊,所以你可以試驗你的配置功能鍵,決定什麼是有道理的,並使用這些設置。

VTE的行爲沒有記錄。但是您可以閱讀XTerm Control Sequences中的原文。