当前位置:  开发笔记 > 编程语言 > 正文

如何在Vim中有效地处理多个文件?

如何解决《如何在Vim中有效地处理多个文件?》经验,为你挑选了18个好方法。

我已经开始使用Vim开发Perl脚本,并开始发现它非常强大.

我喜欢的一件事是能够一次打开多个文件,vi main.pl maintenance.pl然后在它们之间跳转:

:n
:prev

并查看打开的文件

:args

要添加文件,我可以说:

:n test.pl

我希望将其添加到我的文件列表中,但它会清除我当前的文件列表,当我输入时:args我只test.pl打开了.

那么我怎样才能将文件添加到我的args列表中并将其删除?



1> fijter..:

为什么不使用标签(在Vim 7中引入)?您可以使用:tabn和在标签之间切换:tabp,:tabe 您可以添加新标签; 并使用常规:q:wq关闭选项卡.如果映射:tabn:tabp你的F7/ F8键,您可以文件之间轻松切换.

如果没有那么多文件或者你没有Vim 7,你也可以将屏幕分成多个文件::sp .然后你可以在Ctrl+ 之间切换分屏,W然后在想要移动的方向上切换箭头键(或者代替箭头键,w用于下一个和W之前的分屏)


此外,在编辑模式中,`gt`转到下一个选项卡,`gT`转到上一个选项卡.
另请注意,您可以使用`-p`标志从命令行打开选项卡中的多个文件.例如,`gvim -p main.pl maintenance.pl`将在选项卡中打开这两个文件.
要保存并关闭选项卡,您还可以使用`ZZ`而不是`:wq`(就像通常保存和关闭一样)
我正在使用Ubuntu 10.10中的vim-gnome软件包,我可以使用Ctrl + PageUp和Ctrl + PageDown在标签之间切换.我没有配置任何东西; 这是默认的.
您可以使用ngt跳转到任何选项卡,其中n是选项卡的索引(以1开头).我认为有一个选项可以显示文件名附近的每个标签的索引,但我不知道它是什么.如果有人知道,我很想听.
这个答案不值得这么多的投票,因为它让我(可能还有很多其他人)认为[vim](http://www.vim.org/)中的**tab**与tab相同在任何其他编辑器中(如[notepad ++](https://notepad-plus-plus.org/)).@Nikos Alexandris很好地指出了标签和窗口之间的区别._'Tabs只是为了让我们拥有不同的窗户布局.它们并不打算成为一个开放文件的存在; 而是将打开的文件加载到缓冲区中.
@Dean:我认为`gt`和`gT`在转义/命令模式下工作,而不是在*edit*模式下工作.
@AndreasGrech`ZZ`是`:x`的同义词,而不是`:wq`.我知道,非常挑剔,但是如果你需要关心文件的最后修改时间戳,差别很重要,因为`:x`(和`ZZ`)只会修改文件.`:wq`强制写一个.
垂直分裂!`:vsp filename`
fyi,[Buffers vs. Tabs](https://joshldavis.com/2014/04/05/vim-tab-madness-buffers-vs-tabs/)
如果Patryk.beza是正确的,那么这不是标签的预期功能.
这是非常糟糕的建议.选项卡实际上是布局缓冲区的一种方式.
注意:如果在Gnome终端中打开了多个选项卡,则Ctrl + PageUp/PageDown将不起作用.终端选项卡采用快捷方式.
@Ryan不,你错了.[Buffers vs. Tabs](https://joshldavis.com/2014/04/05/vim-tab-madness-buffers-vs-tabs/)明确提到[vim的标签](http://vim.wikia. com/wiki/Using_tab_pages),**不**[终端标签](https://help.gnome.org/users/gnome-terminal/stable/gs-tabs.html.en).
我相信在选项卡中打开新的缓冲区/文件是明智的,特别是当你在当前选项卡中有多个相同缓冲区的窗口时.但是,使用`:bd`关闭当前缓冲区通常会更直观(除非与另一个缓冲区分开,否则也会关闭选项卡/窗口),而不是关闭选项卡/窗口(这将使缓冲区保持打开状态)如果有另一个活动标签/窗口).
总之,[Buffers vs. Tabs](http://joshldavis.com/2014/04/05/vim-tab-madness-buffers-vs-tabs/)说,当使用不同的选项卡/拆分窗口时编辑同一个文件,Vim实际上只打开一个缓冲区,导致你在不同的选项卡/拆分窗口上实际编辑同一个文件(缓冲区).我不认为这对我来说是一个问题.我仍然会使用标签和拆分窗口.
我将`Ctrl-h`映射到上一个选项卡,将`Ctrl-l`映射到下一个选项卡,这与Vim的默认映射`h`和`l`(左右移动光标)相吻合:`nnoremap gT`和`nnoremap gt`.
如何用F7 / F8键映射:tabn和:tabp?
@munesh将`map :tabp `和`map :tabn `添加到.vimrc文件中.

2> Sébastien Ro..:

清单

要查看当前缓冲区列表,我使用:

:ls

开盘

要打开一个新文件,我使用

:e ../myFile.pl

增强的标签完成(放入set wildmenu你的.vimrc).

注意:您也可以使用:find哪个路径搜索一组路径,但您需要先自定义这些路径.


交换

要在所有打开的文件之间切换,我使用

:b myfile

增强的标签完成(仍然set wildmenu).

注意::b#选择上次访问的文件,以便您可以使用它在两个文件之间快速切换.


使用Windows

Ctrl-W sCtrl-W v水平和垂直分割当前窗口.你也可以使用:split:vertical split(:sp:vs)

Ctrl-W w在打开的窗口之间切换,以及Ctrl-W h(或jkl)在打开的窗口中导航.

Ctrl-W c关闭当前窗口,并Ctrl-W o关闭除当前窗口之外的所有窗口.

使用-o-O标志启动vim会在其自己的拆分中打开每个文件.


有了这些,我不需要Vim中的标签,我的手指找到我的缓冲区,而不是我的眼睛.

注意:如果您希望所有文件都转到相同的Vim实例,请使用该--remote-silent选项启动Vim .


我在.vimrc中有这一行:`nnoremap gb:ls :b `.当我在命令模式下键入`gb`时,它会列出我的打开缓冲区并输入`:b`,我就可以开始输入缓冲区名称/编号了.
`:b`是一个非常强大的命令,因为它可以接受缓冲区编号和缓冲区名称作为参数.还有什么?它还支持文件名的任何部分的制表符完成.比如,你在缓冲区2中打开了foo.txt,你可以输入`:b 2 `或`:b foo.txt`或`:b oo `来编辑该文件.是的,当您按键时,最后一个将完成'oo'到'foo.txt'.
如果你正在玩多个缓冲区,我会推荐[LustyJuggler](http://www.vim.org/scripts/script.php?script_id=2050).
值得一提的是,只要它是明确的,`:b`将接受子串匹配.所以,如果你打开文件`foo`,`bar`和`baz`,只需`:bz`足以切换到`baz`缓冲区,`:b oo`或`:bo`将带你到`foo`缓冲区.

3> shyam..:
:ls

用于打开缓冲区列表

:bp 前缓冲区

:bn 下一个缓冲区

:bn(n一个数字)移动到第n个缓冲区

:b 使用tab键提供自动完成功能(真棒!!)

在某些版本的Vim,bnbp实际上是bnextbprevious分别.选项卡自动完成在这种情况下很有用.

或者当您处于正常模式时,使用^切换到您正在处理的最后一个文件.

另外,您可以保存vim的会话

:mksession! ~/today.ses

上面的命令将当前打开的文件缓冲区和设置保存到~/today.ses.您可以使用加载该会话

vim -S ~/today.ses

没有麻烦记住你昨天离开的地方.;)


@shyam我想我爱你!不知怎的,我从来不知道肯定有关mksession命令,但今天出蓝色的,我决定必须有某种方式来保存文件,方便地打开它们的列表.这是更好,因为它甚至似乎存储的东西完整状态(窗口拆分,缓冲单元等).那谢谢啦!

4> MarkB..:

要添加到args列表:

:argadd

要从args列表中删除:

:argdelete

在您的示例中,您可以使用:argedittest.pl将test.pl添加到args列表中并一步编辑该文件.

:help args 提供更多细节和高级用法


这实际上是问题的答案,尽管给出了标题,其他答案是完全公平的.

5> Andy Whitfie..:

我使用缓冲区命令 - :bn(下一个缓冲区),:bp(前一个缓冲区):buffers(列表打开缓冲区):b(打开缓冲区n):bd(删除缓冲区).:e 将只是打开一个新的缓冲区.


:ls比:缓冲区更快

6> Rob Wells..:

我想您可能正在使用错误的命令来查看已打开的文件列表.

尝试执行:ls以查看已打开的文件列表,您将看到:

   1 %a   "./checkin.pl"            line 1
  2 #    "./grabakamailogs.pl"     line 1
  3      "./grabwmlogs.pl"         line 0
  etc.

然后,您可以通过列出的数字引用它们来反弹文件,例如:3b

或者您可以通过输入数字来分割屏幕,但使用sb而不是b.

旁边%表示当前可见的文件,#表示备用文件.

按下即可轻松切换这两个文件 Ctrl Shift 6

编辑:就像:ls您可以:reg用来查看寄存器的当前内容,包括包含已删除内容的0-9寄存器.如果您想重用之前删除的某些文本,这将非常有用.



7> Konrad Rudol..:

Vim(但不是原来的Vi!)有一些标签,我发现(在许多情况下)优于缓冲区.您可以说:tabe [filename]在新选项卡中打开文件.通过单击选项卡或按键组合[ n ] gt和,可以在选项卡之间循环gT.Graphical Vim甚至还有图形标签.



8> Petur Subev..:

这里有很多答案!我使用的是在不重新发明轮子的情况下 - 最着名的插件(不会很快就会死掉并且被很多人使用)是超快速和令人讨厌的.

ctrlpvim/ctrlp.vim - 按名称模糊搜索按位置或仅名称查找文件

jlanzarotta/bufexplorer - 浏览打开的缓冲区(当你不记得最近打开和修改了多少文件而你不记得它们在哪里时,可能是因为你用Ag搜索了它们)

rking/ag.vim搜索关于gitignore的文件

scrooloose/nerdtree查看目录结构,环视,添加/删除/修改文件

更新:最近我使用dyng/ctrlsf.vim 搜索上下文视图(如Sublime搜索),我将引擎从ag切换到ripgrep.表现非常出色.


*ctrlp*已移动,现在位于*ctrlpvim/ctrlp.vim*
它没有更多的赞成,因为在2008年提出了这个问题.:)

9> puk..:

喜欢的东西: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/*



10> Andrew..:

这个帖子中的一些答案建议使用制表符,其他人建议使用缓冲区来完成同样的事情.标签和缓冲区是不同的.我强烈建议你阅读这篇文章Vim Tab madness - Buffers vs Tabs

这是我从文章中摘录的一个很好的总结:

摘要:

缓冲区是文件的内存中文本.

窗口是缓冲区上的视口.

标签页是一组窗口.


您可以通过在Vim中输入`:help window`来获得摘要。

11> zigdon..:

在vim中使用多个文件时,我主要使用这些命令(打开~350个文件):

:b (跳转到缓冲区)

:bw (缓冲区擦除,删除缓冲区)

:e (编辑,打开一个新的缓冲区>

pltags - 启用跳转到子例程/方法定义


350档!!! 这令人印象深刻.你如何找到合适的缓冲区来跳转?你做过分裂吗?
@BrianO'Dell你的`.vimrc`中的`:b <部分文件名> `加上`set wildmenu`适用于你打开大量缓冲区的情况.然后你只是部分匹配并滚动它找到的那些.在其他体面的编辑器中,你有模糊的发现,但通常你不能将模糊的发现限制在你打开的文件中.

12> 小智..:

您可能想要使用Vim全局标记.

这样,您可以快速在文件之间跳转,甚至可以在文件中的标记位置跳转.此外,关键命令很简单: 'C 带我到我正在使用的代码, 'T 带我到我正在使用的单元测试.

更改位置时,也可以快速重置标记: mC 标记新的代码点, mT 标记新的测试点.



13> dlmeetei..:

添加另一个答案,因为任何答案都没有涵盖

要更改要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



14> Max Cantor..:

我为GVim和命令行vim使用相同的.vimrc文件.我倾向于在命令行vim中使用GVim中的选项卡和缓冲区,所以我设置了我的.vimrc以便更容易地使用它们:

" Movement between tabs OR buffers
nnoremap L :call MyNext()
nnoremap H :call MyPrev()

" 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"表示前一个; 无论您使用制表符还是缓冲区,都可以获得预期的结果.


使用您的领导键而不是ctrl来避免破坏现有的映射

15> indentation..:

如果您打算使用多个缓冲区,我认为最重要的是设置隐藏,这样即使您要离开的缓存中有未保存的更改,它也可以让您切换缓冲区.



16> qeatzy..:

如果只使用vim内置命令,那么我在多个缓冲区之间切换的最好的命令是:

nnoremap f :set nomore:ls:set more:b

它完美地结合了两个命令:ls:b命令 - 列出所有打开的缓冲区并等待您输入命令切换缓冲区.

在vimrc中给出上面的映射,一旦你键入f,

显示所有打开的缓冲区

您可以:

输入23到缓冲区23,

输入#要转到备用/ MRU缓冲区,

键入文件的部分名称,然后键入自动完成,

或者只是留在当前的缓冲区

上述键映射的输出快照是:

: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 ' here'

在上面的快照中:

第二列:%a对于当前,h对于隐藏,#对于先前,为空尚未切换到.

第三栏:+进行修改.

另外,我强烈建议set hidden.见:help 'hidden'.



17> Michael Durr..:

我有效处理多个文件的方法是使用tmux.

它允许您垂直和水平分割窗口,如下所示:

在此输入图像描述

我在mac和linux机器上以这种方式工作,我发现它比提供的本机窗格切换机制(在Mac上)更好.我发现切换更容易,只有使用tmux我才能在我的mac上运行"在同一个当前目录下的新页面"(尽管事实上似乎有在同一目录中打开新窗格的选项),这是一个令人惊讶的关键作品.当前位置的即时新窗格非常有用.为两个操作系统创建具有相同组合键的新窗格的方法对我来说至关重要,并为将来的个人兼容性提供奖励.除了多个tmux窗格,我还尝试使用多个选项卡,例如在此输入图像描述 和多个新窗口,例如 在此输入图像描述最后我发现多个tmux窗格对我来说最有用.我非常"视觉化",喜欢把我的各种情境放在我面前,连在一起作为窗格.

tmux还支持水平和垂直窗格,而老版本screen没有(虽然mac的iterm2似乎支持它,但同样,当前的目录设置对我来说不起作用).tmux 1.8



18> icc97..:

我使用以下内容,这为您提供了许多其他编辑器所具有的功能,例如Sublime Text/Textmate

    使用缓冲区而不是"标签页".缓冲区与几乎所有其他编辑器中的选项卡相同.

    如果你想要有相同的标签,你可以使用vim-airline插件,并在你的.vimrc:let g:airline#extensions#tabline#enabled = 1.如果没有打开标签页,则会自动将所有缓冲区显示为标签页眉

    使用Tim Pope的vim-unmpaired,它分别提供[b]b移动到上一个/下一个缓冲区(加上一大堆其他好东西)

    set wildmenu.vimrc那么当你输入:b + Tab一个缓冲区,你会得到可能的缓冲区的列表,你可以使用左/右箭头键滚动

    使用Tim Pope的vim-obsession插件来存储与航空公司很好地合作的会话(我对会话和插件有很多痛苦)

    使用Tim Pope的vim-vinegar插件.这适用于本机,:Explore但使其更容易使用.您只需键入-以打开资源管理器,该资源管理器与浏览器中的目录相同.使导航更快(但是使用fzf我很少使用它)

    fzf(可以作为vim插件安装)也是一个非常强大的模糊查找器,可用于搜索文件(和缓冲区).fzf也很好用fd(更快的发现版本)

    使用Ripgrep和vim-ripgrep搜索你的代码库,然后你可以使用:cdo结果进行搜索和替换

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有