vim:用+ x位创建文件


14

+x创建时有什么方法可以设置脚本位吗?

例如,我运行:

vim -some_option_to_make_file_executable script.sh

保存后,我可以运行文件而无需任何其他动作。

ps。我可以从控制台运行chmodvim甚至可以从控制台运行,但这有点烦人,原因是vim建议重新加载文件。chmod每次键入命令也很烦人。pps。使其取决于文件扩展.txt名将是很棒的(我不需要可执行文件:-))

Answers:


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
哇,真是太好了。顺便说一句,好像你可以连接两个if的为一体if getline(1) =~ "^#!/bin/"。无论如何,这太神奇了。谢谢。
2012年

这不是“或”。我更喜欢只使用第一个条件,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()

您现在可以使用命令设置execute位:Xbit。全部归功于vim.wikia.com上的Max Ischenko


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也给出了相同的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.