vim: создать файл с битом + x

14

Есть ли способ установить +xбит на сценарии при создании?

Например я бегу:

vim -some_option_to_make_file_executable script.sh

и после сохранения я могу запустить файл без каких-либо дополнительных перемещений.

пс. Я могу работать 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

Команда автоматически устанавливает исполняемый бит, если первая строка начинается с "#!" или содержит "/ bin /".

tonymac
источник
1
Вау, это здорово. Кстати, кажется, вы можете объединить два ifв один if getline(1) =~ "^#!/bin/". Во всяком случае, это удивительно. Спасибо.
Раш
Это не «или». Я предпочитаю использовать только первое условие,au BufWritePost * if getline(1) =~ "^#!" | silent !chmod +x % | endif
хранилище
1
@rush Причины для двойных операторов if заключаются в том, чтобы перехватывать строки, где the /binне следует сразу за шаббатом, например #!/usr/bin/env. Путь вокруг этого, конечно , использовать подстановочные: getline(1) =~ "^#!.*/bin/".
Харальд Нордгрен
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. Весь кредит Максу Ищенко на vim.wikia.com

NSG
источник
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
TonyB
источник
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 также дал тот же ответ.

Джонатан
источник