Bagaimana cara saya memasukkan nama file saat ini ke dalam konten di Vim?

39

Setelah beberapa pencarian, saya jadi tahu :echo @%menampilkan nama file saat ini di baris bawah layar vim.

Saya ingin membuang nama file (dengan dan tanpa path lengkap) ke dalam isi file tanpa meninggalkan vim.

Apakah ada cara untuk melakukan ini?

mtk
sumber

Jawaban:

28

Saya yakin ada cara lain untuk melakukan ini ... tetapi perintah utama yang Anda inginkan adalah :r[ead]yang menyisipkan output dari perintah ke buffer.

Jadi, untuk memasukkan hanya nama file:

:r! echo %

Dan, untuk memasukkan jalur lengkap:

:r! echo %:p

Untuk info lebih lanjut:

:help read
:help filename-modifiers 
JC Yamokoski
sumber
37

Nama file saat ini ada dalam "%register, sehingga Anda dapat memasukkannya (saat dalam mode insert) dengan <c-r>%; path lengkap dapat dimasukkan dengan <c-r>=expand("%:p"). Anda bisa membuat makronya jika Anda sering menggunakannya. Untuk selengkapnya, trik serupa, lihat :h expanddan :h "=.

Kevin
sumber
Mungkin saya salah membaca itu, tetapi tidak <c-r>dipetakan sebagai perintah redo?
JC Yamokoski
10
Dalam mode sisipkan, <c-r>tentukan bahwa karakter selanjutnya adalah register.
Kevin
Benar, terima kasih. Benar-benar lupa untuk beralih ke memasukkan mode ...
JC Yamokoski
Anda juga dapat melakukannya "%pdalam mode normal atau visual.
naught101
15

Seperti dapat dilihat di :h registers, "%register berisi nama file saat ini. The :pu[t]perintah menyisipkan isi dari register ke dalam teks.

Jadi, untuk memasukkan nama file yang sebenarnya Anda dapat mengetikkan salah satu dari ini, dalam mode perintah:

:put %

atau

"%p

Untuk memasukkan nama file dengan path lengkap, ketik

:put=expand('%:p')

dalam mode perintah.


Info lebih lanjut:

:h pu[t]

Dengan mengetik "rpAnda bisa menempelkan isi register "r.

braunmagrin
sumber
3
The :put "%:p"tampaknya tidak bekerja untuk saya. Tampaknya hanya berfungsi dengan expand () , seperti pada :put =expand('%:p'):, yang membuatnya tidak lebih rumit daripada <c-r>=expand('%:p')sayangnya.
aliasvel
@ Ovel Anda benar, saya akan memperbarui jawabannya. Terima kasih! ;) Dan, memang, keduanya sama-sama bertele-tele.
braunmagrin
5

Cara sederhana adalah menjalankan:

!!echo %
  • !! mengganti baris saat ini dengan hasil dari perintah yang mengikutinya.

  • % diganti dengan nama file yang diedit dalam perintah sehingga ini akan secara efektif memasukkan nama itu dalam file yang diedit.

Nama file adalah yang Anda berikan ke perintah vi (m) dan mungkin berisi path relatif atau absolut. Jika Anda ingin menghapusnya dan hanya menyimpan nama file, jalankan

!!basename %
Jlliagre
sumber
1

Jika Anda perlu sering melakukan ini, mungkin berguna untuk mengikat urutan kunci ke apa yang Anda inginkan, sesuai http://vim.wikia.com/wiki/Insert_current_filename

menyisipkan nama file saat ini tanpa ekstensi pada posisi kursor, ketika Anda berada dalam mode insert.

:inoremap \fn <C-R>=expand("%:t:r")<CR>

Untuk tetap menggunakan ekstensi:

:inoremap \fn <C-R>=expand("%:t")<CR>

Untuk memasukkan path absolut dari direktori file sedang digunakan:

:inoremap \fn <C-R>=expand("%:p:h")<CR>

Untuk memasukkan jalur relatif dari direktori file digunakan:

:inoremap \fn <C-R>=expand("%:h")<CR>

Semua di atas bekerja langsung vimuntuk sesi ini, atau Anda dapat memasukkannya ke dalam .vimrc(di mana titik dua di baris adalah opsional).

Randall
sumber
0

Saya sedang mencari cara termudah untuk menyisipkan nama file saat ini (tanpa jalur atau ekstensi) ke posisi saat ini (tidak ada baris baru, tidak ada ganti baris saat ini). Jadi menggabungkan jawaban sebelumnya dan tautan ini, inilah yang saya cari.

Dalam mode sisipkan :

<C-R>=expand("%:t:r")

Kemudian waktu berikutnya (dengan perintah sudah ada dalam sejarah):

<C-R>=<UP>
kub1x
sumber