Vim文件导航

时间:2009-09-18 17:53:31

标签: vim editor navigation

过去几年我在使用TextMate后很难学习vim。

我已经开始将一些文件内导航提交到内存,但我正在努力在多个文件之间导航。

在我的工作流程中,很常见的是我经常在一些文件之间翻转(足够多的文件使得分屏窗口变得太小)。

我目前正在使用NERDTree,但发现深入研究目录繁琐以及不断使用 CTRL + W h / CTRL + W l 来回跳来跳去。

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

我还想在TextMate中使用“转到文件...”快捷方式,例如 CMD + T 。我发现fuzzy_file_finder但是它需要使用Ruby绑定构建vim,而不是我工作过的本机安装。

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

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

16 个答案:

答案 0 :(得分:227)

浏览文件系统的简便方法是命令:

:Sex

我不是这样说的:)

答案 1 :(得分:82)

我没有发现通过普通的旧: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匹配的当前打开的文件。
  6. 我也使用这些映射来更容易打开新窗口并在它们之间跳转,因为这是我经常这样做的。

    " 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,设置一些窗口并在其中打开一些文件需要几秒钟的时间。就个人而言,我从未发现任何第三方文件浏览脚本非常有用。

答案 2 :(得分:38)

:Sex:Vex:Tex:Ex都是有用的命令,用于在您的系统上使用与{{{ 1}}

(其中:e是Split / Vertical / Tab的缩写)

答案 3 :(得分:6)

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

  • 原始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

答案 4 :(得分:5)

到目前为止,我发现LustyExplorer是最好的。

您只需键入其名称的一部分即可打开文件。

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

如果从缓冲区列表中打开文件,则不必浏览目录树,但不幸的是,对于其他两种模式,您仍然需要在树中导航。好消息是你不必从第一个角色开始。

如果你有:

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

并且您想要打开dir_b/file.html,通常可以通过输入b<Tab>h

找到它

答案 5 :(得分:4)

  

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

你知道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的模糊发现,因为它工作得很好但仅适用于已打开的缓冲区。当我一次打开十几个或更多文件时仍然很棒。 (N.B.我需要在我的vimrc中:set switchbuf=usetab才能在标签页面上工作,但是一旦设置它就很棒了。)

答案 6 :(得分:3)

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

答案 7 :(得分:2)

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

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

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

如果要在新标签页中打开缓冲区,请使用:tab b name

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

答案 8 :(得分:2)

令人惊讶的是,在任何答案中都没有提到application.css命令。我通常使用rails项目,我需要深入到目录层次结构中。因此,对于位于app/assets/stylesheets/的文件:find applica,我需要输入public String envoyer(SMS sms) { logger.info("Envoie SMS au serveur samba sur {} : {} : {}", properties.getUser(), properties.getPassword(), properties.getUrl()); logger.info("SMS : {}", sms.toString()); HttpEntity<String> request = getRequest(sms); ResponseEntity<String> responseEntity = restTemplate.postForEntity(properties.getUrl(), sms, String.class); return responseEntity.getBody(); } private String getBase64Credentials(){ Base64.Encoder encoder = Base64.getEncoder(); String creds = properties.getUser()+":"+properties.getPassword(); byte[] credBytes = creds.getBytes(); byte[] base64Bytes = encoder.encode(credBytes); logger.info("Credentials === "+creds); logger.info("Credentials Bytes === "+new String(credBytes)); logger.info("Encoded Credentials === "+new String(base64Bytes)); return new String(base64Bytes); } private HttpEntity getRequest(SMS sms){ HttpHeaders headers = new HttpHeaders(); headers.add("Authorization", "Basic " + getBase64Credentials()); headers.add("sms", sms.toString()); return new HttpEntity<>(headers); } ,然后按标签进行自动填充,输入打开。

答案 9 :(得分:2)

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

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

这是文件搜索的样子: enter image description here

这是内容搜索的样子:
enter image description here

答案 10 :(得分:1)

我使用此函数查找子目录中的文件,但我没有写它。它来自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("") 

我喜欢的一件事是它支持通配符(*)。它也适用于多场比赛。

答案 11 :(得分:1)

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

答案 12 :(得分:1)

你知道MacVim应用吗?它是针对OS X的VIM抛光,其功能之一是支持标签(CMD + T打开新标签),它有抽屉等......(请阅读:http://zerokspot.com/weblog/2008/08/03/macvim-as-textmate-replacement/

试试吧!

此致 米哈尔

答案 13 :(得分:1)

NerdTree最适合vim中的文件导航。

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

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

答案 14 :(得分:0)

这是我坚持.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插件)​​。

答案 15 :(得分:0)

我查找文件的工作流程是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>通过它们。使用return打开:)

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