【问题标题】:Detect if a key is bound to something in vim检测一个键是否绑定到 vim 中的某个东西
【发布时间】:2010-03-20 16:44:58
【问题描述】:

我想知道是否有办法确定某个键是否在 vim 中执行某些操作。我知道我可以使用:map 来查看用户定义的映射,但是内置的东西有什么用吗?

例如,我总是将 CTRL-W 绑定到关闭选项卡,因为我认为它没有被使用。半年后,我发现有一些序列在使用它,比如 CTRL-W CTRL-S kbd> 拆分窗口,重新训练自己是一场噩梦。

【问题讨论】:

  • 说到用户自定义映射的意外碰撞,使用mapleader确实是个好习惯

标签: vim key-bindings


【解决方案1】:

如果您查看 Randy Morris 的建议答案,您会发现

:help index 

会给你你想要的列表。

【讨论】:

  • 非常有用!很高兴知道有一个地方可以去看看,如果你只是想四处逛逛,学习一些新东西
【解决方案2】:

检查默认映射:

:help index

对于由用户或插件完成的其他映射:

:map
:map!

来自http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-Tutorial(Part_1):

第一个命令显示正常工作的地图,视觉和 选择和操作员挂起模式。第二个命令显示地图 在插入和命令行模式下工作。

上述命令的输出通常会跨越多个页面。 您可以使用以下命令集将输出重定向到 vim_maps.txt 文件:

:redir! > vim_maps.txt
:map
:map!
:redir END

【讨论】:

  • 除非新版本的 Vim 突然提供更好的选择,否则这似乎是搜索包含和自定义键映射的唯一方法。 mapcheck(如another answer 中所述)也仅涵盖自定义键绑定。输出到文本文件和 mapcheck 之间的主要区别在于输出到文本文件和/或使用 :help index 让您在 Vim 中 /C-w 使用 C-w 查找任何内容
【解决方案3】:

不是一个完整的答案,但您可能需要查看 :help map-which-keys 以获取 vim 建议您在自定义映射中使用的键列表。

该帮助部分提供了有关如何判断特定键是否映射到操作的建议。

【讨论】:

    【解决方案4】:

    我浏览了:help index 并列出了一些未使用的nmap 键:

    • Q(切换到“Ex”模式)
    • 除 ZZ、ZQ 以外的 Z
    • \
    • <Space>(与普通模式下的l相同;普通模式下最大且利用率最低的键)
    • gb、gc、gl、gx、gy、gz
    • gs(睡眠)
    • zp, zq, zu, zy
    • cd、cm、co、cp、cq、cr、cs、cu、cx、cy
    • dc、dm、do、dp、dq、dr、ds、du、dx、dy
    • gA、gB、gC、gG、gK、gL、gM、gO、gS、gX、gY、gZ
    • zB、zI、zJ、zK、zP、zQ、zP、zS、zT、zU、zV、zY、zZ
    • ]a, ]b, ]e, ]g, ]h, ]j, ]k, ]l, ]n, ]o, ]q, ]r, ]t, ]u, ]v, ]w , ]x, ]y
    • [a, [b, [e, [g, [h, [j, [k, [l, [n, [o, [q, [r, [t, [u, [v, [w , [x, [y
    • CTRL-G, CTRL-K
    • CTRL-\ a - z(为扩展保留)
    • CTRL-\ A - Z(未使用)

    请更新/评论。

    【讨论】:

      【解决方案5】:

      使用:map! 和:map 手动设置键和:help 'char(-combination)' 找出哪些键已经映射到vim 开箱即用(/在您的特定编译选项之外)。 (稍微偏离主题但仍然值得尊重(我认为):使用:scriptnames 查看哪些文件是按什么顺序获取的。)

      【讨论】:

      • 如果要搜索哪些键触发了某个命令,可以这样: :redir keys.txt :map :redir end 然后打开keys.txt,搜索绑定了哪些命令。
      【解决方案6】:

      你可以使用mapcheck.:-

      例如,我想将 <CR> ,i 映射到 gg=G 以缩进文件。 检查是否已经有<CR> , i的映射

      if mapcheck("\<CR>", "I") == "" |echo "no mapping"
      

      ...但这不会检测映射是否是序列的一部分。

      【讨论】:

      • 我试图检查“o”是否在正常模式下绑定到某个东西,如下: if mapcheck("o", "N") == "" |回显“无映射”但它报告“无映射”,当 o 肯定绑定到“打开新行”时。我用错了吗?
      • @K.Norbert:我相信这适用于用户定义的映射
      猜你喜欢
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 2014-05-12
      相关资源
      最近更新 更多