vim,使用 vanilla Vim 快速切换文件(无插件)

标签 vim

我知道将自己限制在 vanilla Vim(不使用插件)会限制编辑器的功能,但是当我经常在不同的机器之间切换时,到处移动我的环境通常会很麻烦。我只想留在 Vanilla Vim 中。

阻碍我的是在文件之间快速切换的能力。
我(至少相信)对缓冲区、窗口、选项卡以及 netrw( VexEx 等)有很好的理解。

但是在诸如Sublime Text之类的编辑器中,我只需输入 ctrl-p 即可立即进入该文件。

我知道我可以下拉到 shell,但我想知道是否有任何其他“隐藏的” secret 可以根据文件名在 Vim 中的文件之间快速切换。

最佳答案

与 ST2 的 Ctrl+P 最接近的等价物(“最接近”,而不是“精确”)是一个名为的插件,准备好... CtrlP .还有其他类似的插件,如 Command-TFuzzyFinder .

我使用 CtrlP 并且我喜欢它,但我全心全意地支持您决定“无插件”。这不是最简单的方法,但从长远来看会有所返回。

打开文件

打开文件的最基本方法是 :e /path/to/filename .值得庆幸的是,您可以获得制表符完成和通配符:经典 *还有一个特别的,** ,代表“任何子目录”。

结合所有这些,您可以执行以下操作:

:e **/*foo<Tab>

从所有包含 foo 的文件中进行选择在工作目录下以他们的名义或:
:e **/*foo/*bar<Tab>

从所有包含 bar 的文件中进行选择在包含 foo 的任何子目录下的名称中在其名称中,位于工作目录下的任何位置。

当然,这适用于 :tabe[dit] , :sp[lit]:vs[plit] ,也是。

但是,这些命令仅限于一个文件。使用 :next打开多个文件:
:next **/*.js

看看:help arglist .

在缓冲区之间跳转
:b[uffer]是基本的缓冲区切换命令:
:b4         " switch to buffer number 4
:bn         " switch to next buffer in the buffer list
:bp         " switch to previous buffer in the buffer list
:bf         " switch to first buffer in the buffer list
:bl         " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b#         " switch to the alternate file

请注意,这些命令中的许多命令及其相关命令都接受计数。
:ls命令显示加载缓冲区的列表。不过,它有点“特殊”:缓冲区在创建时会被分配一个编号,因此您可以拥有一个类似于 1 2 5 的列表。如果删除缓冲区。这有点尴尬,是的,这使得按其编号切换到缓冲区有点太麻烦了。首选按部分名称切换,:b foo<Tab>或骑自行车,:bn :bp .

无论如何,这是一个很酷的映射,它列出了所有加载的缓冲区并为您填充提示,等待您输入缓冲区的编号并按 <enter> :
nnoremap gb :ls<CR>:b<Space>

使用此映射,切换到另一个缓冲区非常简单:
gb
(quickly scanning the list)
3<CR>

或:
gb
(quickly scanning the list)
foo<tab><CR>

这个想法来自这张图片taken from Bairui's collection of Vim infographics :

Flying vs cycling

Vim 也有 <C-^> (或 <C-6> 在某些键盘上)—正常模式等效于 :b# — 在当前缓冲区和前一个缓冲区之间跳转。如果您经常在两个缓冲区之间交替使用,请使用它。

:help buffers 中阅读有关缓冲区的所有信息.

去报关

在文件中,您可以使用 gdgD .

在项目中,Vim 的“标签”功能是您的 friend ,但您需要一个外部代码索引器,如 ctags 或 cscope。最基本的命令是 :tag foo<C-]>将光标放在方法名称上。这两个工具都很好地集成到 Vim 中:见 :help tags , :help ctags:help cscope .

就其值(value)而言,我广泛使用标签导航在项目中移动(使用 CtrlP 的 :CtrlPTag:CtrlPBufTag 命令,大多数情况下,但也使用内置命令),我最喜欢的“通用”缓冲区切换方法是按名称。

部署您的配置

许多 Vim 用户将他们的配置置于版本控制之下,这使得在新机器上安装自己的配置变得非常快速和容易。想想看。

编辑

几个月前,我不得不在一台装有过时 Vim 的远程机器上工作。我本可以安装一个合适的 Vim 并克隆我自己心爱的配置,但这次我决定轻装上阵,以“锐化锯”。我很快建了一个极简主义.vimrc并重温了几个被遗忘的本土特征。在那场演出之后,我认为 CtrlP 不是必需的并摆脱了它: native 功能和自定义映射并不那么性感,但它们可以在没有太多依赖性的情况下完成工作。

处理文件
set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *
:find是一个真正伟大的命令 set path正确。使用我的设置,,ffoo<Tab>将找到所有包含 foo 的文件在当前目录下,递归。它快速、直观且轻便。当然,我受益于与 :edit 相同的补全和通配符。和 friend 。

为了使过程更快,以下映射允许我跳过项目的整个部分并在当前文件的目录下递归查找文件:
nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>

警告! path选项非常强大。上面的值— .,** — 对我有用,但我使用的语言没有标准库。正确的值完全取决于您的需要。

处理缓冲区
set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>

上面的映射列出了带有空提示的“wildmenu”中的可用缓冲区,允许我使用 <Tab> 导航菜单。或输入几个字母和 <Tab>再次缩小列表。与上面的文件映射一样,这个过程很快而且几乎没有摩擦。
nnoremap <PageUp>   :bprevious<CR>
nnoremap <PageDown> :bnext<CR>

这些映射不言自明。

杂耍标签
nnoremap <leader>j :tjump /

这个映射使用正则表达式搜索而不是全词搜索,所以我可以做 ,jba<Tab>寻找标签 foobarbaz() .

是的,模糊匹配会让人上瘾,但没有它你也可以同样高效。而且只需要一小部分成本。

更多编辑

一些额外的提示/技巧......

野生菜单选项

使用 set wildmenu 启用的“wildmenu” , 使文件/缓冲区导航更容易。它的行为受一系列值得研究的选项控制:
wildmode告诉 Vim 你希望“wildmenu”如何表现:
set wildmode=list:full
wildignore过滤掉所有的垃圾:
set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*
wildignorecase允许您搜索 foo并找到 Foo :
set wildignorecase

文件标记
augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

我最近在别人的 ~/.vimrc 中发现了这颗 gem .每当您离开缓冲区时,它都会在光标的确切位置创建一个文件标记,以便无论您身在何处,'J跳转到您编辑的最新 JavaScript 缓冲区。太棒了。

关于vim,使用 vanilla Vim 快速切换文件(无插件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16082991/

相关文章:

vim - 如何在 VIM 中更改左装订线的颜色?

vim - 搜索和替换相同的视觉区域

linux - 文件解密,用vim blowfish加密

vim - 如何为 Vim 中的特定插件重新映射键

vim - ultisnips 在 Vim 中给我一条错误消息 : E117: Unknown function: UltiSnips#

vim - VIM 可以做这个 Sublime 的把戏吗?

linux - 如何使用 :arga in vim? 添加文件而不是子目录到 args 列表

vim - 如何在 Vim 中重复任何命令,例如 emacs 中的 "C-x z"?

vim - 在 vim 中更改水平拆分状态行的突出显示颜色

vim - markdown [ 在 vi​​m 中创建下划线