我一般都会问这个问题,但我会根据我遇到的具体问题加以说明。
我在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的解决方案。
答案 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