退出Escape以外的其他方式退出插入模式


74

我喜欢vim而不是emacs的主要原因是我的手离主行的距离非常小(即使是程序员)。但是,我这样做的主要时间是通过按Escape键离开插入模式。

我最近了解到,我也可以使用Ctrl + C退出插入模式。但是,这并不是真正的改进。

如何在不离开双手且不严重影响我打字能力的情况下退出插入模式?注意:尽管我很想听听qwerty布局的解决方案,但我使用的是带有香草味的vim和dvorak键盘布局。


1
您可以将任何组合键映射到任何地方,而您不能做其他任何事情。你是这个意思吗?
2015年

3
了解了Ctrl + c快捷键THX!
Philippe Gachoud

如何将Caps Lock映射为Esc?
Kolob峡谷

@PhillippeGachaud:不要使用Ctrl-C代替Esc。Ctrl-C与Escape不同,它是强制的Escape,在某些情况下的行为可能有所不同
Lie Ryan

Answers:


60

您将看到的常见绑定是jj,因为如果您使用主行定位,它对于QWERTY布局非常有效。

inoremap jj <ESC>

在这种情况下,要键入文字jj-您应该在键入第二个字符之间等待1秒钟(默认情况下)。(:help 'timeout'有关详细信息,请参见)

还有一个功能可以c-o让您退出插入操作,让您执行一个正常的命令,然后立即回到插入操作。

http://vim.wikia.com/wiki/Avoid_the_escape_key


1
在德沃夏克,jc关键。因此,这并不太糟(键入cc)。我还可以绑定hh(qwerty jkey = dvorak h),这只会在我输入内容shhhhhhh或其他内容时引导我。
durron597

7
cc是至少两个英文字母的更常见的组合键。因此,这可能不是最佳选择
Nick J Adams

4
模仿jk怎么样?找到两个在Dvorak中相邻但在您的首选语言中不常见的组合键。tn,例如与的位置等效jk
David Lord

1
我有点喜欢在Dvorak中拥有jk/ kj退出普通模式;它们是QWERTY键盘上的“ c”和“ v”键,因此对于我的左指针和中指来说很容易。
alxndr

2
我认为我们可以做得更好- ii改为使用。是的,您确实需要将手指移离主行,但是仍然很舒适。更重要的是,您无需动动手指就可以在模式之间来回切换。
Sridhar Sarnobat,

38

除了内置的替代品<C-[>,并<C-c><Esc>被他人引用键,另一种流行的解决方案是重新映射<CapsLock>作为附加逃生。这都在Qwerty和Dvorak键盘上。

这样,您可以用左手的小指头非常轻松地按Esc,而无需从HomeRow中移开手(顺便说一下,CapsLock是vi发明时Escape以前在键盘上的位置)。

重新映射可以完成:

  • 在Windows上使用AutoHotKey实用程序;
  • 在Mac上使用KeyRemap4MacBook实用程序和其他实用程序;
  • 在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


2
完全同意。在主行上使用ctrl键可以提高很多可用性(使用ctrl + n滚动完成,使用ctrl + f / ctrl + b滚动浏览文件,使用ctrl +]转义等)。所有这些键组合都更易于执行这种方式。
约翰O'M。

1
关于按下Ctrl键(在常规位置),而不扭曲小指:你可以用手的外部手掌按下它,因为它是描述以及这里 (我发现了“网这个漂亮的巧招,时间给它back :)和对发明它的人表示
敬意

FWIW KeyRemap4MacBook已重命名为Karabiner:pqrs.org/osx/karabiner/index.html.en
alxndr 2015年

我尝试了此解决方案,但发现有时按Shift键时偶然碰到了Caps Lock,这很烦人。因此,您的行驶里程可能会因左手小指的敏捷程度而异。:)
Godsmith,2013年

2
如果您重新映射CtrlAltCmd),反之亦然,那么 <C-[>确实很不错。小指弱,拇指强。在QWERTY上,您甚至不需要为此离开家,在Dvorak上,它不是很好,但是可以接受。
纳什桥

28

我使用的映射是:

inoremap jk <esc>
inoremap kj <esc>

这样,您可以同时点击jk同时进行操作,而不必担心先按哪个按钮。


70
但是我正在写一本关于在雷克雅未克玩埃德加·迪克斯特拉玩二十一点的书!;)
durron597

如果您想写任何荷兰语,两者都是可怕的。
Hielke Walinga

12

