'path'
Opsi Vim memungkinkan Anda untuk menentukan direktori mana perintah suka gf
dan :find
akan mencari file.
Jika Anda hanya ingin fungsi ini memicu set file tertentu, maka Anda dapat menggunakan autocmd untuk secara otomatis "mengarahkan" :edit
perintah Anda ke file di salah satu 'path'
direktori.
set path+=~/
function! FindInPath(name)
let found = findfile(a:name)
if !empty(found)
exe 'silent keepalt file '. fnameescape(found)
edit
endif
endfunction
autocmd BufNewFile .vimrc,.zshrc nested call FindInPath(expand('<afile>'))
Ini menggunakan BufNewFile
autocmd sebagai pemicu untuk file not found, so try to find it somewhere else
. Ketika situasi itu terdeteksi, gunakan findfile()
untuk mencoba menemukan file di 'path'
direktori. Jika ditemukan, ubah nama buffer saat ini ke file itu dan edit kembali buffer, jika tidak terus menggunakan buffer baru.
The nested
kualifikasi diperlukan di sini karena autocmds biasanya tidak sarang. Dalam hal ini, Anda ingin memicu autocmds khas ketika :edit
perintah membuka file Anda.
Perhatikan bahwa ini masih akan membuat buffer tambahan dibandingkan dengan hanya mengedit file secara manual. Pada saat BufNewFile
dijalankan, buffer untuk nama file yang ditentukan sebelumnya sudah dibuat. Menggunakan :file
untuk mengubah nama buffer menciptakan buffer baru yang dibongkar dengan nama asli.
Jika Anda selalu ingin mencari 'path'
, maka autocmd dapat dengan mudah diubah untuk menggunakan *
pola file daripada menentukan file tertentu.
Ini versi terbaru yang lebih sesuai dengan kebutuhan Anda. Ini digunakan :find
untuk langsung membuka file daripada menetapkan nama buffer berdasarkan hasil findfile()
.
function! FindInPath(name)
let path=&path
" Add any extra directories to the normal search path
set path+=~,~/.vim,/etc
" If :find finds a file, then wipeout the buffer that was created for the "new" file
setlocal bufhidden=wipe
exe 'silent! keepalt find '. fnameescape(a:name)
" Restore 'path' and 'bufhidden' to their normal values
let &path=path
set bufhidden<
endfunction
autocmd BufNewFile * nested call FindInPath(expand('<afile>'))
Ini menyelesaikan masalah pada fungsi sebelumnya di mana Vim akan mengeluh ketika mencoba untuk menyimpan :file
buffer -named.
keepalt file
memiliki kelemahan yang sama dengan penugasan kevim.current.buffer.name
- vim memperingatkan Anda bahwa file tersebut sudah ada saat mencoba menyimpan perubahan Anda.if expand('%') !~ '^[.~]\?/'
...endif
sehingga jalur relatif atau absolut tertentu yang eksplisit dilewati; dan gunakansilent
alih-alihsilent!
, karena jika Anda membukavim vimrc
di dua terminal, terminal kedua akan menunggu input untuk peringatan "file is open elsewhere", tetapi pengguna tidak tahu apa yang menunggu. Saya belum mengeditnya, untuk melihat apakah Anda memiliki cara yang lebih baik untuk mengatasi keduanya.Alternatifnya adalah dengan membuat beberapa perintah yang akan membuat ini lebih mudah:
Saya menggunakan pola
E
/S
yang rails.vim / projectionist.vim gunakan.Untuk bantuan lebih lanjut lihat:
sumber
Ini bukan solusi, tetapi ini adalah apa yang saya lakukan agar memiliki akses yang mudah ke
.vimrc
dan.zshrc
. Secara pribadi saya pikir ini cukup rapi:sumber
Dalam semangat
CDPATH
, saya menulis fungsi berbasis Python untuk melakukan ini (dengan bantuan dari Matt Boehm ):BufWinEnter
bukanBufNewFile
karena yang terakhir tampaknya tidak berperilaku andal ketika beberapa nama file tersebut diberikan.bad
diikutibd
sebagai cara yang dapat diandalkan untuk menutup buffer yang dibuka untuk file yang tidak digunakan. Ini masih tidak berfungsi ketika saya melakukannya:tabe some-file
(tidak ada tab baru dibuka). Namun, itu pertanyaan untuk hari lain.CDPATH
, saya dapat dengan mudah menambahkan lebih banyak direktori dengan mengeditPATHS
, atau menjadikannya variabel level Vim dan memodifikasinya.Apa yang terlewatkan oleh jawaban lain, IMO, adalah bahwa saya tidak ingin membuat konfigurasi untuk setiap file , tetapi untuk setiap direktori . Saya tidak peduli apakah saya membuka
fstab
atauvimrc
, saya hanya ingin Vim mencari file dalam beberapa direktori jika tidak ada di direktori saat ini. +1 untuk semuanya untuk upaya khusus file.sumber
*
untuk pola file, daripada file tertentu, harus mencapai hal yang sama dan menghindari masalah Anda dengannya:tabe
.Dengan
'user-commands'
dan'Dictionary'
, kita dapat mengedit file tanpa membuat buffer untuk mengganti file yang ingin kita edit pada buffer.Perhatikan bahwa fungsi
Editfile
tidak mencoba memverifikasi argumennya. Mari kita vim menangani semua kesalahan seperti Ex-command normal lainnya. Jika argumennya benar maka vim mulai mengedit file, dan jika tidak benar maka vim akan melaporkan kesalahan.Menurut pendapat saya, kita tidak perlu membuat buffer. Ini memiliki dua kelemahan utama.
'not-edited'
flag akan ditetapkan. Sebagai jamessan menunjukkan dalam jawabannya , jika kita mengatur nama file saat ini dengan:file
perintah dan mencoba untuk menulis file, kita akan menemui pesan kesalahan.E13: File exists (use ! to override)
Ini karena vim menandai file sebagai "tidak diedit" ketika kita mengubah nama file dengan:file
perintah.:keepalt
perintah. Ketika kami mencoba mengedit vimrc saat mengedit 'foo.bar', kami berharap nama file alternatifnya adalah 'foo.bar'. Tetapi jika kita membuat buffer dan mengubah nama, nama file alternatif menjadi bukan "foo.bar" tetapi nama lama buffer 'vimrc'. Lebih buruk lagi, buffer lama akan dibiarkan sepertiunlisted-buffer
atauinactive-buffer
. Itu sebabnya kita harus menggunakan:keepalt
perintah untuk menjaga nama file alternatif seperti yang kita harapkan dan mengaturbufhidden
opsiwipe
untuk menghapus buffer lama.Jika huruf kapital dalam nama perintah (semua perintah yang ditentukan pengguna harus dimulai dengan huruf kapital) tidak menjadi perhatian kami, akan lebih baik untuk menggunakannya. Karena tidak membuat buffer, kita bebas dari beban untuk mengelola buffer. Cukup berikan nama file ke vim dan lihat bagaimana vim menanganinya.
sumber