而在插入模式在Vim,有任何方法来遍历文本移动一些字符向前和向后除了使用方向键?
如果我在插入模式下按下h, j, k和l,实际字符将打印在屏幕上,而不是在文本中移动。
我现在这样做的方式是不得不诉诸Ctrl + [(Esc)和遍历文本;但很明显,这是没有成效的。
而在插入模式在Vim,有任何方法来遍历文本移动一些字符向前和向后除了使用方向键?
如果我在插入模式下按下h, j, k和l,实际字符将打印在屏幕上,而不是在文本中移动。
我现在这样做的方式是不得不诉诸Ctrl + [(Esc)和遍历文本;但很明显,这是没有成效的。
当前回答
虽然您应该能够使用h j k l键在插入模式下遍历编辑器可能有意义,但这实际上不是Vim的使用方式!Vim提供了许多命令来使编辑变得更快更容易。
正确的方法是按Esc键,去你想做一个小的修正,修正它,返回并继续编辑。这是有效的,因为Vim有更多的运动比通常字符向前/向后/向上/向下。当你学到更多的时候,你就会更有效率。
下面是一些用例:
You accidentally typed "accifentally". No problem, the sequence EscFfrdA will correct the mistake and bring you back to where you were editing. The Ff movement will move your cursor backwards to the first encountered "f" character. Compare that with Ctrl+←→→→→DeldEnd, which does virtually the same in a casual editor, but takes more keystrokes and makes you move your hand out of the alphanumeric area of the keyboard. You accidentally typed "you accidentally typed", but want to correct it to "you intentionally typed". Then Esc2bcw will erase the word you want to fix and bring you to insert mode, so you can immediately retype it. To get back to editing, just press A instead of End, so you don't have to move your hand to reach the End key. You accidentally typed "mouse" instead of "mice". No problem - the good old Ctrl+w will delete the previous word without leaving insert mode. And it happens to be much faster to erase a small word than to fix errors within it. I'm so used to it that I had closed the browser page when I was typing this message...! Repetition count is largely underused. Before making a movement, you can type a number; and the movement will be repeated this number of times. For example, 15h will bring your cursor 15 characters back and 4j will move your cursor 4 lines down. Start using them and you'll get used to it soon. If you made a mistake ten characters back from your cursor, you'll find out that pressing the ← key 10 times is much slower than the iterative approach to moving the cursor. So you can instead quickly type the keys 12h (as a rough of guess how many characters back that you need to move your cursor), and immediately move forward twice with ll to quickly correct the error.
但是,如果您仍然想在不离开插入模式的情况下进行小型文本遍历,请遵循rson的建议并使用Ctrl+O。以我上面提到的第一个例子为例,Ctrl+OFf将移动到前面的“f”字符,并使您处于插入模式。
其他回答
我相信Home和End(以及PageUp/PageDn)在插入模式下也能正常工作,但除此之外,我不相信还有其他为文本遍历定义的标准键。
对于一些常用的动作和动作,我定义了以下映射。与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
在插入模式下,使用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
这将消除许多浪费的开关回到正常模式。
在GVim中,您可以使用鼠标。但说实话,使用方向键有什么错呢?它们在键盘上是有原因的。
您可以创建在插入模式下工作的映射。方法是通过inoremap。注意命令开头的“i”(noremap有助于避免键映射冲突)。推论是“n”代表“正常”模式。你可以猜测vim认为什么是“正常的”;)
然而,你真的想在文本中使用“正常”模式导航。Vim在这方面非常出色,所有这些功能都可以从普通模式中获得。Vim已经提供了从普通模式切换到插入模式的简单方法(例如,i, i, a, a, o, o),诀窍是让它更容易进入正常模式。这样做的方法是将escape重新映射到一个更方便的键。但你需要一个不会与你的常规打字冲突的键盘。我使用:
inoremap jj <Esc>
因为jj(两个j一个接一个的快速输入)似乎没有出现在我的词汇表中。其他的会重新映射到舒适的地方。
我做的另一个重要的改变是切换我键盘上的CAPSLOCK和CONTROL键(使用主机的键盘配置),因为我几乎从不使用CAPSLOCK,它有一个大而漂亮的按钮,就在我想要它的地方。(这对于Emacs用户来说很常见。缺点是当你发现自己在一个“不固定”的键盘上时!Aaarggh !)
一旦你重新映射CAPSLOCK,你可以轻松地使用以下插入模式重新映射:
请记住,有些键已经在插入模式下映射(默认情况下,反向kill-word是C-w (Control-w)),您可能已经有了想要的绑定。也就是说,我更喜欢C-h,所以在我的。vimrc中,我有:
inoremap <C-h> <C-w>
但是,你可能想在正常模式下获得同样的肌肉记忆痉挛,所以我也将C-h映射为:
nnoremap <C-h> db
(d)elete (b)ackwards用相同的关键和弦完成了同样的事情。这种快速编辑是我在实践中发现的一种有用的错别字。但是在文本中移动和删除前一个单词以外的任何事情都要使用正常模式。一旦你养成了改变模式的习惯(当然是使用重映射),它将比重映射插入模式更有效。