2009-09-18 87 views
64

過去幾年使用TextMate後,我很努力學習vim。Vim文件導航

我已經開始將一些文件內導航提交到內存,但我很難在多個文件之間進行導航。

在我的工作流程中,很常見的是我經常在少量文件之間翻轉(足夠的文件,例如分割窗格窗口變得太小)。

我目前使用NERDTree卻發現向下鑽取目錄繁瑣以及不斷利用CTRL +W¯¯^h/CTRL +W¯¯升跳來回。

我認爲我會做更好的選項卡我可以輕鬆切換,但也許我需要使用不同的工作流程。

我還像一個 「轉到文件...」 快捷方式一樣CMD + 牛逼在TextMate中。我發現了fuzzy_file_finder,但它需要使用Ruby綁定來構建vim,而不是我在其中進行的本地安裝。

雖然我可能重建我想切換到vim的主要原因是,我可以有一個編輯器環境,我知道可以很容易地在任何平臺上工作。

在那裏的選項是壓倒性的任何想法非常感謝!

+1

我還沒有找到真正令人滿意的導航文件和緩衝區的方法,它根本不使用外部輔助。內置的東西是非常糟糕的(我的意思是,通過它的編號更改爲緩衝區?誰記得臨時緩衝區編號......) – Svend 2009-09-20 14:11:17

+1

@svend:您可以通過名稱和編號引用緩衝區 - 請參閱下面的答案 – 2010-03-05 08:11:07

回答

72

我沒有發現通過簡單的舊: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,設立一些窗口並在其中打開幾個文件。就我個人而言,我從來沒有發現任何第三方文件瀏覽腳本非常有用。

+2

哦。我的。神。先生;謝謝。 – 2013-02-28 22:51:17

+3

真棒完美的帽子尖端。對於skillz ++來說,你已經需要了解這個補充。 – 2014-06-28 20:34:33

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>) 

這樣我就可以說:

:呃Main.java

,它會搜索子目錄,找到Main.java並加載它。它對於同名多個文件的表現不佳,但它很快且簡單。

我使用的另一個工具是VTreeExplorer,它提供了一個基於樹的文件/目錄窗口,並且不需要任何來自VIM的特殊構建選項(即它是一個vanilla插件)​​。

+0

我希望能夠從一個子目錄加載,但多個文件問題對我來說會是一個難題。我是一個Django開發人員,所以我通常有一堆子目錄,它們都有'models.py','views.py'等。 – Pete 2009-09-18 18:13:51

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>。使用返回打開:)

^D將永遠給你所有的比賽。由於autocmd總是進入當前文件的文件夾,因此很容易處理。如果你在foo/bar.py,你想去foo/baz.py你只有:e baz.py,你在那裏。這也與緩衝工作(:b foo^D列表以foo開頭的所有緩衝區)

+0

如何訪問其他目錄?例如,我經常在我的Python視圖,HTML模板和JavaScript文件之間工作,這些文件都位於不同的子目錄中?在TextMate中,我開始輸入文件的名稱,並在我的「項目」(又名cwd)中顯示所有匹配項。 – Pete 2009-09-18 18:12:00

+0

它不遞歸到子文件夾中,沒有。但我已將我的工作流程適應了這一點此外,一旦我打開的文件,我只能提及緩衝區的名稱,並很好。您可以告訴Vim記住打開的緩衝區,然後通常根本不需要該功能。 – 2009-09-18 18:29:06

4

我想我會用我的標籤可以 輕鬆之間切換做的更好,但也許我 需要使用不同的工作流程。

您是否知道Vim的選項卡?不知道你是否指的是Vim自己的選項卡,或者是爭取TextMate的。目前還不清楚你使用的Vim版本是什麼,但它至少有7.0版本(這似乎安裝在我最近看的任何地方),而且它們很棒。

