如何针对不同类型的缓冲区以不同方式映射vim中的键

时间:2010-03-12 16:20:29

标签: vim

我面临的问题是我在编辑文件时已经映射了一些用于在vim中进行搜索的键和鼠标事件。但是,如果使用quickfix缓冲区,那些映射会影响功能。

我想知道是否可以根据使用它们的缓冲区映射键。

EDIT - 我正在为此问题添加更多信息 让我们考虑一个场景。我想映射<C-F4>以关闭缓冲区/窗口。现在这种行为可能取决于许多事情。

如果我正在编辑缓冲区,它应该关闭该缓冲区而不改变窗口的布局。我正在使用buffkil插件。

它不依赖于文件的扩展名,而是依赖于缓冲区的类型。我在vim文档中看到有未列出和列出的缓冲区。因此,如果它是列出的缓冲区,它应该使用bufkill命令关闭。

如果它不是列出的缓冲区,则应使用<c-w>c命令关闭缓冲区并更改窗口布局。

我是编写vim函数/脚本的新手,有人可以帮助我开始使用这个

4 个答案:

答案 0 :(得分:4)

function KillBuffer()
    if &buflisted
         " bufkill command here
    else
         execute "normal! \<C-w>c"
    endif
endfunction
noremap <C-F4> :call KillBuffer()<CR>

将它放在你的.vimrc中 或者,如果您想将quickfix窗口作为未列出的缓冲区处理(在我的Vim中列出):

function KillBuffer()
    if &buflisted && !&filetype=="qf"
         " bufkill command here
    else
         execute "normal! \<C-w>c"
    endif
endfunction
noremap <C-F4> :call KillBuffer()<CR>

根据手册,您可以在上述脚本中用更简单的execute "normal! \<C-w>c"替换close!

答案 1 :(得分:1)

您可以拦截某些类型的文件加载并指定缓冲区特定的映射。

au! BufRead *.ext call <SID>init_hotkeys()

function s:init_hotkeys()
    nnoremap <buffer> <CR> :Action<CR>
endfunction

要在热键上映射复杂的逻辑,你可以在你的vimrc中使用类似的东西,甚至更好 - 把以下内容放到vim插件目录中的closebuffer.vim文件中

function s:close_buffer()
   if &buflisted
      " your command here from the killbuf plugin
      echo "Listed Buffer"
   else
      wincmd c
      " or
      " normal <c-w>c
   endif
endfunction

nnoremap <C-F4> :call <SID>close_buffer()<CR>

答案 2 :(得分:1)

您可以创建特定于文件类型的设置。首先,在vimrc文件中,确保通过添加

启用文件类型插件
  

上的filet插件

然后制作一个特定于文件类型的插件。在Unix下创建一个名为〜/ .vim / after / ftplugin / [file-type-name] .vim的文件并将你的映射放在那里。在Windows中,目录是$ HOME / vimfiles / after / ftplugin。 [file-type-name]是Vim检测到的类型,有时与文件扩展名相同,例如c.vim,python.vim等。如果输入,Vim可以告诉你打开文件后的类型是什么

  

:echo&amp; ft

答案 3 :(得分:0)

我在我的vimrc中使用它在当前行的上方或下方插入一个空行,只使用return和shift-return(而不是o<Esc>O<Esc>)而不会干扰打开的文件行为你想要在quickfix列表中。

" Use enter to insert newlines in normal mode, but not in quickfix
function! s:insert_line(direction)
  if &buftype == "quickfix"
    execute "normal! \<Enter>"
  else
    if a:direction == 'below'
      execute "normal! o\<Esc>"
    else
      execute "normal! O\<Esc>"
    endif
  endif
endfunction

nmap <Enter> :call <SID>insert_line('below')<CR>
nmap <S-Enter> :call <SID>insert_line('above')<CR>

希望其他人会觉得这很有用。