vim: tạo tập tin với + x bit


14

Có cách nào để thiết lập +xbit trên script trong khi tạo không?

Ví dụ tôi chạy:

vim -some_option_to_make_file_executable script.sh

và sau khi lưu tôi có thể chạy tập tin mà không cần thêm bất kỳ chuyển động nào.

ps. Tôi có thể chạy chmodtừ vimhoặc thậm chí từ chính bàn điều khiển, nhưng điều này hơi khó chịu, vì vimgợi ý để tải lại tệp. Ngoài ra, thật khó chịu khi gõ chmodlệnh mỗi lần. pps. Sẽ thật tuyệt khi làm cho nó tùy thuộc vào phần mở rộng tập tin (Tôi không cần thực thi .txt:-))

Câu trả lời:


23

Tôi không nhớ nơi tôi tìm thấy cái này, nhưng tôi sử dụng cái sau trong ~ / .vimrc của tôi

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

Lệnh tự động đặt bit thực thi nếu dòng đầu tiên bắt đầu bằng "#!" hoặc chứa "/ bin /".


1
Wow, đó là điều tuyệt vời. Btw, dường như bạn có thể tham gia hai ifthành một if getline(1) =~ "^#!/bin/". Dù sao đó là tuyệt vời. Cảm ơn bạn.
vội vàng

Đây không phải là "hoặc". Tôi chỉ thích sử dụng điều kiện đầu tiên,au BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
vault

1
@rush Những lý do để nhân đôi câu lệnh là để bắt các dòng trong /binđó không theo ngay lập tức theo shebang #!/usr/bin/env. Một cách xung quanh đó là tất nhiên để sử dụng ký tự đại diện : getline(1) =~ "^#!.*/bin/".
Harald Nordgren

1
Thủ thuật gọn gàng nhưng tôi nhận được những điều sau đây mỗi khi tôi lưu:written/bin/bash: endif: command not found /bin/bash: endif: command not found
StevieD

3
cái này sửa nó:au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif
StevieD

4

Tôi tìm thấy kịch bản này tại http://vim.wikia.com . Không phải là một giải pháp hoàn hảo, nhưng tôi chấp nhận được.

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

Bây giờ bạn có thể thiết lập bit thực thi bằng lệnh :Xbit. Tất cả tín dụng cho Max Ischenko tại vim.wikia.com


0

Tôi sử dụng điều này trong MacVim Phiên bản tùy chỉnh 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

Câu trả lời của tonymac đã ngừng hoạt động với tôi tại một số điểm (với VIM 7.4), cho tôi vấn đề tương tự như @StevieD. Sửa đổi nó đã khắc phục vấn đề:

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

Tôi đã tìm thấy câu trả lời từ https://bbs.archlinux.org/viewtopic.php?id=126304 , mặc dù @StevieD cũng đưa ra câu trả lời tương tự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.