Como posso expandir o caminho completo do arquivo atual para passar para um comando no Vim?

123

Quando vou para o modo de comando e digito

:!mycommand %

Eu recebo meu comando executado no arquivo atual ( %é expandido para o nome do arquivo atual). Existe uma construção semelhante que expande o nome completo do arquivo (com o caminho completo)?

Estou usando o Windows.

skeept
fonte
:! mycommand "%"
SdidS 20/09

Respostas:

161

:!mycommand %:p

Palavras-chave:

:!cd %:p:h

Annika Backstrom
fonte
23
Como você os encontra na ajuda do VIM?
Keflavich
57
@keflavich:help filename-modifiers
Annika Backstrom
para obter o diretório que contém o arquivo atual, acho que%: h é suficiente. Por que precisar%: p: h aqui?
HVNSweeting
1
@HVNSweeting :%pé o caminho absoluto para o arquivo, e não o caminho relativo. :%p%hé o caminho absoluto para o diretório pai do arquivo. Usar just %:hpode resultar em um caminho relativo.
Annika Backstrom
2
@HVNSweeting Shell:, cd ~ ; vim .vimrcVim :, :!echo %:hdeve exibir '.' para o caminho relativo.
Annika Backstrom
65

As outras duas respostas não funcionaram para mim (por algum motivo). No entanto, descobri que esse combo exibe o caminho completo quando digitado no modo Normal:

Pressione 1entãoCtrlG

Fonte: “ Obtenha o nome do arquivo atual ” no Wiki do Vim Tips. Veja também a {count}CTRL-Gseção de :help CTRL-G.

Virola de Umber
fonte
5
Esse é um tópico diferente. A questão é sobre a inclusão do caminho do buffer em uma sequência de comandos (portanto, a principal :!). Sua {count}CTRL-Gsequência é para exibir o caminho completo na interface do usuário.
Stefan Majewsky
3
@StefanMajewsky sobre o título da pergunta que de fato me trouxe aqui, essa deve ser a resposta escolhida.
DOC_ID
29

Anexar :p, por exemplo

:!mycommand %:p

E %:p:hfornecerá o caminho do diretório em que o arquivo reside.

Martin Clayton
fonte
9

Para imprimir o nome do arquivo atual do 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

Por exemplo (com uma função vim), para resolve()e expand()quaisquer links simbólicos para o caminho absoluto para o script atual <sfile>:p(em vez de %:p) e, em seguida, execpara sourceo fnameescapenome do arquivo -ed contido em uma variável vim local da função 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:

Referências

Wes Turner
fonte
0

Se você deseja usar o caminho completo no seu vimrc, você pode usar algo como isto:

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

Isso fornecerá um caminho com barras invertidas no Windows.

Matthias Braun
fonte