ChatGPT解决这个技术问题 Extra ChatGPT

在 Vim 普通模式下快速切换缓冲区

vim

最近我发现我是"using tabs incorrectly" in Vim。从那以后,我一直试图在 Vim 中使用缓冲区,通过 MiniBufExplorer 提供帮助,但我发现这很痛苦,因为从正常模式更改缓冲区需要多少次击键。使用标签,我可以在正常模式下执行 gtgT 在标签之间来回跳转,我也可以执行 NUMBERgt 转到特定选项卡。

对于缓冲区,我要么必须使用 :bn:bp 进入命令模式,要么使用 MiniBufExplorer,使用 Ctrl + kCtrl + Up 跳到缓冲区窗口,使用 hl 向左或向右滚动,然后按 Enter 选择我想要的缓冲区。或者我可以做一些涉及前导序列的事情,但它总是需要从主行移除多个手指。那是一个真正的痛苦。

如何在正常模式下获得等效的切换选项卡以在正常模式下切换缓冲区,所以我可以执行类似 gn/g< :bn/:bp 的 kbd>p 和 :buf NUMBERNUMBERgn


E
Eric Johnson

将此添加到您的 .vimrc

map gn :bn<cr>
map gp :bp<cr>
map gd :bd<cr>  

请注意,您正在重新映射 gpgd,但也许您并不关心(:help gp:help gd)。

有关如何映射击键的更多信息,请参阅 :help map-overview:help map.txt

顺便说一句,我个人在映射中使用 <leader> 而不是 g。我的 <leader> 设置为 ;。这将我的 <leader> 键放在主行上,这使我愿意使用 <leader> 映射各种东西。 :help mapleader 如果您想更改您的 <leader> 密钥。


关于使用 <leader> 的好建议。最初我不喜欢这样,因为 \ 是最初的领导者并且不容易到达,但当然,正确的做法是将领导者重新定义为接近本行的东西,在我的情况下 , ,这对于 Dvorak 布局比 ; 更容易。
这可能会影响 gn (选择上次搜索的下一个实例),有些人可能会使用某些宏和重复。
<leader>d 作为到 :bd 的映射,我觉得更烦人而不是值得。很容易意外输入 <leader>d,然后您必须重新打开文件。我发现这种风险比每次都输入 :bd 更烦人。但是通常我几乎从不删除缓冲区,我只是让所有缓冲区打开/隐藏,然后在完成某项工作后运行 :%bd 将它们全部删除。 Vim 的优点之一是您不必真正关心打开了多少缓冲区。
C
Community

我通常在缓冲区之间切换的方式是使用带有内置自动完成功能的 :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)非常方便,因为它以最近使用的顺序循环匹配,从而很容易跳回到最近的缓冲区。
i
icc97

{count}CTRL-^ 切换到 count 编号的缓冲区。


那么记住每个缓冲区 ID 吗?在此之前执行 :buffers 或查看我的答案...
使用 MiniBufExplorer 插件查看数字并在它们之间切换
F
Fritz G. Mehner

我在 .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 可以让您转到上一个缓冲区。


非常好。轻松获得最佳解决方案。选项卡毕竟是导航键。标签的ctl-sh-tab和ctl-tab怎么样?
@HörmannHH 不幸的是,某些快捷方式无法在 Vim 中映射, 就是这种情况。
这很棒。我在偷
如果您有 :set hidden,您是否需要 modifiable、readonly、modified 的值?
很棒的答案。
i
icc97

这是基于 Nick Knowlson's answer,但我想在那里扩展我的评论......

键入 :b (注意空格),然后使用 Tab 或 ← / → 在打开的缓冲区中循环。

...这让我们更接近我使用的所有其他编辑器和浏览器中的 Ctrl + Tab。

它实际上在某些方面甚至更好,然后您可以使用 ← / → 箭头来回前进。它避免了拇指 + 手指 fu 键入 Ctrl + Shift + Tab 来向后浏览编辑器和浏览器中的选项卡。

注意 Shift + Tab 与 Tab 的作用相同

