在Vim的“插入”模式下,除了使用箭头键之外,还有什么方法可以向前或向后移动一些字符?

如果在“插入”模式下按h,j,k和l ,实际的字符会显示在屏幕上,而不是在文本中移动。

我目前的操作方式是必须使用Ctrl + [(Esc)并遍历文本;但显然这没有效果。

评论

顺便提一句:如果将转义映射到更近的按键组合(即imap jk ),这也很有用,这样您就不必打破动力就可以跨键盘来按下键了。

我喜欢将它()映射到kj而不是jk;我的同伴朋友迪克斯特拉应该受到指责!

我有jk和kj,所以我就像用两个手指按下一个大按钮一样,对我回到正常状态的顺序都没关系。

#1 楼

您似乎滥用了vim,但这可能是由于对vim不太熟悉。

正确的方法是按Esc键,转到要进行小的更正的位置,进行修复,然后再返回继续编辑。之所以有效,是因为Vim的动作要比平常的角色前进/后退/上/下动作多得多。了解更多这些知识之后,这将变得更有效率。

以下是两个用例:


您不小心键入了“ accifently”。没问题,序列EscFfrdA将纠正错误,并使您返回到编辑位置。 Ff移动会将光标向后移动到第一个遇到的“ f”字符。将其与Ctrl +←→→→→DeldEnd进行比较,后者在休闲编辑器中的功能几乎相同,但是需要更多的击键,并使您的手移出键盘的字母数字区域。
您不小心键入了“您不小心键入了但您想将其更正为“您有意输入”。然后,Esc2bcw将清除您要修复的单词并使您进入插入模式,因此您可以立即重新输入该单词。要返回到编辑状态,只需按A而不是End,这样就不必动手就可以到达End键。
您不小心输入了“ mouse”而不是“ mice”。没问题-老式的Ctrl + w会删除前一个单词而不会离开插入模式。而且,擦除一个小字比修复其中的错误要快得多。我已经习惯了,当我键入此消息时关闭了浏览器页面...!
重复计数在很大程度上没有得到利用。进行移动之前,您可以输入数字。并且移动将重复此次数。例如,15h将使光标返回15个字符,而4j将使光标向下移动4行。开始使用它们,您很快就会习惯。如果您从光标后面错了十个字符,您会发现按←键10次要比迭代移动光标慢得多。因此,您可以改而快速键入键12h(粗略地猜测,您需要向后移动几个字符),并立即用ll向前两次前进以快速纠正错误。

但是,如果您仍然希望在不离开插入模式的情况下进行小的文本遍历,请遵循rson的建议并使用Ctrl + O。以我上面提到的第一个示例为例,Ctrl + OFf会将您移至上一个“ f”字符,并使您进入插入模式。

评论


+1出色的回答,并感谢您提供的所有示例!

– Andreas Grech
09年11月15日13:35

还值得注意的是,您可以在正常模式下使用Ctrl + o发出单个命令。有时这可以使您到达想要的位置,特别是与t / T和f / F运动命令结合使用时。

–兰迪·莫里斯(Randy Morris)
09年11月16日在0:27

“您似乎滥用了vim,但这很可能是您不太熟悉它。”居高临下。没有?

– David Rivers
2011年3月12日18:00

这是对如何正确使用Vim的深刻见解。但是,我发现按“ Esc”是很痛苦的,因此我认为值得指出的是,您可以将一个更易于访问的键映射到该功能,例如“ imap jj ”。

–对称
2012年4月15日的1:07

要纠正错字,您不应该离开插入模式。 Vim功能强大,因为您可以创建原子的,可重复的动作。插入错字并加以修正会创建两个单独的动作。纠正错字的正确方法是在不离开插入模式的情况下进行操作。如果那意味着使用箭头键导航到那里,那很好。 Vim确实有一些键绑定可以在插入模式下导航。检查:h ins-special-keys。 ctrl-h:退格键,ctrl-w:删除单词,ctrl-u:删除至行首,alt-b:返回一个单词。

–everett1992
13年4月21日在23:41

#2 楼

在插入模式下,只需按一个命令即可使用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


这些将消除许多浪费的切换回普通模式的操作。

评论


谢谢。这应该被认为是正确的答案。它实际上是有帮助的。

– Atcold
16 Mar 2 '16 at 20:56

在我的Mac上,它是小写字母o而不是大写字母O。这与“标准vim”不同吗?我看到很多地方它们似乎都是大写的(除非那只是草率的写作)。你确定吗?

–花
17年12月15日在15:13

好的,非常有用。但是,我很难找到一个有趣的组合,这是删除行。意外插入行时要做的事被低估了。

–帕特里克
18年4月4日在13:11

@Floris Vim不能区分ctrl组合的大小写字母。这就是为什么无法映射ctrl + shift +某物的原因。

–马哈茂德·古德西(Mahmoud Al-Qudsi)
18年9月8日在18:25

CTRL-H是现金。不敢相信我浪费了多少键盘遍历来获取Backspace键。

–J.M. Janzen
20年7月20日在19:40

#3 楼

插入模式

运动

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。

每次启动vim时,都必须将该代码复制到vimrc文件中以进行加载(可以通过在普通模式下键入:new $myvimrc来打开它)。 br />


任何普通模式下的运动

由于默认情况下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


(我使用\的行连续和缩进来增加清晰度-命令解释为好像写在一行上。)



用于编辑的内置热键

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

评论


@YugalJindle:谢谢! :)我现在添加了有关调整命令行模式的信息。 (此方法与“插入”模式有些不同。)

