Как я могу расширить полный путь к текущему файлу, чтобы перейти к команде в Vim?

Когда я перехожу в командный режим и набираю

:!mycommand %

Я запускаю свою команду в текущем файле (% разворачивается до текущего имени файла). Есть ли аналогичная конструкция, которая расширяет полное имя файла (с полным путем)?

Я использую Windows.

Ответ 1

:!mycommand %:p

по теме:

:!cd %:p:h

Ответ 2

Остальные два ответа не помогли мне (по какой-то причине). Однако я обнаружил, что этот комбо отображает полный путь при вводе в нормальном режиме:

Нажмите 1, затем Ctrl G

Источник: "Получить имя текущего файла" в Vim Tips Wiki. См. Также раздел {count}CTRL-G :help CTRL-G.

Ответ 3

Добавить :p, например

:!mycommand %:p

И %:p:h предоставит вам путь к каталогу, в котором находится файл.

Ответ 4

Чтобы распечатать текущее имя файла vim:

:help expand
:echo expand("%:p")    " absolute path
:echo expand("%:p:h")  " absolute path dirname
:echo expand("%:p:h:h")" absolute path dirname dirname
:echo expand("%:.")    " relative path
:echo expand("%:.:h")  " relative path dirname
:echo expand("%:.:h:h")" relative path dirname dirname

:echo expand("<sfile>:p")  " absolute path to [this] vimscript

:help filename-modifiers

Например (с функцией vim), до resolve() и expand() любые символические ссылки на абсолютный путь к текущему script <sfile>:p (вместо %:p), а затем exec до source имя файла fnameescape -ed, содержащегося в переменной-функции vim l:vimrcfilename:

 "  g:__sfile__dirname     -- directory containing this vimrc script
 "                            after symlinks
 "                            ~dirname(abspath(realpath(__file__)))
 let g:__sfile__dirname=fnamemodify(resolve(expand("<sfile>:p")), ":h")

 "  Source_dotvim(filename)  -- source dirname(this_vimrc)/filename
 function Source_dotvim(filename)
     let l:vimrcfilename=g:__sfile__dirname . "/" . a:filename
     if filereadable(l:vimrcfilename) && !empty(l:vimrcfilename)
         "source s:vimrcfilename "this doesn't work, so exec:
         exec "source " . fnameescape(l:vimrcfilename)
     else
         echo l:vimrcfilename . " empty or not found."
     endif
 endfunction 

 call Source_dotvim("vimrc.local.01-env.vimrc")

Примечания:

Ссылки

Ответ 6

Если вы хотите использовать полный путь в своем vimrc, вы можете использовать что-то вроде этого:

let vimFiles = '$HOME/.vim'
let absPath  = expand(vimFiles . '/subDir')

Это даст вам путь с обратными косыми чертами в Windows.