这实际上类似于 Windows 10 中的 Win + Tab,一旦您第一次打开窗口,您就可以使用箭头键四处移动。

编辑:我还有两个使用缓冲区的技巧:

从这个答案我在我的 .vimrc 中有这个: nnoremap bb :buffers:b 它打开 :ls / :buffers 命令并预先输入 :b 以便您只需输入缓冲区编号,您将看到一个包含所有缓冲区及其编号的列表。我也有 nnoremap :b# 在当前和最近使用的缓冲区之间切换,这有点像 cd - 在目录之间来回切换时


s
skeept

我使用插件 unimpaired.vim

它定义了跳转到列表中上一个和下一个缓冲区的映射 [b]b

对于跳转到特定缓冲区,我知道的最佳选择是您提到的那个::b<number>

如果您进入另一个缓冲区,您可以通过键入 <c-^> 快速返回


r
romainl

我使用 LustyExplorer:我点击 <leader>b 打开一个缓冲区列表,然后是我要打开的缓冲区名称中的几个字母,然后是 enter。简单的。

但是,您并没有“错误地使用标签”,而是按照您想要的方式使用标签。如果它对您有用,为什么还要经历忘记学习“正确方式”的方式的痛苦?


LustyExplorer 看起来非常整洁,可能是我最终确定的。在 lococast.net/archives/185 大约 7 分钟有一个非常好的视频演示。谢谢。
R
Robert

扩展 Rumple Stiltskin 的答案,例如,如果您知道要访问的文件位于缓冲区 4 中,则可以使用

4Ctrl-^

在我的英国键盘上,我实际上可以执行 4Ctrl-6,如中所述

:help CTRL-^

顺便说一句,您可以看到缓冲区编号

:buffers

或者

:ls

m
mvidovic

我使用 F9 和 F10 在具有此映射的上一个/下一个缓冲区之间移动:

map <F9> :bprevious<CR>
map <F10> :bnext<CR>

对我来说,这是切换缓冲区的最快方法。


S
Sebastian Müller

fzf.vim 是使用模糊匹配更改缓冲区的另一种快速方法。此插件附带默认命令:

:Buffers

它打开所有打开的缓冲区列表,类似于 :ls 但可以(模糊)搜索和选择一个缓冲区。在当前窗口中打开缓冲区是通过回车,但也可以分别使用 ^X ^V 或 ^T 在新的拆分(h 或 v)或选项卡中打开。

值得注意的还有:

:Lines

它允许搜索所有打开缓冲区的内容。如果您忘记了缓冲区的名称,但您知道它应该包含什么,这会很方便。


FZF 通常很棒,我总是在打开不在缓冲区中的文件时使用它。我的 .vimrc 中有这个:nnoremap <leader>bb :buffers<cr>:b<space> 它会打开 :ls / :buffers 命令并预先输入 :b ,这样您只需输入缓冲区编号。这对我来说通常足够了。我还发现 :buffers 命令会立即出现,因为打开 :Buffers 时会出现令人沮丧的延迟(至少在我最常使用 Vim 的 Windows 上的 GVim 中)。
M
Mamrezo

我让自己更容易:在 .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> 向前导航

所以不需要额外的重新映射,否则你重新映射它们。


S
Sheldon

这是我的解决方案:

" `<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


f
faham

我认为 bufexplorer 是一个不错的插件。 <leader>be 会打开一个交互式缓冲区浏览器,列出所有打开的缓冲区。您可以快速浏览列表,然后 Enter 将您放入选定的缓冲区。与 LustyExplorer 不同,它不依赖于 ruby。


S
Smartens

我更喜欢在缓冲区之间导航,就像在窗格之间导航一样:<alt-h><alt-l>。这在 Mac 上设置很简单,因为 <alt>/<option> 键绑定绑定到特定字符。

" Buffer navigation
map ˙ :bp<cr>
map ¬ :bn<cr>
map § <c-^>

这是一个很好的 answer,它显示了如何查看映射到 <alt-..> 组合的字符