Pertahankan bit izin saat menulis file baru dengan VIM

8

Di Vim, ketika saya menulis salinan buffer saat ini ke file baru menggunakan :w [filename], tampaknya Vim menggunakan default (yaitu ditetapkan oleh umask atau apa pun) izin file untuk file baru. Jika buffer saat dimuat dari file yang ada, meskipun, tidak harus yang "benar" perilaku adalah untuk menduplikasi izin dari yang berkas? Misalnya, jika saya mengedit file yang dapat dieksekusi, dan saya menulis salinan file baru, mengapa Vim tidak menulis file yang dapat dieksekusi baru ? Apakah ada cara untuk memaksa Vim berperilaku seperti yang saya jelaskan, selain hanya melakukan sesuatu seperti ! chmod --reference % [newfilename]setelah menulis file baru?

Kyle Strand
sumber
Mungkin terkait: unix.stackexchange.com/q/58880/22703
allquixotic
Saya pikir jawabannya sudah ada di pertanyaan - Anda harus membuat makro atau keybinding yang melakukan itu chmoduntuk Anda. AFAIK, vim tidak memiliki built in ini.
Kevin Panko

Jawaban:

3

Anda bisa melakukan sesuatu seperti ini. Pertama, tangkap nama file asli.

au BufRead * let b:oldfile = expand("<afile>")

Kemudian, saat Anda menyimpan file baru, ubah izinnya menjadi sama dengan file asli.

au BufWritePost * if exists("b:oldfile") | let b:newfile = expand("<afile>") | if b:newfile != b:oldfile | echo system("chmod --reference=".b:oldfile." ".b:newfile) | endif |endif

Masukkan saja kedua autocommand itu ke ~ / .vimrc Anda.

garyjohn
sumber
Jawaban ini luar biasa, tetapi saya punya satu saran: ubah echo system(dll ke silent echo system(dll. Ini menghindari "tekan ENTER untuk melanjutkan" hang.
Kyle Strand
@KyleStrand: Saya bisa saja menggunakan call system(...untuk tidak mencetak apapun ke layar juga, tetapi saya mencoba untuk menghindari masalah dari perintah gagal secara diam-diam. Jika Anda tidak berpikir itu akan pernah gagal, atau lebih suka hidup dengan kegagalan sesekali daripada sial Press ENTER..., maka saya setuju dengan saran Anda. Saya pikir solusi yang lebih baik adalah menulis fungsi yang menangkap output dari sistem () dan menggemakannya hanya jika tidak kosong. Saya telah melakukannya di plugin dan berfungsi dengan cukup baik.
garyjohn
Cukup adil. Saya tidak mengerti vimscript sama sekali, jadi saya hanya terjebak dalam "diam" untuk melihat apakah itu akan berhasil, dan ketika tampaknya baik-baik saja, saya hanya meninggalkan .vimrc saya seperti itu. Saya pasti lebih suka kegagalan sesekali daripada gigih Press ENTER,, jadi saya pikir saya akan tetap dengan silentatau menggunakan call. Sekali lagi terima kasih atas sarannya!
Kyle Strand
0

Pastikan bahwa tidak ada perubahan yang belum disimpan dalam file dan kemudian gunakan cpuntuk membuat salinan. Itu akan menghasilkan salinan dengan izin yang sama seperti aslinya.

Roland Smith
sumber