ChatGPT解决这个技术问题 Extra ChatGPT

Vim 文件导航

在过去几年使用 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 之类的东西

佚名

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

:Sex

我不是在编造这个:)


从帮助中我看到 :Vex 也很棒。
:Vex 如果您想垂直分割屏幕而不是水平分割
哇,这两个都不知道。我发现 :Vex 更实用,但 :Sex 让我很开心。
作为记录,:Se 也有效(对于 Ve, Te 变体也是如此)。没必要让它变得奇怪:)
A
Andrew Hendrie

考虑到制表符完成的体面配置,我发现通过普通的旧 :e 深入到子目录不会那么麻烦。

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

我个人使用 :set wildmode=full

我的工作流程是这样的:

:cd 进入我项目的顶层目录。打开文件 foo/bar/baz: 最简单的场景:输入 :e fbb。如果在其中一个目录中有多个以 b 开头的文件,您可能需要在键盘上执行 或另一个 以在它们之间跳转(或键入更多字母以消除歧义) .最坏的情况是存在共享名称的文件和目录,您需要深入到目录中。在这种情况下,使用制表符完成目录名称,然后键入 * 以向下钻取。打开 2 或 3 个窗口并根据需要在所有窗口中打开文件。在缓冲区中打开文件后,不要终止缓冲区。打开新文件时,让它在后台打开。只需 :ea 在同一窗口中新建文件。然后,使用 :b 循环浏览已在后台打开的缓冲区。如果你输入 :b foo 它将只匹配当前打开的匹配 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 所述
E
Emil Rehhnberg

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

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


d
dlimeb

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

原始的模糊查找器插件——IIRC 没有 Ruby 绑定问题

项目插件——类似于 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

e
eclipse

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

由于我们有一个非常大的代码库,我指定了几个我最常使用的目录作为 fzf 搜索的目录。 Fzf 甚至有丰富的 git 集成。因此,您只能搜索跟踪的文件。

https://i.stack.imgur.com/KcwmH.gif

https://i.stack.imgur.com/grGuv.gif


V
Vini.g.fer

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


:find 对我不起作用?它不会在当前目录中找到任何内容。
@TomRossi,您的 vim 点文件必须缺少配置,请参阅此 post
b
bitprophet

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

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

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

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

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


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

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

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

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

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

如果你有:

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

如果您想打开 dir_b/file.html,您通常可以通过键入 b<Tab>h 找到它


我对这个很棒的插件做了一些扩展。 svendtofte.com/wp-content/uploads/2009/08/… svendtofte.com/other/vim-stuff 基本上只允许我输入最近使用的文件的名称,无论它是否已经加载都没有关系。这意味着您只需要在第一次打开文件时浏览 FS。
H
Hotschke

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


D
Dave Kirby

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

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

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

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

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


u
uniquesnowflake8

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

function! Find(name) 
    let l:list=system("find . -name '".a:name."' | grep -v \".svn/\" | perl -ne 'print \"$.\\t$_\"'") 
    let l:num=strlen(substitute(l:list, "[^\n]", "", "g")) 
    if l:num 0 
            echo "Not a number" 
            return 
        endif 
        if l:inputl:num 
            echo "Out of range" 
            return 
        endif 
        let l:line=matchstr("\n".l:list, "\n".l:input."\t[^\n]*") 
    else 
      let l:line=l:list 
    endif 
    let l:line=substitute(l:line, "^[^\t]*\t./", "", "") 
    execute ":e ".l:line 
endfunction 

command! -nargs=1 Find :call Find("")

我喜欢的一件事是它支持通配符 (*)。它在多场比赛中也表现良好。


A
Ayman

除了 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


J
John Topley

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

试试看!

问候米哈尔


x
xinghua

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

下面的链接是对 nerdtree 的一个很好的介绍。

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


B
Brian Agnew

这是我在 .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>) 

所以我只能说:

:尔主.java

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

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


我希望能够从子目录加载,但多文件问题对我来说将是一个交易破坏者。我是一名 Django 开发人员,所以我通常有一堆子目录,它们都有 models.pyviews.py 等。
A
Armin Ronacher

我查找文件的工作流程是 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 开头的所有文件。您也可以通过它们<Tab>。使用返回打开:)

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


进入其他目录怎么样?例如,我经常在我的 Python 视图、HTML 模板和 JavaScript 文件之间工作,这些文件都位于不同的子目录中?在 TextMate 中,我开始输入文件名,然后我的“项目”(又名 cwd)中的所有匹配项都会显示出来。
它不会递归到子文件夹中,不。但我调整了我的工作流程。同样,一旦我打开文件,我只需提及缓冲区的名称就可以了。你可以告诉 Vim 记住打开的缓冲区,那么你通常根本不需要那个功能。