如何在插入模式下遍历文本?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (80)

在vim中使用插入模式的时候,除了通过使用箭头,是否还会有别的方法来遍历文本并将一些字符左右移动?

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

我想要通过Ctrl+[(Esc)来遍历文本,但显然这是无效的。

提问于
用户回答回答于

可以通过摁ESC来解决这个问题,然后在出现错误的地方对它进行修正,然后再返回继续编辑。这很有效,因为Vim比向前/向后/向上/向下的字符来说移动更灵活

以下有几个用例:

  • 你不小心输入了“accifentally”,不过序列EscFfrdA会纠正错误,并将你带回原来编辑它的位置。Ff移动会使你回到遇到的第一个“f”字符。 与Ctrl + < - > - > - > - > deldEnd进行比较,它在随便编辑器中的功能几乎相同,但点击键盘的次数会增多,使你可以将手移出键盘的字母数字空间。
  • 你不下心地输入了“你意外键入的内容”,但想要将其改正为“你有意输入的内容”。 可以通过Esc2bcw来删除你想修复的单词并进入插入模式,以便你立即重新输入。 可以通过A而不是End来返回编辑状态。
  • 你不小心输入了了“mouse”而不是“mice”。Ctrl + W会删除前一个单词,但并不会从插入模式中移出。
  • 重复计数在很大程度上被利用不足。在进行移动之前,你可以输入一个数字; 并且运动将重复这个次数。 例如,15小时将带回15个字符,4j将向下滚动4行。 而且你会发现你按10次< - 键会比移动光标的迭代方法快,当你输入12h时,注意你会返回一个错误,并且可以立即用ll来更正。

但是如果你仍然想在不离开插入模式的情况下执行小文本遍历,可以采纳rson的建议来使用Ctrl+O。例如,ctrl+of+f会将你移到前面的f字符并让你进入插入模式。

用户回答回答于

vim的工作方式不是这样的。

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

用户回答回答于

可以通过inoremap来创建在插入模式下工作的映射。 注意命令开头的'i'(noremap对避免关键映射冲突很有用)。

当你想要使用“普通”模式在文本中导航的时候,Vim在这种情况下是具有特权的,所有值都可以从正常模式中获得。并且Vim已经提供了从正常模式到插入模式(例如,i,i,a,A,o,O)的简单方法。可以通过转义重新映射到一个更合适的键来进入正常模式。但是你需要一个不会与你的常规打字相冲突的输入键,以下为我使用的方法:

inoremap jj <Esc>

由于jj(这是2j一个接一个很快地输入)并没有出现在我的词汇表中, 其他的将重新映射到更合适的地方。

我做的另一个重要的改变是切换我的键盘上的CAPSLOCK和CONTROL键(使用主机的键盘配置)。(这对于Emacs用户来说很常见,缺点是你会发现自己在一个'未固定'的键盘上)

重新映射capslock之后,你可以轻松地使用以下插入模式映射:

请记住,某些键已经在插入模式中映射(默认情况下,backwards-kill-word为C-w(Control-w)),并且我更喜欢在.vimrc中使用C-h:

inoremap <C-h> <C-w>

所以我还将C-h映射为:

nnoremap <C-h> db

(d)elete (b)ackwards用同样的键值来完成同样的事情。但是要坚持用正常模式在文本中移动,而不是直接删除前面的单词。一旦你养成了改变模式的习惯(当然要使用重新映射),它将比重新映射插入模式更有效。

用户回答回答于

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

用户回答回答于

可以通过映射键来在插入模式下有一个更好的导航:

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

如果你可以解决在终端中使Meta键工作的话,那么就可以更好地模拟emacs模式。在正常模式下的导航更好,但对于较短的移动,它有助于保持插入模式。

对于长跳转来说,我更喜欢以下的默认转换:

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

这将转换到正常模式并返回一条语句。

用户回答回答于

在GVim中,你可以使用鼠标,但实际上我想知道使用箭头键的意义是什么?

用户回答回答于

Vim工具在创建自动的、可重复的操作或查找时,功能是最强大的。

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

如果你在输入文本时出错,并通过退出插入模式来修复它,这将导致无法重复预期的操作,.会进行重复修正。

Vim支持许多插入模式导航键, 例如箭头键,Home和End,但也有很多其他快捷键。 具体请参阅:h ins-special-keys

用户回答回答于

使用Shift+left或Shift+right遍历语句

虽然重复是vim中的一个强大的概念,但是我(个人)发现使用它会迫使我计算(行,字符,单词等)。 我的想法通常是“我想要光标在那里”而不是像“我想要光标像_5_words_to_the_left_”那样工作。 能够快速移动光标,并通过这种方式直观地观察插入点的位置,使我能够随时了解自己正在编辑的内容,而不必计算需要进行多少距离才能到达需要编辑的位置。

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

浏览大量文本

大多数(所有)现代计算机都有一个TouchPad这与键盘(例如MacBook)紧密结合在一起。工业设计师花了很多年来对这些设计进行优化,对于任何刚开始使用vim的人这应该不是什么大问题。

单击+拖动进入可视模式。

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

使用滚轮

使用鼠标(滚轮)滚动,然后单击以定位光标(duh)即可。

更多信息:http://usevim.com/2012/05/16/mouse

以上就是我说的更现代(使用鼠标、滚动轮等)的导航方式

用户回答回答于

插入模式,使用Ctr+lO访问正常模式只有一个命令:

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

用户回答回答于

插入模式

Movement

hjkl

遍历文本输入-更可取的做法是转义插入模式,以下是一组用于插入模式内快速导航的映射示例:

" 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。

每次启动vim时,都必须将该代码复制到vimrc文件中才能加载(你可以在正常模式下输入:new $myvimrc)。

任何正常模式运动

由于Alt修饰符键在默认情况下没有映射(到一些重要的东西),所以你可以以同样的方式将其他(或全部)功能从正常模式拉到插入模式。例如:

通过Alt+b来将当前语句移动到开头:

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

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

值得一提的是,Alt键的使用可能比复制正常模式的办法更好,以下代码是从当前列的部分复制到行尾的映射。

" 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

vim documentation

编辑键

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

扫码关注云+社区