vim: फ़ाइल को + x बिट के साथ बनाएँ


14

क्या +xस्क्रिप्ट बनाते समय बिट सेट करने का कोई तरीका है ?

उदाहरण के लिए मैं चलाता हूं:

vim -some_option_to_make_file_executable script.sh

और सेव करने के बाद मैं बिना किसी अतिरिक्त मूवमेंट के फाइल चला सकता हूं।

ps। मैं कंसोल chmodसे vimया यहां तक ​​कि खुद से चला सकता हूं , लेकिन यह थोड़ा कष्टप्रद है, इसका कारण vimफ़ाइल को फिर से लोड करना है। इसके अलावा chmodहर बार कमांड टाइप करना कष्टप्रद है । पी पी एस। फ़ाइल एक्सटेंशन के आधार पर इसे बनाना बहुत अच्छा होगा (मुझे निष्पादन योग्य .txt:-) की आवश्यकता नहीं है )

जवाबों:


23

मुझे याद नहीं है कि मुझे यह कहाँ मिला है, लेकिन मैं अपने ~ / .vimrc में निम्नलिखित का उपयोग करता हूं

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

यदि पहली पंक्ति "#!" के साथ शुरू होती है, तो कमांड स्वचालित रूप से निष्पादन योग्य बिट सेट करता है। या "/ बिन /" शामिल हैं।


1
वाह, यह तो बड़ी अच्छी बात है। Btw, लगता है आप ifएक में दो शामिल हो सकते हैं if getline(1) =~ "^#!/bin/"। वैसे भी यह अद्भुत है। धन्यवाद।
भीड़ दें

यह "या" नहीं है। मैं सिर्फ पहली शर्त का उपयोग करना पसंद करता हूं,au BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
वॉल्ट

1
@rush डबल के कारण अगर बयानों को उन पंक्तियों को पकड़ना है जहां /binतुरंत शेबंग का पालन ​​नहीं होता है, जैसे #!/usr/bin/env। एक रास्ता है कि चारों ओर एक वाइल्डकार्ड का उपयोग करने के लिए है getline(1) =~ "^#!.*/bin/":।
हैराल्ड नॉर्डग्रेन

1
नीट ट्रिक, लेकिन मुझे हर बार बचत के बाद निम्नलिखित written/bin/bash: endif: command not found /bin/bash: endif: command not found
मिलते हैं

3
यह इसे ठीक करता है:au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif
StevieD

4

मुझे यह स्क्रिप्ट http://vim.wikia.com पर मिली । एक सही समाधान नहीं है, लेकिन एक स्वीकार्य है, मुझे लगता है।

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()

अब आप कमांड के साथ निष्पादित बिट सेट कर सकते हैं :Xbit। मैक्स Ischenko के लिए सभी क्रेडिट vim.wikia.com पर


0

मैं MacVim कस्टम संस्करण 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

0

tonymac के जवाब ने मेरे लिए कुछ बिंदु (VIM 7.4 के साथ) काम करना बंद कर दिया, जिससे मुझे @StevieD जैसी ही समस्या हुई। इसे संशोधित करने से समस्या ठीक हो गई:

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

मुझे https://bbs.archlinux.org/viewtopic.php?id=126304 से जवाब मिला , हालांकि @StevieD ने भी यही जवाब दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.