在插入模式下将光标移动到行首

85

我知道可以使用以下任一方式:

  1. 在插入模式下,按下 Home
  2. 按下 Esc 然后再按下 i 以退出插入模式并重新进入插入模式,从而有效地到达行的开头.

但是这两种方法都不能满足我的需求。在第一种情况下,我必须歪着头才能按到 Home,因为我无法盲目地按它。在第二种情况下,我的左手臂必须离开主位键盘区域才能按下 Esc,这也很烦人。

有什么建议吗?


5
你可以使用0移动到行的开头,但那不是插入模式。 - manku
3
如果你觉得Esc键也太远了,你可以使用Ctrl-[键代替 :) - user610650
3
更好的做法是,Ctrl-C 的作用类似于 Esc。甚至更好的做法是将 Caps Lock 键映射为 Esc。 - Eric Wilson
4
@manku,你并没有很好地回答他的问题,实际上你是没有回答他的问题=P - puk
将 Esc 键映射为 jj,在 Vim 中需要频繁切换模式。 - kapil
“Home”键是什么? - Blaszard
9个回答

159

Ctrl+O 是一种在插入模式下暂时进入命令模式的快捷键,只需要按下一个键即可返回插入模式。因此,使用 Ctrl+O 然后再按下 Shift+I 应该可以实现你想要的功能。


你可以通过按下 Ctrl+c,I 或 Ctrl+[, I 来完成相同的操作。Ctrl+c 在功能上类似于 ESC,而 Ctrl+[ 等效于 ESC。 - sml
44
按下Ctrl-o再跟着0(比按下Ctrl-o后跟着Shift-I略微更有效率),你就会自动回到插入模式。在某些情况下,按下Ctrl-o接着跟上^可能更好(可以移到该行的第一个非空白字符)。 - Jeet
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Rivenfall
2
"<C-O>"并不同于"<C-[>"或"<Esc>",尽管它们看起来很相似。区别在于使用常规的Escape + <something to get you into insert mode again>进行编辑会留下两个编辑,而<C-O>只留下一个。这可以帮助您保持更清晰的撤消历史记录,并能够重复使用该插入以进行粘贴。一些vim用户会认为您应该关注这样的东西。 - Nicolai S
我不明白。在Linux和Mac OSX上,ctrl + O都无法工作。但是如果我按下ESCAPE键,它会进入命令模式,然后shift + I就可以工作了。 - Daniel Viglione

59

您可以使用大写字母I进入插入模式。

它将把光标放在行的开头。

同样,您可以使用大写字母A在行末添加内容。

然而,这并不能真正解决在插入模式下移动的问题。

我刚刚查看了有关插入模式的帮助,没有在插入模式下移动到行首的键组合。

其他想法: 在插入模式下重新映射一个新的命令

inoremap <C-i> <Home>


1
T. <kbd>I</kbd> 运行良好,但我正在寻找在插入模式下移动到行首的解决方案。 - Valentin V
这并没有直接回答问题,但提供了功能,可能预先回答了大多数人的问题。 - Joe Coder

25

我已经将Ctrl+a和Ctrl+e分别映射到行的开头和结尾。这与大多数bash命令行的行为相匹配。对我来说效果很好。

inoremap <C-e> <Esc>A
inoremap <C-a> <Esc>I

如果我没记错的话,这些是大多数其他编辑器的键绑定。我将把它们添加到我的vimrc文件中。 - Aaron
2
这些是Emacs的常见行为。大多数浏览器也支持各种类型的文本字段。我不认为这是一个坏主意,但你错过了以下内容:<C-e>复制/写入光标下的字符(<C-y>用于光标上方),<C-a>插入您的.-register中的任何内容(点寄存器)。当您离开插入模式时(即使使用Ctrl-c(出于许多原因,您不应该习惯使用它)),该寄存器将填充您刚刚输入的任何内容。 - Nicolai S
@Jonathan Cutrell 你怎么跳到新行的开头? - sayth

3

如果您正在使用MacOS终端,请前往“首选项...>设置>键盘”,将结束键映射为Ctrl-O$(显示为\017$),然后使用fn键+左箭头模拟结束键。同样的操作也适用于home键。对于home键,也可以使用转义序列\033[H。


2
在我的Mac终端上,fn-Left和fn-Right在vim中默认工作。 - Jeff

1

0
ctrl+o then 0
     |      |
  letter  number

0

对我来说有用的一个快捷方式(肌肉记忆和直观性)是将__(双下划线)映射到“在当前行的开始处插入”。

原理:

  • _ 已经移到了行首
  • 在 vim 中,任何东西都可以通过重复实现这一行的操作
  • 双下划线不会与任何动作冲突(您已经在行首)
  • 如果您已经到达行首并想要插入,您的手已经位于正确的位置。

vimscript 代码:

"insert at start of current line by typing in __ (two underscores)
function DoubleUnderscore()
    if v:count == 0 && getcurpos()[2] == 1
        :silent call feedkeys('I', 'n')
    else
        :silent call feedkeys('^', v:count + 'n')
    endif
endfunction
nnoremap <silent> _ :call DoubleUnderscore()<CR>

这个问题很复杂,因为简单的替代方案nnoremap __ _I会导致Vim在按下_时延迟以区分___


0

除非你打算经常提到二战 :)。 - Alexey

0

我使用这个命令在不离开插入模式的情况下跳到行末

inoremap jl <esc><S-a>

同样地,回到行首的命令是:

inoremap jl <esc><S-i>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接