而在插入模式在Vim,有任何方法来遍历文本移动一些字符向前和向后除了使用方向键?

如果我在插入模式下按下h, j, k和l,实际字符将打印在屏幕上,而不是在文本中移动。

我现在这样做的方式是不得不诉诸Ctrl + [(Esc)和遍历文本;但很明显,这是没有成效的。


当前回答

是的,有办法。您可以在Insert Mode中使用gj和gk在单个逻辑行中向上(向后)和向下(向前)移动,该逻辑行环绕着许多可视线条。如果你有很长的行和/或宽度较窄的终端,这是很方便的,可以比方向键或按ESC键来使用其他导航快捷键快得多。还可以使用CTRL-O发出一个普通模式命令。这两种导航动作都不会使您退出插入模式。

按ESC键可能会破坏工作效率(在发明Vi时,它在终端键盘上的home行之外)。我处理的文本文件有非常长的逻辑行,整个段落的句子都是纯文本。这两个选择对我来说是一个真正的时间节省。如果我需要在段落中寻找某个特定的单词,切换到正常模式仍然很方便,但很多时候我只需要向上或向下移动一条可视线,然后继续插入。

实际上,我编辑了.vimrc来映射几乎无用的ALT键,所以我的左手按下ALT,而右手使用方向键。(并且它不会转义出插入模式:请注意每个条目末尾的“i”)。

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

我还在.vimrc中添加了行,以便我的方向键在正常模式下工作,在由一个逻辑行所包含的许多可视行中上下遍历(代码与上面的相同,只是您使用的是map或nmap而不是imap),我使用键盘的其他导航键ALT-KEY,都在插入模式中。

我为我的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> ^

My "within" insert-mode navigation short cuts utilize the ALT key with PgUp, PgDn, Home & End keys too, to jump around far more quickly. I use alt-pgup and alt-pgdn presses to jump forward or backward by sentences. And, I use alt-home and alt-end to jump to the beginning and end of my paragraph long logical lines. None of this escapes me out of insert mode. (I figured that I might as well program all the preassigned navigation keys to work quickly within insert-mode, without leaving it). And if I want to move one character at a time, I just let up on the ALT key while still using the arrow keys.

所有这些都是对.vimrc的简单修改。您可以发挥创意,做各种事情来改进插入模式下的导航。否则,如果在长行中使用插入模式下的普通ole箭头键,则需要在右手按住方向键的同时,左手拿着一杯咖啡来啜饮。那要花很长时间!

顺便说一下,这个键已经与所有其他正常模式导航命令一起工作了,比如h,j,k,l和w, w, b, b, e和search: /,%等。除了它会自动退出插入模式,而无需按ESC键。因此,使用正常模式导航字符会让你陷入正常模式,直到你努力再按i, i, a, a, o, o, o,我发现这很容易忘记。

Since the keyboards preassigned navigation commands: arrows: UP, DOWN, RIGHT, LEFT and PGUP, PGDN, HOME, END don't do anything special with the key, I found that I might as well map them out in .vimrc to help my navigation within insert-mode, while staying within insert-mode. And, to reiterate, its helpful to me because I work with very long text documents that have paragraph long logical-lines that span across a lot of visual-lines, and the arrow keys and h,j,k,l don't acknowledge the visual-lines. This fixes that particular problem, both within insert-mode and normal-mode.

我把这归功于我在Kim Schulz的HACKING VIM 7.2一书中找到的知识

其他回答

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

imap <C-b> <Left>
imap <C-f> <Right>
imap <C-e> <End>
imap <C-a> <Home>
" <C-a> is used to repeat last entered text. Override it, if its not needed

如果您可以在您的终端中使用元键,那么您可以更好地模拟emacs模式。正常模式下的导航更好,但对于较短的移动,它有助于保持插入模式。

对于较长的跳跃,我更喜欢以下默认翻译:

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

这将切换到正常模式并返回一个单词

在插入模式下,使用CtrlO切换到正常模式,只执行一个命令:

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教程和博客中找不到,请继续阅读…: -)

一些非正统的(vim)方法

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

使用shift+左或shift+右遍历单词

