在插入模式下移至行首


83

我知道我可以使用:

  1. Home 在插入模式下
  2. Esc+i退出插入模式并再次输入,有效地转到行首。

但是没有一个让我满意。在第一种情况下,我必须倾斜头部才能击中Home,因为我不能盲目地击中它。在第二种情况下,我的左臂必须离开主行才能击打Esc,这也很烦人。

有什么想法吗?


5
您可以使用0移至行首,但不在插入模式下。
manku'7

3
而且,如果您也能找到Esc,则可以使用Ctrl- [代替:)

3
更好的是,Ctrl-C的作用类似于Esc。甚至更好的是,将Caps Lock映射到Esc。
埃里克·威尔逊

4
@manku,您没有回答他的问题,就没有回答他的问题= P
puk

将esc重映射为jj,您需要在vim中在很多模式之间切换
kapil

Answers:


149

CtrlO在插入模式下,+可使您进入命令模式仅需按一下键。因此,Ctrl+O然后Shift+I应该可以满足您的需求。


您可以通过按Ctrl + c,I或Ctrl + [,I来完成相同的事情。Ctrl+ c在功能上类似于ESC,而Ctrl + [等价于ESC。
sml

42
Ctrl-o后跟0(比Ctrl-o后跟效率更高Shift-I),因为您将自动回到插入模式。在某些情况下, Ctrl-o随后^可能会更好(移动到行的第一个非空白字符)。
Jeet

2
如果您的Alt键发送转义符(可以在iTerm2中配置),则可以在插入模式下使用Alt-A或Alt-I
Rivenfall

2
<C-O>与它们看起来不同<C-[><Esc>相同。不同之处在于,进行常规转义的编辑+ <使您再次进入插入模式的内容>使您进行两次编辑,而<CO>使您进行一次编辑。这可以帮助您保持更清晰的撤消历史记录,并能够重复使用该插入内容进行粘贴。一些病毒主义者会争辩说,您应该注意类似的事情。
Nicolai S 2015年

我不明白 在Linux和Mac OSX上,ctrl + O均不起作用。但是,如果我按ESCAPE键,它将进入命令模式,然后按shift +我可以工作。
多纳托

51

您可以使用I(大写i)进入插入模式。

它将光标放在行的开头。

同样,您可以A在行尾添加内容。

虽然,它并不能真正解决已经处于插入模式下的移动问题。

我刚刚检查了关于“插入”模式的帮助,“插入”模式下没有按键组合可以移动到行首。

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

inoremap <C-i> <Home>


1
T. <kbd> I </ kbd>可以正常工作,但是我正在寻找一种解决方案,使其已经在插入模式下移至行首。
Valentin Vasilyev

这不是直接回答问题,而是提供了可能对大多数人来说都是先于问题的功能。
乔·编码员

24

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

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

如果我没记错的话,这些也是大多数其他编辑器的快捷键。我将这些添加到我的vimrc文件中。
亚伦2015年

2
这些是Emacs通常的行为。大多数浏览器还在各种类型的文本字段中支持这些功能。我不认为这是一个坏主意,但这是您遗漏的内容:<C-e>在光标下方复制/写入字符(<C-y>用于光标上方),<C-a>在.-register(点寄存器)中插入所有内容。当您退出插入模式时(甚至在使用Ctrl-c时(由于多种原因您都不习惯),该寄存器将被您刚刚键入的内容填充。
Nicolai S

@Jonathan Cutrell您如何转到新行的开头。
sayth

3

如果您使用的是MacOS Terminal,请转到“首选项...>设置>键盘”,然后将结束键映射到Ctrl-O $(显示为\ 017 $),然后使用fn + left模拟结束键。对主页键执行相同的操作。转义序列\ 033 [H也适用于家庭。


1
fn-Left和fn-Right在Mac终端上的vim中默认为我工作
Jeff 2015年



0

对我有用的捷径(肌肉记忆力和直观性)是将__(这是double _)映射到“在当前行的开始处插入”。

理由:

  • _ 已经到了行首
  • 在vim中,将所有内容加倍是“达到此行”的一种非常常见的方式
  • double_不会与任何动作发生冲突(您已经在行首了)
  • 如果您移至行首并现在要插入,则您的手已经在正确的位置。

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按下_以区分_和时延迟__



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.