在vim中选择缓冲区的一种方法可能是浏览缓冲区列表,使用标准命令:ls,或者使用一些外部插件/ vimscript代码在窗口中浏览列表。
要尽可能快地直接跳转到缓冲区。

要在顺序模式下遍历缓冲区列表,我现在在我的.vimrc中设置了<C-J> <C-K>快捷方式:

" move among buffers with CTRL
map <C-J> :bnext<CR>
map <C-K> :bprev<CR>


另一种方式(直接访问)可以通过数字切换:知道缓冲区编号,可以通过输入缓冲区编号和<C-^>直接进行切换。因此,如果我想切换到5号缓冲区,请按5<C-^>。我怀疑这是因为^字符在意大利语键盘的大写字母中,所以实际上要获得^,我需要按SHIFT-^

评论

您可以按而不是吗?

您是说Ctrl-1转到1号缓冲区吗?不幸的是行不通。什么都没发生

否。某些终端可以理解Ctrl-6,与美国键盘上的Ctrl- ^相同。

+1好极了!我使用意大利语键盘布局(使用腻子终端模拟器)。因此:1 切换到缓冲区编号1。谢谢!

您还可以通过输入以下内容在新窗口中打开任何备用缓冲区:Ctrl-w 5 Ctrl-6,其中5是要打开的备用缓冲区,也是Ctrl-w Ctrl-6。

#1 楼

:b命令还可以获取要传输到的缓冲区文件名的子字符串,这非常方便。例如,如果您有三个缓冲区foobarbaz,然后


:b bar将切换到bar文件。
:b o将切换到foo文件。
:b a将给您一个错误,因为这可能意味着barbaz,但是您可以将名称更具体,例如:↑r Enter。

这可能非常有用,因为它的意思是代替了

:buffer very/very/long/path/to/a/veryVeryLongFileName.txt


您可以做类似

的事情,它更短,更容易。如果要使用该数字,请同时输入一个数字:

:b LongFileName


评论


关于使用部分缓冲区名称的警告:如果部分缓冲区名称出现在某个缓冲区路径中单词边界的开头,则:b命令将无法访问部分名称位于单词中间的缓冲区。例如,如果您有两个缓冲区path / to / foo和path / to / tofu,命令:bf 将永远不匹配path / to / tofu,因为它与path / to / toword中的单词开头匹配foo。

–tommcdo
2015年2月23日下午13:36

:5b短于:b 5 ;-)

– joeytwiddle
15年2月24日在22:00

@joeytwiddle或:b5(如果愿意):)

–血腥
20年4月7日在21:54

#2 楼

这就是我使用的方法:

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


现在按\b将列出可用的缓冲区并为您准备:b

然后您可以键入缓冲区号,然后按Enter。

或者您可以键入文件名的一部分,然后按Enter。 (但是我通常在按Enter之前先按Tab,以检查我是否有正确的缓冲区。如果没有,我将继续使用Tab循环直到得到想要的缓冲区。)实际上,
我使用了上面的略微调整后的版本:

nnoremap <C-e> :set nomore <Bar> :ls <Bar> :set more <CR>:b<Space>


当缓冲区多于可用行以显示它们时,这将防止出现-- More --提示。

但是,如果您通常无论如何都禁用了'more'选项,则此映射将使您非常烦恼,因为它在执行'more'之后会重新启用ls选项!

评论


实话实说,我实际上并没有使用任何一个,而是使用了自己的小插件,但是功能非常相似。使用该插件,我还可以对未打开的缓冲区的文件名执行Tab补全。

– joeytwiddle
15年2月24日在22:24

尽管当您知道缓冲区编号时此技术不如使用[count] 快,但在您不知道时它非常有用。

– joeytwiddle
15年2月24日在22:28

谢谢joeytwiddle的笔记。我将尽快检查您的插件。就我而言(请参阅上面的键盘问题)[count] 在我看来是切换到已知缓冲区的最快方法

– Giorgio Robino
2015年2月25日在9:25

