环绕在vim

jua*_*tas 0 vim macvim

有没有一种简单的方法来包围文本,我知道这个插件

但太多的钥匙.

我尝试了我的方法

vmap ' <D-x>i'<esc><D-v>i'
vmap " <D-x>i"<esc><D-v>i"
Run Code Online (Sandbox Code Playgroud)

但这不起作用.无论如何,如果修复了这种方式,我怎么能将这种行为提取到一个允许我这样做的函数:

  1. 我选择任何文字(我认为这将是视觉模式)
  2. 我在给定的集合中输入"对称"环绕(例如',",",|,/ ,*, - )或"非对称"环绕(例如<>,{},[], ())
  3. 选定的文本被符号包围.
  4. 如果选择的单词已经被包围并且切换符号,那么对于检测可能会很好.

有关如何做到这一点的任何推荐阅读?

rom*_*inl 6

s'并且s"是"太多的钥匙"?真?

环绕是要走路.

您将无法使用映射(以及使用Cmd键的映射).如果你想要一个切换引号的"智能"命令你不能真正跳过vimscript,从那里,使用Surround这可能是一个更好的主意,这是最好的Vim插件之一.

无论如何,这可能是一个(快速且未经过彻底测试)的基础:

function! SurroundWithDoubleQuotes()
  let old_n = @n
  normal! gv
  normal! "nd
  let @n = "\"" . @n . "\""
  normal! "nP
  let @n = old_n
endfunction
Run Code Online (Sandbox Code Playgroud)

您需要找到一种方法来输入所需的字符,并测试@n寄存器两端是否存在该字符.

:h functions 如果你想这样做,肯定会帮助你.

以下是我对映射的处理方法:

vnoremap " <Esc>`>a"<Esc>`<i"<Esc>

`> marks the end of the visual selection
`< marks its beginning
Run Code Online (Sandbox Code Playgroud)

但要小心你的映射.在可视化模式,(){}[]有你的意义想要超载.