最近,我一直在大幅减少正在使用的插件的数量,因此我
仅使用内置的Vim功能来寻找答案。我在编辑许多缓冲区时的工作流程:我
在一个缓冲区上,我想切换到另一个我不记得
名称并且不是替代缓冲区的缓冲区。因此,无法使用:b#,并且
通过命令q4​​312079q使用补全也不方便。

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


首先使用:b获取打开的缓冲区列表
记住我要使用的缓冲区的编号
按Enter键关闭缓冲区列表
使用:buffers:bX的数量

这个工作流程对我来说似乎很繁重,所以我在我的
X中添加了以下几行: >这给了我一个命令.vimrc(和一个映射),它调用函数:B等待输入
,最后调用:buffers,然后输入。我必须开发这样的功能:通常
Vim有一个非常有效的默认工作流程,所以我想知道是否有更好的方式切换到我不知道的缓冲区?
已经打开在我的编辑会话中。

评论

我先执行:ls再执行:b#(不需要先按return或转义,可以直接从'ls'中的缓冲区列表中去。)(作为注释发布,因为它似乎不足以作为答案?还想知道我是否缺少某些东西并回答错误的问题。)

@LindaJeanne:正如我说的那样:b#不是我要的东西,但是是的,您可以通过直接输入:b来保存击键,而无需先按回车键这一事实很有趣。 (实际上,这个答案可能太轻巧了,但是值得一提:-))

我猜想LindaJeanne的意思是#字符是(缓冲区)数字的替代品,而不是文字的#字符。

#1 楼


当我编辑许多缓冲区时,我一直注意到工作流程中的一个缺陷:我在一个缓冲区上,我想切换到另一个我不记得名字的缓冲区,而那个是“ t备用缓冲区。因此,不可能使用:b#,也不能通过命令q4​​312079q使用补全。


相反,我发现制表符补全非常方便。为适合您的值设置正确的选项可能会很有帮助。这些是我的:b的相关代码行(它们对我有用,但它们可能对您不起作用,因此请不要复制它们):

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

正确的缓冲区很少会超过五到六个按键:函数vimrc等待输入,最后调用:B,然后输入。


Barry Arthur在几年前想出了一个简单得多的解决方案,此后从此开始流行:

nnoremap <leader>b :ls<CR>:b<Space>


几年前,我提出了一个更为通用的变体:

nnoremap gb :ls<CR>:b





由于我们正在谈论vimscript,所以我写了一个很好的小函数,它在类似:buffers:b的类似列表的命令之后,使用正确的命令存根“自动填充”命令行。该函数相对于上面的映射的优点是,我不必记住特定的映射。它的工作原理类似于Vim,但有一点点扭曲。

支持“基于符号的导航”而不是“基于文件的导航”。如果适用,基于符号的导航比基于文件的导航要快得多,也更经济。

最后一个GIF显示了基于符号的导航的一种意思。这个例子很愚蠢,但是……哦。

评论


我想我对Wild *选项的玩法还不够,我会尝试以自己的方式进行调整。关于Barry Arthur解决方案,它非常接近@ nobe4的有趣的答案。最后,我将不得不更深入地研究您的CCR()函数以真正获得它,但它看起来很有希望。感谢您的回答。

–statox♦
16年8月11日在11:40

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

– romainl
16年8月11日在11:46

我一定会偷其中的一些!

–statox♦
16年8月11日在11:52

#2 楼

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

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

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

评论


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

–statox♦
16年8月11日在11:37

如果要使结尾处的空间更加可见,可以执行以下操作:nnoremap b:buffers :buffer |

–泰勒·杜顿(Tyler Durden)
16年8月11日在12:39

#3 楼


有一阵子,我使用了nobe4的技术,如下所示:发现击键最少的最快方法是使用:
nnoremap <Leader>b :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>
这与{count} CTRL-^没什么不同,但是正如您所说,您需要知道缓冲区编号! 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

所以我当前的缓冲区切换过程如下:

看MiniBufExplorer
命中3 Ctrl-E


不幸的是,MBE和上面的脚本不是您所要求的Vim内置文件。当我在没有配置的远程计算机上时,我只使用:b#<Enter>和Tab补全。