Memunculkan nama file saat ini untuk edisi di baris perintah

10

Bagaimana saya bisa memunculkan path ke file saat ini di baris perintah, sehingga untuk mengetik nama file yang sama? Saya tidak ingin singkatan yang akan diganti dengan nama file saat ini, saya ingin mengedit nama file, lengkap dengan jalur direktori. Misalnya, saya ingin :editfile dengan nama yang mirip, atau di direktori yang sama, misalnya

vim src/submodule/frontend/frobnicate2.c

dan sekarang saya ingin mengedit ../trunk/src/submodule/frontend/frobnicate.c, dan saya hanya ingin menyisipkan ../trunkdan menghapus 2, bukan mengetik ulang path lengkap.

Tentu saja saya bisa kembali ke shell dan menggunakan histori perintahnya, atau saya bisa menyalin-tempel path melalui GUI, tapi saya mencari cara yang lebih efisien yang tidak perlu meninggalkan Vim.

Gilles 'SANGAT berhenti menjadi jahat'
sumber

Jawaban:

11

Selain memasukkan %register yang telah Anda temukan sendiri, Anda juga dapat menggunakannya :edit %<Tab>.

Dari :help cmdline-special:

In Ex commands, at places where a file name can be used, the following
characters have a special meaning.  These can also be used in the expression
function `expand()`.

        %       Is replaced with the current file name.           :_% c_%

Jadi, Anda dapat, misalnya, menggunakan:

:edit %.orig

untuk mengedit file.txt.orig. Misalnya, Anda mengetik :e ../trunk/%, tekan <Tab>untuk mendapatkan nama file dengan jalur relatif, dan hapus 2sebelum menekan <Enter>.

Anda dapat menambahkan beberapa pengubah ke jalur untuk memodifikasinya; Saya menemukan :hsangat berguna, itu mendapat "dirname" (atau "head" di Vim-speak ") dari jalur saat ini:

:edit file/in/a/deeply/nested/subdirectory/here.txt
:edit %:h/in_same_dir_as_above.txt

Anda bahkan dapat menggunakan :hbeberapa kali. Sebagai contoh:

:edit %:h:h:h/file.txt

Akan buka file/in/a/deeply/file.txt

Ada juga :pyang memberi Anda path lengkap dan yang bisa berguna dalam kasus Anda: ketik :e %:p, tekan <Tab>dan edit path yang diinginkan. Anda bahkan dapat menggunakan beberapa pengubah, misalnya: :e %:p:h.

Lihat :help filename-modifiersdaftar lengkapnya.

Catatan: jika Anda <Tab>, Vim akan memperluas %. Jika Anda menggunakan <C-d>, Vim tidak akan memperluas %(tetapi mengganti %saat menyelesaikan jalur).

Martin Tournoij
sumber
5

Oh Cari "nama file" di :help :! Sangat sederhana: untuk menyisipkan khusus r egister , yang berarti nama file saat ini.CTRL-R %%

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Jadi, membangun jawaban Anda: untuk mendapatkan path lengkap seperti yang diminta OP, Anda akan melakukan sesuatu seperti Ctrl-r =expand('%:p'). Ini menggunakan register = .
lcd047
3

Jika Anda telah menetapkan pathvariabel vim Anda, Anda memiliki kekuatan penuh dari :findperintah, yaitu tab-penyelesaian nama file (tanpa perlu menentukan bagian direktori!)

Dalam kasus Anda, sesuatu seperti

set path=./**

mungkin semua yang Anda butuhkan untuk :fin frob<tab>bekerja. Untuk detail berdarah :help find,, :help file-searching.

Jens
sumber
0

Berikut adalah pemetaan yang dapat Anda coba:

cnoremap <a-q> <c-c>:let @a=expand('%')<CR>:<Up><c-r>a

Ini menyimpan perintah saat ini kemudian mengatur register 'a' ke nama file saat ini. Kemudian perintah terakhir dipanggil kembali dan ditambahkan dengan isi register 'a'. Tentu saja jika Anda memiliki sesuatu yang berguna dalam register 'a' ini akan menimpanya.

Anda mungkin ingin mengubah karakter yang dipetakan ke sesuatu yang lain. Saya suka menggunakan tombol Alt tetapi tidak berfungsi di beberapa terminal.

Seperti yang ditunjukkan oleh Carpetsmoker dalam jawabannya, Anda dapat mengubah panggilan fungsi menjadi

expand('%:p')

untuk memaksa jalur penuh.

jujur
sumber
1
Daftar ini akan menghilangkan register a. Coba sesuatu seperti ini sebagai gantinya:cnoremap <M-q> <C-r>=fnameescape(expand('%:p'))<CR>
lcd047