我已经开始使用 Vim 来开发 Perl 脚本并且开始发现它非常强大。
我喜欢的一件事是能够一次打开多个文件:
vi main.pl maintenance.pl
然后在它们之间跳跃:
:n
:prev
并查看打开哪个文件:
:args
要添加一个文件,我可以说:
:n test.pl
我希望它会被添加到我的文件列表中,但它会清除我当前的文件列表,当我输入时:args
我只有test.pl
打开。
那么如何在我的 args 列表中添加和删除文件呢?
为什么不使用制表符(在 Vim 7 中引入)?:tabn
您可以使用和在选项卡之间切换:tabp
,:tabe <filepath>
您可以添加一个新选项卡;并使用常规:q
或:wq
关闭选项卡。如果您映射:tabn
和:tabp
到您的F7/F8键,您可以轻松地在文件之间切换。
如果文件不多或者您没有 Vim 7,您也可以将屏幕拆分为多个文件::sp <filepath>
. Ctrl然后,您可以使用+在分屏之间切换W,然后在您想要移动的方向上使用箭头键(或者代替箭头键,w用于下一个和W上一个分屏)
要查看当前缓冲区的列表,我使用:
:ls
要打开一个新文件,我使用
:e ../myFile.pl
具有增强的选项卡完成(放入set wildmenu
您的.vimrc
)。
注意:您也可以使用:find
which 为您搜索一组路径,但您需要先自定义这些路径。
要在所有打开的文件之间切换,我使用
:b myfile
具有增强的选项卡完成(仍然set wildmenu
)。
注意::b#
选择上次访问的文件,因此您可以使用它在两个文件之间快速切换。
Ctrl-W s
并Ctrl-W v
水平和垂直分割当前窗口。您还可以使用:split
and :vertical split
( :sp
and :vs
)
Ctrl-W w
在打开的窗口之间切换,和Ctrl-W h
(或j
或k
或l
)在打开的窗口中导航。
Ctrl-W c
关闭当前窗口,并Ctrl-W o
关闭除当前窗口之外的所有窗口。
-o
使用or标志启动 vim会以-O
自己的拆分方式打开每个文件。
有了所有这些,我就不需要 Vim 中的选项卡了,我的手指找到了我的缓冲区,而不是我的眼睛。
注意:如果您希望所有文件都转到同一个 Vim 实例,请使用该--remote-silent
选项启动 Vim。
:ls
用于打开缓冲区的列表
:bp
前一个缓冲区:bn
下一个缓冲区:bn
(n
一个数字)移动到第 n 个缓冲区:b <filename-part>
带有提供自动完成功能的制表键(太棒了!!)在某些版本的 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 来拆分屏幕。
另外,% 指的是当前可见的文件,# 指的是备用文件。
您可以通过按轻松在这两个文件之间切换Ctrl Shift 6
编辑:就像:ls
您可以:reg
用来查看寄存器的当前内容,包括包含您已删除内容的 0-9 寄存器。如果您想重复使用之前删除的某些文本,这将特别有用。
Vim(但不是原来的 Vi!)具有我发现(在许多情况下)优于缓冲区的选项卡。您可以说:tabe [filename]
在新选项卡中打开文件。通过单击选项卡或通过组合键 [ n ]gt
和来完成选项卡之间的循环gT
。图形 Vim 甚至有图形标签。
类似:e
and:badd
只会接受 ONE 参数,因此以下将失败
: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/*
这里有很多答案!我在不重新发明轮子的情况下使用的东西——最著名的插件(不会很快消亡并且被很多人使用)是超快速和令人讨厌的。
编辑:最近我一直在使用dyng/ctrlsf.vim 来搜索上下文视图(如 Sublime 搜索),并将引擎从ag切换到ripgrep。表现非常出色。
EDIT2:与CtrlSF一起,您可以使用mg979/vim-visual-multi,一次更改多个文件,然后最后一次保存它们。
该线程中的一些答案建议使用选项卡,而其他答案建议使用缓冲区来完成同样的事情。选项卡和缓冲区是不同的。我强烈建议你阅读这篇文章“ Vim Tab madness - Buffers vs Tabs ”。
这是我从文章中提取的一个很好的摘要:
概括:
在 vim 中使用多个文件时,我主要使用这些命令(打开约 350 个文件):
:b <partial filename><tab>
(跳转到缓冲区):bw
(缓冲区擦除,删除缓冲区):e <file path>
(编辑,打开一个新缓冲区>pltags
- 允许跳转到子程序/方法定义添加另一个答案,因为任何答案均未涵盖此答案
更改所有要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
你可能想使用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上一个;无论您使用的是制表符还是缓冲区,您都会得到预期的结果。
如果仅使用 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
.vimrc
插件,并在您的:中进行以下设置let g:airline#extensions#tabline#enabled = 1
。当您没有打开标签页时,这会自动将所有缓冲区显示为标签页眉set wildmenu
您将获得一个可能的缓冲区列表,您可以使用左/右箭头滚动浏览.vimrc
:b <file part>
Tab:Explore
,但更容易使用。您只需键入-
以打开资源管理器,这与在资源管理器中进入目录的键相同。使导航更快(但是我很少使用 fzf):cdo
结果进行搜索和替换我有效处理多个文件的方法是使用 tmux。
它允许您垂直和水平拆分窗口,如下所示:
我在我的 mac 和 linux 机器上都以这种方式工作,我发现它比提供的本机窗口窗格切换机制(在 Mac 上)更好。我发现切换更容易,只有使用 tmux,我才能在我的 mac 上获得“在同一当前目录中的新页面”(尽管似乎有在同一目录中打开新窗格的选项),这是一个令人惊讶的关键部分。当前位置的即时新窗格非常有用。一种为两个操作系统使用相同键组合的新窗格的方法对我来说至关重要,并且对所有人来说都是未来个人兼容性的奖励。除了多个 tmux 窗格之外,我还尝试过使用多个选项卡,例如和多个新窗口,例如最终我发现多个 tmux 窗格对我最有用。我非常“视觉化”,喜欢把我的各种背景放在我面前,像窗格一样连接在一起。
tmux 还支持旧版screen
不支持的水平和垂直窗格(尽管 mac 的 iterm2 似乎支持它,但同样,当前目录设置对我不起作用)。多路复用器 1.8
在我和其他许多 vim 用户中,最好的选择是,
:e 文件名.extension
然后只需Ctrl+6即可更改为最后一个缓冲区。或者,您可以随时按
:ls 列出缓冲区,然后使用 b 后跟缓冲区编号更改缓冲区。
:vsp 垂直分割
:sp 水平分割
然后<C-W><C-H/K/L/j>
更改工作拆分。
您当然可以编辑任意数量的拆分中的任何文件。
~/.vimrc
我使用在我的文件中设置为隐藏的多个缓冲区。
mini-buffer explorer 脚本也很适合获得一个漂亮的紧凑的缓冲区列表。然后:b1
或:b2
... 转到适当的缓冲区或使用迷你缓冲区资源管理器和选项卡浏览缓冲区。
我经常使用命令行和 git,所以我的 bashrc 中有这个别名:
alias gvim="gvim --servername \$(git rev-parse --show-toplevel || echo 'default') --remote-tab"
这将在现有窗口的新选项卡中打开每个新文件,并为每个 git 存储库创建一个窗口。因此,如果您从 repo A 打开两个文件,从 repo B 打开 3 个文件,您最终会看到两个窗口,一个用于带有两个选项卡的 repo A,一个用于带有三个选项卡的 repo B。
如果您打开的文件不包含在 git repo 中,它将转到默认窗口。
要在选项卡之间跳转,我使用这些映射:
nmap <C-p> :tabprevious<CR>
nmap <C-n> :tabnext<CR>
要一次打开多个文件,您应该将其与其他解决方案之一结合使用。
尝试以下地图以方便编辑多个文件
" 拆分窗口
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+数字在选项卡之间切换,因为我认为使用类似的命令: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 命令,这当然很好,但我认为我会使用我认为特别有用的插件和功能的组合来提供广泛的答案(至少其中一些提示来自Gary Bernhardt 的文件导航提示):
要在最后两个文件之间切换,只需按<leader>
两次。我建议分配<leader>
给空格键:
nnoremap <leader><leader> <c-^>
为了快速移动项目,答案是模糊匹配解决方案,例如CtrlP。我将其绑定以<leader>a
快速访问。
如果我想查看当前打开的缓冲区的可视化表示,我使用BufExplorer 插件。简单但有效。
如果我想浏览文件系统,我会使用命令行或外部实用程序(Quicklsilver、Afred 等),但查看当前项目结构NERD Tree是经典之作。不要使用它来代替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>
通过添加以下内容,您可以成为绝对的疯子和别名:vim
vim -p
.bashrc
alias vim="vim -p"
这将导致在选项卡中从 shell 打开多个文件,而无需:tab ball
事后从 vim 中调用。
要使用 vim 类型打开 2 个或更多文件:vim -p file1 file2
在那个命令去扔那个文件之后,你可以使用CTRL++Shift↑</kbd> or ↓</kbd> , it will change your files in vim.
如果你想再添加一个文件 vim 并使用它::tabnew file3
您也可以使用不会创建新选项卡并在屏幕上打开文件来切片您的屏幕::new file3
如果您想使用可以帮助您处理目录和文件的插件,我建议您使用 NERDTree。
要下载它,你需要有 vim-plug 以便下载其他插件,还需要 NERDTree 在你的~/.vimrc
.
let data_dir = has('nvim') ? stdpath('data') . '/site' : '~/.vim'
if empty(glob(data_dir . '/autoload/plug.vim'))
silent execute '!curl -fLo '.data_dir.'/autoload/plug.vim --create-dirs
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
call plug#begin('~/.vim/plugged')
Plug 'scrooloose/nerdtree'
call plug#end()
:wq
,返回并输入::PlugInstall
之后,插件将被安装,您可以将您的 NERDTree 与其他插件一起使用。