【问题标题】:How do you prefer to switch between buffers in Vim?你更喜欢如何在 Vim 中的缓冲区之间切换?
【发布时间】:2008-11-29 10:24:28
【问题描述】:

我已经尝试过MiniBufExplorer,但我通常会看到几个窗口显示它或完全关闭它。我想要的是像 LustyJuggler 这样的增量搜索,我在 Emacs 中的缓冲区之间切换的方式。肯定有这样的脚本吗?

【问题讨论】:

    标签: vim editor buffer


    【解决方案1】:

    我曾经使用选项卡和多个gvim 实例的组合,将相关文件组保留为每个实例中的选项卡。只要我没有在一个实例中出现太多选项卡,选项卡栏就会一目了然地显示您正在编辑的每个文件的名称。

    然后我阅读了 Jamis Buck 关于他如何切换from TextMate back to vim 的帖子,并学到了一些很棒的技巧:

    • Ctrl+w sCtrl+w v 分割当前窗口
    • Ctrl+6 在同一窗口的两个缓冲区之间来回切换。
    • 超棒的fuzzyfinder.vim 可让您自动完成当前目录或当前打开的缓冲区中的文件搜索
    • Jamis 自己的fuzzy_file_finderfuzzyfinder_textmate,稍微修改了fuzzyfinder 的工作方式,使其更像TextMate 中的类似功能(据我所知,不同之处在于它匹配文件名,而不是从头开始)。观看 this video 以了解它的实际效果。

    现在我只有一个gvim 实例,已最大化,并将其拆分为多个窗口,以便我可以一次查看多个文件。我将 Ctrl+F 绑定到 fuzzyfinder\_textmate,所以现在如果我输入(比如说)Ctrl+F @ 987654335@ 它打开了app/models/user\_observer.rb。我几乎再也不用担心标签了。

    2010/08/07 更新

    虽然 fuzzyfinder\_textmate remains 很棒,正如 Casey 在 cmets 中指出的那样,但它已不再维护。此外,它(和/或fuzzyfinder.vim)在处理大型项目(大量目录或文件)时会变得有点慢和不稳定,所以我一直在寻找替代方案。

    幸运的是,Wincent ColaiutaCommand-T plugin 形式似乎有一个非常好的替代方案。这与fuzzyfinder\_textmate 的行为非常相似(如果不是稍微好一点的话),但明显更快;它还具有很好的功能,例如能够以拆分或垂直拆分的方式打开找到的文件。感谢(和赞成!)David Rivers 指出它。

    【讨论】:

    • 是的,fuzzyfinder 非常符合我的要求。
    • Jamis 的fuzzyfinder_textmate 完成了vim。它真的应该成为一个核心功能!
    • 看起来 Jami 已经停止了这个项目。也许原作者会引入这些功能? weblog.jamisbuck.org/2009/1/28/…
    • 山姆,谢谢你给我的道具(在我生日那天!):D
    • 试试 ctrlp vim 插件 (kien.github.com/ctrlp.vim),它实现了模糊查找器,但具有更多有用的功能:)
    【解决方案2】:

    我已经使用 Wincent Colaiuta 的 Command-T vim plugin 几个月了。 Wincent 用 C 写了它需要快速的部分,我必须说它是!而且,我认为它的文件模式匹配逻辑甚至比 Textmate 的 Command-T 还要好。查看screencast

    VIM 的 Command-T 插件提供 一种极其快速、直观的机制 用最少的文件打开文件 击键次数。它被命名为 “Command-T”,因为它的灵感来自 “转到文件”窗口绑定到 TextMate 中的 Command-T。

    通过键入选择文件 出现在其路径中的字符, 并由一个算法排序 知道出现在 某些位置(例如, 紧跟在路径分隔符之后) 应该给予更多的权重。

    Easier buffer switching 包含许多有用的提示。我已将以下内容应用于我的 .vimrc,它执行缓冲区名称自动完成,将最有用的缓冲区切换命令映射到我的 和左侧主行键,并在状态行中显示当前缓冲区编号:

    "" Tab triggers buffer-name auto-completion
    set wildchar=<Tab> wildmenu wildmode=full
    
    let mapleader = ","
    
    map <Leader>t :CommandT<Return>
    map <Leader>a :bprev<Return>
    map <Leader>s :bnext<Return>
    map <Leader>d :bd<Return>
    map <Leader>f :b 
    
    "" Show the buffer number in the status line.
    set laststatus=2 statusline=%02n:%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
    

    我还使用MiniBufExplorer,它在其自己的水平拆分顶部提供每个列出的缓冲区的紧凑列表。

    【讨论】:

      【解决方案3】:

      列出并在我使用的缓冲区之间切换:

      nnoremap <Leader>l :ls<CR>:b<space>
      

      在缓冲区之间切换:

      map <Leader>n :bn<CR>
      map <Leader>p :bp<CR>
      

      【讨论】:

        【解决方案4】:

        我用

        CTRL-J 用于下一个缓冲区

        CTRL-K 用于前一个缓冲区

        CTRL-L 用于下一个标签

        CTRL-H 用于上一个标签

        这是.vimrc的配置:

        map <C-J> :bnext<CR>
        map <C-K> :bprev<CR>
        map <C-L> :tabn<CR>
        map <C-H> :tabp<CR>
        

        http://syskall.com/my-biggest-vim-productivity-boost/

        【讨论】:

          【解决方案5】:

          我喜欢“ctrl-w s”和“ctlr-w v”来分割窗口。然后我映射移动键(h、j、k、l)并按住 ctrl 在拆分窗口之间移动:

          " Map ctrl-movement keys to window switching
          map <C-k> <C-w><Up>
          map <C-j> <C-w><Down>
          map <C-l> <C-w><Right>
          map <C-h> <C-w><Left>
          

          不得不将我的手移到箭头键上很烦人。

          接下来,我设置了 ctlr-tab 以在当前窗口中的缓冲区之间切换(就像许多其他环境一样):

          " Switch to alternate file
          map <C-Tab> :bnext<cr>
          map <C-S-Tab> :bprevious<cr>
          

          在过去的几年里,这些对我来说效果很好,尽管 vim 总是有比你知道的更多的秘密。

          【讨论】:

          • 您的评论“切换到备用文件”具有误导性,因为 Vim 已经有一个备用文件,它是您之前打开的文件,您可以轻松切换当前 (%) 和备用 (#) 文件使用 ctrl-6。
          • 另外,带有 hjkl 的 将切换窗口——不需要箭头键。
          • 要求 RSI。我已将 映射到 :bp 并将 映射到 :bn
          • 重新映射 在正常模式下似乎是一个糟糕的选择,因为这是常用的(用于连接行)。
          【解决方案6】:
          imap <A-1> <Esc>:tabn 1<CR>i
          imap <A-2> <Esc>:tabn 2<CR>i
          imap <A-3> <Esc>:tabn 3<CR>i
          imap <A-4> <Esc>:tabn 4<CR>i
          imap <A-5> <Esc>:tabn 5<CR>i
          imap <A-6> <Esc>:tabn 6<CR>i
          imap <A-7> <Esc>:tabn 7<CR>i
          imap <A-8> <Esc>:tabn 8<CR>i
          imap <A-9> <Esc>:tabn 9<CR>i
          
          map <A-1> :tabn 1<CR>
          map <A-2> :tabn 2<CR>
          map <A-3> :tabn 3<CR>
          map <A-4> :tabn 4<CR>
          map <A-5> :tabn 5<CR>
          map <A-6> :tabn 6<CR>
          map <A-7> :tabn 7<CR>
          map <A-8> :tabn 8<CR>
          map <A-9> :tabn 9<CR>
          

          【讨论】:

          • Vim 最有趣的地方是你可以每天都学到一些东西!
          • 问题是关于 buffers,而不是 tabs... 但你可以先:tab sball,或者你应该不使用:tabn使用:buffer
          • 是的!这就是我一直在寻找的东西,无论是有人使用 Alt- 映射还是那些有隐藏的陷阱(就像 Ctrl- 一样)。我还计划使用来自vim.fandom.com/wiki/… 的第二个代码示例(基本上,使用while 循环和execute)以使其更简洁且更易于使用。
          【解决方案7】:
          nmap <Leader>bb :ls<CR>:buffer<Space>
          

          没有人提到不错的插件ctrlp.vim。使用此插件,您可以按名称搜索缓冲区。

          【讨论】:

          • 我喜欢那个映射!聪明灵活。
          【解决方案8】:

          我最近变得更简约了。

          为了循环缓冲区,我使用 ]b[b 来自 unimpaired:https://github.com/tpope/vim-unimpaired

          要直接跳转到打开的缓冲区,只需使用 Vim 的制表符补全和 :b。几个字母足以到达任何带有一两个制表符的打开缓冲区。

          类似于打开缓冲区,我使用 :e 与相对路径和制表符完成。

          我偶尔也会使用 :ls 来查看我打开了哪些缓冲区(并检查它们的修改状态)。

          为了摆脱缓冲区,我使用 :bw 来擦除缓冲区。我通常会临时拆分并更改缓冲区以保留我的布局,因为 :bw 也会关闭活动窗口。

          我尝试过的所有 minibuf 东西都让我很烦,我不希望一些智能匹配的东西为我打开随机文件。如果我真的需要浏览某些内容,我会使用 NERDtree (:e .)。

          IDK,最近我也放弃了 Yankring(因为它搞砸了 xp)并开始使用寄存器,最近我决定使用 f/t 运动是有史以来最伟大的事情......

          【讨论】:

          • 这都是很好的建议。我将&lt;leader&gt;ll 映射到:ls。此外,确保您的 .vimrc 中有 set wildmenu 也非常有用,因为您会得到一个小菜单,其中包含 :b 的所有替代品
          【解决方案9】:

          我已将&lt;S-J&gt;&lt;S-K&gt; 映射到:bp:bn,尽管我承认我不使用它,因为文件数大于10。然后我映射了&lt;C-J&gt; 和@ 987654326@ 到 Gnome 终端的上一个和下一个选项卡,我通常为我从事的 4 个不同项目中的每一个运行 4 个 vim 实例。我仍然真的希望下一个和上一个缓冲区能够转到我一直在处理的缓冲区的历史记录,而不是缓冲区列表中的顺序。

          【讨论】:

            【解决方案10】:

            我使用基础 - ':ls' + ':bn'/':bp' + ':b &lt;part-of-name&gt;'

            【讨论】:

            • :-) 我从没想过我会看到“简单”和“':ls' + ':bn'/':bp' + ':b '”在同一句话中。
            • 帕克斯,我还是没看到。 :-)
            • 这个,加上:map &lt;c-n&gt; :bn&lt;cr&gt;:map &lt;c-p&gt; :bp&lt;cr&gt;,因为C-nC-p 打字速度很快,如果你反复按下它们,它们可以在缓冲区之间循环。 (我从未将它们用于最初的目的。)这就像在浏览器标签之间循环使用 C-PgUpC-PgDn 或浏览器具有的任何快捷方式。
            • Ctrl+N 是大多数其他编辑器中“新建文件”的标准,而 Ctrl+P 是粘贴命令,因此对于大多数人来说,这些将非常令人困惑。 Tim Pope 的vim-unimpaired 为您提供前一个缓冲区的[b 和下一个缓冲区的]b。加上大量其他使用 ] 的概念表示下一个和 [ 表示上一个的好东西。
            【解决方案11】:

            优秀的Buffer Explorer,它已经变得如此强大的肌肉记忆力,以至于我发现自己希望我可以在其他应用程序中使用它。我发现主动编辑两个以上文件时速度非常快。

            【讨论】:

              【解决方案12】:

              我花了很长时间来构建我的 .vimrc 来处理这个我已经从事了四年的 HTML::Mason 项目,所以我有一个奇怪的选项卡和拆分窗口组合。为了您的观赏乐趣:

              map ;o :Sex <CR>
              map <C-J> <C-W>j
              map <C-K> <C-W>k
              map <C-l> <C-W>l
              map <C-h> <C-W>h
              map ;] :tabnext<CR>
              map ;[ :tabprev<CR>
              map <C-t> :tabe +"browse ."<CR>
              map <C-O> :NERDTreeToggle ~/curr/trunk/<CR>
              

              【讨论】:

                【解决方案13】:

                我使用tselectbuffer。它真的很快,不像 bufexplorer 不会在你的窗口中占用空间。它还有一个增量搜索。我尝试了 minibufexplorer,发现缓冲区中的导航有点困难。

                【讨论】:

                • 感谢您的指点,现在我两个都用了。 BufExplorer 的默认值是,be,bs,bv,所以我将 TSelectBuffer 映射到了,bb
                【解决方案14】:

                我使用 tselectbuffer。它真的很快,不像 bufexplorer 不会在你的窗口中占用空间。它也有增量搜索。我尝试了 minibufexplorer,发现缓冲区中的导航有点困难。

                【讨论】:

                  【解决方案15】:

                  我使用简单的 :vsplit 和 ^W+w/^W+r 和 :tabnew 和 Ctrl+Alt+PgUp/PgDown 组合键。

                  【讨论】:

                  • 我必须同意Zathrus 所说的here。 Vim 中的选项卡(或带有 TabBar 的 Emacs)根本不像通常的选项卡式界面那样工作。
                  【解决方案16】:

                  当 Vim 会话中打开了多个缓冲区时,可能很难跟踪缓冲区及其各自的缓冲区编号。如果是这种情况,使用简单的地图可以更轻松地切换到不同的文件:

                  :nnoremap (F5) :buffers(CR):buffer(空格)

                  vim.wikia.com

                  【讨论】:

                    猜你喜欢
                    • 2020-04-18
                    • 2011-11-15
                    • 2011-06-07
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-09-19
                    • 2015-06-14
                    相关资源
                    最近更新 更多