如何在quickfix退出时取消映射vim快捷方式

时间:2015-11-10 03:38:43

标签: vim

背景:我正在使用skwp's dotfiles,他最近的changes打破了我日常使用的一些功能。

我没有在全局范围内设置映射,而是在quickfixes退出后尝试nnoremap两个快捷方式输入快捷方式和nunmap

BTW ,我认为syntastic用于linting,它会调用quickfix / location列表。

以下是代码:

augroup quickfixShortcutsGroup
  autocmd!
  autocmd BufWrite * :echom "Foo"
  " au BufReadPost quickfix nnoremap <silent> <C-z> :cp<CR>
  " au BufReadPost quickfix nnoremap <silent> <C-x> :cn<CR>
  au BufWinEnter quickfix nnoremap <silent> <C-z> :cp<CR>
  au BufWinEnter quickfix :echo '1'
  au BufWinLeave quickfix nnoremap <silent> <C-z> :cp<CR>
  au BufWinLeave quickfix :echo 'BufWinLeave'
  au BufLeave qf :echo 'BufLeave'
  au BufUnload qf :echo 'unload qf'
  " au BufLeave qf noremap <silent> <C-z> :cb<CR>
  " au BufLeave quickfix noremap <silent> <C-z> :cb<CR>
  " au BufWinLeave quickfix noremap <silent> <C-z> :cb<CR>
  " au BufWinLeave quickfix nunmap <C-z>
  " au BufWinLeave quickfix :echom 'Hello'<cr>
  " BufWinEnter
augroup END

阅读参考后:

  1. http://vimdoc.sourceforge.net/htmldoc/autocmd.html#BufWinLeave
  2. http://vimdoc.sourceforge.net/htmldoc/autocmd.html#autocmd-patterns
  3. 我仍然无法使unmap个事件正常工作,即BufWinLeaveBufUnloadBufLeave未被调用。

    Vimers可以告诉我应该使用哪些事件并帮助我解决这个问题吗?提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

:help BufWinLeave所述,当前缓冲区“%”可能与正在卸载的缓冲区“”不同。因此,您需要一个全局autocmd,并解析剩余的缓冲区编号,然后检查 quickfix 'buftype'

autocmd! BufWinLeave * if getbufvar(bufnr(expand('<afile>')), '&buftype') ==# 'quickfix' | echo "leaving quickfix" | endif

但总的来说,我建议不要使用这些技巧,尤其是条件映射。您的<C-z> / <C-x>映射仍然是全局的,现在只取决于quickfix列表是否可见。这对于肌肉记忆是不利的,并且关键组合的过载会带来精神上的负担。我宁愿完全摆脱映射,或分配不同的(如果可能更长)键。

还有下一个复杂因素:Vim“发行版”和其他人的dotfiles通过快速安装和开箱即用的设置吸引你,但你付出的代价却增加了复杂性(你需要了解Vim的运行时加载方案和分配的任意约定)和不灵活性(分布可能使一些事情变得更容易,但其他事情非常困难)。 Vim非常可定制,使用其他人的定制毫无意义。

答案 1 :(得分:0)

如果你希望<?php $installer = $this; $installer->startSetup(); $setup = Mage::getModel('customer/entity_setup', 'core_setup'); $setup->addAttribute('customer', 'is_activated', array( 'type' => 'int', 'input' => 'select', 'label' => 'Activated', 'global' => 1, 'visible' => 1, 'required' => 0, 'user_defined' => 0, 'default' => 1, 'visible_on_front' => 0, 'source' => 'eav/entity_attribute_source_boolean', )); $installer->endSetup(); 这两个映射在quickfix上输入,nnoremap在quickfix退出后,你可以

nunmap

或者您可以使用本地缓冲区映射来缩短代码

" map silently upon entering Quickfix
autocmd BufWinEnter * if &buftype == 'quickfix' 
    \| nnoremap <silent> <C-x> :cn<CR>
    \| nnoremap <silent> <C-z> :cp<CR>
    \| endif

" unmap upon leaving Quickfix
autocmd BufWinLeave * if &buftype == 'quickfix' 
    \| nunmap <C-x>
    \| nunmap <C-z>
    \| endif

每次进入或离开缓冲区时都会调用这些" map silently upon entering Quickfix, and only for Quickfix autocmd BufWinEnter * if &buftype == 'quickfix' \| nnoremap <buffer><silent> <C-x> :cn<CR> \| nnoremap <buffer><silent> <C-z> :cp<CR> \| endif 。因此,Sato Katsura suggested添加到您的autocmd

中真的更好
~/.vim/ftplugin/qf.vim

您可以考虑阅读以下内容: