【问题标题】:How to efficiently add parentheses or a string in vim?如何在vim中有效地添加括号或字符串?
【发布时间】:2015-05-17 23:02:52
【问题描述】:

在传统的文本编辑器中,每当我需要打开一个字符串或括号并在它们之间输入一些内容时,我都会这样做:

  1. 键入()""
  2. 按左键
  3. 输入我需要的内容
  4. 向右按

但是在 vim 中(也就是说,如果我遵循 vim way)这个过程变得相当乏味,因为我必须进入正常模式才能移动很多次:

  1. 键入()""
  2. <ESC>
  3. i
  4. 输入我需要的内容
  5. <ESC>
  6. l
  7. a

如果在任何时候使用箭头键都不是一个好习惯,那么在 vim 中有没有更有效的方法来完成这种任务?

【问题讨论】:

  • 你可以按A而不是la
  • 在 vim 中这样做,你通常不会先写 "" 或 (),而只是开始 " ,写字符串并在退出插入模式之前再次以 " 结束。跨度>
  • 你也可以试试github.com/tpope/vim-surround
  • 这是一个奇怪的特定用例。我不知道你用 Vim 做什么,但我个人不会为额外的笔画出汗。

标签: vim


【解决方案1】:

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

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

有很多插件可以自动附加这些字符(请参阅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>" : ")" 

这些映射会在你输入一个开头 () 时插入 "()",将光标放在括号之间。当你输入 ')' 并且光标后面已经有一个结尾 ')' 时,Vim 会跳过括号而不是插入一个新的。光标移动前面有&lt;C-G&gt;U,这是上述补丁添加的功能,允许以下光标移动不会破坏撤消顺序(只要移动都在一行中)。

从 Vim 7.4.663 开始,这个补丁还没有被正式包含。

【讨论】:

    【解决方案2】:

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

    话虽如此,如果您一心想要避开它们,您可以使用&lt;i_ctrl-o&gt;

    :help i_ctrl_o

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

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

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

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

    请注意,此解决方案比简单地使用箭头键更多击键,但您不需要将手从主行移开,因此无论如何它可能会更快。

    【讨论】:

      【解决方案3】:

      没有。在 Vim 中执行此操作与在您的“传统”编辑器中执行此操作完全相同:

      1. 键入()""
      2. left
      3. 输入您需要的内容
      4. right

      但是……你为什么不输入开始字符,你想要在对中的内容,然后是结束字符?

      1. 键入("
      2. 输入您需要的内容
      3. 键入)"

      太简单了?

      【讨论】:

      • 立即再次关闭东西实际上是一个好习惯,所以一个人不能忘记任何关闭。再按一次左右键就值得了。
      猜你喜欢
      • 2013-10-08
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 2021-01-20
      • 1970-01-01
      相关资源
      最近更新 更多