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


Respuestas:


161

:!mycommand %:p

Relacionado:

:!cd %:p:h


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.


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.


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



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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.