While repetition is a powerful concept in vim, I (personally) find it strange that using it either forces me to count (lines, characters, words, etc.) or make guesses. My brain usually works like "I want the cursor there" and not like "I want the cursor _5_words_to_the_left_". Quickly being able to move the cursor, and visually observe where the insertion point this way allows me to keep my mind on what I'm editing instead of having to count how many hops I need to make to get to where I need to edit.

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

...在大量文本中导航。

大多数(所有)现代电脑都有一个与键盘紧密结合的触摸板(例如macbook)。工业设计师们花费了多年的时间来优化这些设计,因此必须将手从键盘上移开的老问题不再是一个真正的问题。好吧,如果你习惯了鼠标,不喜欢切换,但对于vim的新手(比如那些可能通过搜索找到这篇文章的人),这应该不是什么大问题。

作为奖励,点击+拖动使您进入可视模式

在启用鼠标的情况下,单击和拖动可以切换到可视模式,并标记一个区域以进行拉拽。

使用滚轮

使用鼠标(滚轮)来滚动,然后点击来定位光标(废话)。更多信息请参见http://usevim.com/2012/05/16/mouse/。

所以…

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

HTH

是的,有办法。您可以在Insert Mode中使用gj和gk在单个逻辑行中向上(向后)和向下(向前)移动,该逻辑行环绕着许多可视线条。如果你有很长的行和/或宽度较窄的终端,这是很方便的,可以比方向键或按ESC键来使用其他导航快捷键快得多。还可以使用CTRL-O发出一个普通模式命令。这两种导航动作都不会使您退出插入模式。

按ESC键可能会破坏工作效率(在发明Vi时,它在终端键盘上的home行之外)。我处理的文本文件有非常长的逻辑行,整个段落的句子都是纯文本。这两个选择对我来说是一个真正的时间节省。如果我需要在段落中寻找某个特定的单词,切换到正常模式仍然很方便,但很多时候我只需要向上或向下移动一条可视线,然后继续插入。

实际上,我编辑了.vimrc来映射几乎无用的ALT键,所以我的左手按下ALT,而右手使用方向键。(并且它不会转义出插入模式:请注意每个条目末尾的“i”)。

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

我还在.vimrc中添加了行,以便我的方向键在正常模式下工作,在由一个逻辑行所包含的许多可视行中上下遍历(代码与上面的相同,只是您使用的是map或nmap而不是imap),我使用键盘的其他导航键ALT-KEY,都在插入模式中。

我为我的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> ^

My "within" insert-mode navigation short cuts utilize the ALT key with PgUp, PgDn, Home & End keys too, to jump around far more quickly. I use alt-pgup and alt-pgdn presses to jump forward or backward by sentences. And, I use alt-home and alt-end to jump to the beginning and end of my paragraph long logical lines. None of this escapes me out of insert mode. (I figured that I might as well program all the preassigned navigation keys to work quickly within insert-mode, without leaving it). And if I want to move one character at a time, I just let up on the ALT key while still using the arrow keys.

所有这些都是对.vimrc的简单修改。您可以发挥创意,做各种事情来改进插入模式下的导航。否则,如果在长行中使用插入模式下的普通ole箭头键,则需要在右手按住方向键的同时,左手拿着一杯咖啡来啜饮。那要花很长时间!

顺便说一下,这个键已经与所有其他正常模式导航命令一起工作了,比如h,j,k,l和w, w, b, b, e和search: /,%等。除了它会自动退出插入模式,而无需按ESC键。因此,使用正常模式导航字符会让你陷入正常模式,直到你努力再按i, i, a, a, o, o, o,我发现这很容易忘记。

Since the keyboards preassigned navigation commands: arrows: UP, DOWN, RIGHT, LEFT and PGUP, PGDN, HOME, END don't do anything special with the key, I found that I might as well map them out in .vimrc to help my navigation within insert-mode, while staying within insert-mode. And, to reiterate, its helpful to me because I work with very long text documents that have paragraph long logical-lines that span across a lot of visual-lines, and the arrow keys and h,j,k,l don't acknowledge the visual-lines. This fixes that particular problem, both within insert-mode and normal-mode.

我把这归功于我在Kim Schulz的HACKING VIM 7.2一书中找到的知识

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

imap h <Left>

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

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