在插入模式下遍历文本

在Vim的插入模式下 ,除了使用箭头键之外,还有什么方法可以遍历文本吗?

如果在插入模式下按hjkl ,实际字符将被打印在屏幕上,而不是在文本中移动。

我现在的做法是不得不求助于Ctrl + [Esc )并遍历文本; 但显然这不是生产力。

你似乎滥用vim,但这可能是由于不太熟悉。

正确的方法Esc键 ,去你想要做的小修改,修复它,回去继续编辑。 这是有效的,因为Vim有更多的动作比往常的字符前进/后退/上/下。 在你了解了更多之后,这将会更有成效。

这里有几个用例:

  • 你意外地input了“合意”。 没问题,顺序Esc F f r d A将纠正这个错误,并把你带回你编辑它的地方。 F f动作会使你回到遇到的第一个“F”字符。 与Ctrl + < - - > - > - > - > del d End比较 ,在休闲编辑器中的function几乎相同,但需要更多按键,使您可以将手移出键盘的字母数字空间。
  • 你不小心键入了“你不小心input了”,但是想纠正为“你有意input”。 然后, Esc 2 b c w将会删除您想要修复的字词,并将您带入插入模式,以便您立即重新input。 要回到编辑状态,只需按下A而不是End ,即可触及到您应该移动的手
  • 你不小心键入“鼠标”而不是“鼠标”。 没问题 – 好的旧的Ctrl + W会删除前一个单词,而不会从插入模式退出。 而擦掉小字的速度比修正错误要快得多。 我很习惯,当我input这个消息时,我closures了浏览器页面。
  • 重复计数在很大程度上被利用不足。 在进行移动之前,您可以input一个数字; 而且这个动作会重复这个次数。 例如, 1 5 h将带回15个字符, 4 j将向下滚动4行。 开始使用它们,你会很快得到使用,并发现按下10次< -键比移动光标的迭代方法快,当你键入1 2 h时 ,注意你犯了一个错误,立即用l l

但是,如果您想在不离开插入模式的情况下进行小文本遍历,请按照rson的build议并使用Ctrl + O。 例如, Ctrl + O F + f会将您移动到前一个f字符,并使您处于插入模式。

插入模式

运动

hjkl

尽pipePavel Shved 说了什么 – 可能更适合使用Esc aping插入模式 – 下面是插入模式下用于快速导航的一组示例映射:

 " provide hjkl movements in Insert mode via the <Alt> modifier key inoremap <Ah> <Co>h inoremap <Aj> <Co>j inoremap <Ak> <Co>k inoremap <Al> <Co>l 

这将使插入模式中的Alt + h变成一个字符, Alt + j向下,等等,类似于正常模式下的h j k l

您必须将该代码复制到vimrc文件中,以便每次启动vim时加载它(可以通过键入:new $myvimrc打开该文件:new $myvimrc以普通模式启动)。

任何普通模式的动作

由于默认情况下Alt修饰键没有被映射(重要),所以可以用同样的方式将其他(或全部)function从正常模式拉到插入模式。 例如:
Alt + b移动到当前单词的开头:

 inoremap <Ab> <Co>b inoremap <Aw> <Co>w 

(插入模式下Alt的其他用途)

值得一提的是, Alt键可能比复制普通模式有更好的用途:例如这里是从相邻行复制当前列到行尾的部分的映射:

 " Insert the rest of the line below the cursor. " Mnemonic: Elevate characters from below line inoremap <Ae> \<Esc> \jl \y$ \hk \p \a " Insert the rest of the line above the cursor. " Mnemonic: Y depicts a funnel, through which the above line's characters pour onto the current line. inoremap <Ay> \<Esc> \kl \y$ \hj \p \a 

(我使用了\ line的延续和缩进来增加清晰度 – 这些命令被解释为如果写在一行上。)

内置热键进行编辑

 CTRL-H delete the character in front of the cursor (same as <Backspace>) CTRL-W delete the word in front of the cursor CTRL-U delete all characters in front of the cursor (influenced by the 'backspace' option) 

(在插入模式下,没有显着的内置热键用于移动。)

参考:: :help insert-index


命令行模式

这组映射使得命令行中可用的Alt + hjkl

 " provide hjkl movements in Command-line mode via the <Alt> modifier key cnoremap <Ah> <Left> cnoremap <Aj> <Down> cnoremap <Ak> <Up> cnoremap <Al> <Right> 

