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

标签 vim

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

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

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

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

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

最佳答案

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

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

有很多插件可用于自动附加这些字符(请参阅 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 将跳过括号而不是插入一个新的。光标移动之前是 <C-G>U这是上述补丁添加的功能,允许以下光标移动不会破坏撤消序列(只要移动全部在一行中)。

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

关于vim - 如何在 vim 中有效地添加括号或字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29066542/

相关文章:

Vim+CtrlP : Behavior to initially show MRU files and switch to searching files when typing

VIM - 将多个文件中的行合并为单个文件

vim - 如何在 Rust 程序的 `main` 函数处打开 Vim?

vim - 在 IdeaVim 中将 Alt-j 映射到 <Esc><j>

regex - 如何使用 * 模式删除 vim 中的搜索元素

vim - 通过过滤器运行选定的文本并重新插入

git - 尝试执行基本 git 操作时获取 "Vim: Caught deadly signal ILL"

Vim 在 tmux 中显示不正确的颜色

vim - 在Vim中,如果某行包含特定单词,如何以特定颜色显示该行文本?

vim缩进: don't remove tabs indent when closing }