por - ¿Cómo puedo expandir la ruta completa del archivo actual para pasar a un comando en Vim?
salir del editor vi (6)
Adjuntar :p
, por ejemplo
:!mycommand %:p
Y %:p:h
le dará la ruta del directorio en el que reside el archivo.
Cuando voy al modo de comando y escribo
:!mycommand %
Obtengo mi comando ejecutado en el archivo actual ( %
se expande al nombre del archivo actual). ¿Existe una construcción similar que expanda el nombre completo del archivo (con la ruta completa)?
Estoy usando Windows.
Las otras dos respuestas no funcionaron para mí (por alguna razón). Sin embargo, descubrí que este combo muestra la ruta completa cuando se escribe en modo Normal:
Presione 1 luego Ctrl G
Fuente: " Obtener el nombre del archivo actual " en la Wiki de consejos de Vim. Consulte también la sección {count}CTRL-G
de :help CTRL-G
.
Obtenga el nombre del archivo actual 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
Para imprimir el nombre de archivo vim actual:
: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
Por ejemplo (con una función vim), para resolve()
y expand()
cualquier enlace simbólico a la ruta absoluta a la secuencia de comandos actual <sfile>:p
(en lugar de %:p
), y luego fnameescape
a la source
fnameescape
-ed nombre de archivo contenido en una variable vim local de función 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")
Notas:
-
:help fnamemodify
- "archivo actual":
%:p
(archivo de almacenamiento intermedio) /<sfile>:p
archivo de<sfile>:p
(archivo de script) -
expand(''<sfile>'')
no funciona desde dentro de una función - fuente
l:varname
no funciona; entonces,exec
- concatenación de cadenas - yfnameescape
-
:messages
imprime los:messages
más recientes de 200 vim [error,]
Referencias
- La respuesta de annika-backstrom
- respuesta de la férula de umber
- la respuesta de tito-11
Si desea usar la ruta completa en su vimrc
, puede usar algo como esto:
let vimFiles = ''$HOME/.vim''
let absPath = expand(vimFiles . ''/subDir'')
Esto le dará un camino con barras diagonales inversas en Windows.
:!mycommand %:p
Relacionado:
:!cd %:p:h