Ответ 1
:!mycommand %:p
по теме:
:!cd %:p:h
Когда я перехожу в командный режим и набираю
:!mycommand %
Я запускаю свою команду в текущем файле (%
разворачивается до текущего имени файла).
Есть ли аналогичная конструкция, которая расширяет полное имя файла (с полным путем)?
Я использую Windows.
:!mycommand %:p
по теме:
:!cd %:p:h
Остальные два ответа не помогли мне (по какой-то причине). Однако я обнаружил, что этот комбо отображает полный путь при вводе в нормальном режиме:
Нажмите 1, затем Ctrl G
Источник: "Получить имя текущего файла" в Vim Tips Wiki. См. Также раздел {count}CTRL-G
:help CTRL-G
.
Добавить :p
, например
:!mycommand %:p
И %:p:h
предоставит вам путь к каталогу, в котором находится файл.
Чтобы распечатать текущее имя файла 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")
Примечания:
:help fnamemodify
%:p
(файл буфера)/ <sfile>:p
(script файл)expand('<sfile>')
не работает изнутри функцииl:varname
не работает; поэтому exec
- конкатенация строк - и fnameescape
:messages
печатает самые последние сообщения об ошибке [error,] 200 vimСсылки
Получить имя текущего файла http://vim.wikia.com/wiki/Get_the_name_of_the_current_file
Set_working_directory_to_the_current_file http://vim.wikia.com/wiki/Set_working_directory_to_the_current_file
Если вы хотите использовать полный путь в своем vimrc
, вы можете использовать что-то вроде этого:
let vimFiles = '$HOME/.vim'
let absPath = expand(vimFiles . '/subDir')
Это даст вам путь с обратными косыми чертами в Windows.