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
vault

1
@rush double if 문의 이유는 /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. vim.wikia.com에서 Max Ischenko의 모든 크레딧


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

@StevieD도 같은 대답을했지만 https://bbs.archlinux.org/viewtopic.php?id=126304 에서 답변을 찾았습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.