如何在vim中有效地添加括号或字符串?

时间:2015-03-15 21:45:54

标签: vim

在传统的文本编辑器中,每当我需要打开字符串或括号并在它之间键入内容时,我曾经这样做:

  1. 键入()""
  2. 按左
  3. 输入我需要的内容
  4. 按右键
  5. 但是在vim中(即如果我跟着vim way),这个过程变得相当繁琐,因为我必须进入正常模式才能移动很多次:

    1. 键入()""
    2. <ESC>
    3. i
    4. 输入我需要的内容
    5. <ESC>
    6. l
    7. a
    8. 如果在任何时候使用箭头键都不是一个好习惯,在vim中有更有效的方法来执行此类任务吗?

3 个答案:

答案 0 :(得分:2)

没有。在Vim中完成它与在“传统”编辑器中完全相同:

  1. 键入()""
  2. left
  3. 输入您需要的内容
  4. right
  5. 但是......你为什么不输入开场角色,你想要在对内,然后是结束角色?

    1. 键入("
    2. 输入您需要的内容
    3. 键入)"
    4. 太简单了?

答案 1 :(得分:2)

实际上很容易在映射中自动附加那些结束字符,并将光标放在您想要的位置。诀窍是做到这一点,而不是搞乱撤消/重做/重复动作。问题是插入模式下的光标移动命令会破坏&#34;撤消序列&#34;这样,移动光标后所做的任何更改都会与移动光标前所做的更改分开撤消。

警告:以下信息可能会过时

有很多插件可以自动附加这些字符(参见Vim wiki page for appending closing characters的部分列表),而在Vim 7.4之前,其中一些插件甚至还有复杂的解决方法来保持撤销序列的完整性。不幸的是,他们都依赖于Vim中的一个错误,该错误已在7.4版本中得到修复。

add a cursor movement that does not break undo有一个补丁,所以如果你想要compile Vim yourself,你可以抓住那个补丁并使用如下所示的映射(不需要插件!)来做你想做的事:

inoremap            (          ()<C-G>U<Left> 
inoremap <expr>     )          strpart(getline('.'), col('.')-1, 1) == ")" ? "\<C-G>U\<Right>" : ")" 

这些映射将插入&#34;()&#34;当你键入一个开口(将光标放在括号之间。当你输入&#39;)时,#39;已经关闭&#39;)&#39;在光标之后,Vim将跳过括号而不是插入新的括号。光标移动前面是<C-G>U,这是上述补丁添加的功能,允许后续光标移动不会中断撤消序列(只要移动全部在一行中)。

自Vim 7.4.663起,该补丁尚未正式纳入。

答案 2 :(得分:0)

我认为在正常模式下使用箭头键移动是不好的做法,但在你的情况下;在插入模式下移动一个空格,我可能会说使用箭头键可能是最好的做法。

如果你已经死定了,那么你可以使用<i_ctrl-o>

:help i_ctrl_o

CTRL-O      execute one command, return to Insert mode   *i_CTRL-O*

因此,在插入模式下,您可以键入:()<ctrl-o>h<xxx><ctrl-o>l,其中<xxx>是括号中的任何内容。

不幸的是,如果光标位于该行的最后一个字符上,那么它不起作用,如果你输入的话很可能就是这样。

要解决该问题,请执行:set virtualedit+=onemore或将其添加到~/.vimrc文件中。

请注意,此解决方案比使用箭头键更容易击键,但您不需要将手移离主行,因此无论如何它都可能更快。