在Windows里待久了的人,初用Emacs時,對它的很多按鍵功能會很不適應,其中之一就是TAB鍵,有時候按一下TAB鍵會縮進很多,有時候無論怎么按都沒反應,讓人摸不着頭腦。
Emacs中的TAB鍵,默認功能是自動排版(在編程mode下),就像VC中的Alt+F8,對光標所在行或者選中區域的所有行按照語言排版格式重新排版。有人問那怎么才能輸入一個水平制表符,一個普通的Tab,Emacs默認的方法是組合鍵C-q Tab,需要3個鍵,好痛苦啊,如果要改回你認識的Tab鍵,可以這樣重新定義Tab的功能,輸入1個Ascii為9的字符(即tab):
(global-set-key (kbd "<tab>") '(lambda () (interactive) (insert-char 9 1)))
但是,請相信我,這不會讓你爽多久,很快你會發現Shift-Tab不是反向縮進,而且在選中狀態下按Tab,也不是你想象的那樣所有行縮進,而是選擇被取消並在光標處插入一個普普通通的Tab… 我妥協了,把Tab保留在默認的排版功能,而像多數Emacser那樣,把”鍵入一個Tab“綁定到一個空閑的C-tab組合鍵上。
(global-set-key [C-tab] '(lambda () (interactive) (insert-char 9 1)))
因為對我來說,需要”鍵入一個Tab“的情況不是很多,相較起來,也許排版要用的更多。
順便一提,在網上看到有人把C-i鍵重定義后,Tab鍵也會跟着變成同樣的功能。(參考:How do I bind a command to C-i without changing TAB?)在原帖的回答里,下面的方法據說最有效,可以改C-i鍵而又不影響Tab
(setq local-function-key-map (delq '(kp-tab . [9]) local-function-key-map))
(global-set-key (kbd "C-i") 'forward-word)
因為在elisp的說明文檔里這樣講:In ASCII, C-i and <TAB> are the same character.(參考:GNU Emacs Lisp Reference Manual-21.7.2 Function Keys)我沒能完全理解這句話,雖然我知道ASCII里有<TAB>,但是ASCII里竟然還有C-i ?
但是不知道為什么,上面的配置在我電腦上行不通,第一條刪除(kp-tab . [9])按鍵映射,我這里刪不掉,或者是最后一個參數改成function-key-map也不行,用C-h v local-function-key-map查看(kp-tab . [9])還在,后來我用delete成功刪掉了(delete '(kp-tab . [9]) local-function-key-map)這次(kp-tab . [9])終於沒有了,但是改C-i鍵依然會影響Tab鍵,WTF!,有高手的話希望能指點一下。下面介紹我實驗出來的終極奧義
(global-set-key (kbd "C-i") 'command1)
(global-set-key (kbd "<tab>") 'command2)
這下可以使<tab>"和"C-i"不再影響了,但是,Tab鍵也被全局鎖定為這一個功能了,本來Tab鍵在不同模式下有不同功能,如果這么定義的話,就要追加定義一堆東西,還是放棄吧,放棄C-i鍵。關於Tab鍵就折騰到這吧。
軟件環境 Emacs for Windows, version 24.2 OS:Windows7中文版