仅使用内置的Vim功能来寻找答案。我在编辑许多缓冲区时的工作流程:我
在一个缓冲区上,我想切换到另一个我不记得
名称并且不是替代缓冲区的缓冲区。因此,无法使用
:b#
,并且通过命令q4312079q使用补全也不方便。
为此,我正在执行以下操作:
首先使用
:b
获取打开的缓冲区列表记住我要使用的缓冲区的编号
按Enter键关闭缓冲区列表
使用
:buffers
和:bX
的数量这个工作流程对我来说似乎很繁重,所以我在我的
X
中添加了以下几行: >这给了我一个命令.vimrc
(和一个映射),它调用函数:B
等待输入,最后调用
:buffers
,然后输入。我必须开发这样的功能:通常Vim有一个非常有效的默认工作流程,所以我想知道是否有更好的方式切换到我不知道的缓冲区?
已经打开在我的编辑会话中。
#1 楼
当我编辑许多缓冲区时,我一直注意到工作流程中的一个缺陷:我在一个缓冲区上,我想切换到另一个我不记得名字的缓冲区,而那个是“ t备用缓冲区。因此,不可能使用
:b#
,也不能通过命令q4312079q使用补全。相反,我发现制表符补全非常方便。为适合您的值设置正确的选项可能会很有帮助。这些是我的
: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
–泰勒·杜顿(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补全。
评论
我先执行:ls再执行:b#(不需要先按return或转义,可以直接从'ls'中的缓冲区列表中去。)(作为注释发布,因为它似乎不足以作为答案?还想知道我是否缺少某些东西并回答错误的问题。)@LindaJeanne:正如我说的那样:b#不是我要的东西,但是是的,您可以通过直接输入:b来保存击键,而无需先按回车键这一事实很有趣。 (实际上,这个答案可能太轻巧了,但是值得一提:-))
我猜想LindaJeanne的意思是#字符是(缓冲区)数字的替代品,而不是文字的#字符。