最近我发现我是"using tabs incorrectly" in Vim。从那以后,我一直试图在 Vim 中使用缓冲区,通过 MiniBufExplorer 提供帮助,但我发现这很痛苦,因为从正常模式更改缓冲区需要多少次击键。使用标签,我可以在正常模式下执行 gt 或 gT 在标签之间来回跳转,我也可以执行 NUMBERgt 转到特定选项卡。
对于缓冲区,我要么必须使用 :bn
、:bp
进入命令模式,要么使用 MiniBufExplorer,使用 Ctrl + k 或 Ctrl + Up 跳到缓冲区窗口,使用 h 和 l 向左或向右滚动,然后按 Enter 选择我想要的缓冲区。或者我可以做一些涉及前导序列的事情,但它总是需要从主行移除多个手指。那是一个真正的痛苦。
如何在正常模式下获得等效的切换选项卡以在正常模式下切换缓冲区,所以我可以执行类似 gn/g< :bn
/:bp
的 kbd>p 和 :buf NUMBER
的 NUMBERgn?
将此添加到您的 .vimrc
map gn :bn<cr>
map gp :bp<cr>
map gd :bd<cr>
请注意,您正在重新映射 gp
和 gd
,但也许您并不关心(:help gp
、:help gd
)。
有关如何映射击键的更多信息,请参阅 :help map-overview
和 :help map.txt
。
顺便说一句,我个人在映射中使用 <leader>
而不是 g
。我的 <leader>
设置为 ;
。这将我的 <leader>
键放在主行上,这使我愿意使用 <leader>
映射各种东西。 :help mapleader
如果您想更改您的 <leader>
密钥。
我通常在缓冲区之间切换的方式是使用带有内置自动完成功能的 :buffer
命令,例如 :b prof<Tab>
切换到 folder/path/LoginProfileFactory.php
。
您可以开始输入您需要的缓冲区文件名的任何部分,这很好。
不太常见的是,我实际上记住了我想要的缓冲区的数量,我使用了 :b 3
或 :3b
之类的东西。我看到您提到您不喜欢 :buf 3
,因此 Rumple Stiltskin 可以替代您可能喜欢的 :3b
样式。
:b <Tab>
(注意不要忘记添加空格),它将开始循环通过您打开的缓冲区。如果您甚至不记得文件名,这很有帮助
wildmode
中包含 lastused
(我使用 set wildmenu wildmode=lastused:full
)非常方便,因为它以最近使用的顺序循环匹配,从而很容易跳回到最近的缓冲区。
{count}CTRL-^
切换到 count
编号的缓冲区。
:buffers
或查看我的答案...
我在 .vimrc 中有以下几行:
nnoremap <silent> <tab> :if &modifiable && !&readonly && &modified <CR> :write<CR> :endif<CR>:bnext<CR>
nnoremap <silent> <s-tab> :if &modifiable && !&readonly && &modified <CR> :write<CR> :endif<CR>:bprevious<CR>
现在,一个 Tab 可以让您转到下一个缓冲区,而 Shift-Tab 可以让您转到上一个缓冲区。
:set hidden
,您是否需要 modifiable、readonly、modified 的值?
这是基于 Nick Knowlson's answer,但我想在那里扩展我的评论......
键入 :b
...这让我们更接近我使用的所有其他编辑器和浏览器中的 Ctrl + Tab。
它实际上在某些方面甚至更好,然后您可以使用 ← / → 箭头来回前进。它避免了拇指 + 手指 fu 键入 Ctrl + Shift + Tab 来向后浏览编辑器和浏览器中的选项卡。
注意 Shift + Tab 与 Tab 的作用相同
这实际上类似于 Windows 10 中的 Win + Tab,一旦您第一次打开窗口,您就可以使用箭头键四处移动。
编辑:我还有两个使用缓冲区的技巧:
从这个答案我在我的 .vimrc 中有这个: nnoremap
我使用插件 unimpaired.vim
它定义了跳转到列表中上一个和下一个缓冲区的映射 [b
和 ]b
。
对于跳转到特定缓冲区,我知道的最佳选择是您提到的那个::b<number>
如果您进入另一个缓冲区,您可以通过键入 <c-^>
快速返回
我使用 LustyExplorer:我点击 <leader>b
打开一个缓冲区列表,然后是我要打开的缓冲区名称中的几个字母,然后是 enter
。简单的。
但是,您并没有“错误地使用标签”,而是按照您想要的方式使用标签。如果它对您有用,为什么还要经历忘记学习“正确方式”的方式的痛苦?
扩展 Rumple Stiltskin 的答案,例如,如果您知道要访问的文件位于缓冲区 4
中,则可以使用
4Ctrl-^
在我的英国键盘上,我实际上可以执行 4Ctrl-6
,如中所述
:help CTRL-^
顺便说一句,您可以看到缓冲区编号
:buffers
或者
:ls
我使用 F9 和 F10 在具有此映射的上一个/下一个缓冲区之间移动:
map <F9> :bprevious<CR>
map <F10> :bnext<CR>
对我来说,这是切换缓冲区的最快方法。
fzf.vim 是使用模糊匹配更改缓冲区的另一种快速方法。此插件附带默认命令:
:Buffers
它打开所有打开的缓冲区列表,类似于 :ls 但可以(模糊)搜索和选择一个缓冲区。在当前窗口中打开缓冲区是通过回车,但也可以分别使用 ^X ^V 或 ^T 在新的拆分(h 或 v)或选项卡中打开。
值得注意的还有:
:Lines
它允许搜索所有打开缓冲区的内容。如果您忘记了缓冲区的名称,但您知道它应该包含什么,这会很方便。
.vimrc
中有这个:nnoremap <leader>bb :buffers<cr>:b<space>
它会打开 :ls
/ :buffers
命令并预先输入 :b
,这样您只需输入缓冲区编号。这对我来说通常足够了。我还发现 :buffers
命令会立即出现,因为打开 :Buffers
时会出现令人沮丧的延迟(至少在我最常使用 Vim 的 Windows 上的 GVim 中)。
我让自己更容易:在 .vimrc
中:
nnoremap <leader>bf :buffers<CR>:buffer "<- Last spaces is necessary
例如,在正常模式下,假设您的领导键是 \
(默认为),输入 \bf
,然后您有一个打开的缓冲区列表,输入您想要的缓冲区编号并按 Enter 键。注意:请记住,如果您在 :D 之后键入最后一个空格
,则根本不需要
就这样;)
https://i.stack.imgur.com/VNkZl.png
更多详情:
<C-O>
向后导航
<C-I>
向前导航
所以不需要额外的重新映射,否则你重新映射它们。
这是我的解决方案:
" `<leader><Tab>` - next buffer;
nnoremap <silent> <leader><Tab> :bnext<CR>
" `<leader><S-Tab>` - previous buffer;
nnoremap <silent> <leader><S-Tab> :bprevious<CR>
" `_bufferNumber_ + <Tab>` - go exact the buffer number;
nnoremap <silent> <Tab> <C-^>
顺便说一句,我使用 'buftabline' 插件并设置 let g:buftabline_numbers = 1
以将我的缓冲区分布在 tabline 上。
https://i.stack.imgur.com/BIUuB.png
我认为 bufexplorer 是一个不错的插件。 <leader>
be 会打开一个交互式缓冲区浏览器,列出所有打开的缓冲区。您可以快速浏览列表,然后 Enter 将您放入选定的缓冲区。与 LustyExplorer
不同,它不依赖于 ruby。
我更喜欢在缓冲区之间导航,就像在窗格之间导航一样:<alt-h>
和 <alt-l>
。这在 Mac 上设置很简单,因为 <alt>/<option>
键绑定绑定到特定字符。
" Buffer navigation
map ˙ :bp<cr>
map ¬ :bn<cr>
map § <c-^>
这是一个很好的 answer,它显示了如何查看映射到 <alt-..>
组合的字符
<leader>
的好建议。最初我不喜欢这样,因为\
是最初的领导者并且不容易到达,但当然,正确的做法是将领导者重新定义为接近本行的东西,在我的情况下,
,这对于 Dvorak 布局比;
更容易。<leader>d
作为到:bd
的映射,我觉得更烦人而不是值得。很容易意外输入<leader>d
,然后您必须重新打开文件。我发现这种风险比每次都输入:bd
更烦人。但是通常我几乎从不删除缓冲区,我只是让所有缓冲区打开/隐藏,然后在完成某项工作后运行:%bd
将它们全部删除。 Vim 的优点之一是您不必真正关心打开了多少缓冲区。