【问题标题】:Vim file navigationVim 文件导航
【发布时间】:2010-11-29 13:56:07
【问题描述】:

在过去几年使用 TextMate 之后,我非常努力地学习 vim。

我已经开始将一些文件内导航提交到内存,但我在多个文件之间导航时遇到了困难。

在我的工作流程中,我经常在几个文件之间切换是很常见的(足够多的文件,以至于拆分窗格窗口变得太小)。

我目前正在使用 NERDTree,但发现深入目录很麻烦,并且经常使用 CTRL+W h/ CTRL+W l 来回跳跃。

我认为使用可以轻松切换的选项卡会做得更好,但也许我需要使用不同的工作流程。

我还想要一个“转到文件...”快捷方式,例如 TextMate 中的 CMD+T。我找到了fuzzy_file_finder,但它需要使用 Ruby 绑定构建 vim,而我从事的本机安装并非如此。

虽然我可以重建我想切换到 vim 的主要原因是我可以拥有一个我知道可以轻松跨任何平台工作的编辑器环境。

非常感谢任何想法的选择!

【问题讨论】:

  • 我还没有找到一种完全不使用外部辅助工具的文件和缓冲区导航方法。内置的东西很糟糕(我的意思是,通过其编号更改为缓冲区?谁会记住临时缓冲区编号......)
  • @svend:您可以按名称和编号引用缓冲区 - 请参阅下面的答案
  • 您是否将caps-lock 映射到ctrl?它使ctrl 的大多数事情变得更好......您可以使用gnome-tweakssetxkbmap -o ctrl:nocaps 之类的东西

标签: vim editor navigation


【解决方案1】:

浏览文件系统的一种简单方法是使用以下命令:

:Sex

这不是我编的:)

【讨论】:

  • 从帮助中我发现 :Vex 也很棒。
  • 这有 69 个赞。我认为我没有勇气改变这一点。
  • :Vex 如果你想垂直分割屏幕而不是水平分割
  • 哇,这两个都不知道。我发现:Vex 更实用,但:Sex 让我很开心。
  • 作为记录,:Se 也可以工作(Ve, Te 变体也是如此)。没必要让它变得奇怪:)
【解决方案2】:

我不觉得通过简单的旧 :e 向下钻取子目录会很麻烦,因为它有一个不错的选项卡完成配置。

查看'wildmenu' 选项,让 Vim 在命令行上方的模式行中显示完成列表(文件名)。您可以更改'wildmode' 选项以进一步配置 Vim 将执行的制表符补全类型。

我个人使用:set wildmode=full

我的工作流程是这样的:

  1. :cd 进入我项目的顶级目录。
  2. 打开文件foo/bar/baz:

    • 最简单的场景:输入:e f<tab>b<tab>b<tab><enter>

    • 如果在其中一个目录中有多个以b 开头的文件,您可能需要在键盘上执行<left><right> 或另一个<tab> 以在它们之间跳转(或再输入几个字母以消除歧义)。

    • 最坏的情况是存在共享名称的文件和目录,您需要深入到目录中。在这种情况下,使用制表符完成目录名称,然后键入 *<tab> 以向下钻取。

  3. 根据需要打开 2 或 3 个窗口并在所有窗口中打开文件。
  4. 在缓冲区中打开文件后,不要终止缓冲区。打开新文件时,让它在后台打开。只需:e 同一窗口中的新文件即可。
  5. 然后,使用:b <tab> 循环浏览已在后台打开的缓冲区。如果您输入 :b foo<tab>,它将仅匹配当前打开的与 foo 匹配的文件。

我还使用这些映射来更轻松地打开新窗口并在它们之间跳转,因为这是我经常做的事情。

" Window movements; I do this often enough to warrant using up M-arrows on this"
nnoremap <M-Right> <C-W><Right>
nnoremap <M-Left> <C-W><Left>
nnoremap <M-Up> <C-W><Up>
nnoremap <M-Down> <C-W><Down>

