在插入模式下遍历文本

384

在 Vim 的插入模式中,除使用箭头键外,是否有其他方式可以移动一些字符向前或向后遍历文本?

如果我在插入模式下按下 hjkl 键,则屏幕上会打印出相应的字符,而不是在文本中移动。

目前我使用的方法是使用 Ctrl + [Esc),然后再遍历文本;但显然这样不够高效。


1
顺带一提:将 escape 映射到更近的组合键(如imap jk <Esc>)也会很有帮助,这样你就不用打断势头并越过键盘去按下该键了。 - tsujin
8
我喜欢将 <ESC> 键映射为 kj,而不是 jk;我的好友 Dijkstra 应该为此负责! - DrBeco
14
我有jkkj,所以我用两个手指按它就像按一个大按钮一样,而且顺序并不重要,这样我就回到正常状态了。 - Edu Ruiz
13个回答

1

有方法可以在插入模式下进行行内移动,你可以使用gjgk向上(反向)和向下(正向)移动单个逻辑行,在逻辑行包含多行可视文本时非常方便。 如果你的终端宽度很窄或者你的文本行非常长,使用这种方式比使用箭头键或按ESC更快。 此外,你可以使用CTRL-O发出一个普通模式命令。 这两种移动方式都不会使你退出插入模式。

ESC 键会干扰生产力(当Vi被发明时,ESC键位于终端键盘的home-row键旁边)。 我处理的文本文件包含非常长的逻辑行,整个段落都是由纯文本组成的句子。 对我来说,这两个选项真正节省了时间。 要查找段落中的特定单词仍然很方便,但很多时候我只需要向上或向下移动一个可视行,然后继续插入。

我实际上编辑了我的 .vimrc 以映射出几乎没用的 ALT 键,因此我的左手按ALT键,右手使用箭头键。(而且它不会使我退出插入模式,注意每个条目末尾的“i”)。

imap <A-UP> <ESC>gki
imap <A-DOWN> <ESC>gji

我还在.vimrc中添加了几行代码,这样我的箭头键就可以在正常模式下上下移动,浏览一个逻辑行中包含的多个可视行(代码与上面相同,只是使用mapnmap而不是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> ^

我的“内部”插入模式导航快捷键利用ALT键与PgUp、PgDn、Home和End键,以便更快地跳转。我使用alt-pgup和alt-pgdn按键来向前或向后跳转一句话。而且,我使用alt-home和alt-end键来跳转到段落长的逻辑行的开头和结尾。这些操作都不会使我退出插入模式。(我想我不妨将所有预定义的导航键都编程为在插入模式下快速工作,而不离开它)。如果我想每次移动一个字符,我只需松开ALT键,同时仍然使用箭头键。
所有这些都是在.vimrc中进行的非常简单的修改。你可以发挥创意,在插入模式下做各种事情来改善导航。否则,如果你在长行中在插入模式下使用普通的箭头键,那么你需要左手拿着咖啡杯,在右手按住箭头键时喝咖啡。这太费时间了!
顺便说一下,键已经可以与所有其他正常模式导航命令一起使用,比如h、j、k、l和w、W、b、B、e和搜索:/,%等等。但它会自动将你从插入模式中退出,而无需按ESC键。因此,使用与正常模式导航字符一起使用将使你陷入正常模式,直到你再次按i、I、a、A、o、O键,这很容易被忘记。
由于键盘预定义的导航命令:箭头:上、下、右、左和PgUp、PgDn、Home、End不会对键进行任何特殊处理,我发现我不妨在.vimrc中将它们映射出来,以帮助我的插入模式内导航,同时保持在插入模式下。并且,重申一遍,这对我很有帮助,因为我处理非常长的文本文档,其中包含跨越许多可视行的段落长的逻辑行,而箭头键和h、j、k、l不会识别可视行。这解决了这个特定问题,无论是在插入模式还是在正常模式下。
(本段内容来源于Kim Schulz的《HACKING VIM 7.2》)

0
你可以使用imap将插入模式下的任何键映射到其中一个光标键。像这样:
imap h <Left>

现在h键在正常模式下像移动光标一样工作。(显然将h键映射成这样是一个糟糕的选择)

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


1
我并没有说在vim中标准的文本移动方式不够高效;我说的是,有时候需要退出插入模式回退几个字符,再重新进入插入模式,这有点“烦人”;但话说回来,也许这只是因为我还没完全习惯vim :) - Andreas Grech
这就是我一直在寻找的解决方案。我使用 imap <C-h> <Left>(我知道它会删除一个字符,但我有退格键),这就是我需要的一切,谢谢。 - user4052054

0

对于一些经常使用的动作和操作,我定义了以下映射。与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

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