Vim nama file / penyelesaian jalur

10

Saya tahu saya bisa menyelesaikan nama file / jalur dari direktori saat ini menggunakan ctrl + x, ctrl + f ( compl-filename). Itu bekerja sangat baik dalam kombinasi dengan set autochdir, yang mengubah pembaruan direktori saat ini ke direktori buffer aktif.

Namun, saya mulai menggunakan airblade/vim-rooteruntuk membuat direktori saat ini sebagai folder "proyek". Sekarang penyelesaian nama file selalu dimulai dari folder proyek.

Pertanyaannya: Apakah ada cara untuk membuat penyelesaian nama file menggunakan direktori buffer aktif, bukan direktori saat ini? Atau solusi lain?

Juga ditanyakan dalam stackoverflow

Rafael Barbosa
sumber
5
C-xC-f selalu menggunakan direktori kerja buffer saat ini, tanpa opsi untuk mengkonfigurasinya (juga tidak mendukung path). Tergantung pada apa yang Anda gunakan untuk vim-rooter. Bergantung pada apa yang Anda inginkan darinya, kami dapat menggunakan plugin lain. Selain itu: Saya menggunakan youcompleteme, yang melengkapi jalur dari direktori buffer saat ini jika Anda mulai mengetik ./. Lihat reddit.com/r/vim/comments/216jdd/…
muru

Jawaban:

7

Seperti yang disebutkan @muru, tidak ada opsi untuk mengonfigurasi direktori untuk melengkapi path dan nama file. Itu selalu menggunakan direktori kerja dari jendela.

Saya telah menulis beberapa fungsi dan pemetaan untuk membantu ini. Di belakang layar, mereka mengubah direktori kerja lokal (menggunakan :lcd) sementara, kemudian mengembalikan direktori kerja sebelumnya ketika selesai.

Gajah

Untuk alasan yang bahkan tidak diketahui oleh saya, saya telah memanggil Gajah plugin mikro ini .

Berikut kode (disalin dari konfigurasi Vim saya di GitHub ):

let g:elephant_map = {
    \ 'f': function('elephant#current_file'),
    \ 'p': function('elephant#vcs_project')
\ }

function! elephant#prompt(base)
    let l:Fcn = get(g:elephant_map, a:base, function('elephant#identity'))
    let l:basedir = l:Fcn()
    execute 'lcd' l:basedir
    let l:file = fnamemodify(input(l:basedir.'/', '', 'file'), ':p')
    lcd -
    return fnamemodify(l:file, ':.')
endfunction

function! s:elephant_init()
    let l:base = getchar()
    return elephant#prompt(nr2char(l:base))
endfunction

function! elephant#identity()
    return '.'
endfunction

function! elephant#vcs_project()
    return fnamemodify(finddir('.git', '.;'), ':h')
endfunction

function! elephant#current_file()
    return expand('%:h')
endfunction

inoremap <silent> <expr> <C-R><C-E> <SID>elephant_init()
cnoremap <silent> <C-R><C-E> <C-R>=<SID>elephant_init()<CR>

Bagaimana cara menggunakannya

Menggunakan pemetaan ini terjadi dalam 3 langkah.

1. Aktifkan pemetaan

Dalam mode Sisipkan atau mode baris perintah, aktifkan pemetaan menggunakan <C-R><C-E>.

2. Pilih direktori

Ketikkan satu karakter untuk memilih direktori root yang ingin Anda selesaikan. Kode di atas menyediakan dua jenis root:

  • f - Direktori tempat file (buffer) saat ini berada
  • p - Direktori dasar proyek Git milik file saat ini

3. Masukkan jalur atau nama file

Anda akan diminta untuk memasukkan jalur atau nama file relatif ke direktori yang ditentukan, dengan penyelesaian tersedia. Tekan Entersaat selesai.

Beberapa catatan

  • Ini tidak memberikan penyelesaian inline dalam mode Sisipkan seperti yang <C-X><C-F>dilakukan; sebagai gantinya, Anda akan mengetik path atau nama file pada command-line prompt (ke mana :perintah pergi). Setelah menekan Enter, path akan dimasukkan ke buffer.
  • Hal yang sama berlaku dalam mode Command-line, yang kadang-kadang bisa membingungkan ketika Anda menekan Enterdan lupa bahwa Anda masih harus menekan Enteruntuk mengeluarkan perintah apa pun yang baru saja Anda ketikkan.
  • Fungsi direktori lainnya dapat didaftarkan dengan menambahkannya ke g:elephant_map.
  • Jalur yang dimasukkan akan menjadi jalur penuh dan absolut. Script dapat diubah untuk mengubah perilaku itu, tapi saya belum sempat melakukannya.
tommcdo
sumber
Tidak cukup menguji solusi, tetapi menerimanya karena kelengkapannya. Sebagai gantinya saya menggunakan solusi yang disarankan: YouCompleteMe bukannya ctrl + x, ctrl + f.
Rafael Barbosa