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

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

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


当前回答

抱歉,vim不是这样工作的。

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

其他回答

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

插入模式

运动

hjkl

尽管Pavel Shved说过——习惯转义插入模式可能更可取——这里有一个在插入模式下快速导航的映射示例集:

" provide hjkl movements in Insert mode via the <Alt> modifier key
inoremap <A-h> <C-o>h
inoremap <A-j> <C-o>j
inoremap <A-k> <C-o>k
inoremap <A-l> <C-o>l

这将使插入模式下的Alt+h向左移动一个字符,Alt+j向下,以此类推,类似于普通模式下的hjkl。

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

任何正常模式移动

因为默认情况下Alt修饰键没有映射到(重要的东西),所以您可以以同样的方式将其他(或所有)功能从普通模式拉到插入模式。例如: 用Alt+b移动到当前单词的开头:

inoremap <A-b> <C-o>b
inoremap <A-w> <C-o>w

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

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

" Insert the rest of the line below the cursor.
" Mnemonic: Elevate characters from below line
inoremap <A-e> 
    \<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 <A-y> 
    \<Esc>
    \kl
        \y$
    \hj
        \p
        \a

(我使用了行续和缩进来增加清晰度。这些命令就像写在一行上一样。)

内置热键编辑

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 <A-h> <Left>
cnoremap <A-j> <Down>
cnoremap <A-k> <Up>
cnoremap <A-l> <Right>

或者,这些映射将移动同时添加到插入模式和命令行模式:

" provide hjkl movements in Insert mode and Command-line mode via the <Alt> modifier key
noremap! <A-h> <Left>
noremap! <A-j> <Down>
noremap! <A-k> <Up>
noremap! <A-l> <Right>

将普通模式命令拉到命令行模式的映射命令看起来与插入模式映射命令有点不同(因为命令行模式缺少插入模式的Ctrl+O):

" Normal mode command(s) go… --v <-- here
cnoremap <expr> <A-h> &cedit. 'h' .'<C-c>'
cnoremap <expr> <A-j> &cedit. 'j' .'<C-c>'
cnoremap <expr> <A-k> &cedit. 'k' .'<C-c>'
cnoremap <expr> <A-l> &cedit. 'l' .'<C-c>'

cnoremap <expr> <A-b> &cedit. 'b' .'<C-c>'
cnoremap <expr> <A-w> &cedit. 'w' .'<C-c>'

内置热键移动和编辑

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

是的,有办法。您可以在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一书中找到的知识

抱歉,vim不是这样工作的。

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

Vim社区的许多人认为不应该在插入模式下导航,因为这不是Vim的方式。我认为这是在从标准编辑器过渡到Vim时学到的错误观点。

当您使用Vim的工具创建原子的、可重复的操作或查找时,Vim是最强大的。

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

如果您在输入文本时出错,并退出插入模式来修复它,您将无法重复预期的操作。将重复修正。

Vim支持许多插入模式导航键。显然有方向键、Home键和结束键,但还有许多其他快捷键。参见:h ins-special-keys。