更改为缓冲区的父目录的简单方法?

时间:2010-12-01 23:59:30

标签: vim

如果我的缓冲区列表如下所示:

: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
有什么建议吗?

编辑:在这里添加了由ZyX建议的mods,因为我没有足够的点来直接编辑Jeet的答案:

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

3 个答案:

答案 0 :(得分:2)

我在.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 + enter

如果您不想安装脚本或地图

,也可以使用:ls <enter> :buffer BufferNumber <enter>

要使最后一个更容易添加到.vimrc nmap <F3> :ls<CR>:buffer,然后您可以按f3并直接按所需的缓冲区编号。

答案 1 :(得分: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)将工作目录切换到该缓冲区的工作目录。如果参数前面没有“〜”,则将其视为直接更改的目录路径。虽然没有参数的命令会将工作目录切换为当前缓冲区的工作目录。为了健壮,你应该添加一些白痴检查代码(例如,当给出多个参数时会发生什么?),或者处理特殊情况(例如,如果传递字符串或缓冲区名称会发生​​什么,或者文件是符号链接)。

答案 2 :(得分:1)

选择子缓冲区并键入:cd %:h|cd ..

%是当前缓冲区文件名,:h是提取目录的修饰符(头部修饰符,请参阅:help filename-modifiers了解更多信息),|只是分离同一行中的命令。