我喜欢vim而不是emacs的主要原因是我的手离主行的距离非常小(即使是程序员)。但是,我这样做的主要时间是通过按Escape键离开插入模式。
我最近了解到,我也可以使用Ctrl + C退出插入模式。但是,这并不是真正的改进。
如何在不离开双手且不严重影响我打字能力的情况下退出插入模式?注意:尽管我很想听听qwerty布局的解决方案,但我使用的是带有香草味的vim和dvorak键盘布局。
我喜欢vim而不是emacs的主要原因是我的手离主行的距离非常小(即使是程序员)。但是,我这样做的主要时间是通过按Escape键离开插入模式。
我最近了解到,我也可以使用Ctrl + C退出插入模式。但是,这并不是真正的改进。
如何在不离开双手且不严重影响我打字能力的情况下退出插入模式?注意:尽管我很想听听qwerty布局的解决方案,但我使用的是带有香草味的vim和dvorak键盘布局。
Answers:
您将看到的常见绑定是jj,因为如果您使用主行定位,它对于QWERTY布局非常有效。
inoremap jj <ESC>
在这种情况下,要键入文字jj
-您应该在键入第二个字符之间等待1秒钟(默认情况下)。(:help 'timeout'
有关详细信息,请参见)
还有一个功能可以c-o
让您退出插入操作,让您执行一个正常的命令,然后立即回到插入操作。
j
是c
关键。因此,这并不太糟(键入cc
)。我还可以绑定hh
(qwerty j
key = dvorak h
),这只会在我输入内容shhhhhhh
或其他内容时引导我。
jk
怎么样?找到两个在Dvorak中相邻但在您的首选语言中不常见的组合键。tn
,例如与的位置等效jk
。
jk
/ kj
退出普通模式;它们是QWERTY键盘上的“ c”和“ v”键,因此对于我的左指针和中指来说很容易。
ii
改为使用。是的,您确实需要将手指移离主行,但是仍然很舒适。更重要的是,您无需动动手指就可以在模式之间来回切换。
除了内置的替代品<C-[>
,并<C-c>
以<Esc>
被他人引用键,另一种流行的解决方案是重新映射<CapsLock>
作为附加逃生。这都在Qwerty和Dvorak键盘上。
这样,您可以用左手的小指头非常轻松地按Esc,而无需从HomeRow中移开手(顺便说一下,CapsLock是vi发明时Escape以前在键盘上的位置)。
重新映射可以完成:
在Linux上,根据桌面环境而有所不同。例如,在Linux Mint / Cinnamon上,只需在Menu-> Keyboard-> Keyboard Layouts-> Caps Lock behavior中选择适当的选项即可。另外,但不那么容易,可以使用xmodmap程序并运行以下.Xmodmap
文件在Xorg级别重新映射它:
clear Lock
keycode 0x42 = Escape
可以将系统设置为在每次登录时自动运行,方法.Xmodmap
是在~
登录自动获取的文件链中策略性地放置以下shell脚本行(假设位于主目录中):
if [ -s ~/.Xmodmap ]; then
xmodmap ~/.Xmodmap
fi
但是,这很棘手,因为实际来源的文件会根据所使用的(桌面)环境而有所不同。例如,在Cinnamon“启动应用程序”中,我将xmodmap称为条目(这使我可以做的比标准的GUI密钥重映射自定义还多)。
有些人甚至更进一步,将CapsLock键编程为具有以下行为:
Ctrl
按住它作为键, Esc
按下并快速释放它作为键。在Windows和Mac上,可以通过正确设置/编程相应的remap实用程序来完成此操作(特别是有关AutoHotkey提示的信息,请参见此处,有关KeyRemap4MacBook的信息,请参见此处)。在Linux上,使用程序xcape。
Ctrl
到Alt
(Cmd
),反之亦然,那么 <C-[>
确实很不错。小指弱,拇指强。在QWERTY上,您甚至不需要为此离开家,在Dvorak上,它不是很好,但是可以接受。
我使用的映射是:
inoremap jk <esc>
inoremap kj <esc>
这样,您可以同时点击j和k同时进行操作,而不必担心先按哪个按钮。
<C-[>
和<C-c>
是的两种本地选择<Esc>
。
请参阅:help i_<esc>
和:help i_ctrl-c
,其中解释了<C-c>
和的区别<Esc>
。
<C-[>
具有很好的对称性(两个小手指朝相反的方向移动)。
<C-c>
与并不完全相同<Esc>
。
<C-c>
会巧妙地破坏插件和autocmds。
您可以映射Caps Lock到Control 而不使用任何外部程序:
setxkbmap -option caps:ctrl_modifier
这样就Control进入了主行,可以更轻松地按下所有 Control修改的笔触,包括Ctrl-[和Ctrl-C都退出Vim中的“插入”模式。
另外,乔凡尼在回答的最底端建议映射Caps Lock并执行这两个操作Control , Escape具体取决于印刷时间,但这需要安装额外的软件。
Ctrl-[是首选的选择,因为它总是像Escape。
一个明显的区别用Ctrl-C的是留下的编辑时,在块模式,Ctrl-C将让你在当前行所做的更改,但不会重复修改过的块,这是模式的点其他线路。
它还不会检查缩写或触发InsertLeave事件。看到
:help i_CTRL-C
我建议使用我的插件vim-easyescape。
Plug "zhou13/vim-easyescape"
let g:easyescape_chars = { "j": 1, "k": 1 }
let g:easyescape_timeout = 100
cnoremap jk <ESC>
cnoremap kj <ESC>
一个简单的映射序列的问题inoremap jj <ESC>
是,无论何时您键入j或k处于插入模式,Vim都会暂停(它正在等待下一个键来确定是否应用映射)。暂停会引起视觉干扰,您可能会注意到,也可能不会注意到。 vim-easyescape没有这种问题,并支持自定义超时。
在终端vi和Vim中,
alt+ single-normal-mode-key
可以在大多数终端中进行快速编辑。
之所以可行,是因为大多数终端都将alt修饰符作为转义符发送。例如,当您键入时alt+k,终端仿真器会向正在运行的程序发送两个字符:esc
,k
。Vi和Vim会按照您的期望进行解释。它将退出插入模式(由于转义)并执行正常模式命令(在示例中,将光标向上移动一行)。
如果键盘上的空格键旁边有alt键,则这是退出插入模式的便捷方法(只要您使用终端仿真器,它就可以用拇指按下,将手指放在首页上)出现这种情况,不要介意运行普通模式命令。
single-normal-mode-key
吗?你的意思是逃生?
我使用的FWIW:
:map! ;l ^[
:vmap ;l ^[
感觉就像击中Return。我也;
作为其他插入模式映射的领导者。
我唯一需要输入“;”的时间 +字母表示打高尔夫;否则我没有任何冲突。
从很长一段时间以来,我一直在使用Ctrl+ 3,我发现它比大多数替代品更容易打字,并且看起来运行良好(至少在Linux上如此)。My Caps Lock映射到Ctrl,因此键入它非常方便。
我尝试使用Ctrl+ c已有一段时间,但是我遇到了一些问题,现在我不记得了,但是我没有得到Esc与使用Ctrl+ 完全相同的行为3。
Esc
在香草Vim中一样。我是通过测试组合来凭经验发现的,不知道有关内部原理的详细信息。
如果您使用美国英语键盘,则按Ctrl- [等效于按Esc。这提供了一种退出插入模式的简便方法。或者使用Ctrl- c。
如果您处于简易模式(-y
)中,则必须按Ctrl- l(Control-L)退出插入模式。
也有Ctrl+ o,这将只是暂时退出插入模式只是执行一个命令,并返回到插入模式(见:help i_CTRL-O
)
或Ctrl+ r,但它仅用于插入寄存器或表达,例如内容Ctrl+ r,=5*5(见:help i_CTRL-R
,:help c_CTRL-R
和计算器后)。
Ctrl+r
用于插入注册表(包括表达式=
reg)。如果要临时执行一次性命令,请使用Ctrl+o
。
我已经<A-e>
为逃生做好了准备:
noremap <A-e> <Esc>
snoremap <A-e> <Esc>
inoremap <A-e> <Esc>
tnoremap <A-e> <Esc>
" For some reason in command line mode '\e' is interpreted as Enter.
cnoremap <A-e> <C-c>
编辑:刚刚发现<C-\><C\n>
哪个从任何其他模式将您发送到正常模式。它还具有更好的整体行为。映射变为:
noremap <A-e> <C-\><C-n>
noremap! <A-e> <C-\><C-n>
nnoremap <C-I> <C-I>
vnoremap <Tab> <Esc>gV
onoremap <Tab> <Esc>
inoremap <Tab> <Esc>`^
我重新映射选项卡退出。从历史上看,我认为这是esc键的所在地,因此我使用了它,并且从不回头。我几乎不需要在文档中添加选项卡,当我这样做时,只需按Shift + Tab。我从未从未错过过原始的标签绑定。