我面临的问题是我在编辑文件时已经映射了一些用于在vim中进行搜索的键和鼠标事件。但是,如果使用quickfix缓冲区,那些映射会影响功能。
我想知道是否可以根据使用它们的缓冲区映射键。
EDIT
- 我正在为此问题添加更多信息
让我们考虑一个场景。我想映射<C-F4>
以关闭缓冲区/窗口。现在这种行为可能取决于许多事情。
如果我正在编辑缓冲区,它应该关闭该缓冲区而不改变窗口的布局。我正在使用buffkil插件。
它不依赖于文件的扩展名,而是依赖于缓冲区的类型。我在vim文档中看到有未列出和列出的缓冲区。因此,如果它是列出的缓冲区,它应该使用bufkill命令关闭。
如果它不是列出的缓冲区,则应使用<c-w>c
命令关闭缓冲区并更改窗口布局。
我是编写vim函数/脚本的新手,有人可以帮助我开始使用这个
答案 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>
希望其他人会觉得这很有用。