–亚伦·托马
2014年1月18日,12:24

@Zen:“ winkey”是什么意思?我没有在答案中引用Windows键。您是指Alt键吗?

–亚伦·托马
2015年4月8日13:39



Shift-向左/向右移动整个单词!!我怎么不知道谢谢。

–花
17年12月14日23:38

实际上在终端模式下,alt会在您的命令之前自动发送esc.......。

–保险丝团队
19年8月30日在17:34

#4 楼

如果您是vim纯粹主义者,请跳过阅读此答案。 OTOH,如果您是vim的新手,并且正在数百个vim教程和博客中找不到一些有用的提示,请继续阅读... :-)

一些不合常规的东西(vim)方式

现在是2014年,作为最近回到vim的人,我可以提供一些可能相反的观点和技巧。

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

虽然重复在vim中是一个强大的概念,但我(个人)感到奇怪,使用重复会迫使我计数(行,字符,单词等)或猜测。我的大脑通常像“我希望光标在那里”而不是“我希望光标_5_words_to_the_left_”一样工作。能够快速移动光标,并以这种方式直观地观察到插入点的位置,这使我可以专心于正在编辑的内容,而不必计算要到达所需编辑位置的跳数。

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

...来导航大文本正文。

大多数(全部)现代计算机具有与键盘紧密集成的触摸板(例如MacBook)。工业设计人员花了很多年的时间来优化这些设计,从而使原来必须将手从键盘上移开的旧问题不再是真正的问题。好的,这是如果您习惯了鼠标并且不喜欢切换,但是对于vim新手(例如可能通过搜索找到此帖子的人)来说,这应该不是什么大问题。 >
作为奖励,单击+拖动使您进入可视模式

在启用鼠标的情况下,单击和拖动具有切换到可视模式并标记要拉动区域的效果。

并使用滚轮

使用鼠标(滚轮)滚动,然后单击以定位光标(duh)即可。有关更多信息,请参见http://usevim.com/2012/05/16/mouse/。因此...

这些就是我所说的更现代的(使用鼠标,滚轮等)在vim中导航的方式,同样有效,具体取决于您对输入的偏好。

HTH

评论


@MilesRout是的,我有免责声明。但实际上,我认为有很大一部分vim用户的大脑工作与我的相同。那就是...我的大脑通常像“我希望光标在那里”而不是“我想要光标5_words_to_the_left”一样工作。传统的vim方式对那些人来说效果不佳。我喜欢vim,因为a)它随处可见,并且b)具有强大的功能。但是,我不认为需要遵循所有默认机制。

– Shyam Habarakada
14-10-14在23:08

@MilesRout在vim中,围绕这种事情有很多宗教信仰,所以我不会就此与您辩论。重复计数方法对我无济于事,被接受的答案也称其为未充分使用的东西。我只能猜测为什么会这样。使用w,b等导航到附近的地方都很棒,但是如果走得更远,鼠标滚轮对我来说要好得多。干杯。

– Shyam Habarakada
14-10-17在0:58



+1。我不明白这一点。有免责声明。如果喜欢,请接受;如果不喜欢,请跳过。

–fangmobile
15年10月12日在20:32

这是一个非常有用的答案

– Slava
2015年11月9日在8:57

