在 Vim 的插入模式中,除使用箭头键外,是否有其他方式可以移动一些字符向前或向后遍历文本?
如果我在插入模式下按下 h、j、k 和 l 键,则屏幕上会打印出相应的字符,而不是在文本中移动。
目前我使用的方法是使用 Ctrl + [(Esc),然后再遍历文本;但显然这样不够高效。
有方法可以在插入模式下进行行内移动,你可以使用gj
和 gk
向上(反向)和向下(正向)移动单个逻辑行,在逻辑行包含多行可视文本时非常方便。 如果你的终端宽度很窄或者你的文本行非常长,使用这种方式比使用箭头键或按ESC
更快。 此外,你可以使用CTRL-O发出一个普通模式命令。 这两种移动方式都不会使你退出插入模式。
按 ESC 键会干扰生产力(当Vi被发明时,ESC键位于终端键盘的home-row键旁边)。 我处理的文本文件包含非常长的逻辑行,整个段落都是由纯文本组成的句子。 对我来说,这两个选项真正节省了时间。 要查找段落中的特定单词仍然很方便,但很多时候我只需要向上或向下移动一个可视行,然后继续插入。
我实际上编辑了我的 .vimrc 以映射出几乎没用的 ALT 键,因此我的左手按ALT键,右手使用箭头键。(而且它不会使我退出插入模式,注意每个条目末尾的“i”)。
imap <A-UP> <ESC>gki
imap <A-DOWN> <ESC>gji
我还在.vimrc中添加了几行代码,这样我的箭头键就可以在正常模式下上下移动,浏览一个逻辑行中包含的多个可视行(代码与上面相同,只是使用map或nmap而不是imap)。另外,我使用ALT键与键盘的其它导航键一起在插入模式下进行导航。
我为ALT键添加了额外的导航内容,以便与键盘预分配的导航键配合,在插入模式下更快地导航。这些都不会使你退出插入模式:
" <ALT> navigation within insert-mode
imap <A-UP> <ESC>gki
imap <A-DOWN> <ESC>gji
imap <A-LEFT> <ESC>bi
imap <A-RIGHT> <ESC>ea
imap <A-END> <ESC>A
imap <A-PageUp> <ESC>(i
imap <A-PageDown> <ESC>l)i
imap <A-Home> <Esc>I
" so that <ALT> behaves the same in normal mode
nmap <A-UP> gk
nmap <A-DOWN> gj
nmap <A-LEFT> b
nmap <A-RIGHT> le
nmap <A-END> $
nmap <A-PageUp> (
nmap <A-PageDown> )
nmap <A-Home> ^
imap
将插入模式下的任何键映射到其中一个光标键。像这样:imap h <Left>
现在h键在正常模式下像移动光标一样工作。(显然将h键映射成这样是一个糟糕的选择)
话虽如此,我认为使用VIM在文本中移动的标准方式并不是“不高效”的。在正常模式下有许多非常强大的遍历文本的方法(例如使用w和b,或/和?,或f和F等)。
对于一些经常使用的动作和操作,我定义了以下映射。与CTRL+O组合相比,这可以节省一个按键,而且由于我经常需要它们,所以从长远来看是值得的。
inoremap <A-$> <C-o>$
inoremap <A-^> <C-o>^
inoremap <A-h> <Left>
inoremap <A-l> <Right>
inoremap <A-O> <C-O>O
inoremap <A-o> <C-o>o
imap jk <Esc>
)也会很有帮助,这样你就不用打断势头并越过键盘去按下该键了。 - tsujin<ESC>
键映射为kj
,而不是jk
;我的好友 Dijkstra 应该为此负责! - DrBecojk
和kj
,所以我用两个手指按它就像按一个大按钮一样,而且顺序并不重要,这样我就回到正常状态了。 - Edu Ruiz