如何在Vim映射列表中搜索?

25

使用:map可提供Vim中的所有映射列表。但是,我无法搜索列表。我惊讶地看到它在一个不同类型的窗口中打开,不像通常的Vim帮助文件。有没有一种方法可以使它以通常的形式可用?

4个回答

22

Vim使用其内部分页程序来显示:map的输出,其功能相当有限(有关详细信息,请参见:h pager)。

如果您想在普通vim缓冲区中访问:map的输出,可以使用:redir

:redir @a>    " redirect output to register a
:map
:redir END
:put a        " paste the output of :map in the current buffer

请注意,您可以将重定向到文件、变量等。有关更多详细信息,请参见:h redir

(Note that you can redirect to a file, to a variable, etc... See :h redir for more details.)

1
感谢您对map的解释以及指针重定向的说明。但我认为,我应该接受之前的答案,因为它实际上是与实际问题相关的答案。 - Jikku Jose
1
我也在考虑使用 :redir。+1 - Roman Kiselenko

16

不要惊讶。 :map:help 完全没有关系,因此没有任何理由期望它的工作方式像 :help

您可以给 :map 一个参数来缩小列表:

:map ,

通过正确配置wildmenu和/或wildmode,您可以使用Tab键补全:map命令:

:map ,<Tab>

您还可以使用 <C-d> 列出当前映射:

:map <C-d>
您还可以使用特定于模式的 :map 变体来获取更可管理的列表:
:imap ,
:nmap ,
:xmap ,
and so on…

请注意,:map 只列出自定义映射(由您或插件创建的)。如果您想要默认映射列表,请查看:help index

---编辑---

因此,最近有人点赞了我这个老回答,事实证明在此期间添加了一个新命令:help :filter来帮助处理这种用例。

您可以像这样使用它,只列出使用:help pumvisible() 的插入模式映射:

:filter pumvisible imap

虽然严格来说不是搜索功能,但这是一个非常有用的附加功能。


7

这里有一个强大的函数,可以创建一个可搜索的垂直分割,并带有排序后的:maps输出结果。

function! s:ShowMaps()
  let old_reg = getreg("a")          " save the current content of register a
  let old_reg_type = getregtype("a") " save the type of the register as well
try
  redir @a                           " redirect output to register a
  " Get the list of all key mappings silently, satisfy "Press ENTER to continue"
  silent map | call feedkeys("\<CR>")    
  redir END                          " end output redirection
  vnew                               " new buffer in vertical window
  put a                              " put content of register
  " Sort on 4th character column which is the key(s)
  %!sort -k1.4,1.4
finally                              " Execute even if exception is raised
  call setreg("a", old_reg, old_reg_type) " restore register a
endtry
endfunction
com! ShowMaps call s:ShowMaps()      " Enable :ShowMaps to call the function

nnoremap \m :ShowMaps<CR>            " Map keys to call the function

最后一行将两个键\m映射到调用该函数,您可以根据需要更改此内容。


但是排序并不太好用...它们都混在一起了;也许是因为操作系统的差异?我改成了 sort --key=1,14 - JESii
需要将 @a 赋值吗?为什么不能直接将 silent map | ... 的值放入新缓冲区中? - gented
谢谢!我收到了“自上次更改以来没有写入(添加!以覆盖)”的警告。是否有一种方法可以通过打开只读缓冲区或其他方式来避免这种情况? - HowlingFantods

6
对于neovim来说,telescope具备映射列表和搜索能力:builtin.keymaps

2
我认为,对于那些不知道Telescope是什么的人来说,提供一些更多的上下文可能会使这个答案更好。我以前从未使用过它,但现在我有了一个起点。对于其他人:我通过packer安装了telescope(在您分享的链接中描述),然后运行了:Telescope,输入了键映射,按下回车,然后通过输入我期望找到的一些内容,成功地找到了我感兴趣的键映射。如果有人遇到困难,这里有一个示例,希望能帮到你:https://asciinema.org/a/g9YF0I3tw5nyn4U0l2NIiqRTR我显然不懂如何搜索,但文档可以帮助我完成其余部分。 - James Andariese

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接