" Movement between tabs OR buffers
nnoremap L :call MyNext()<CR>
nnoremap H :call MyPrev()<CR>
" MyNext() and MyPrev(): Movement between tabs OR buffers
function! MyNext()
if exists( '*tabpagenr' ) && tabpagenr('$') != 1
" Tab support && tabs open
normal gt
else
" No tab support, or no tabs open
execute ":bnext"
endif
endfunction
function! MyPrev()
if exists( '*tabpagenr' ) && tabpagenr('$') != '1'
" Tab support && tabs open
normal gT
else
" No tab support, or no tabs open
execute ":bprev"
endif
endfunction
我在mac和linux机器上以这种方式工作,我发现它比本机窗口窗格切换机制更好's provided (on Macs). I find the switching easier and only with tmux have I been able to get the '在同一当前目录' working on my mac (despite the fact that there seems to be options to open new panes in the same directory) which is a surprisingly critical piece. An instant new pane at the current location is amazingly useful. A method that does new panes with the same key combos for both OS'的新页面对我来说是至关重要的,并为将来的个人兼容性提供奖励 . 除了多个tmux窗格,我还尝试使用多个标签,例如
和多个新窗口,例如
最终我've found that multiple tmux panes to be the most useful for me. I am very '视觉'并且喜欢把我的各种情境放在我面前,连在一起作为窗格 .
tmux还支持水平和垂直窗格,旧的 screen 没有't (though mac' s iterm2似乎支持它,但同样,当前目录设置对我来说不起作用) . tmux 1.8
1
如果 using only vim built-in commands ,我见过在多个缓冲区之间切换的最好的是:
It perfectly combines both :ls and :b commands -- listing all opened buffers and waiting for you to input the command to switch buffer.
在vimrc中给出上面的映射,一旦你键入 <Leader>f ,
显示所有打开的缓冲区
您可以:
输入 23 进入缓冲区23,
键入 # 以转到备用/ MRU缓冲区,
键入文件的部分名称,然后键入 <Tab> 或 <C-i> 以自动完成,
或者只是 <CR> 或 <Esc> 保持当前缓冲区
上述键映射的输出快照是:
:set nomore|:ls|:set more
1 h "script.py" line 1
2 #h + "file1.txt" line 6 -- '#' for alternative buffer
3 %a "README.md" line 17 -- '%' for current buffer
4 "file3.txt" line 0 -- line 0 for hasn't switched to
5 + "/etc/passwd" line 42 -- '+' for modified
:b '<Cursor> here'
在上面快照:
第二列: %a 表示当前, h 表示隐藏, # 表示前一个,空表示尚未切换到 .
第三栏: + 进行修改 .
另外,我强烈建议 set hidden . 见 :help 'hidden' .
1
我使用以下内容,这为您提供了许多其他编辑器所具有的功能,例如Sublime Text / Textmate
使用不是'tab pages'的缓冲区 . 缓冲区与几乎所有其他编辑器中的选项卡相同 .
如果您希望获得相同的标签,可以在 .vimrc 中使用vim-airline插件并使用以下设置: let g:airline#extensions#tabline#enabled = 1 . 如果没有打开标签页,则会自动将所有缓冲区显示为标签页眉
27 回答
为什么不使用标签(在Vim 7中引入)?您可以使用
:tabn
和:tabp
在选项卡之间切换,使用:tabe <filepath>
可以添加新选项卡;并使用常规:q
或:wq
关闭选项卡 . 如果将:tabn
和:tabp
映射到F7 / F8键,则可以轻松切换文件 .如果没有那么多文件或者您没有Vim 7,您还可以将屏幕拆分为多个文件:
:sp <filepath>
. 然后你可以用Ctrl W切换分屏,然后在想要移动的方向上切换箭头键(或者代替箭头键,w代表下一个,W代表前一个分屏)这个帖子中的一些答案建议使用制表符,其他人建议使用缓冲区来完成同样的事情 . 标签和缓冲区是不同的 . 我强烈建议你阅读这篇文章Vim Tab madness - Buffers vs Tabs
以下是我从文章中摘录的一个很好的总结:
摘要:
缓冲区是文件的内存中文本 .
窗口是缓冲区上的视口 .
标签页是一组窗口 .
上市
要查看当前缓冲区列表,我使用:
开幕
要打开一个新文件,我使用
增强的选项卡完成(在
.vimrc
中放置set wildmenu
) .注意:您也可以使用
:find
来搜索一组路径,但您需要先自定义这些路径 .切换
要在所有打开的文件之间切换,我使用
增强的选项卡完成(仍为
set wildmenu
) .注意:
:b#
选择上次访问的文件,因此您可以使用它在两个文件之间快速切换 .使用窗口
Ctrl-W s
和Ctrl-W v
水平和垂直分割当前窗口 . 你也可以使用:split
和:vertical split
(:sp
和:vs
)Ctrl-W w
在打开的窗口和Ctrl-W h
(或j
或k
或l
)之间切换以浏览打开的窗口 .Ctrl-W c
关闭当前窗口,Ctrl-W o
关闭除当前窗口之外的所有窗口 .使用
-o
或-O
标志启动vim会在其自己的拆分中打开每个文件 .有了这些,我不需要Vim中的标签,我的手指找到我的缓冲区,而不是我的眼睛 .
注意:如果您希望所有文件都转到相同的Vim实例,请使用
--remote-silent
选项启动Vim .用于打开缓冲区列表
:bp
上一个缓冲区:bn
下一个缓冲区:bn
(n
一个数字)移动到第n个缓冲区:b <filename-part>
使用tab键提供自动完成功能(真棒!!)在某些版本的vim中,
bn
和bp
实际上分别是bnext
和bprevious
. 选项卡自动完成在这种情况下很有用 .或者当您处于正常模式时,使用
^
切换到您正在处理的最后一个文件 .另外,您可以保存vim的会话
以上命令将当前打开的文件缓冲区和设置保存到
~/today.ses
. 您可以使用加载该会话没有麻烦记住你昨天离开的地方 . ;)
要添加到
args
列表:要从
args
列表中删除:在您的示例中,您可以使用
:argedit
test.pl将test.pl添加到args
列表并一步编辑该文件 .:help args
提供了更多细节和高级用法我使用缓冲区命令 -
:bn
(下一个缓冲区),:bp
(上一个缓冲区):buffers
(列表打开缓冲区):b<n>
(打开缓冲区n):bd
(删除缓冲区) .:e <filename>
将打开一个新的缓冲区 .我想您可能正在使用错误的命令来查看已打开的文件列表 .
尝试执行
:ls
以查看已打开的文件列表,您将看到:然后,您可以通过列出的数字引用它们来反弹文件,例如:3B
或者您可以通过输入数字来分割屏幕,但使用sb而不是b .
旁边%表示当前可见的文件,#表示备用文件 .
您可以通过按Ctrl Shift 6轻松切换这两个文件
编辑:像
:ls
一样,您可以使用:reg
来查看寄存器的当前内容,包括0-9寄存器,其中包含您之前删除的've deleted. This is especially useful if you want to reuse some text that you' .Vim(但不是原来的Vi!)有我找到的标签(在许多情况下)优于缓冲区 . 您可以说
:tabe [filename]
在新选项卡中打开文件 . 通过单击选项卡或按键组合[n]gt
和gT
完成选项卡之间的循环 . Graphical Vim甚至还有图形标签 .:e
和:badd
之类的东西只接受一个参数,因此以下内容将失败如果要从vim中添加多个文件,请使用
arga[dd]
这里有很多答案!我使用的是在不重新发明轮子的情况下 - 最着名的插件(不会很快就会死掉并且被很多人使用)是超快速和令人讨厌的 .
ctrlpvim/ctrlp.vim - 按名称查找文件模糊搜索的位置或仅名称
jlanzarotta/bufexplorer - 浏览打开的缓冲区(当你不记得你最近打开和修改了多少文件而你不记得它们在哪里时,可能是因为你用Ag搜索了它们)
rking/ag.vim 搜索与gitignore相关的文件
scrooloose/nerdtree 查看目录结构,环视,添加/删除/修改文件
更新:最近我使用 dyng/ctrlsf.vim 搜索上下文视图(如Sublime搜索),我将引擎从 ag 切换到 ripgrep . 表现非常出色 .
在vim中使用多个文件时,我主要使用这些命令(打开~350个文件):
:b <partial filename><tab>
(跳转到缓冲区):bw
(缓冲区擦除,删除缓冲区):e <file path>
(编辑,打开新缓冲区>pltags
- 启用跳转到子程序/方法定义您可能想要使用Vim global marks .
这样,您可以快速在文件之间跳转,甚至可以在文件中的标记位置跳转 . 此外,关键命令很简短:
'C
带我到我正在使用的代码,'T
带我到我正在使用的单元测试 .更改位置时,重置标记的速度也很快:
mC
标记新的代码点,mT
标记新的测试点 .我为GVim和命令行vim使用相同的.vimrc文件 . 我倾向于在命令行vim中使用GVim中的选项卡和缓冲区,所以我设置了我的.vimrc以便更容易地使用它们:
这破坏了H和L的现有映射,但它使文件之间的切换非常快速和容易 . 只需按“H”表示下一个,“L”表示前一个;无论您使用制表符还是缓冲区,都可以获得预期的结果 .
如果您打算使用多个缓冲区,我认为最重要的是设置隐藏,这样即使您要离开的缓存中有未保存的更改,它也可以让您切换缓冲区 .
我有效处理多个文件的方法是使用tmux .
它允许您垂直和水平分割窗口,如下所示:
我在mac和linux机器上以这种方式工作,我发现它比本机窗口窗格切换机制更好's provided (on Macs). I find the switching easier and only with tmux have I been able to get the '在同一当前目录' working on my mac (despite the fact that there seems to be options to open new panes in the same directory) which is a surprisingly critical piece. An instant new pane at the current location is amazingly useful. A method that does new panes with the same key combos for both OS'的新页面对我来说是至关重要的,并为将来的个人兼容性提供奖励 . 除了多个tmux窗格,我还尝试使用多个标签,例如
和多个新窗口,例如
最终我've found that multiple tmux panes to be the most useful for me. I am very '视觉'并且喜欢把我的各种情境放在我面前,连在一起作为窗格 .
tmux还支持水平和垂直窗格,旧的
screen
没有't (though mac' s iterm2似乎支持它,但同样,当前目录设置对我来说不起作用) . tmux 1.8如果 using only vim built-in commands ,我见过在多个缓冲区之间切换的最好的是:
It perfectly combines both :ls and :b commands -- listing all opened buffers and waiting for you to input the command to switch buffer.
在vimrc中给出上面的映射,一旦你键入
<Leader>f
,显示所有打开的缓冲区
您可以:
输入
23
进入缓冲区23,键入
#
以转到备用/ MRU缓冲区,键入文件的部分名称,然后键入
<Tab>
或<C-i>
以自动完成,或者只是
<CR>
或<Esc>
保持当前缓冲区上述键映射的输出快照是:
在上面快照:
第二列:
%a
表示当前,h
表示隐藏,#
表示前一个,空表示尚未切换到 .第三栏:
+
进行修改 .另外,我强烈建议
set hidden
. 见:help 'hidden'
.我使用以下内容,这为您提供了许多其他编辑器所具有的功能,例如Sublime Text / Textmate
使用不是'tab pages'的缓冲区 . 缓冲区与几乎所有其他编辑器中的选项卡相同 .
如果您希望获得相同的标签,可以在
.vimrc
中使用vim-airline插件并使用以下设置:let g:airline#extensions#tabline#enabled = 1
. 如果没有打开标签页,则会自动将所有缓冲区显示为标签页眉使用Tim Pope的vim-unimpaired,它给[b和] b分别移动到上一个/下一个缓冲区(加上一大堆其他好东西)
.vimrc
中有set wildmenu
然后当您键入:b <file part>
Tab作为缓冲区时,您将获得一个可用缓冲区列表,您可以使用左/右箭头滚动浏览使用Tim Pope的vim-obsession插件来存储与航空公司很好地合作的会话(我有lots of pain with sessions and plugins)
使用Tim Pope的vim-vinegar插件 . 这适用于本机
:Explore
,但使其更容易使用 . 您只需键入-
即可打开资源管理器,该资源管理器与浏览器中的目录相同 . 使导航更快(但是使用fzf我很少使用它)fzf(可以作为vim插件安装)也是一个非常强大的模糊查找器,可以用来搜索文件(和缓冲区) . fzf也plays very nicely与fd(更快版本的find)
使用Ripgrep和vim-ripgrep搜索您的代码库,然后您可以在结果上使用
:cdo
进行搜索和替换添加另一个答案,因为任何答案都没有涵盖
要将所有缓冲区更改为
tab
视图 .将打开所有缓冲区到选项卡视图 . 然后我们可以使用任何与标签相关的命令
详细信息在
:help tab-page-commands
.我们可以通过
vim -p file1 file2
指示vim以标签视图的形式打开多个文件 .alias vim='vim -p'
会很有用 .通过在
~/.vimrc
中进行以下自动命令也可以实现同样的目的无论如何回答这个问题:要添加到arg列表:
arga file
,要从arg列表中删除:
argd pattern
更多
:help arglist
我使用命令行和git很多,所以我在我的bashrc中有这个别名:
这将在现有窗口的新选项卡中打开每个新文件,并为每个git存储库创建一个窗口 . 因此,如果您从repo A打开两个文件,从repo B打开3个文件,您将最终得到两个窗口,一个用于具有两个选项卡的repo A,另一个用于具有三个选项卡的repo B.
如果您打开的文件未包含在git repo中,它将进入默认窗口 .
要在标签之间跳转,我使用这些映射:
要一次打开多个文件,您应该将其与其他解决方案结合使用 .
我使用隐藏在
~/.vimrc
文件中的多个缓冲区 .迷你缓冲区资源管理器脚本也很好,可以获得缓冲区的精简列表 . 然后
:b1
或:b2
...转到相应的缓冲区或使用迷你缓冲区资源管理器和标签通过缓冲区 .尝试按照 Map 方便编辑多个文件
“拆开窗户
nmap <leader>sh :leftabove vnew<CR>
nmap <leader>sl :rightbelow vnew<CR>
nmap <leader>sk :leftabove new<CR>
nmap <leader>sj :rightbelow new<CR>
“ 到处走
nmap <C-j> <C-w>j
nmap <C-k> <C-w>k
nmap <C-l> <C-w>l
nmap <C-h> <C-w>h
我做了very simple video显示了我使用的工作流程 . 基本上我使用Ctrl-P Vim插件,并将缓冲区导航映射到Enter键 .
通过这种方式,我可以在正常模式下按Enter键,查看打开文件列表(显示在屏幕底部的一个小新窗口中),选择我要编辑的文件,然后再次按Enter键 . 要快速搜索多个打开的文件,只需键入文件名的一部分,选择文件并按Enter键 .
我在视频中没有打开很多文件,但是当你开始使用它们时,它会变得非常有用 .
由于插件使用MRU排序对缓冲区进行排序,因此您只需按两次Enter键即可跳转到您正在编辑的最新文件 .
安装插件后,您需要的唯一配置是:
当然你可以将它映射到不同的键,但我发现输入的映射非常方便 .
当我开始使用VIM时,我没有意识到应该使用标签用作不同的窗口布局,缓冲区用于多个文件编辑/相互切换的角色 . 实际上在开始时标签甚至没有在v7.0之前,我刚刚在终端标签中打开了一个VIM(我此刻正在使用gnome-terminal),并使用alt号在标签之间切换,因为我想使用如下命令:缓冲区,:bn和:bp对我来说太过分了 . 当VIM 7.0发布时,我发现管理大量文件并切换到它更容易,但最近我才意识到缓冲区应该始终是要走的路,除非有一点:你需要配置它以使其正常工作 .
所以我尝试了vim-airline并启用了可视的顶部标签式缓冲条,但是图形显示我的iTerm2有问题,所以我尝试了其他几个,看起来MBE对我来说效果最好 . 我还将shift h / l设置为快捷键,因为原始的(移动到当前页面的头部/尾部)对我来说不是很有用 .
map <S-h> :bprev<Return>
map <S-l> :bnext<Return>
它似乎比gt和gT更容易,并且:e比以下更容易:tabnew . 我发现:bd不如以下那样方便:q虽然(MBE对它有一些问题),但我认为我可以使用缓冲区中的所有文件 .
您可以通过添加
.bashrc
成为绝对的疯子和别名vim
至vim -p
:alias vim="vim -p"
这将导致在选项卡中打开shell中的多个文件,而不必在之后从vim中调用
:tab ball
.我建议使用插件
这是带指令的github链接 .
Nerdtree
我使用vim-plug作为插件管理器,但你也可以使用Vundle .
vim-plug
Vundle
如果您在osx上并希望能够单击选项卡,请使用MouseTerm和SIMBL(取自here) . 另外,请查看related discussion .
这个帖子中的大部分答案都是使用普通的vim命令,这当然很好,但我想我会提供一个广泛的答案,使用我觉得特别有用的插件和函数的组合(至少其中一些提示来自Gary Bernhardt's file navigation tips):
<leader>
两次 . 我建议将<leader>
分配给空格键:为了快速移动项目,答案是模糊匹配解决方案,例如CtrlP . 我将它绑定到
<leader>a
以便快速访问 .如果我想看到当前打开的缓冲区的可视化表示,我使用the BufExplorer plugin . 简单但有效 .
如果我想浏览文件系统,我会使用命令行或外部实用工具(Quicklsilver,Afred等),但要查看当前的项目结构NERD Tree是经典的 . 不要在
2
的位置使用它作为主要的文件查找方法 . 它会让你失望 . 我使用绑定<leader>ff
.这些应该足以查找和打开文件 . 从那里当然使用水平和垂直分割 . 关于拆分,我发现这些功能特别有用: