เป็นกลุ่ม: สร้างไฟล์ด้วย + x บิต


14

มีวิธีใดบ้างในการตั้งค่า+xบิตของสคริปต์ขณะที่สร้าง

ตัวอย่างเช่นฉันวิ่ง:

vim -some_option_to_make_file_executable script.sh

และหลังจากบันทึกฉันสามารถเรียกใช้ไฟล์โดยไม่ต้องย้ายใด ๆ เพิ่มเติม

PS ฉันสามารถเรียกใช้chmodจากvimหรือแม้กระทั่งจากคอนโซลตัวเอง แต่มันน่ารำคาญเล็กน้อยเพราะvimแนะนำให้โหลดไฟล์ นอกจากนี้ยังเป็นเรื่องน่ารำคาญที่จะพิมพ์chmodคำสั่งทุกครั้ง PPS มันจะเป็นการดีที่จะทำให้มันขึ้นอยู่กับนามสกุลของไฟล์ (ฉันไม่ต้องการปฏิบัติการ.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

คำสั่งจะตั้งค่าบิตที่สามารถใช้งานได้โดยอัตโนมัติหากบรรทัดแรกขึ้นต้นด้วย "#!" หรือมี "/ bin /"


1
ว้าวนั่นเป็นสิ่งที่ดี Btw ดูเหมือนว่าคุณสามารถเข้าร่วมสองคนifเป็นหนึ่งเดียวif getline(1) =~ "^#!/bin/"ได้ อย่างไรก็ตามมันช่างน่าอัศจรรย์ ขอขอบคุณ.
เร่ง

นี่ไม่ใช่ "หรือ" ฉันชอบที่จะใช้เพียงเงื่อนไขแรกau BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
ตู้

1
@rush เหตุผลสำหรับคู่ถ้างบคือการที่จะจับเส้นที่ที่/binไม่ได้ทันทีตาม shebang #!/usr/bin/envเช่น getline(1) =~ "^#!.*/bin/"รอบวิธีการที่เป็นหลักสูตรที่จะใช้สัญลักษณ์แทน:
Harald Nordgren

1
เคล็ดลับเรียบร้อย แต่ฉันได้รับสิ่งต่อไปนี้ทุกครั้งที่ฉันบันทึก:written/bin/bash: endif: command not found /bin/bash: endif: command not found
StevieD

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ตอนนี้คุณสามารถตั้งค่าดำเนินการบิตที่มีคำสั่ง เครดิตทั้งหมดให้กับ Max Ischenko ที่ vim.wikia.com


0

ฉันใช้สิ่งนี้ใน 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

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 ก็ให้คำตอบเหมือนกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.