如何在.vimrc中添加autocmd,新建文件时自动插入Shebang(无需骨架文件)
搞定Vim自动添加Shebang的问题
嘿,你的问题根源其实很简单:你写的命令只是定义了一个叫line的变量,但完全没执行把这个变量内容插入到缓冲区的操作。Vim可不会自动把你定义的变量内容放到文件里,必须显式告诉它要写入才行!
先给你最基础的可用版本
直接把Shebang插入到新建文件的第一行,用setline()函数就很靠谱:
autocmd BufNewFile * call setline(1, "#!/usr/bin/env" . (empty(&filetype) ? '' : ' '.&filetype))
或者用:normal命令模拟手动插入的操作(原理是跳到首行,插入新行并写入内容):
autocmd BufNewFile * execute "normal! ggO" . "#!/usr/bin/env" . (empty(&filetype) ? '' : ' '.&filetype)
第一种写法更简洁,也不容易因为按键映射干扰出问题,优先推荐。
优化:别给所有文件都加Shebang
上面的命令会给所有新建文件(比如普通的.txt文件)都加上Shebang,这显然没必要。我们可以限制只给脚本类文件生效,比如指定后缀名:
autocmd BufNewFile *.sh,*.py,*.pl,*.rb,*.lua call setline(1, "#!/usr/bin/env " . &filetype)
或者更灵活一点,判断文件类型是否属于脚本范畴:
autocmd BufNewFile * if index(['sh','py','pl','rb','lua','perl','bash'], &filetype) >= 0 | call setline(1, "#!/usr/bin/env " . &filetype) | endif
再升级:避免重复插入
如果之后你手动修改了首行,或者通过其他方式加了Shebang,再次打开时别重复插入。可以加个判断,检查首行是否已经有Shebang了:
autocmd BufNewFile * \ if index(['sh','py','pl','rb'], &filetype) >= 0 && getline(1) !~ '#!/usr/bin/env' | \ call setline(1, "#!/usr/bin/env " . &filetype) | \ endif
再回头说你的原命令为啥失效
看你写的这条:
autocmd BufNewFile * let line = "#!/usr/bin/env" . (empty(&filetype) ? '' : ' '.&filetype)
它只是在Vim当前会话里创建了一个变量line,存了Shebang的字符串,但完全没告诉Vim要把这个字符串写到你正在编辑的文件里。let命令就是用来定义变量的,和文件内容没有自动关联,必须显式调用写入缓冲区的操作才行!
内容的提问来源于stack exchange,提问作者AgentConfusedLlama
相关产品推荐
相关产品推荐