或者,这些映射一次添加插入模式和命令行模式的移动:

 " provide hjkl movements in Insert mode and Command-line mode via the <Alt> modifier key noremap! <Ah> <Left> noremap! <Aj> <Down> noremap! <Ak> <Up> noremap! <Al> <Right> 

用于将正常模式命令拉到命令行模式的映射命令与插入模式映射命令有些不同(因为命令行模式缺less插入模式的Ctrl + O ):

 " Normal mode command(s) go… --v <-- here cnoremap <expr> <Ah> &cedit. 'h' .'<Cc>' cnoremap <expr> <Aj> &cedit. 'j' .'<Cc>' cnoremap <expr> <Ak> &cedit. 'k' .'<Cc>' cnoremap <expr> <Al> &cedit. 'l' .'<Cc>' cnoremap <expr> <Ab> &cedit. 'b' .'<Cc>' cnoremap <expr> <Aw> &cedit. 'w' .'<Cc>' 

内置的热键用于移动和编辑

 CTRL-B cursor to beginning of command-line CTRL-E cursor to end of command-line CTRL-F opens the command-line window (unless a different key is specified in 'cedit') CTRL-H delete the character in front of the cursor (same as <Backspace>) CTRL-W delete the word in front of the cursor CTRL-U delete all characters in front of the cursor CTRL-P recall previous command-line from history (that matches pattern in front of the cursor) CTRL-N recall next command-line from history (that matches pattern in front of the cursor) <Up> recall previous command-line from history (that matches pattern in front of the cursor) <Down> recall next command-line from history (that matches pattern in front of the cursor) <S-Up> recall previous command-line from history <S-Down> recall next command-line from history <PageUp> recall previous command-line from history <PageDown> recall next command-line from history <S-Left> cursor one word left <C-Left> cursor one word left <S-Right> cursor one word right <C-Right> cursor one word right <LeftMouse> cursor at mouse click 

参考:: :help ex-edit-index

插入模式 ,只需一个命令即可使用Ctrl O进入正常模式

 CTRL-O h move cursor left CTRL-O l move cursor right CTRL-O j move cursor down CTRL-O k move cursor up 

这可能是做你想做的事情的最简单的方法,而且很容易记住。

其他非常有用的控制键在插入模式下:

 CTRL-W delete word to the left of cursor CTRL-O D delete everything to the right of cursor CTRL-U delete everything to the left of cursor CTRL-H backspace/delete CTRL-J insert newline (easier than reaching for the return key) CTRL-T indent current line CTRL-D un-indent current line 

这些将消除许多浪费的开关回到正常模式。

如果你是一个vim纯粹主义者,跳过阅读这个答案。 OTOH,如果您是vim的新手,并且正在寻找几个有用的技巧,而您不会在许多vim教程和博客中find这些技巧,请阅读… 🙂

一些非正统(vim)的方式

现在是2014年,作为最近回到vim我可以提供一些潜在的逆向的观点和技巧。

使用shift +左移或shift + right移动单词

虽然重复是vim中的一个强大的概念,但是我个人觉得使用它强迫我计算(行,字符,单词等)或猜测是很奇怪的。 我的大脑通常像“我想要光标在那里 ”而不是像“我想要光标_5_words_to_the_left_”那样工作。 快速地移动光标,然后直观地观察插入点以何种方式让我保持对正在编辑的内容的记忆,而不必计算需要进行多less跳才能到达需要编辑的位置。

打开鼠标模式,然后使用鼠标滚轮并单击

…浏览大量的文本。

大多数(所有)现代电脑都有一个与键盘紧密结合的触摸板 (例如MacBook)。 工业devise师花了很多年的时间来优化这些devise,以至于不得不将手从键盘移开的老问题已经不再是一个真正的问题。 好吧,如果你习惯了鼠标而不想切换,但是对于任何新的vim(比如那些可能通过searchfind这个post的人),这应该不是什么问题。

作为奖励,点击+拖动将您置于可视模式

在启用鼠标的情况下,点击和拖动可以切换到可视模式,并标记一个区域用于屏蔽。

并使用滚轮

