: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-^
#1 楼
:b
命令还可以获取要传输到的缓冲区文件名的子字符串,这非常方便。例如,如果您有三个缓冲区foo
,bar
和baz
,然后:b bar
将切换到bar
文件。:b o
将切换到foo
文件。:b a
将给您一个错误,因为这可能意味着bar
或baz
,但是您可以将名称更具体,例如:↑r Enter。这可能非常有用,因为它的意思是代替了
:buffer very/very/long/path/to/a/veryVeryLongFileName.txt
您可以做类似
的事情,它更短,更容易。如果要使用该数字,请同时输入一个数字:
:b LongFileName
评论
关于使用部分缓冲区名称的警告:如果部分缓冲区名称出现在某个缓冲区路径中单词边界的开头,则:b命令将无法访问部分名称位于单词中间的缓冲区。例如,如果您有两个缓冲区path / to / foo和path / to / tofu,命令:bf
–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]
– 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
我正在使用地图
–罗夫
18-09-13在7:59
@Rolf:您知道
–霍奇克
18-09-13在8:25
@Hotschke:不,我不知道。知道了些什么,谢谢!我要重新映射
–罗夫
18-09-14在6:44
很好的参考
– radke
19年7月31日在16:01
#4 楼
来自插件
[b
(> 2k★)的]b
和vim-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)。通过两次快速击键,我得到了列表它们都可以,并且我能够对它们使用强大的模糊搜索来快速找到我想要的东西。 评论
在只有两个缓冲区的情况下,单独使用
– 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>
评论
您可以按您是说Ctrl-1转到1号缓冲区吗?不幸的是行不通。什么都没发生
否。某些终端可以理解Ctrl-6,与美国键盘上的Ctrl- ^相同。
+1好极了!我使用意大利语键盘布局(使用腻子终端模拟器)。因此:1
您还可以通过输入以下内容在新窗口中打开任何备用缓冲区:Ctrl-w 5 Ctrl-6,其中5是要打开的备用缓冲区,也是Ctrl-w Ctrl-6。