" Open window below instead of above"
nnoremap <C-W>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR>

" Vertical equivalent of C-w-n and C-w-N"
nnoremap <C-w>v :vnew<CR>
nnoremap <C-w>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR>

" I open new windows to warrant using up C-M-arrows on this"
nmap <C-M-Up> <C-w>n
nmap <C-M-Down> <C-w>N
nmap <C-M-Right> <C-w>v
nmap <C-M-Left> <C-w>V

我只需几秒钟就可以打开 Vim,设置一些窗口并在其中打开一些文件。就我个人而言,我从未发现任何第三方文件浏览脚本非常有用。

【讨论】:

  • 顶礼膜拜的真棒解释。为你已经需要理解解释的 Skillz++ 摇手指。
  • 如果您将set path+=** 添加到您的配置中,您基本上可以启用模糊搜索,如here 所述
【解决方案3】:

:Sex:Vex:Tex:Ex 都是有用的命令,如果你想使用不同于 :e 的东西,可以在你的系统上搜索(探索)文件

(其中S/V/T 是Split/Vertical/Tab 的缩写)

【讨论】:

    【解决方案4】:

    如果您还没有找到它们,您可能需要查看:

    • 原来的 fuzzy finder 插件 -- IIRC 没有 Ruby 绑定问题
    • Project 插件 -- 类似于 NERDTree
    • 缓冲区浏览器插件 -- 显示打开的缓冲区列表

    还请记住,您可以在 .vimrc 中重新映射快捷键,以减少它们的繁琐。我确实经常使用拆分窗口;我发现以下内容使处理它们变得更加容易:

    " set your own personal modifier key to something handy
    let mapleader = "," 
    
    " use ,v to make a new vertical split, ,s for horiz, ,x to close a split
    noremap <leader>v <c-w>v<c-w>l
    noremap <leader>s <c-w>s<c-w>j
    noremap <leader>x <c-w>c
    
    " use ctrl-h/j/k/l to switch between splits
    map <c-j> <c-w>j
    map <c-k> <c-w>k
    map <c-l> <c-w>l
    map <c-h> <c-w>h
    

    【讨论】:

      【解决方案5】:

      到目前为止,我发现的用于文件导航的最好和最快的插件是fzf.vim。您可以非常快速地模糊搜索所有文件、打开的缓冲区甚至文件内容。

      由于我们的代码库非常庞大,我指定了几个我最常使用的目录作为 fzf 搜索的目录。 Fzf 甚至有丰富的 git 集成。所以你可以只搜索被跟踪的文件。

      这是文件搜索的样子:

      他就是内容搜索的样子:

      【讨论】:

        【解决方案6】:

        我认为我会在标签上做得更好 可以轻松切换,但也许我 需要使用不同的工作流程。

        你知道 Vim 的标签吗?不确定您是否指的是 Vim 自己的选项卡,或者是 TextMate 的。目前尚不清楚您使用的是什么 Vim 版本,但它至少从 7.0 开始就有标签(我最近看到的地方似乎都安装了它),而且它们很棒。

        :tabe 打开一个新文件(“tab edit”的缩写,例如:tabe 为空或:tabe path/to/file 用于在新选项卡中打开文件,)您可以使用gt/ 在相邻选项卡之间移动gT,还有许多其他与选项卡相关的导航命令,正如您对 Vim 所期望的那样 (:help tabs)

        我的大型项目工作流程往往涉及一堆选项卡,每个选项卡都有 1 到 3 个窗口,具体取决于我需要什么样的上下文。如果我有一个双宽终端窗口,这会更好,因为我可以用:vs 垂直分割,所以单个选项卡可以轻松地一次显示 4 个文件,每个文件都有足够的空间。

        最后提示:我有时会使用“切换缓冲区”命令 (:sb &lt;partial_buf_name&gt;),这有点像 TM 的模糊发现,因为它工作得很好,但仅适用于已经打开的缓冲区。当我同时打开十几个或更多文件时仍然很棒。 (注意,我需要在我的 vimrc 中 :set switchbuf=usetab 才能跨选项卡工作,但一旦设置好它就很棒。)

        【讨论】:

        • 我对选项卡的理解是,它更像是一个布局保护器,而不是真正在每个选项卡中打开一个缓冲区的方法(查看视频中 Bram Molenaars 对选项卡的看法“7 个有效习惯文本编辑”。
        • 然后,一旦你找到了适合你的命令,你就可以将它们绑定到一个键上。我在打开的缓冲区(a la firefox)之间有控制选项卡翻转,但你可以切换选项卡。
        • vim-titlecase 螺钉与 gt/gT 映射,但有一个 work-around
        【解决方案7】:

        我发现 LustyExplorer 是迄今为止最好的。

        您可以通过仅输入文件名称的一部分来打开文件。

        您可以从当前文件所在目录,或当前pwd,或从缓冲区列表中打开文件。

        如果您从缓冲区列表中打开文件,则不必浏览目录树,但不幸的是,对于其他两种模式,您仍然必须浏览目录树。好处是您不必从第一个字符开始。

        如果你有:

        dir_a/
            ...
        dir_b/
            file.js
            file.html
        

        如果你想打开dir_b/file.html,你一般可以通过输入b&lt;Tab&gt;h找到它

        【讨论】:

        【解决方案8】:

        令人惊讶的是,:find 命令在任何答案中都没有被提及。我通常使用需要深入了解目录层次结构的 Rails 项目。因此,对于位于app/assets/stylesheets/ 的文件application.css,我只需输入:find applica,然后按tab 自动完成并按enter 打开。

        【讨论】:

        • :find 对我不起作用?它不会在当前目录中找到任何内容。
        • @TomRossi,你的 vim 点文件必须缺少配置,请参阅此post
        【解决方案9】:

        查看插件ctrlp 作为插件Command-T 的替代品。它比这更好,因为它是一个“本机”Vim 脚本,不需要用 ruby​​(或其他支持)编译 Vim,而它运行得非常快且不引人注目。

        【讨论】:

          【解决方案10】:

          如果您想要的文件已经加载到缓冲区中(如果您经常在少数文件之间切换,这很可能),那么您可以使用:b[uffer] 命令快速切换到缓冲区。

          :b 可以将缓冲区编号作为参数,或者(更有用)一个匹配路径/文件名的部分的字符串。如果有多个匹配项,您可以使用 tab 循环浏览它们。

          如果要拆分窗口并在新窗口中打开缓冲区,请使用:sb name

          如果您想在新选项卡中打开缓冲区,请使用:tab b name

          您还可以使用:ls 命令查看当前加载的缓冲区列表。

          【讨论】:

            【解决方案11】:

            我使用这个函数来查找子目录中的文件,但我没有写它。来自vim wiki

            功能!查找(姓名) let l:list=system("find .-name '".a:name."' | grep -v \".svn/\" | perl -ne 'print \"$.\\t$_\"' ") 让 l:num=strlen(substitute(l:list, "[^\n]", "", "g")) 如果 l:num 0 echo "不是数字" 返回 万一 如果 l:inputl:num 回声“超出范围” 返回 万一 让 l:line=matchstr("\n".l:list, "\n".l:input."\t[^\n]*") 别的 让 l:line=l:list 万一 让 l:line=substitute(l:line, "^[^\t]*\t./", "", "") 执行 ":e".l:line 结束功能 命令! -nargs=1 查找 :call Find("")

            我喜欢的一点是它支持通配符 (*)。它在多次匹配时也表现良好。

            【讨论】:

              【解决方案12】:

              除了wildmenu 的答案,我使用BufExplorer 插件,以及以下映射来快速跳转缓冲区:

              nmap <A-1> :b 1<CR>
              nmap <A-2> :b 2<CR>
              nmap <A-3> :b 3<CR>
              ...
              nmap <A-0> :b 10<CR>
              nmap <A-=> \bs
              

              或者你可以用:ls命令替换缓冲区浏览器,基本上显示相同的东西。

              最后一个映射Alt-= 以显示缓冲区资源管理器。

              我很少使用 Windows,因为我通常只有一两个窗口。

              我还修改了statusline 以包含缓冲区号%2n,以便我始终知道正在编辑哪个缓冲区。见:h statusline

              【讨论】:

                【解决方案13】:

                你知道 MacVim 应用程序吗?它是为 OS X 优化的 VIM,其功能之一是支持选项卡(CMD+T 打开新选项卡),它有抽屉等...(阅读:http://zerokspot.com/weblog/2008/08/03/macvim-as-textmate-replacement/

                试试吧!

                问候 迈克尔

                【讨论】:

                  【解决方案14】:

                  NerdTree 最适合在 vim 中进行文件导航。

                  下面的链接很好地介绍了nerdtree。

                  http://www.catonmat.net/blog/vim-plugins-nerdtree-vim/

                  【讨论】:

                    【解决方案15】:

                    我在.vimrc 中保留了一些相当琐碎的内容。它将从任何子目录加载文件。

                    " load from an unspecified subdirectory 
                    function! LoadFromSubdirectory(filespec) 
                      let filename = glob("`find . -name '" . a:filespec . "' -print`") 
                      exe ':e '.filename 
                    endfunction 
                    :command -nargs=1 Er :call LoadFromSubdirectory(<f-args>) 
                    

                    所以我只能说:

                    :Er Main.java

                    它会搜索子目录,找到Main.java 并加载它。对于同名的多个文件,它的表现不佳,但它快速而简单。

                    我使用的另一个工具是VTreeExplorer,它提供了一个基于树的文件/目录窗口,并且不需要来自 VIM 的任何特殊构建选项(即它是一个 vanilla 插件)。

                    【讨论】:

                    • 我希望能够从子目录中加载,但多文件问题对我来说将是一个交易破坏者。我是一名 Django 开发人员,所以我通常有一堆子目录,它们都有 models.pyviews.py 等。
                    【解决方案16】:

                    我查找文件的工作流程是 wildmenu、autocwd 和 :e

                    .vimrc中的相关部分:

                    set wildmenu
                    set wildignore=*.dll,*.o,*.pyc,*.bak,*.exe,*.jpg,*.jpeg,*.png,*.gif
                    set wildmode=list:full
                    set autochdir
                    let g:netrw_list_hide='^\.,.\(pyc\|pyo\|o\)$'
                    

                    以及如何使用它:

                    :e myf^D
                    

                    这给出了当前目录中以 myf 开头的所有文件。你也可以通过他们&lt;Tab&gt;。使用return打开:)

                    ^D 将始终为您提供所有匹配项。因为 autocmd 总是转到当前文件的文件夹,所以很容易使用。如果你在foo/bar.py 并且你想去foo/baz.py 你只做:e baz.py 你就在那里。这也适用于缓冲区(:b foo^D 列出所有以 foo 开头的缓冲区)

                    【讨论】:

                    • 去其他目录怎么样?例如,我经常在我的 Python 视图、HTML 模板和 JavaScript 文件之间工作,这些文件都位于不同的子目录中?在 TextMate 中,我开始输入文件名,然后我的“项目”(又名 cwd)中的所有匹配项都会显示出来。
                    • 它不会递归到子文件夹中,不。但我调整了我的工作流程。同样,一旦我打开文件,我只需提及缓冲区的名称就可以了。你可以告诉 Vim 记住打开的缓冲区,那么你通常根本不需要那个功能。
                    猜你喜欢
                    • 2012-02-03
                    • 2015-04-30
                    • 2013-07-20
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-10-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-02-03
                    相关资源
                    最近更新 更多