vim: buat file dengan + x bit

14

Apakah ada cara untuk mengatur +xbit pada skrip saat membuat?

Misalnya saya menjalankan:

vim -some_option_to_make_file_executable script.sh

dan setelah menyimpan saya dapat menjalankan file tanpa ada gerakan tambahan.

ps. Saya dapat menjalankan chmoddari vimatau bahkan dari konsol itu sendiri, tetapi ini sedikit mengganggu, sebab vimmenyarankan untuk memuat ulang file. Juga sangat menjengkelkan untuk mengetik chmodperintah setiap saat. pps. Akan sangat bagus untuk membuatnya tergantung pada ekstensi file (saya tidak perlu dieksekusi .txt:-))

buru-buru
sumber

Jawaban:

23

Saya tidak ingat di mana saya menemukan ini, tetapi saya menggunakan yang berikut di ~ / .vimrc saya

" Set scripts to be executable from the shell
au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod +x <afile> | endif | endif

Perintah secara otomatis mengatur bit yang dapat dieksekusi jika baris pertama dimulai dengan "#!" atau mengandung "/ bin /".

tonymac
sumber
1
Wow, itu hebat. Btw, sepertinya Anda bisa menggabungkan dua ifmenjadi satu if getline(1) =~ "^#!/bin/". Bagaimanapun itu luar biasa. Terima kasih.
buru
Ini bukan "atau". Saya lebih suka menggunakan kondisi pertama saja,au BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
lemari besi
1
@ bergegas Alasan ganda jika pernyataan adalah untuk menangkap garis di mana /bintidak segera mengikuti shebang, seperti #!/usr/bin/env. Cara mengatasinya adalah tentu saja untuk menggunakan wildcard: getline(1) =~ "^#!.*/bin/".
Harald Nordgren
1
Trik yang rapi tetapi saya mendapatkan yang berikut setiap kali saya simpan:written/bin/bash: endif: command not found /bin/bash: endif: command not found
StevieD
3
ini memperbaikinya:au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif
StevieD
4

Saya menemukan skrip ini di http://vim.wikia.com . Bukan solusi yang sempurna, tetapi yang dapat diterima, saya pikir.

function! SetExecutableBit()
  let fname = expand("%:p")
  checktime
  execute "au FileChangedShell " . fname . " :echo"
  silent !chmod a+x %
  checktime
  execute "au! FileChangedShell " . fname
endfunction
command! Xbit call SetExecutableBit()

Anda sekarang dapat mengatur bit eksekusi dengan perintah :Xbit. Semua kredit untuk Max Ischenko di vim.wikia.com

nsg
sumber
0

Saya menggunakan ini di MacVim Custom Version 8.0.648 (134)

" if file is executable just exit

au BufWritePost *.sh if FileExecutable("%") | if getline(1) =~ "^#!" | silent !chmod u+x % | endif | endif

" Determines if file is already executable 

function! FileExecutable(fname)

    execute "silent! ! test -x" a:fname
    return v:shell_error

endfunction
TonyB
sumber
0

jawaban tonymac berhenti bekerja untuk saya di beberapa titik (dengan VIM 7.4), memberi saya masalah yang sama dengan @StevieD. Memodifikasi itu memperbaiki masalah:

au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod +x <afile>" | endif | endif

Saya menemukan jawaban dari https://bbs.archlinux.org/viewtopic.php?id=126304 , meskipun @StevieD juga memberikan jawaban yang sama.

Jonathan
sumber