<C-[><C-c>是的两种本地选择<Esc>

请参阅:help i_<esc>:help i_ctrl-c,其中解释了<C-c>和的区别<Esc>


同样,这些并不是改进,因为Ctrl与Escape一样,离主行也很远。
durron597 2015年

4
@ durron597在QWERTY键盘上,Ctrl可能离主行很远,但确实有一个重要区别:它在主行下方。您只需要动动手指即可按下它,而使用Esc则需要稍微旋转整个手。而且,它<C-[>具有很好的对称性(两个小手指朝相反的方向移动)。
wchargin 2015年

6
请注意,这<C-c> 与并不完全相同<Esc>
wchargin 2015年

2
同意 习惯使用<C-c>会巧妙地破坏插件和autocmds。
David Lord

在我的计算机上,它的<C-[>正常工作,但是注册所需的时间比<Cc>长半秒
亚历山大·米尔斯

4

您可以映射Caps LockControl 而不使用任何外部程序

这样就Control进入了主行,可以更轻松地按下所有 Control修改的笔触,包括Ctrl-[Ctrl-C都退出Vim中的“插入”模式。

另外,乔凡尼在回答的最底端建议映射Caps Lock并执行这两个操作Control Escape具体取决于印刷时间,但这需要安装额外的软件。

Ctrl-[首选的选择,因为它总是像Escape

一个明显的区别Ctrl-C的是留下的编辑时,在块模式Ctrl-C将让你在当前行所做的更改,但不会重复修改过的块,这是模式的点其他线路。

它还不会检查缩写或触发InsertLeave事件。看到:help i_CTRL-C


4

我建议使用我的插件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>是,无论何时您键入jk处于插入模式,Vim都会暂停(它正在等待下一个键来确定是否应用映射)。暂停会引起视觉干扰,您可能会注意到,也可能不会注意到。 vim-easyescape没有这种问题,并支持自定义超时。


3

在终端vi和Vim中, alt+ single-normal-mode-key可以在大多数终端中进行快速编辑。

之所以可行,是因为大多数终端都将alt修饰符作为转义符发送。例如,当您键入时alt+k,终端仿真器会向正在运行的程序发送两个字符:esck。Vi和Vim会按照您的期望进行解释。它将退出插入模式(由于转义)并执行正常模式命令(在示例中,将光标向上移动一行)。

如果键盘上的空格键旁边有alt键,则这是退出插入模式的便捷方法(只要您使用终端仿真器,它就可以用拇指按下,将手指放在首页上)出现这种情况,不要介意运行普通模式命令。


2
您能详细说明什么single-normal-mode-key吗?你的意思是逃生?
kenorb

您可以使用alt键在插入模式下使用在普通模式下使用的单个按键。例如Alt + x删除一个字符。
ewatt

2
我也不太明白这个答案。实际上,Alt + x在正常模式下似乎与Alt有所不同?还有其他一些键似乎不起作用?但也许我用错了..?也许您可以对答案进行一些扩展以解释其工作原理,并链接到一些Vim文档也将很不错:-)谢谢!:-)
马丁·图尔诺伊

实际上取决于您的终端配置,并且通常未按照您建议的那样进行设置。
Christian Brabandt '16

1
我对此表示赞同,然后查看历史记录,并意识到由于某种原因,主持人对其进行了编辑,以凭空添加了99%的文字,而不是像我们其他人一样发表评论。所以我不得不推翻我的投票。当然,这里发生的事情超出了明智的编辑范围?我拒绝的破坏性编辑要少得多。当然,新内容很棒,但不属于这个答案。它应该是它自己的。
underscore_d

3

我使用的FWIW:

:map! ;l ^[
:vmap ;l ^[

感觉就像击中Return。我也;作为其他插入模式映射的领导者。

我唯一需要输入“;”的时间 +字母表示打高尔夫;否则我没有任何冲突。


也许将其映射为转义比将其映射为^ [更好?:)
Alexander Mills

2

从很长一段时间以来,我一直在使用Ctrl+ 3,我发现它比大多数替代品更容易打字,并且看起来运行良好(至少在Linux上如此)。My Caps Lock映射到Ctrl,因此键入它非常方便。

我尝试使用Ctrl+ c已有一段时间,但是我遇到了一些问题,现在我不记得了,但是我没有得到Esc与使用Ctrl+ 完全相同的行为3


2
Ctrl-3到底应该做什么?
克里斯蒂安·布拉班德

我不知道它是如何工作的,但是就像Esc在香草Vim中一样。我是通过测试组合来凭经验发现的,不知道有关内部原理的详细信息。
elias '16

1
这不是vi的东西,也可以在shell上工作。如果您在外壳上使用bindkey -v启用了vi模式,这将非常有用
golfadas

1

如果您使用美国英语键盘,则按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计算器后)。

在以下位置了解更多信息:避免在Vim Wikia上使用Escape


3
仅供参考:Ctrl+r用于插入注册表(包括表达式=reg)。如果要临时执行一次性命令,请使用Ctrl+o
Sukima 2015年

1

我已经<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>

0
nnoremap <C-I> <C-I>
vnoremap <Tab> <Esc>gV
onoremap <Tab> <Esc>
inoremap <Tab> <Esc>`^

我重新映射选项卡退出。从历史上看,我认为这是esc键的所在地,因此我使用了它,并且从不回头。我几乎不需要在文档中添加选项卡,当我这样做时,只需按Shift + Tab。我从未从未错过过原始的标签绑定。


关于vim和emacs的段落完全没有必要...
D. Ben Knoble
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.