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

3
在传统的文本编辑器中,每当我需要打开一个字符串或括号并在其中输入内容时,我通常会执行以下操作:
  1. 输入()""
  2. 按左箭头
  3. 输入所需内容
  4. 按右箭头
但在vim中(如果我遵循vim方式),这个过程变得相当繁琐,因为我必须进入正常模式多次移动:
  1. 输入()""
  2. <ESC>
  3. i
  4. 输入所需内容
  5. <ESC>
  6. l
  7. a
如果在任何时候使用箭头键都不是一个好习惯,那么在vim中是否有更有效的方法来完成这种任务呢?

你可以按下 A 键来代替 la 键。 - Marcin Doliwa
4
在vim中,通常不需要先写""或(),而是直接开始输入",然后写入字符串,并在离开插入模式之前再次输入"以结束它。 - nos
1
你也可以尝试使用https://github.com/tpope/vim-surround。 - EvergreenTree
可能是https://dev59.com/H2Ei5IYBdhLWcg3wZ7ka的重复问题。 - Yosh
这是一个非常特定的用例。我不知道你在使用Vim做什么,但个人而言,我不会太过担心多打几个键。 - QuestionC
3个回答

4

不。在Vim中做这件事与在您的“传统”编辑器中完全相同:

  1. 输入()""
  2. 左箭头
  3. 输入所需内容
  4. 右箭头

但是...为什么不先输入开头字符,然后输入所需内容,再输入结束字符呢?

  1. 输入("
  2. 输入所需内容
  3. 输入)"

太简单了吗?


2
实际上,立即关闭事物是一个很好的习惯,这样就不会忘记任何关闭操作。再按一次左右键确实值得努力。 - Zelphir Kaltstahl

3
在映射中自动附加这些闭合字符并将光标放在所需位置其实很容易。关键是要做到这一点,而不会破坏撤销/重做/重复操作。问题在于插入模式下的光标移动命令会破坏“撤销序列”,因此在移动光标之后进行的任何更改都将与移动光标之前进行的更改分别撤消。
警告:以下信息可能已过时
有许多插件可用于自动附加这些字符(请参见Vim维基页面上的附加结束字符 的部分列表),在Vim 7.4之前,其中一些甚至具有保持撤销序列完整的复杂解决方案。不幸的是,它们都依赖于Vim中的一个错误,在版本7.4中已经修复了这个错误。
现在有一个补丁可以添加不会破坏撤销的光标移动,因此如果您想要自己编译Vim,您可以使用以下映射(无需插件!)来实现您想要的功能:
inoremap            (          ()<C-G>U<Left> 
inoremap <expr>     )          strpart(getline('.'), col('.')-1, 1) == ")" ? "\<C-G>U\<Right>" : ")" 

这些映射将在您输入开放括号"("时,插入“()”,并将光标置于括号之间。当您输入")"且光标后面已经有一个右括号")"时,Vim会跳过该括号而不是插入一个新的右括号。光标移动前需要使用<C-G>U进行预处理,这是上述补丁添加的功能,允许以下光标移动不中断撤销序列(只要移动在单行内完成)。

截至Vim 7.4.663,此补丁仍未被正式包含。


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文件中。

请注意,这种解决方案比仅使用箭头键更多按键,但你无需将手离开主键区,因此可能更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接