【问题标题】:vim change :x function to delete buffer instead of save & quitvim 更改 :x 函数来删除缓冲区而不是保存和退出
【发布时间】:2011-11-22 17:24:06
【问题描述】:

我想在 vim gui-mode 中将 :x 设置为 delete buffer 因为我总是杀死整个 gvim,这有点烦人。我知道我可以专门设置 gui 问题 if has("gui running") 但不知道如何重新映射 :x

提前致谢

ps:也许标签/术语remap 是错误的,但我不知道正确的术语,这就是谷歌根本没有提供任何帮助的原因。

【问题讨论】:

标签: vim remap


【解决方案1】:

这并不像看起来那么容易。 :map 不适用于命令,:command 只接受以大写字母开头的命令。但是你可以使用:cabbrev:

if has("gui_running")
  cabbrev x bd
endif

更新::cmap 可以实际使用::cmap x bd,但它不能正常工作:命令中每次出现x 都会立即被bd 替换。

编辑:这个问题与Can I (re)map Ex commands in vim? 重复。

【讨论】:

  • 为什么是has("gui running")?我不相信那永远是真的。应该是has("gui")
  • 这有一个问题,如果你曾经输入“x”作为一个词,例如:echo "1 + x = 3"(很复杂,我知道!),它会变成:echo "1 + bd = 3"。 @Peter 的解决方案更好,因为它没有这个缺陷。
  • @ChrisMorgan 应该是has("gui_running")。它可以在:h has-patch 下方的列表中找到(使用:helpg gui_running)。
  • @ZyX 正确,我的错误。我以前用过,但没有提到它...has('gui')当然不会削减它。
【解决方案2】:

我发现最安全的替代方法是使用表达式缩写:

cnoreabbrev <expr> x getcmdtype() == ":" && getcmdline() == 'x' ? 'bd' : 'x'

这将确保缩写仅在使用:x 时扩展为bd,否则仅扩展为x

如需更多帮助:

:h map-<expr>
:h getcmdtype()
:h getcmdline()

经过进一步检查,似乎有一个由 Hari Krishna Dara 完成的插件,名为 cmdalias.vim。它使用了上述技术的变体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2015-02-23
    相关资源
    最近更新 更多