【问题标题】:Auto closing curly quotation marks in Vim在 Vim 中自动关闭大括号
【发布时间】:2011-09-10 11:46:13
【问题描述】:

我想将 Vim 设置为自动关闭“和”对(大括号)。

我已尝试配置我能找到的所有五个插件(两个自动关闭、环绕、关闭对和分隔),但没有成功。我什至似乎根本无法重新映射'(使用:imap ‘ ‘’<left> 或类似的)。

我在 Arch Linux 上使用 Vim 7.3 和 uim 1.7.0 输入法;我通过 .XCompose 中定义的快捷方式插入“和”。重新映射对于我的其他撰写键快捷方式效果很好,例如¡!或¿?。

【问题讨论】:

  • 您使用的编码是什么? (:echo &enc)
  • 是 utf-8,我的 $LANG 是 en_US.UTF-8。

标签: vim typography auto-close


【解决方案1】:

它看起来很像一个 vim 错误,特别是带有内部 vim 转义序列的错误,它们都以 \x80 开头(有问题的字符的第二个字节是 \x80)并编码各种东西,如 NULL、功能键或\x80 字节本身。我想你可以深入研究 vim 源代码并在那里找到这个字节是如何转义的,并尝试用这个转义码替换 的最后一个字节,或者等到它被修复(尽管我不希望很快修复:这是来自 todo.txt 的引用

UTF-8:不出现映射第二个字节为 0x80 的多字节键 去工作。 (托尼·梅赫林克,2007 年 3 月 2 日)

因此,您会发现问题已经知道了四年,但尚未解决。)

【讨论】:

  • 哦……就是这样。哦亲爱的。哦,非常感谢您的澄清!这几乎就是我需要知道的全部内容,即使我可能希望有一个不同的解决方案。
  • @caminoix 讨论了用 CSI 序列替换非常有限的\x80 vim 自己的转义,因为当前实现存在更多问题:与可能的修饰符的绝对值+smth 快捷方式相比像<C-Tab>, <C-S-a>, <C-»>, ... vim 几乎不支持它们,而 CSI 都可以支持。当这段代码最终将被重新设计时,我想你的问题会消失,尽管它可能直到 vim-7.4 甚至 vim-8.0 才会发生。
【解决方案2】:

避免递归

inoremap ' ''<left>

【讨论】:

  • 这不是问题。 imap a ab&lt;left&gt;inoremap a ab&lt;left&gt; 都工作得一样好,但都不想和'.显然,问题在于重新映射',因为imap a ‘’ 按预期工作。
【解决方案3】:

你可以用一个小函数来实现:

function! CloseQuotes()
    normal! i'' 
    startinsert
endfunction

然后通过以下方式将其映射到'

inoremap ' <ESC>:call CloseQuotes()<CR>

重要的是normal!中的感叹号,它可以防止映射递归。

【讨论】:

  • 感谢您的尝试,但这不起作用。递归不是问题; imap a ab&lt;left&gt; 工作正常。问题是重新映射大引号:' (U+2018)。 imap ‘ a 不包含递归并且以同样的方式失败。
  • @caminoix imap something 工作正常的事实不应该让你写imap something。使用inoremap,除非您可以回答“为什么我不能在这里使用nore?”这个问题,因为可以相互干扰的映射数量越来越多,这将节省您的时间。
  • 明白。我想我太专注于当前的问题,无法欣赏一般的(如果不是很相关)建议。
猜你喜欢
  • 1970-01-01
  • 2010-11-04
  • 2012-02-16
  • 2014-05-15
  • 1970-01-01
  • 2011-05-30
  • 2010-10-27
  • 2015-01-14
  • 1970-01-01
相关资源
最近更新 更多