¿Cómo puedo expandir la ruta completa del archivo actual para pasar a un comando en Vim?

123

Cuando voy al modo de comando y escribo

:!mycommand %

Obtuve mi comando ejecutado en el archivo actual ( %se expande al nombre del archivo actual). ¿Existe una construcción similar que expande el nombre completo del archivo (con la ruta completa)?

Estoy usando Windows

guardado
fuente
:! mycommand "%"
SdidS

Respuestas:

161

:!mycommand %:p

Relacionado:

:!cd %:p:h

Annika Backstrom
fuente
23
¿Cómo los encuentra en la ayuda de VIM?
keflavich
57
@keflavich:help filename-modifiers
Annika Backstrom
para obtener el directorio que contiene el archivo actual, creo que%: h es suficiente. ¿Por qué necesita%: p: h aquí?
HVNSweeting
1
@HVNSweeting :%pes la ruta absoluta al archivo, en lugar de la ruta relativa. :%p%hes la ruta absoluta al directorio padre del archivo. Usar solo %:hpuede dar como resultado una ruta relativa.
Annika Backstrom
2
@HVNSweeting Shell:, cd ~ ; vim .vimrcVim:, :!echo %:hdebería mostrar '.' para el camino relativo.
Annika Backstrom
65

Las otras dos respuestas no me funcionaron (por alguna razón). Sin embargo, descubrí que este combo muestra la ruta completa cuando se escribe en modo Normal:

Presione 1entoncesCtrlG

Fuente: " Obtener el nombre del archivo actual " en el Wiki de Vim Tips. Ver también la {count}CTRL-Gsección de :help CTRL-G.

Virola Umber
fuente
55
Ese es un tema diferente. La pregunta es sobre la inclusión de la ruta del búfer en una cadena de comando (por lo tanto, el inicio :!). Su {count}CTRL-Gsecuencia es para mostrar la ruta completa en la interfaz de usuario.
Stefan Majewsky
3
@StefanMajewsky con respecto al título de la pregunta que de hecho me trajo aquí, esta debería ser la respuesta elegida.
doc_id
29

Anexar :p, p. Ej.

:!mycommand %:p

Y %:p:hle dará la ruta del directorio en el que reside el archivo.

Martin Clayton
fuente
9

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), a resolve()y expand()cualquier enlaces simbólicos a la ruta absoluta al script actual <sfile>:p(en lugar de %:p) y, a continuación, execa sourcela fnameescapenombre de archivo -ed contenida en una variable vim-función local 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:

Referencias

Wes Turner
fuente
0

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á una ruta con barras invertidas en Windows.

Matthias Braun
fuente