如何在Vim中调试无效的键映射?

时间:2015-03-13 13:49:57

标签: vim

我一般都会问这个问题,但我会根据我遇到的具体问题加以说明。

我在Mercurial源代码管理下使用vim-lawrencium插件进行项目。我使用:Hgstatus命令打开状态缓冲区。

状态缓冲区附带some nice keymaps,可以轻松地将文件添加到提交,查看差异,并最终完成提交。

nnoremap <buffer> <silent> <cr>  :Hgstatusedit<cr>
nnoremap <buffer> <silent> <C-N> :call search('^[MARC\!\?I ]\s.', 'We')<cr>
nnoremap <buffer> <silent> <C-P> :call search('^[MARC\!\?I ]\s.', 'Wbe')<cr>
nnoremap <buffer> <silent> <C-D> :Hgstatustabdiff<cr>
nnoremap <buffer> <silent> <C-V> :Hgstatusvdiff<cr>
nnoremap <buffer> <silent> <C-U> :Hgstatusdiffsum<cr>
nnoremap <buffer> <silent> <C-H> :Hgstatusvdiffsum<cr>
nnoremap <buffer> <silent> <C-A> :Hgstatusaddremove<cr>
nnoremap <buffer> <silent> <C-S> :Hgstatuscommit<cr>
nnoremap <buffer> <silent> <C-R> :Hgstatusrefresh<cr>
nnoremap <buffer> <silent> q     :bdelete!<cr>

其中大多数似乎都有效。我已成功尝试差异化,添加和q以关闭状态,但<C-S>快捷方式根本不起作用。我可以手动运行它映射到的:Hgstatuscommit命令。我还查看:map以验证密钥是否实际映射到该缓冲区,并且它确实显示在列表中。

调试此操作的下一步是什么?我想修复这个特定的问题,但我也想知道如何来修复它,以防将来遇到破坏的快捷方式。我是Vim的新手,所以我现在有点亏。

更新:verbose map <C-S>

的输出
v  <C-S>       *@:Hgstatuscommit<CR>
        Last set from ~/.spf13-vim-3/.vim/bundle/vim-lawrencium/plugin/lawrencium.vim
n  <C-S>       *@:Hgstatuscommit<CR>
        Last set from ~/.spf13-vim-3/.vim/bundle/vim-lawrencium/plugin/lawrencium.vim

解决方案:原来问题是我的shell拦截Ctrl-S并且它永远不会进入Vim。

我在.zshrc中添加了一个Vim别名来修复:

alias vim="stty stop '' -ixoff ; vim"
ttyctl -f

找到the fix on the Vim Wikia,它也有bash shell的解决方案。

3 个答案:

答案 0 :(得分:3)

软件流控制

如果您使用的是终端,那么<c-s>通常会用于终端的软件流控制(XON / XOFF)。这使<c-s>成为一个比较棘手的关键。

通过将以下内容添加到某个启动脚本(例如~/.bash_profile~/.bashrc)来关闭流量控制:

stty -ixon

如果您冻结了终端,则可以按<c-q>解冻它。

通用地图调配

您可以通过以下命令调试几乎任何自定义vim映射:

:verbose map

这将列出每个键/和弦({lhs})映射到映射源自哪个命令({rhs}),模式和文件。有关此商家信息的详情,请参阅:h map-listing:h :map-verbose

我们可以通过以下几种方式过滤此列表:

  • 提供模式。例如正常模式为:verbose nmap,插入模式为:verbose imap
  • 证明我们要查询的密钥。例如:verbose nmap <c-s>
  • 还可以通过添加<buffer>来查看缓冲区特定的映射。例如:verbose nmap <buffer> <c-s>

因此,对于您的问题,调试映射设置的最佳方法是运行以下查询:

:verbose nmap <buffer> <c-s>

注意:Vim的本机命令未通过:verbose map列出。找到Vim本机命令之一的最佳方法是提供帮助。有关详情,请参阅:h

答案 1 :(得分:2)

首先,检查<C-S>是否仍然映射到:Hgstatuscommit

map <C-S>

Hgstatuscommit来电s:HgStatus_Commit。在line 1134上打开它的定义并进行一些调试打印输出:

echom a:linestart
echom a:lineend
echom a:bang
echom a:vertical

使用映射后,请检查:messages

答案 2 :(得分:1)

我怀疑<C-S>被映射到别的东西。您可以使用:map <C-S>来检查其映射的配置方式(或是否)。更好的是,你可以 添加前缀以查看映射的设置位置,例如,当我运行时 :verbose map <C-L>,显示以下内容:

<C-L>       * :noh<CR><C-L>
    Last set from ~/.vimrc

相比之下,我没有为<C-S>设置映射,因此当我运行:map <C-S>时, 我明白了:

No mapping found

verbose预先添加到命令是一种有用的通用调试技术,因为它可以显示设置任何Vim选项的位置,例如,:verbose set background?显示当前设置的background选项和它设置在哪个Vim配置文件中:

background=dark
    Last set from ~/.vimrc  
相关问题