Простой способ изменить родительский каталог буфера? - PullRequest
4 голосов
/ 02 декабря 2010

Если мой список буферов выглядит так:

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

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010

Я бы попробовал что-то подобное в вашем "~ / .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 голосов
/ 02 декабря 2010

Я использую этот скрипт http://www.vim.org/scripts/script.php?script_id=1325 с этим в моем .vimrc

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 голос
/ 15 мая 2015

Выберите дочерний буфер и введите :cd %:h|cd ..

% - текущее имя файла буфера, а :h - модификатор для извлечения каталога (модификатор head, подробнее см. :help filename-modifiers), | просто для разделения команд в одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...