2010-12-01 59 views
4

如果我的緩衝區列表如下:簡單的方法來改變緩衝區的父目錄?

 
:ls 
    1 %a "Application/PowerModeServer/test/testTimer.cpp" line 1 
    2  "Application/PowerModeServer/test/fakeClient.cpp" line 0 
    3  "Application/PowerModeServer/test/fakeVp.cpp" line 0 
    7  "Application/PowerModeServer/private/IMsgSender.h" line 0 
    9  "Application/PowerModeServer/private/UdpSocket.h" line 0 
17  "Application/PowerModeServer/src/PowerFsm.cpp" line 0 
18  "Application/PowerModeServer/src/lua/src/lfunc.h" line 0 
19  "Application/PowerModeServer/src/lua/src/lmem.h" line 0 
20  "Application/PowerModeServer/src/lua/src/ltable.h" line 0 
41  "Application/PowerModeServer/src/PowerModeServer.cpp" line 0 
42  "Application/PowerModeServer/src/UdpSocket.cpp" line 0 
43  "Application/PowerModeServer/src/Timer.cpp" line 0 

什麼改變Vim的當前工作目錄的,比如父目錄,緩衝器19中的最簡單的方法?我習慣用手指咕嚕咕嚕地使用:

:cd A<TAB>P<TAB>s<TAB>l<TAB>s<TAB>
,但這需要相當多的擊鍵 - 特別是如果完成不明確。我想要更簡潔的內容,例如:
:cd ~19
任何建議?

編輯:添加MODS由ZYX建議在這裏,因爲我沒有足夠的積分可以直接編輯截拳道的回答是:

function! CdBufWorkingDir(target) 
    if empty(a:target) 
     let targetdir = expand("%:p:h") 
    else 
     if a:target =~# '^\~\d' 
      let targetdir = fnamemodify(bufname(str2nr(a:target[1:])), ":p:h") 
     else 
      let targetdir = a:target 
     endif 
    endif 
    execute "cd ".fnameescape(targetdir) 
    echo targetdir 
endfunction 
command! -nargs=? Cdbuf :call CdBufWorkingDir(<q-args>) 

回答

2

我會嘗試這樣的事情在你的「〜/ .vimrc」文件(更新按照到OP的規格):

function! CdBufWorkingDir(...) 
    if a:0 == 0 
     let l:targetdir = expand("%:p:h") 
    else 
     if a:1[0] == "~" 
      let l:targetdir = fnamemodify(bufname(str2nr(a:1[1:])), ":p:h") 
     else 
      let l:targetdir = a:1 
     endif 
    endif 
    execute "cd ". l:targetdir 
    echo l:targetdir 
endfunction 
command! -nargs=* Cdbuf :call CdBufWorkingDir(<q-args>) 

然後發出帶有一個「〜」之前作爲一個緩衝區號命令參數(如:Cdbuf ~3)會將工作目錄切換到該緩衝區的工作目錄。如果參數沒有以「〜」開頭,它將被視爲直接改變的目錄路徑。而沒有參數的命令會將工作目錄切換爲當前緩衝區的工作目錄。爲了健壯性,你應該添加一些白癡檢查代碼(例如,當給出多個參數時會發生什麼?),或者處理特殊情況(例如,如果傳遞字符串或緩衝區名稱或文件是符號鏈接會發生什麼情況)。

1

我在.vimrc裏使用這個腳本http://www.vim.org/scripts/script.php?script_id=1325這個

map <silent> <F3> :call BufferList()<CR> 
let g:BufferListWidth = 25  
let g:BufferListMaxWidth = 50 

然後按f3,你可以使用/ filenname +輸入

或者你可以使用:ls <enter> :buffer BufferNumber <enter>如果你不想安裝腳本或地圖

爲了讓最後一個更容易添加到您的.vimrc nmap <F3> :ls<CR>:buffer然後你可以按f3和直接你想要的緩衝區的數量。

+0

我想你誤解了我的意圖(?)我不想切換緩衝區,我只是想改變vim的當前工作目錄。我想我也不介意改變當前的緩衝區,如果它實現了這個目標。是否有一些設置導致cwd跟蹤當前緩衝區? – evadeflow 2010-12-02 00:27:53

+0

+1使我能夠在文檔中找到'autochdir'選項。顯然,如果啓用它,可能會導致一些插件中斷,但在像您這樣的映射中臨時啓用/禁用插件可能會很有用。 – evadeflow 2010-12-02 02:29:09

1

選擇子緩衝器並鍵入:cd %:h|cd ..

%是當前的緩衝區的文件名,和:h是改性劑以提取目錄(頭改性劑,見:help filename-modifiers更多),則|只是分隔命令中同一條線。