vim: створити файл з бітом + x


14

Чи є спосіб встановити +xбіт на скрипт під час створення?

Наприклад, я запускаю:

vim -some_option_to_make_file_executable script.sh

і після збереження я можу запустити файл без додаткових переміщень.

пс. Я можу запускатись 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/".
Харальд Нордгрен

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


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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.