Если мой список буферов выглядит так:
: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, так как у меня недостаточно очков, чтобы редактировать ответ Джита напрямую:
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>)