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


123

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

:!mycommand %

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

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



:! mycommand "%"
SdidS

Ответы:


161

:!mycommand %:p

Связанный:

:!cd %:p:h


23
Как их найти в справке по VIM?
keflavich

57
@keflavich:help filename-modifiers
Анника Бэкстрем

чтобы получить каталог, содержащий текущий файл, я думаю, что%: h достаточно. Зачем здесь%: p: h?
HVNSweeting

1
@HVNSweeting :%p- это абсолютный путь к файлу, а не относительный путь. :%p%h- абсолютный путь к родительскому каталогу файла. Использование только %:hможет привести к относительному пути.
Анника Бэкстрем

2
@HVNSweeting Shell:, cd ~ ; vim .vimrcVim:, :!echo %:hдолжен отображать '.' для относительного пути.
Анника Бэкстрем

65

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

Нажмите 1затемCtrlG

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


5
Это другая тема. Вопрос заключается в том, чтобы включить буферный путь в командную строку (т.е. ведущую :!). Ваша {count}CTRL-Gпоследовательность предназначена для отображения полного пути в пользовательском интерфейсе.
Стефан Маевски

3
@StefanMajewsky относительно заголовка вопроса, который на самом деле привел меня сюда, это должен быть выбранный ответ.
doc_id 02


9

Чтобы распечатать текущее имя файла 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()любые символические ссылки на абсолютный путь к текущему сценарию <sfile>:p(вместо %:p), а затем , execчтобы sourceв fnameescape-ED файла содержится в функции локальной переменной ВИМ 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")

Ноты:

Ссылки



0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.