使用鼠标(滚轮)滚动,点击来定位光标(杜)正常工作。 有关详情,请参阅http://usevim.com/2012/05/16/mouse/

所以…

这些就是我所说的更现代的(使用鼠标,滚轮等)在vim中导航的方式,根据您的input偏好同样有效。

HTH

Vim社区的许多人认为,你不应该在插入模式下导航,它不是Vim的方式。 我认为从标准编辑转向Vim时,这是一个不正确的观点。

当你使用它的工具来创buildprimefaces的,可重复的动作或发现时,Vim是最强大的。

如果您正在修复在同一个插入会话中犯的错误,则可以在插入模式下导航 您不应该在您修改的文本范围之外进行导航。

如果您在input文本时出错,并退出插入模式以解决问题,则无法重复预期的操作. 将重复更正。

Vim支持很多插入模式导航键。 显然有箭头键,首页和结束,但也有很多其他的捷径。 请参阅:h ins-special-keys

在GVim中,您可以使用鼠标。 但老实说,使用箭头键有什么问题呢? 他们在键盘上有一个原因。

为了在插入模式下有一个更好的导航,为什么不映射一些键?

 imap <Cb> <Left> imap <Cf> <Right> imap <Ce> <End> imap <Ca> <Home> " <Ca> is used to repeat last entered text. Override it, if its not needed 

如果您可以在terminal中使Meta键工作,则可以更好地模拟emacs模式。 正常模式下的导航方式更好,但对于较短的移动,它有助于保持插入模式。

对于更长的跳转,我更喜欢下面的默认翻译:

 <Meta-b> maps to <Esc><C-left> 

这转移到正常模式 ,并返回一个字

我相信HomeEnd (和PageUp / PageDn )在插入模式下也能正常工作,但除此之外,我不相信为文本遍历定义了任何其他的标准键。

您可以创build在插​​入模式下工作的映射。 要做到这一点的方法是通过inoremap。 注意命令开头的'i'(noremap对避免键映射冲突很有用)。 “正常”模式的推论是“n”。 你可以猜测vim认为什么是“正常的”;)

不过,你真的想用“正常”模式在文本中四处浏览。 Vim在这种事情上是超级的,所有的能力都可以从正常模式中获得。 Vim已经提供了从普通模式到插入模式(例如,I,I,a,A,o,O)的简单方法。 诀窍是让它很容易进入正常模式。 要做到这一点的方法是把逃跑重新映射到一个更方便的关键。 但是,你需要一个不会与你的正常打字冲突。 我用:

 inoremap jj <Esc> 

因为jj(这是2j一个接一个地快速input)似乎并没有出现在我的词汇表中。 其他的将重映射到舒适的地方。

我做的另一个重要的改变是切换我的键盘上的CAPSLOCK和CONTROL键(使用主机的键盘configuration),因为我几乎从不使用CAPSLOCK,并且在我想要的地方有一个大而美丽的button。 (这对于Emacs用户来说是很常见的,不利的一面是当你在一个“不固定的”键盘上发现自己的时候!)Aaarggh!)

一旦重新映射CAPSLOCK,您可以舒适地使用以下插入模式重新映射:

请记住,一些键已经在插入模式下映射了(反向杀词是Cw(Control-w)默认情况下,你可能已经有了你想要的绑定,也就是说,我更喜欢Ch,所以在我的.vimrc中我有:

 inoremap <Ch> <Cw> 

但是,您可能需要在正常模式下进行相同的肌肉记忆痉挛,所以我也将Ch映射为:

 nnoremap <Ch> db 

(d)电话(b)ackwards用相同的和弦来完成同样的事情。 这种快速编辑是我发现在拼写错误实践中有用的。 但坚持正常模式在文本中移动,而不是杀死前一个字。 一旦习惯了改变模式(当然使用重映射),它将比重映射插入模式更有效率。

对不起,但VIM不这样工作。

你应该切换到“正常”模式,导航,然后再回去插入。

您可以使用imap将插入模式中的任何键映射到其中一个光标键。 像这样:

 imap h <Left> 

现在h像在正常模式下工作,移动光标。 (以这种方式映射h显然是一个不好的select)

话虽如此,我并不认为使用VIM在文本中移动的标准方式是“不成效”的。 在正常模式下有很多非常强大的遍历文本的方法(比如使用w和b,或者/和?,或者f和F等)