当我编辑许多缓冲区时,我一直注意到我的工作流程中存在一个缺陷:我在一个缓冲区上,我想切换到另一个我不记得名字的缓冲区,并且它不是替代缓冲区。因此:b#
无法使用,并且使用命令的完成:b
也不方便。
相反,我发现制表符补全非常方便。为适合您的值设置正确的选项可能会很有帮助。这些是我 的相关内容vimrc
(它们对我有用,但是它们可能对您不起作用,所以不要只复制它们):
nnoremap ,b :buffer *
set wildmenu
set wildignore+=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=*/min/*,*/vendor/*,*/node_modules/*,*/bower_components/*
set wildignore+=tags,cscope.*
set wildignore+=*.tar.*
set wildignorecase
set wildmode=full
这样,正确的缓冲区很少会超过五或六个键击:
这给了我一个命令:B
(和一个映射),该命令调用该函数:buffers
等待输入,最后调用:b
该输入。
几年前,Barry Arthur提出了一个简单得多的解决方案,此后从那时开始变得非常流行:
nnoremap <leader>b :ls<CR>:b<Space>
几年前,我提出了其中一个稍微更通用的变体:
nnoremap gb :ls<CR>:b
既然我们在谈论vimscript,这是我写的一个不错的小函数,它在类似清单的命令(例如:ls
或)之后使用正确的命令存根“自动填充”命令行:ilist
。该函数相对于上面的映射的优点是,我不必记住特定的映射。它的工作原理与Vim相似,但略有不同。
" smooth listing
cnoremap <expr> <CR> <SID>CCR()
function! s:CCR()
if getcmdtype() == ":"
let cmdline = getcmdline()
if cmdline =~ '\v\C^(dli|il)' | return "\<CR>:" . cmdline[0] . "jump " . split(cmdline, " ")[1] . "\<S-Left>\<Left>"
elseif cmdline =~ '\v\C^(cli|lli)' | return "\<CR>:silent " . repeat(cmdline[0], 2) . "\<Space>"
elseif cmdline =~ '\C^changes' | set nomore | return "\<CR>:sil se more|norm! g;\<S-Left>"
elseif cmdline =~ '\C^ju' | set nomore | return "\<CR>:sil se more|norm! \<C-o>\<S-Left>"
elseif cmdline =~ '\C^ol' | set nomore | return "\<CR>:sil se more|e #<"
elseif cmdline =~ '\C^undol' | return "\<CR>:u "
elseif cmdline =~ '\C^ls' | return "\<CR>:b"
elseif cmdline =~ '/#$' | return "\<CR>:"
else | return "\<CR>" | endif
else | return "\<CR>" | endif
endfunction
就是说,我非常支持“基于符号的导航”而不是“基于文件的导航”。如果适用,基于符号的导航比基于文件的导航要快得多,也更经济。
顺便说一下,最后一个GIF显示了一种基于符号导航的方式。这个例子很愚蠢,但是……哦。
:ls
紧随其后:b#
(不需要先打回车或转义,可以直接从“ ls”中的缓冲区列表中去。)(作为注释发布,因为它似乎不足以作为答案?)还想知道我是否丢失了一些东西并回答了错误的问题。)