作为最近刚搬到VIM的人,我发现这个答案的前提是绝对正确的,能够立即告诉将光标定位到给定位置所需的重复次数的功能可能会或可能不会附带经验。现在,就像@ShyamHabarakada一样,我的大脑无法正常工作。不管这有多么不合常规,我个人都会将fn + hjkl重新映射到箭头键以进行很小的移动。对于大动作,我通常会估算一些重复,然后对这些重复进行微调。对我来说,那是我所能尽快得到的。

– Jacoscaz
2015年11月12日11:11



#5 楼

Vim社区中的许多人认为您不应以“插入”模式导航,这不是Vim的方式。从标准编辑器过渡到Vim时,我认为这是一种错误的认识。

使用Vim的工具创建原子的,可重复的动作或发现时,Vim最强大。

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

如果输入文本时出错,并退出了“插入”模式以解决该问题,将无法重复执行预期的操作,请执行以下操作:.将重复校正。

Vim支持许多插入模式导航键。显然,有箭头键,“主页”和“结束”,但还有许多其他快捷键。请参阅:h ins-special-keys

#6 楼

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

评论


但这并不适合vim用户。 vim的主要优势之一是,您可以做各种事情,而不必花费时间将手从键盘上移开。特别是hjkl的动作。

–亚伦·托马
2011年6月13日23:27

我同意@ammoQ。使用箭头键没有问题。如果使用箭头键可以提高工作效率,请选择它。

–宋恩宇
13年2月20日在18:36

赞:使用vi时,我使用hjkl的次数要多于箭头键,但是在模式之间进行切换已成为我的潜意识动作。

– Erich Kitzmueller
13年2月21日在20:20

#7 楼

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

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>


这将转换为普通模式并返回一个单词

#8 楼

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

评论


但是可能没有任何方法可以仅使用字母键来遍历文本吗?

– Andreas Grech
09年11月15日在10:25

当然可以,如果您不想输入某些字母...;)

–霍布斯
09年11月15日在10:33

@hobbs ctrl + hjkl怎么样?那应该说得通

–user405205​​4
19年3月19日在17:45



#9 楼

抱歉,vim无法正常工作。

您应该切换到“普通”模式,浏览,然后再返回以再次插入。

#10 楼

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

但是,您确实想使用'normal'模式浏览文本。 Vim在这种情况下超级出色,所有功能都可以从正常模式获得。 Vim已经提供了从普通模式转换为插入模式的简便方法(例如i,I,a,A,o,O)。诀窍是使其易于进入正常模式。这样做的方法是将转义重新映射到更方便的键。但是,您需要一种不会与常规键入冲突的内容。我使用:

inoremap jj <Esc>


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

我所做的另一个重要更改是切换键盘上的CAPSLOCK和CONTROL键(使用主机的键盘配置),因为我几乎从不使用CAPSLOCK,并且它具有那个大而漂亮的按钮就在我想要的地方。 (这对于Emacs用户来说很常见。缺点是当您发现自己处于“未固定”的键盘上!Aaarggh!)

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

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

inoremap <C-h> <C-w>


但是,您可能希望在正常模式下出现相同的肌肉记忆痉挛,因此我也将Ch映射为:

nnoremap <C-h> db


(d)取消(b)ackwards可以用相同的和弦完成相同的操作。这种快速编辑是我发现在实际操作中对错别字有用的一种。但是请坚持使用普通模式来移动文本,除了杀死前一个单词以外,还要做其他事情。一旦习惯了更改模式的习惯(当然使用重映射),它将比重新映射插入模式更加有效。

评论


很好的逃脱重映射-我认为除了音译阿拉伯语外,它几乎可以用于其他任何方面!

– jjt
15年12月18日在22:23

#11 楼

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

imap h <Left>


现在h的工作方式与普通模式一样,即移动光标。 (以这种方式映射h显然是一个错误的选择)

我已经说过,我认为使用VIM在文本中四处移动的标准方法并不“没有效果”。在普通模式下有很多非常强大的方式遍历文本(例如使用w和b或/和?或f和F等)。

评论


我并不是说在vim中浏览文本的标准方法没有效果;我说的是不得不退出插入模式以返回几个字符然后又不得不返回以进行插入有点“烦人”。但是再说一次,也许这是因为我还不太习惯vim :)

– Andreas Grech
09年11月15日在10:47

这是我一直在寻找的解决方案。我使用imap (我知道它会删除一个字符,但是我有退格键),这就是我所需要的,谢谢。

–user405205​​4
19年3月19日在17:51

#12 楼

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