Answers:
您似乎滥用了vim,但这可能是由于对它不甚了解。
正确的方法是按Esc,转到要进行小的校正的位置,将其修复,然后返回并继续进行编辑。这是有效的,因为Vim的动作要比平常的角色前进/后退/上/下动作更多。了解更多这些知识之后,这将变得更有成效。
这里有几个用例:
但是,如果您仍然想在不离开插入模式的情况下进行小的文本遍历,请遵循rson的建议并使用Ctrl+ O。以我上面提到的第一个示例为例,Ctrl+ OFf会将您移至上一个“ f”字符,并使您进入插入模式。
Ctrl+o
普通模式发出单个命令。有时这可以使您到达想要的位置,尤其是与t / T和f / F运动命令结合使用时。
:h ins-special-keys
。ctrl-h
::退格,ctrl-w
:删除单词,ctrl-u
:删除到行首,alt-b
:返回单词。
而在插入模式,使用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
这些将消除许多浪费的切换回正常模式的麻烦。
尽管Pavel Shved 说了什么-习惯于Escaping插入模式可能更可取-这是在插入模式下快速导航的一组示例映射:
" 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
在“普通”模式下键入“ start”来打开它)。
由于Alt默认情况下未将修饰键映射到(重要的内容),因此您可以以相同的方式将其他(或全部)功能从“普通”模式拉到“插入”模式。例如:
用Alt+ 移到当前单词的开头b:
inoremap <A-b> <C-o>b
inoremap <A-w> <C-o>w
值得一提的是,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)
(没有明显的内置热键可在插入模式下移动。)
这组映射,使上部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
Alt
钥匙吗?
如果您是vim纯粹主义者,请跳过阅读此答案。OTOH,如果您是vim的新手,并且正在寻找数百条vim教程和博客中找不到的有用提示,请继续阅读... :-)
现在是2014年,作为最近回到vim
我身边的人,我可以提供一些可能相反的观点和技巧。
尽管重复在vim中是一个强大的概念,但我(个人)感到奇怪,使用重复会迫使我计数(行,字符,单词等)或进行猜测。我的大脑通常像“我希望光标在那里 ”而不是“我想要光标_5_words_to_the_left_”一样工作。能够快速移动光标,并以这种方式直观地观察插入点的位置,这使我可以专心于正在编辑的内容,而不必计算要到达所需编辑位置的跳数。
...浏览大量文本。
大多数(所有)现代计算机都具有与键盘紧密集成的触摸板(例如MacBook)。工业设计师花了很多年的时间来优化这些设计,以使不得不将手从键盘上移开的旧问题不再是一个真正的问题。好的,这是如果您习惯了鼠标并且不喜欢切换,但是对于vim新手(例如可能通过搜索找到此帖子的人)来说,这应该不是什么大问题。
启用鼠标后,单击和拖动具有切换到可视模式并标记要拉动的区域的效果。
使用鼠标(滚轮)滚动并单击以定位光标(duh)即可。有关更多信息,请参见http://usevim.com/2012/05/16/mouse/。
这些就是我所说的更现代的(使用鼠标,滚轮等)在vim中导航的方式,同样有效,具体取决于您对输入的偏好。
高温超导
在GVim中,您可以使用鼠标。但是说实话,使用箭头键有什么问题?它们在键盘上是有原因的。
为了在插入模式下获得更好的导航,为什么不映射一些键?
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>
切换到正常模式并返回一个字
我相信Home和End(和PageUp/ PageDn)在插入模式下也可以正常工作,但是除此之外,我不认为还有其他用于文本遍历的标准键。
您可以创建在插入模式下工作的映射。做到这一点的方法是通过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后,可以轻松使用以下插入模式重新映射:
请记住,有些键已经在插入模式下映射(默认情况下,backward-kill-word是Cw(Control-w),您可能已经有了想要的绑定。也就是说,我更喜欢Ch,所以在我的.vimrc文件中:
inoremap <C-h> <C-w>
但是,您可能希望在正常模式下出现相同的肌肉记忆痉挛,因此我还将Ch映射为:
nnoremap <C-h> db
(d)缩小(b)击键用相同的和弦完成相同的操作。这种快速编辑是我发现在实际操作中对错别字有用的一种。但是,请坚持使用普通模式来移动文本,而不仅仅是杀死前一个单词。一旦您习惯了更改模式的习惯(当然使用重映射),它将比重新映射插入模式更加有效。
您可以用来imap
将插入模式下的任何键映射到光标键之一。像这样:
imap h <Left>
现在h就像在正常模式下一样移动光标。(以这种方式映射h显然是一个错误的选择)
话虽如此,我认为使用VIM在文本中四处移动的标准方式并不“有效”。在普通模式下有很多非常强大的方式遍历文本(例如使用w和b或/和?或f和F等)
对于一些经常使用的动作和动作,我定义了以下映射。与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
imap jk <Esc>
),这也很有用,这样您就不必中断动量并跨键盘来按下键。