0

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

但是钥匙太多了。

我尝试了我的方法

vmap ' <D-x>i'<esc><D-v>i'
vmap " <D-x>i"<esc><D-v>i"

但这不起作用。无论如何,如果这种方式是固定的,我怎么能将此行为提取到一个允许我这样做的函数中:

  1. 我选择任何文本(我认为这将是视觉模式)
  2. 我为“对称”环绕(例如 '、“、`、|、/、、*、-)或“不对称”环绕(例如 <>、{}、[]、 ())
  3. 选定的文本被符号包围。
  4. 如果选定的单词已经被包围并切换符号,可能会很好检测。

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

4

3 回答 3

6

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

环绕是要走的路。

映射(以及使用 Cmd 键的映射)不会走得太远。如果你想要一个切换引号的“智能”命令,你就不能真正跳过 vimscript,从那里开始,最好只使用最好的 Vim 插件之一的 Surround。

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

function! SurroundWithDoubleQuotes()
  let old_n = @n
  normal! gv
  normal! "nd
  let @n = "\"" . @n . "\""
  normal! "nP
  let @n = old_n
endfunction

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

:h functions如果您想这样做,肯定会帮助您。

这是我将如何处理映射:

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

`> marks the end of the visual selection
`< marks its beginning

但要小心你的映射。在视觉模式下,(){}[]具有您不想超载的含义。

于 2013-02-14T08:04:06.547 回答
3

如果您喜欢环绕插件,但更喜欢较短的映射,您可以自己制作:

:vmap ' S'
:vmap " S"

(在这里,您必须使用:vmapover Preferred :vnoremap,因为您希望应用插件的映射。或者,您可以直接映射到插件的<Plug>映射:vmap ' <Plug>VSurround':)

于 2013-02-14T08:07:29.207 回答
1

这就是我要做的:

:vmap ' s''<esc>P
于 2013-02-14T08:01:54.190 回答