Bagaimana saya bisa memperluas jalur lengkap dari file saat ini untuk meneruskan ke perintah di Vim?

123

Ketika saya masuk ke mode perintah dan ketik

:!mycommand %

Saya mendapatkan perintah saya dieksekusi pada file saat ini ( %diperluas ke nama file saat ini). Apakah ada konstruksi serupa yang memperluas nama file lengkap (dengan jalur lengkap)?

Saya menggunakan Windows.

skeept
sumber
:! mycommand "%"
SdidS

Jawaban:

161

:!mycommand %:p

Terkait:

:!cd %:p:h

Annika Backstrom
sumber
23
Bagaimana Anda menemukan ini di bantuan VIM?
keflavich
57
@keflavi:help filename-modifiers
Annika
untuk mendapatkan direktori yang berisi file saat ini, saya rasa%: h sudah cukup. Mengapa perlu%: p: h di sini?
HVNSweeting
1
@HVNSweeting :%padalah jalur absolut ke file, bukan jalur relatif. :%p%hadalah jalur absolut ke direktori induk file. Menggunakan just %:hdapat menghasilkan jalur relatif.
Annika Backstrom
2
@HVNSweeting Shell:, cd ~ ; vim .vimrcVim :, :!echo %:hharus menampilkan '.' untuk jalur relatif.
Annika Backstrom
65

Dua jawaban lainnya tidak berhasil untuk saya (untuk beberapa alasan). Namun, saya menemukan bahwa kombo ini menampilkan jalur lengkap ketika diketik dalam mode Normal:

Tekan 1laluCtrlG

Sumber: " Dapatkan nama file saat ini " di Wiki Tips Vim. Lihat juga {count}CTRL-Gbagian :help CTRL-G.

Umber Ferrule
sumber
5
Itu topik yang berbeda. Pertanyaannya adalah tentang memasukkan jalur buffer dalam string perintah (dengan demikian memimpin :!). {count}CTRL-GUrutan Anda adalah untuk menampilkan jalur lengkap di UI.
Stefan Majewsky
3
@StefanMajewsky mengenai judul pertanyaan yang ternyata membawa saya ke sini, seharusnya ini adalah jawaban yang dipilih.
doc_id
29

Tambahkan :p, misalnya

:!mycommand %:p

Dan %:p:hakan memberi Anda jalur direktori tempat file tersebut berada.

martin clayton
sumber
9

Untuk mencetak nama file vim saat ini:

: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

Misalnya (dengan fungsi vim), untuk resolve()dan expand()setiap symlink ke jalan mutlak untuk naskah saat ini <sfile>:p(bukan %:p), dan kemudian execke sourcedalam fnameescapenama file -ed terkandung dalam variabel vim fungsi-lokal 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")

Catatan:

Referensi

Wes Turner
sumber
0

Jika Anda ingin menggunakan jalur lengkap di Anda vimrc, Anda dapat menggunakan sesuatu seperti ini:

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

Ini akan memberi Anda jalur dengan garis miring terbalik di Windows.

Matthias Braun
sumber