2010-04-14 26 views
8

我希望能夠暫時從emacs模式切換到vi模式,因爲vi模式有時有時更好,但是我通常在我意識到我想使用vi模式之前通過鍵入一些內容。有沒有辦法通過按鍵將Bash或zsh從Emacs模式切換到vi模式?

我不想永久切換到vi模式,因爲我通常更喜歡emacs模式的命令行,主要是因爲它是我習慣的,多年來許多擊鍵已成爲第二天性。 (作爲一名編輯,我通常在viper模式下使用emacs,這樣我就可以使用這兩個 vi和emacs按鍵,因爲我發現自己一直都在意外地在vi中使用它們,並且搞砸了,因爲在某些情況下,我發現vi鍵擊更加令人難忘和方便,而在其他情況下emacs。)

回答

10

由於vi模式和emacs模式之間的鍵綁定是分開的,因此可以創建切換。

$ set -o emacs 
$ bind '"\ee": vi-editing-mode' 
$ set -o vi 
$ bind '"\ee": emacs-editing-mode' 

現在Alt-e(或Esc e)將在模式之間切換。

將此添加到您的定義PS1的某個位置,以便您在提示時顯示所處模式的指示器。切換模式時不會立即顯示更改,但會在新提示發行。

$(set -o | grep emacs.*on >/dev/null 2>&1 && echo E || echo V) 
+0

你先生,很棒。但是,它在zsh中仍然不起作用。通過一些小的調整,我可以從命令行獲得模式指示器: set -o | grep'vi。* on'> |/dev/null 2>&1 && echo'[vi]'|| echo'' 但是我的提示僅在我輸入.zshrc文件時纔會更改。 (我還沒有在bash中測試模式指示器。) – iconoclast 2010-05-28 23:28:20

+1

Zsh行編輯器似乎不支持'vi-editing-mode',只有'vi-cmd-mode'。 (但是,您仍然可以使用'set -o vi'或'bindkey -v'來有效獲取完整的vi模式。) ^ xv默認情況下在zsh中綁定到vi-cmd模式。它只能持續執行它,並且你只需點擊'i'即可離開它,這會讓你回到emacs模式。 相比之下,bash解決方案會一直持續到您明確切換模式爲止,點擊'i'會將您置入vi插入模式。 – iconoclast 2010-05-28 23:45:47

+0

如果你把'$(command)'放在你的'PS1'變量的定義中,這個命令將被立即評估 - 因此你的提示是靜態定義的,你必須找到你的'〜/ .zshrc'來重新生成提示。如果您希望提示動態顯示變量/命令,則必須修改在顯示提示之前Zsh運行的'precmd'函數。把這個放在你的zshrc中來修正模式指示器: – jabirali 2010-07-13 02:41:34

5

啊哈!我看着readline的來源,發現,你可以這樣做:

"\M-v": vi-editing-mode 
"\M-e": emacs-editing-mode 

似乎沒有成爲一個切換,不過這也夠也許是好事!

爲了後代的緣故,這是我的原始答案,這對於那些試圖做沒有readline函數的人來說可能是有用的。

這裏有一種方法可以設置它,清除進程中的當前命令行。不是你想要的,我知道,但也許它會幫助其他人發現這個問題。在〜/ .inputrc文件:

"\M-v": "\C-k\C-uset -o vi\C-j" # alt (meta)-v: set vi mode 
"\M-e": "\C-k\C-uset -o vi\C-j" # alt (meta)-e: set emacs mode 

或切換...這應該工作:

"\M-t": "\C-k\C-u[[ \"$SHELLOPTS\" =~ '\\bemacs\\b' ]] && set -o vi || set -o emacs\C-j" 

這些基本上別名,拍攝更遠一步映射到按鍵在readline的讓你不」不得不輸入一個別名,然後回車。

1

以下.inputrc線允許元/ ALT + ëemacsvi-insert模式之間切換。

Mooshing都Ĵķ同時會帶你到vi-command模式。

注:唯一的英文單詞爲「KJ」是「二十一點」,沒有的話包含「JK」)

set keymap emacs 
"\ee": vi-editing-mode 
"jk": "\eejk" 
"kj": "\eejk" 

set keymap vi-insert 
"\ee": emacs-editing-mode 
"jk": vi-movement-mode 
"kj": vi-movement-mode 

set keymap vi-command 
"\ee": emacs-editing-mode 

注:如果您添加keymap emacs下結合vi-movement-mode嘗試切換直vi-command模式下,如果您有show-mode-in-prompt on,則提示不會更新,因此需要上述解決方法。

相關問題