是的,这些天我也在使用[count] 。但这意味着我需要运行MiniBufExplorer或类似的东西,才能知道缓冲区号是多少!

– joeytwiddle
17年9月25日在4:16

为什么需要?一开始,对我来说,好像没有它们就可以正常工作...

–费利克斯·克拉佐拉(Felix Crazzolara)
18年8月30日在19:59

#3 楼


插件CtrlP(4k★)中的:CtrlPBuffer

此插件的主要功能是提供模糊匹配,以方便地打开具有可视反馈的其他缓冲区。使用:CtrlPBuffer列出模糊缓冲区,或按<C-p>,然后按<C-b>将模式更改为buffer

输入足够的字符数以指定要打开的缓冲区。
也可以使用<C-j><C-k>循环浏览列表并手动选择缓冲区。 <C-p>,将以下行添加到您的vimrc中:

let g:ctrlp_cmd = 'CtrlPBuffer'


您可以使用<C-f/b>来切换ctrlp窗口的模式。 let g:ctrlp_cmd = 'CtrlPMRU'。最近使用的(mru)列表还包含打开的缓冲区。如果您使用不同的ctrlp模式并希望坚持使用上一个模式,则可以设置let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'。具有模糊匹配的提示,例如Junegunn(+ terminal,go)的


fzf.vim(5k★)
Wincent的
(+ ruby​​)

Shougo的denite.nvim(+ python3,vim8或neovim)例如,繁重的vim设置与vim方式)

在决定使用这些更复杂的插件之前,请先研究@Doorknob和@joeytwiddle的答案。特别是,检查其中一个是否满足您的需求。



另请参阅https://www.vi-improved.org/recommendations上的评论以及Drew Neil的文章“锐化锯子”。

评论


是的,Hotschke,我承认我经常使用:CtrlPBuffer

– Giorgio Robino
17年1月11日在10:36

我正在使用地图 a :CtrlPBuffer 跳转到使用 a打开的缓冲区(而 b只是为我打开了缓冲区列表)

–罗夫
18-09-13在7:59

@Rolf:您知道(= )吗?参见:h CTRL- ^。 Afaik,这确实可以完成您的映射 a的工作。因此,我想您只是举了一个例子,为什么人们说使用插件可能导致不知道vim已经可以自己做什么的vim用户。

–霍奇克
18-09-13在8:25

@Hotschke:不,我不知道。知道了些什么,谢谢!我要重新映射

–罗夫
18-09-14在6:44



很好的参考与香草vim。我在其他任何地方都没有看到该参考。

– radke
19年7月31日在16:01

#4 楼


来自插件[b(> 2k★)的]bvim-unimpaired

如果恰好安装了vim-unimpaired,则可以使用



[b:bp[revious])和
]b:bn[ext]

用于循环打开缓冲区。无需为相同的命令定义更宝贵的映射。此外,可以通过





[B:bf[irst])和

]B:bl[ast])来跳转到第一个缓冲区和最后一个缓冲区。 >
vim-unimpaired中包含许多其他的括号映射,您可能会觉得有用。它们都遵循相同的方案,因此很容易记住它们。 #vim社区将其表示为“不伤害”插件。

评论


