什么是使用缓冲区的更有效方法?


13

最近,我一直在大幅度减少使用的插件数量,因此我只使用内置的Vim功能来寻找答案。

当我编辑许多缓冲区时,我一直注意到我的工作流程中存在一个缺陷:我在一个缓冲区上,我想切换到另一个我不记得名字的缓冲区,并且它不是替代缓冲区。因此:b#无法使用,并且使用命令的完成:b也不方便。

为此,我正在执行以下操作:

  • 第一次使用:buffers来获取打开缓冲区的列表
  • 记住我要使用的缓冲区编号
  • 按下Enter以关闭缓冲区列表
  • 使用:bXX缓冲区的使用数量。

这个工作流程对我来说似乎很繁重,所以我在我的代码中添加了以下几行 .vimrc

" Improve the navigation in the buffers 
nnoremap <Leader><S-b> :B<CR> 
command! B call Buffers() 

function! Buffers() 
    execute "buffers" 
    let buffer=input("Enter a buffer:") 
    execute "b" . buffer 
endfunction 

这给了我一个命令:B(和一个映射),该命令调用该函数:buffers等待输入,最后调用:b该输入。

它工作正常,但令我惊讶的是我不得不开发这样的功能:通常Vim具有非常有效的默认工作流程,所以我想知道是否有更好的方法可以切换到一个我不知道的缓冲区。它已在我的编辑会话中打开。


3
:ls紧随其后:b#(不需要先打回车或转义,可以直接从“ ls”中的缓冲区列表中去。)(作为注释发布,因为它似乎不足以作为答案?)还想知道我是否丢失了一些东西并回答了错误的问题。)
LindaJeanne

2
@LindaJeanne:正如我说的,:b#这不是我要寻找的东西,是的,您可以通过直接输入:b而无需先按即可保存按键,这一事实enter很有趣。(事实上​​,这可能太轻而无法回答,但是值得一提:
statox

我猜想LindaJeanne的意思是该#字符是(缓冲区)数字的替代品,而不是原义#字符。
8bittree '16

Answers:


12

当我编辑许多缓冲区时,我一直注意到我的工作流程中存在一个缺陷:我在一个缓冲区上,我想切换到另一个我不记得名字的缓冲区,并且它不是替代缓冲区。因此: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

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显示了一种基于符号导航的方式。这个例子很愚蠢,但是……哦。


我想我对这些wild*选项的玩法还不够,我将尝试以我的方式对其进行调整。关于Barry Arthur解决方案,它非常接近@ nobe4的有趣的答案。最后,我将不得不对您的CCR()功能进行更深入的了解以真正获得它,但它看起来很有希望。感谢您的回答。
statox

5
看到我的这个答案。特别是漫画。
romainl

我一定会偷其中的一些!
statox

7

不久前,我遇到了同样的问题,并且找到了解决方案:

nnoremap <leader>b :buffers<CR>:buffer<space>

这将打开缓冲区列表,而不会隐藏它,您可以选择切换缓冲区。

我认为Vim在这里没有“ list and select”选项是有道理的,这是两个单独的动作。但是Vim足够强大,可以将命令组合在一起。

将其视为Unix哲学:做一件事并做好。

:buffers列出缓冲区并:buffer xxx允许您选择一个。


1
这是减轻我在问题中建议的功能的好方法,很有趣!
statox

1
如果要使结尾处的空间更加可见,可以执行以下操作:nnoremap <leader> b:buffers <CR>:buffer <Space> |
泰勒·德登

1

有一段时间我使用了nobe4的技术,例如:

nnoremap <Leader>b :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>

然后我开始使用Tab补全功能(如romainl所建议的)

但是最近我发现使用击键次数最少的最快方法是使用:

{count} CTRL-^

:b#<Enter>与您并没有什么不同,但是您需要知道缓冲区编号!

为此,我运行MiniBufExplorer插件,该插件在顶部显示文件名列表(几乎与其他所有编辑器一样)。我敢肯定有很多选择。

最后,由于Ctrl-^这对我的手指有点拉长,而且这是非常常见的操作,因此将其移至Ctrl-E。的实现不是太复杂:

nnoremap <C-E> :<C-U>call SwitchToBuffer()<CR>

function! SwitchToBuffer()
  if v:count > 0
    exec v:count . "b"
    return
  endif

  " Whatever you want to do if you didn't provide a count
  " In this case, fall back to nobe4's technique:
  call feedkeys(":ls\n:b ")
endfunction

因此,我当前的缓冲区切换过程如下所示:

  1. 看看MiniBufExplorer
  2. 击中 3 Ctrl-E

不幸的是,MBE和上面的脚本不是您所要求的Vim内置函数。当我在没有配置的远程计算机上时,我只使用:b [partial]和制表符补全。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.