:tabe打開一個新的(以下簡稱「選項卡編輯」,爲空的,所以如:tabe:tabe path/to/file在新標籤中打開一個文件),你可以用gt/gT相鄰標籤之間移動,並有一堆其它選項卡相關的導航命令也一樣,你可能會在Vim(:help tabs

我的工作流預期的大項目往往涉及一堆標籤,每個取決於我需要什麼樣的背景下的窗口1和3之間。如果我有一個雙倍寬度的終端窗口,這可以更好地工作,因爲我可以使用:vs進行垂直分割,所以一個標籤可以很容易地向我顯示4個文件,並且每個文件都有足夠的空間。最後的提示:我有時使用「switch buffer」命令(:sb <partial_buf_name>),這種命令類似於TM的模糊發現,因爲它工作得很好,但只適用於已經打開的緩衝區。當我一次打開十幾個或更多文件時仍然非常棒。 (N.B.我需要:set switchbuf=usetab在我的vimrc中可以跨越標籤工作,但是一旦設置好就好了)。

+1

我對標籤的理解是,它更像是一個佈局保護程序,並不是真正的在每個標籤中打開一個緩衝區的方法(查看Bram Molenaars在視頻中的標籤中自己的看法「7有效文本編輯的習慣」。 – Svend 2009-09-20 14:08:56

+0

然後一次你已經想出了這些適合你的命令,你可以將它們綁定到一個鍵上,我在打開的緩衝區(la firefox)之間有一個控制選項卡翻轉,但是你可以切換選項卡 – 2009-11-07 10:56:00

5

我發現LustyExplorer是目前爲止最好的。

您可以通過輸入其名稱的一部分來打開文件。

您可以從當前文件的目錄或當前的pwd或緩衝區列表中打開文件。

如果你從緩衝區列表中打開一個文件,你不必瀏覽目錄樹,但不幸的是對於其他兩種模式,你仍然需要瀏覽樹。好的是你不必從第一個角色開始。

如果您有:

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

,並要打開dir_b/file.html你通常可以通過鍵入

+0

我對此做了一些擴展awesome addon。 http://www.svendtofte.com/wp-content/uploads/2009/08/lusty-explorer-mod.vim http://www.svendtofte.com/other/vim-stuff/ Basicly允許我輸入最近使用的文件的名稱,不管它已經加載或不加載都不重要。這意味着您只需要在第一次打開文件時瀏覽FS。 – Svend 2009-09-20 14:07:29

6

找到它,如果你還沒有找到它們了,你可能想看看:

  • fuzzy finder插件 - 這就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 
+0

http://github.com/jamis/fuzzyfinder_textmate更好 – aehlke 2010-02-08 21:29:43

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("") 

有一件事我喜歡的是它有支持通配符(*)。對於多場比賽它也表現良好。

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

183

一個簡單的方法來瀏覽文件系統命令:

:Sex 

我不是做這件事:)

+53

+1性別讓我的一天! :-) – 2010-03-05 08:18:16

+11

從幫助我看出:Vex也很棒。 – jrwren 2012-03-22 13:06:21

+1

:Sexplore ...哈! – Kasapo 2012-07-06 20:13:45

2

如果你想要的文件已經加載到一個緩衝區中(如果你經常在幾個文件之間翻轉),那麼你可以用:b[uffer]命令快速切換到緩衝區。

:b可以乘坐緩衝器號作爲參數,或(更有效)的字符串相匹配的路徑/文件名的一部分。如果有多個匹配,您可以使用製表符在它們之間循環。

如果要分割窗口並打開新窗口的緩衝區,然後使用:sb name

如果你想打開一個新的標籤緩衝區然後使用:tab b name

您也可以使用:ls命令查看當前加載的緩衝區列表。

23

:Sex:Vex:Tex:Ex是EX(ploring)系統上的文件中的所有有用的命令,如果你想使用不同的東西從:e

(其中S/V/T很短的分流/垂直/製表)

3

檢查插件ctrlp作爲替代插件Command-T。這比它更好,因爲它是一個「原生」的Vim腳本,並且它不需要用ruby(或其他支持)編譯Vim,而它運行速度非常快且不顯眼。

2

這是令人驚訝地看到,:find命令還沒有被任何答案提及。我通常使用rails項目,我需要深入瞭解目錄層次結構。因此,對於文件application.css,位於app/assets/stylesheets/,我只需輸入:find applica,然後按選項卡自動完成,並且輸入即可打開。