+1还值得注意,您可以提供一个计数。 3 [b向后跳三个缓冲区。

– joeytwiddle
19年4月29日在3:28

#5 楼

除了joeytwiddle和Doorknob提供的真正有用的答案外,请不要忘记:b#,它会切换到最近使用的缓冲区。也可以只用<C-^>来完成。当您有很多缓冲区并且经常在它们之间切换时,最近的缓冲区通常是最常见的目的地。

我个人使用多种方法的组合。当我主要使用两个缓冲区,而其余缓冲区仅用于偶尔参考时,我倾向于使用:b#<C-^>在它们之间切换。当我不得不使用更多的它们并更频繁地切换时,我可以使用带有TAB的数字(如joeytwiddle提示)或部分名称(如Doorknob提示)使用它们。当名称混乱时,并且打开了许多缓冲区(通常超过10个),我更频繁地使用Ctrl-P插件(https://github.com/kien/ctrlp.vim)。通过两次快速击键,我得到了列表它们都可以,并且我能够对它们使用强大的模糊搜索来快速找到我想要的东西。

评论


在只有两个缓冲区的情况下,单独使用(在我的情况下为,正如Peter Rincker所建议的那样)是一个好技巧:

– Giorgio Robino
15年2月26日在16:50

#6 楼

目前,我正在使用<Leader> + number键进行切换。引导键是我的<space>键。
我还使用vim-airline在窗口顶部显示缓冲区nr。

" airline settings
let g:airline#extensions#tabline#buffer_nr_show = 1
let g:airline#extensions#tabline#enabled = 1


超过10,因此我要调整自己的映射,如果number是唯一的匹配项,请立即切换缓冲区,否则请等待更多数字输入或<space>键确认:

nnoremap <expr> <Leader>1 tweak#wtb_switch#key_leader_bufnum(1)
nnoremap <expr> <Leader>2 tweak#wtb_switch#key_leader_bufnum(2)
nnoremap <expr> <Leader>3 tweak#wtb_switch#key_leader_bufnum(3)
nnoremap <expr> <Leader>4 tweak#wtb_switch#key_leader_bufnum(4)
nnoremap <expr> <Leader>5 tweak#wtb_switch#key_leader_bufnum(5)
nnoremap <expr> <Leader>6 tweak#wtb_switch#key_leader_bufnum(6)
nnoremap <expr> <Leader>7 tweak#wtb_switch#key_leader_bufnum(7)
nnoremap <expr> <Leader>8 tweak#wtb_switch#key_leader_bufnum(8)
nnoremap <expr> <Leader>9 tweak#wtb_switch#key_leader_bufnum(9)




func! tweak#wtb_switch#key_leader_bufnum(num)
    let l:buffers = tweak#wtb_switch#buflisted()
    let l:input = a:num . ""

    while 1

        let l:cnt = 0
        let l:i=0
        " count matches
        while l:i<len(l:buffers)
            let l:bn = l:buffers[l:i] . ""
            if l:input==l:bn[0:len(l:input)-1]
                let l:cnt+=1
            endif
            let l:i+=1
        endwhile

        " no matches
        if l:cnt==0 && len(l:input)>0
            echo "no buffer [" . l:input . "]"
            return ''
        elseif l:cnt==1
            return ":b " . l:input . "\<CR>"
        endif

        echo ":b " . l:input

        let l:n = getchar()

        if l:n==char2nr("\<BS>") ||  l:n==char2nr("\<C-h>")
            " delete one word
            if len(l:input)>=2
                let l:input = l:input[0:len(l:input)-2]
            else
                let l:input = ""
            endif
        elseif l:n==char2nr("\<CR>") || (l:n<char2nr('0') || l:n>char2nr('9'))
            return ":b " . l:input . "\<CR>"
        else
            let l:input = l:input . nr2char(l:n)
        endif

        let g:n = l:n

    endwhile
endfunc

func! tweak#wtb_switch#buflisted()
  return filter(range(1, bufnr('$')), 'buflisted(v:val)')
endfunc

>代码是从此处粘贴的

顺便说一句,我还对<S-h><S-l>使用了:bp:bn,或者如果当前打开了多个标签页,请使用:tabp:tabn。对我来说很直观。

评论


是的。很高兴我在此线程上向下滚动。谢谢。

–imagineerThat
20年7月28日在23:10

#7 楼

这些天我使用[buffer_number]<Ctrl-^>来切换缓冲区,因为它非常快。

但是如何知道缓冲区编号?我使用MiniBufExplorer,所以我总是可以在Vim的顶部看到缓冲区编号。

我也使用以下映射,因为<C-^>很难用一只手拿到。

:nmap <C-E> <C-^>



在没有配置的新机器上,我回到:b [part_of_filename]<Tab><Enter>