在“插入”模式下遍历文本

时间:2009-11-15 10:16:17

标签: vim vi

在Vim的插入模式中,除了使用箭头键之外,有没有办法遍历文本向前和向后移动一些字符?

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

我现在这样做的方法是不得不诉诸 Ctrl + [ Esc )并遍历文本然后;但显然这没有效果。

12 个答案:

答案 0 :(得分:605)

你似乎误用了vim,但这可能是由于对它不太熟悉。

这是有效的,因为Vim比通常的前进/后退/上/下有更多的动作。在您了解更多内容之后,这将更有效率。

以下是几个用例:

  • 你不小心输了“accifentally”。没问题,序列 Esc F f r d A < / kbd>将纠正错误并将您带回您正在编辑的位置。 F f 移动会将光标向后移动到第一个遇到的“f”字符。与 Ctrl + Del d 结束,它在休闲编辑器中几乎完全相同,但需要更多按键,让你的手移出键盘的字母数字区域。
  • 您不小心输入了“您不小心输入”,但想要将其更正为“您有意输入”。然后 Esc 2 b c w 将删除您要修复的单词带您进入插入模式,这样您就可以立即重新输入。要返回编辑,只需按 A 而不是结束,这样您就不必移动手来到达 End 键。
  • 您不小心输入了“鼠标”而不是“鼠标”。没问题 - 好的旧 Ctrl + w 将删除前一个单词而不离开插入模式。擦除一个小字恰好比修复其中的错误要快得多。我已经习惯了,当我输入这条消息时我关闭了浏览器页面......!
  • 重复计数在很大程度上未得到充分利用。在进行移动之前,您可以输入一个数字;并且运动将重复这么多次。例如, 1 5 h 将使光标返回15个字符并且 4 j 将光标向下移动4行。开始使用它们,你很快就会习惯它。如果你错误地从光标返回10个字符,你会发现按下键10次比移动光标的迭代方法要慢得多。所以你可以快速输入键 1 2 h (粗略猜测你需要移动光标的字符数) ,并立即使用 l l 向前移动两次,以快速纠正错误。

但是,如果仍然希望在不离开插入模式的情况下进行小型文本遍历,请按照rsonadvice并使用 Ctrl + 0 。以我上面提到的第一个例子为基础, Ctrl + O F f 将您带到前一个“f “字符,让你处于插入模式。

答案 1 :(得分:123)

插入模式时,使用 Ctrl O 只能执行一个命令普通模式:< / p>

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

这些将消除许多浪费的开关回到正常模式。

答案 2 :(得分:89)

插入模式

运动

hjkl

尽管Pavel Shved said - 可能更习惯于习惯 Esc aping插入模式 - 这里是一组用于在插入模式下快速导航的映射:< / p>

" 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 向下并且依此类推,类似于普通模式下的 h j k l

您必须将该代码复制到vimrc文件中,以便在每次启动vim时加载它(您可以通过在普通模式下键入: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

(我使用\ line continuation和缩进来提高清晰度 - 命令被解释为写在一行上。)


用于编辑的内置热键

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 + 0 ):

" 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

答案 3 :(得分:23)

如果您是vim purist,请跳过阅读此答案。 OTOH,如果你是vim的新手,正在寻找一些你在一百个vim教程和博客中找不到的有用技巧,请继续阅读...: - )

一些非正统(vim)方式

2014年,作为最近回到vim的人,我可以提供一些潜在的逆向观点和提示。

使用shift + left或shift + right来遍历单词

虽然重复在vim中是一个强大的概念,但我(个人)发现使用它或者强迫我计算(行,字符,单词等)或猜测是很奇怪的。我的大脑通常像#34;我希望光标在那里&#34;并且不喜欢&#34;我想要光标_5_words_to_the_left _&#34;。能够快速移动光标,并以可视方式观察插入点的位置,这样我就可以将注意力放在我编辑的内容上,而不必计算我需要做多少跳,才能到达我需要的地方编辑。

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

...导航大量文本。

大多数(所有)现代计算机都有一个与键盘紧密集成的触摸板(例如MacBooks)。工业设计师花了很多年时间来优化这些设计,因此不得不将手从键盘上移开的老问题不再是真正的问题。好吧,如果你已经习惯了鼠标并且不喜欢切换,那么对于任何刚接触vim的人(比如那些可能通过搜索找到这篇文章的人),这应该不是什么大问题。 / p>

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

启用鼠标后,单击并拖动可以切换到可视模式并标记区域以进行移动。

并使用滚轮

使用鼠标(滚轮)滚动,然后单击以定位光标(duh)。有关详情,请参阅http://usevim.com/2012/05/16/mouse/

所以......

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

HTH

答案 4 :(得分:14)

Vim社区中的许多人认为你不应该在插入模式下导航,它不是Vim方式。我认为从标准编辑器转换到Vim时,这是一种不正确的情绪。

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

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

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

Vim确实支持许多插入模式导航键。显然有箭头键,Home和End,但也有许多其他快捷方式。请参阅:h ins-special-keys

答案 5 :(得分:4)

在GVim中,您可以使用鼠标。但老实说,使用箭头键有什么问题?这就是为什么他们在键盘上的原因。

答案 6 :(得分:4)

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

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>

转换为正常模式并返回单词

答案 7 :(得分:2)

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

答案 8 :(得分:1)

您可以创建在插​​入模式下工作的映射。这样做的方法是通过inoremap。注意命令开头的'i'(noremap对于避免键映射冲突很有用)。 “正常”模式的推论是'n'。你可以推测vim认为'正常';)

然而,你真的想使用'普通'模式在文本中导航。 Vim在这种情况下非常出色,所有功能都可以从普通模式中获得。 Vim已经提供了从普通模式到插入模式的简单方法(例如,i,I,a,A,o,O)。诀窍是让它很容易进入正常模式。这样做的方法是将转义重新映射到更方便的密钥。但是你需要一个不会与你的常规打字冲突的。我用:

inoremap jj <Esc>

因为jj(那是2 j的一个接一个地快速输入)似乎没有出现在我的词汇表中。其他的将重新映射到舒适的地方。

我做的另一个重要改变是切换键盘上的CAPSLOCK和CONTROL键(使用主机的键盘配置),因为我几乎从不使用CAPSLOCK,它有一个大而美的按钮就在我想要的地方。 (这对于Emacs用户来说很常见。缺点是当你发现自己处于'不固定'键盘时!Aaarggh!)

重新映射CAPSLOCK后,您可以轻松使用以下插入模式重映射:

请记住,某些键已经在插入模式下映射(默认情况下,backwards-kill-word是Cw(Control-w),您可能已经拥有了所需的绑定。也就是说,我更喜欢Ch。 vimrc我有:

inoremap <C-h> <C-w>

但是,在正常模式下你可能想要相同的肌肉记忆痉挛,所以我也将C-h映射为:

nnoremap <C-h> db

(d)elete(b)ackwards使用相同的键和弦完成相同的操作。这种快速编辑是我在拼写错误的实践中发现的一种。但坚持正常模式在文本中移动,而不是杀死前一个单词。一旦你养成改变模式的习惯(当然使用重映射),它将比重新映射插入模式更有效。

答案 9 :(得分:0)

很抱歉,但是vim不会那样工作。

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

答案 10 :(得分:0)

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

imap h <Left>

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

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

答案 11 :(得分:0)

对于一些常用的动作和动作,我定义了以下映射。与CTRL + O组合相比,这样可以节省击键次数,并且由于我经常需要它们,所以长期来看,它们会有所回报 跑。

JuliaCall