vim: +x 비트로 파일 생성

vim: +x 비트로 파일 생성

+x생성 시 스크립트에 비트를 설정하는 방법이 있나요 ?

예를 들어 다음을 실행합니다.

vim -some_option_to_make_file_executable script.sh

저장한 후에는 추가 이동 없이 파일을 실행할 수 있습니다.

참고 사항 chmod콘솔 자체에서 또는 심지어 콘솔 자체에서도 이 작업을 실행할 수 있지만 파일을 다시 로드하는 것이 권장되므로 vim약간 짜증납니다 . vim그리고 chmod매번 명령어를 입력하는 것도 귀찮습니다. pps. 파일 확장자를 기준으로 만들어주면 좋을 것 같습니다. (실행 파일은 필요하지 않습니다 .txt:-) )

답변1

이것을 어디서 찾았는지는 기억나지 않지만 ~/.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/"을 포함합니다.

답변2

내가 찾은이 스크립트존재하다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에 대한 모든 크레딧

답변3

나는 좀 더 선별적인 버전을 직접 작성했습니다. 새 파일이 작성될 때만 파일을 실행 가능하게 만들고, 파일이 #!.

" automatically make script files executable when writing for the first time
function! NewScriptExec() abort
    " check if this is a new file which starts with a shebang
    if exists('s:new_file') && getline(1)[0:1] == '#!'
        " based on https://stackoverflow.com/a/57539332/370695
        let l:file = expand('%')
        let l:old_perm = getfperm(l:file)
        " set the exec bit everywhere the read bit is set
        let l:new_perm = substitute(l:old_perm, '\v(r.)-', '\1x', 'g')
        if (l:old_perm != l:new_perm)
            call setfperm(l:file, l:new_perm)
        endif
        unlet s:new_file
    endif
endfunction

augroup new_script_exec
        autocmd!
        autocmd BufNewFile * let s:new_file = 1
        autocmd BufWritePost * call NewScriptExec()
augroup END

답변4

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도 동일한 답변을 제공했지만.

관련 정보