题
我开始使用 Vim 开发 Perl 脚本,并开始发现它非常强大。
我喜欢的一件事是能够同时打开多个文件,例如 vi main.pl maintenance.pl
然后在它们之间跳转:
:n
:prev
并查看打开哪个文件
:args
要添加文件,我可以说:
:n test.pl
我希望它会被添加到我的文件列表中,但它会清除我当前的文件列表,当我键入时 :args
我只有 test.pl
打开。
那么如何在我的参数列表中添加和删除文件呢?
解决方案
为什么不使用制表符(Vim 7 中引入)?您可以在选项卡之间切换 :tabn
和 :tabp
, 和 :tabe <filepath>
您可以添加新选项卡;并定期 :q
或者 :wq
您关闭一个选项卡。如果你映射 :tabn
和 :tabp
给你的 F7/F8 键,您可以轻松地在文件之间切换。
如果文件不多或者您没有 Vim 7,您还可以将屏幕拆分为多个文件: :sp <filepath>
. 。然后你可以在分屏之间切换 控制键+瓦 然后按您想要移动的方向的箭头键(或者代替箭头键, w 对于下一个和 瓦 对于以前的分屏)
其他提示
清单
要查看当前缓冲区的列表,我使用:
:ls
开幕
要打开一个新文件,我使用
:e ../myFile.pl
具有增强的选项卡完成功能(将 set wildmenu
在你的 .vimrc
).
笔记:你也可以使用 :find
它将为您搜索一组路径,但您需要首先自定义这些路径。
交换
要在所有打开的文件之间切换,我使用
:b myfile
具有增强的选项卡完成功能(仍然 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
关闭除当前窗口之外的所有窗口。
用 a 启动 vim -o
或者 -O
flag 以自己的分割方式打开每个文件。
有了这些,我不需要 Vim 中的选项卡,我的手指找到我的缓冲区,而不是我的眼睛。
笔记:如果您希望所有文件都进入 Vim 的同一个实例,请使用以下命令启动 Vim --remote-silent
选项。
:ls
用于打开缓冲区列表
:bp
前一个缓冲区:bn
下一个缓冲区:bn
(n
一个数字)移动到第 n 个缓冲区:b <filename-part>
使用 tab 键提供自动完成功能(太棒了!!)
在某些版本的 vim 中, bn
和 bp
实际上是 bnext
和 bprevious
分别。在这种情况下,选项卡自动完成功能很有帮助。
或者当您处于正常模式时,使用 ^
切换到您正在处理的最后一个文件。
另外,你可以保存 vim 会话
:mksession! ~/today.ses
上述命令将当前打开的文件缓冲区和设置保存到 ~/today.ses
. 。您可以使用以下方式加载该会话
vim -S ~/today.ses
轻松记住昨天离开的地方。;)
要添加到 args
列表:
:argadd
要从 args
列表:
:argdelete
在你的例子中,你可以使用 :argedit
test.pl 将 test.pl 添加到 args
一步列出并编辑文件。
:help args
提供更多细节和高级用法
我使用缓冲区命令 - :bn
(下一个缓冲区), :bp
(之前的缓冲区) :buffers
(列出打开的缓冲区) :b<n>
(打开缓冲区n) :bd
(删除缓冲区)。 :e <filename>
将打开一个新的缓冲区。
我认为您可能使用了错误的命令来查看已打开的文件列表。
尝试做一个 :ls
查看已打开的文件列表,您将看到:
1 %a "./checkin.pl" line 1
2 # "./grabakamailogs.pl" line 1
3 "./grabwmlogs.pl" line 0
etc.
然后,您可以通过按列出的数字引用文件来跳转浏览这些文件,例如:3b
或者您可以通过输入数字但使用 sb 而不是仅使用 b 来分割屏幕。
另外,% 指当前可见的文件,# 指备用文件。
您可以通过按轻松在这两个文件之间切换 控制键 转移 6
编辑:喜欢 :ls
您可以使用 :reg
查看寄存器的当前内容,包括包含已删除内容的 0-9 寄存器。如果您想重复使用之前删除的某些文本,这尤其有用。
Vim(但不是原来的 Vi!)有我发现(在许多情况下)优于缓冲区的选项卡。你可以说 :tabe [filename]
在新选项卡中打开文件。通过单击选项卡或组合键 [n]gt
和 gT
. 。图形化 Vim 甚至还有图形选项卡。
这里有很多答案!我使用的无需重新发明轮子的东西 - 最著名的插件(不会很快消亡并且被很多人使用)超快且极客。
- ctrlpvim/ctrlp.vim - 按名称查找文件,按位置或仅按名称进行模糊搜索
- 吉兰扎罗塔/bufexplorer - 浏览打开的缓冲区(当您不记得最近打开和修改了多少文件并且不记得它们在哪里时,可能是因为您使用 Ag 搜索了它们)
- rking/ag.vim 搜索有关 gitignore 的文件
- 斯克鲁鲁斯/书呆子树 查看目录结构、环顾四周、添加/删除/修改文件
更新 :最近我正在使用 dyng/ctrlsf.vim 使用上下文视图进行搜索(如 Sublime 搜索),我将引擎从 股份公司 到 ripgrep. 。表现非常出色。
像 :e
和 :badd
只接受一个参数,因此以下操作将失败
:e foo.txt bar.txt
:e /foo/bar/*.txt
:badd /foo/bar/*
如果您想从 vim 中添加多个文件,请使用 arga[dd]
:arga foo.txt bar.txt
:arga /foo/bar/*.txt
:argadd /foo/bar/*
在 vim 中使用多个文件时,我主要使用这些命令(打开了约 350 个文件):
:b <partial filename><tab>
(跳转到缓冲区):bw
(缓冲区擦除,删除缓冲区):e <file path>
(编辑,打开一个新缓冲区>pltags
- 启用跳转到子例程/方法定义
该线程中的一些答案建议使用选项卡,其他答案建议使用缓冲区来完成同样的事情。选项卡和缓冲区是不同的。我强烈建议你阅读这篇文章 Vim Tab 疯狂 - 缓冲区与选项卡
这是我从这篇文章中摘录的一个很好的总结:
概括:
- 缓冲区是文件的内存文本。
- 窗口是缓冲区上的视口。
- 标签页是窗口的集合。
您可能想使用 Vim 全局标记.
这样您就可以在文件之间快速跳转,甚至跳转到文件中的标记位置。此外,关键命令很短: 'C
带我到我正在使用的代码, 'T
带我进入我正在使用的单元测试。
当您改变位置时,重置标记也很快: mC
标记新的代码点, mT
标记新的测试点。
我对 GVim 和命令行 vim 使用相同的 .vimrc 文件。我倾向于在 GVim 中使用选项卡并在命令行 vim 中使用缓冲区,因此我设置了 .vimrc 以便更轻松地使用它们:
" 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
这破坏了 H 和 L 的现有映射,但它使得文件之间的切换变得非常快速和容易。只需按“H”表示下一个,“L”表示上一个;无论您使用制表符还是缓冲区,您都会得到预期的结果。
如果您要使用多个缓冲区,我认为最重要的是隐藏设置,即使您要离开的更改中有未保存的更改,也可以使您切换缓冲区。
添加另一个答案,因为任何答案均未涵盖此内容
将所有缓冲区更改为 tab
看法。
:tab sball
将打开所有缓冲区到选项卡视图。然后我们就可以使用任何与选项卡相关的命令
gt or :tabn " go to next tab
gT or :tabp or :tabN " go to previous tab
详细信息在 :help tab-page-commands
.
我们可以指示 vim 以选项卡视图方式打开多个文件 vim -p file1 file2
.
alias vim='vim -p'
会有用的。
通过在以下自动命令中也可以实现同样的效果 ~/.vimrc
au VimEnter * if !&diff | tab all | tabfirst | endif
无论如何回答一下问题:添加到 arg 列表: arga file
,
要从 arg 列表中删除: argd pattern
更多内容请参见 :help arglist
我有效处理多个文件的方法是使用 tmux。
它允许您垂直和水平分割窗口,如下所示:
我在我的 Mac 和 Linux 机器上都以这种方式工作,我发现它比(在 Mac 上)提供的本机窗口窗格切换机制更好。我发现切换更容易,只有使用 tmux 才能在我的 mac 上运行“同一当前目录下的新页面”(尽管事实上似乎有在同一目录中打开新窗格的选项),这是令人惊讶的关键作品。当前位置的即时新窗格非常有用。使用相同的按键组合为两个操作系统创建新窗格的方法对我来说至关重要,并且对所有人未来的个人兼容性都有好处。除了多个 tmux 窗格之外,我还尝试使用多个选项卡,例如 和多个新窗口,例如 最终我发现多个 tmux 窗格对我来说最有用。我非常“视觉化”,喜欢将各种背景保持在我的面前,像窗格一样连接在一起。
tmux 还支持水平和垂直窗格,较旧的 screen
没有(虽然mac的iterm2似乎支持它,但同样,当前目录设置对我不起作用)。多路复用器 1.8
如果 仅使用 vim 内置命令, ,我见过的在多个缓冲区之间切换的最好的一个是这样的:
nnoremap <Leader>f :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>
它完美地结合了两者 :ls
和 :b
命令——列出所有打开的缓冲区并等待您输入切换缓冲区的命令。
在 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'
.
我使用以下内容,这为您提供了许多您期望在其他编辑器(例如 Sublime Text / Textmate)中拥有的功能
- 使用缓冲区而不是“标签页”。缓冲区与几乎所有其他编辑器中的选项卡的概念相同。
- 如果您想要与选项卡相同的外观,您可以使用 vim 航空公司 插件在您的中具有以下设置
.vimrc
:let g:airline#extensions#tabline#enabled = 1
. 。当您没有打开选项卡页面时,这会自动将所有缓冲区显示为选项卡标题 - 使用蒂姆波普的 vim 未受损 这使 [乙 和 ]乙 用于分别移动到上一个/下一个缓冲区(加上一大堆其他好东西)
- 有
set wildmenu
在你的.vimrc
然后当你输入时:b <file part>
+ 标签 对于缓冲区,您将获得可能的缓冲区列表,您可以使用向左/向右箭头滚动浏览 - 使用蒂姆波普的 vim 痴迷 插件来存储与航空公司很好地配合的会话(我有 会话和插件带来很多痛苦)
- 使用蒂姆波普的 vim醋 插入。这适用于本机
:Explore
但使其更容易使用。您只需输入-
打开资源管理器,该键与在资源管理器中转到目录相同。使导航速度更快(但是对于 fzf 我很少使用它) - 弗兹夫 (可以作为 vim 插件安装)也是一个非常强大的模糊查找器,您可以使用它来搜索文件(以及缓冲区)。fzf也 玩得很好 使用 fd(find 的更快版本)
- 使用 瑞普格雷普 和 vim-ripgrep 搜索您的代码库,然后您可以使用
:cdo
对结果进行搜索和替换
我经常使用命令行和 git,所以我的 bashrc 中有这个别名:
alias gvim="gvim --servername \$(git rev-parse --show-toplevel || echo 'default') --remote-tab"
这将在现有窗口的新选项卡中打开每个新文件,并为每个 git 存储库创建一个窗口。因此,如果您从存储库 A 打开两个文件,从存储库 B 打开 3 个文件,您最终将看到两个窗口,一个用于存储库 A,带有两个选项卡,另一个用于存储库 B,带有三个选项卡。
如果您打开的文件不包含在 git 存储库中,它将转到默认窗口。
为了在选项卡之间跳转,我使用这些映射:
nmap <C-p> :tabprevious<CR>
nmap <C-n> :tabnext<CR>
要一次打开多个文件,您应该将此与其他解决方案之一结合起来。
我使用多个隐藏在我的缓冲区中的缓冲区 ~/.vimrc
文件。
迷你缓冲区资源管理器脚本也很好,可以获取缓冲区的紧凑列表。然后 :b1
或者 :b2
...转到适当的缓冲区或使用迷你缓冲区资源管理器并通过选项卡浏览缓冲区。
尝试以下地图以方便编辑多个文件
“ 分割窗口
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
我制造了一个 非常简单的视频 显示我使用的工作流程。基本上我用的是 Ctrl-P Vim 插件,我将缓冲区导航映射到 Enter 键。
通过这种方式,我可以在正常模式下按 Enter 键,查看打开的文件列表(显示在屏幕底部的一个小新窗口中),选择我要编辑的文件,然后再次按 Enter 键。要快速搜索多个打开的文件,只需键入文件名的一部分,选择文件并按 Enter 键。
我在视频中打开的文件不多,但当您开始打开很多文件时,它会变得非常有用。
由于插件使用 MRU 顺序对缓冲区进行排序,因此您只需按两次 Enter 键即可跳转到您正在编辑的最新文件。
安装插件后,您唯一需要的配置是:
nmap <CR> :CtrlPBuffer<CR>
当然,您可以将其映射到不同的键,但我发现输入的映射非常方便。
当我开始使用 VIM 时,我没有意识到选项卡应该用作不同的窗口布局,而缓冲区则充当多个文件编辑/相互切换的角色。实际上,在 v7.0 之前,一开始选项卡甚至都不存在,我只是在终端选项卡中打开一个 VIM(我当时使用的是 gnome-terminal),并使用 alt+numbers 在选项卡之间切换,因为我想使用类似的命令:buffers、: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 有一些问题),但我认为我可以接受缓冲区中的所有文件。
你可以成为一个 绝对的疯子 和别名 vim
到 vim -p
通过添加你的 .bashrc
:
alias vim="vim -p"
这将导致在选项卡中从 shell 打开多个文件,而无需调用 :tab ball
之后从 vim 中。
这个线程中的大多数答案都使用简单的 vim 命令,这当然很好,但我想我会使用我发现特别有用的插件和函数的组合来提供广泛的答案(至少其中一些技巧来自 加里·伯恩哈特 (Gary Bernhardt) 的文件导航技巧):
要在最后两个文件之间切换,只需按
<leader>
两次。我建议分配<leader>
到空格键:nnoremap <leader><leader> <c-^>
为了快速移动项目,答案是模糊匹配解决方案,例如 CtrlP. 。我将它绑定到
<leader>a
以便快速访问。在这种情况下,我想查看我使用的当前打开的缓冲区的可视化表示 BufExplorer 插件. 。简单但有效。
如果我想浏览文件系统,我会使用命令行或外部实用程序(Quicklsilver、Afred 等),但要查看当前的项目结构 书呆子树 是经典。但不要使用它来代替
2
作为您的主要文件查找方法。它真的会减慢你的速度。我使用绑定<leader>ff
.
这些应该足以查找和打开文件。当然,从那里开始使用水平和垂直分割。关于分割,我发现这些函数特别有用:
当没有足够的空间时,在较小的区域中打开新的分区,并在导航上扩展它们。参考 这里 有关这些具体作用的评论:
set winwidth=84 set winheight=5 set winminheight=5 set winheight=999 nnoremap <C-w>v :111vs<CR> nnoremap <C-w>s :rightbelow split<CR> set splitright
轻松地从一个拆分移动到另一个拆分:
nnoremap <C-J> <C-W><C-J> nnoremap <C-K> <C-W><C-K> nnoremap <C-L> <C-W><C-L> nnoremap <C-H> <C-W><C-H>