【问题标题】:How to make Vim detect filetype from the shebang line?如何让 Vim 从 shebang 行检测文件类型?
【发布时间】:2012-01-17 06:44:34
【问题描述】:

有时我会编写没有任何文件扩展名的脚本。例如:

#!/usr/bin/env node

console.log('hello world!');

我希望 Vim 可以从 shebang 行检测文件类型(例如 #!/usr/bin/env nodejavascript)。我应该在filetype.vim 中输入什么?

【问题讨论】:

  • 为什么不添加第二行或最后一行模式行# vim: ft=javascript,因为 Vim 已经检查了模式行而不是重新发明轮子?
  • @SwaroopCH 为什么不像real editor 多年来所做的那样,从文件中已有的具有必要信息的行中解析信息,而不是以垃圾的编辑器特定方式重复重复它为其他编辑器的用户创建文件? /我穿上火焰套装

标签: bash vim file-type


【解决方案1】:

按照:help new-filetype-scripts 中列出的说明, 在用户运行时目录中创建scripts.vim 文件(~/.vim/ 在类 Unix 系统上),并在其中编写以下脚本:

if did_filetype()
    finish
endif
if getline(1) =~# '^#!.*/bin/env\s\+node\>'
    setfiletype javascript
endif

【讨论】:

  • 另请参阅值得一读的整个 :help new-filetype 部分。
  • 为什么不转义正斜杠? /bin/env
  • @LaiYu-Hsuan:根据 Vim 正则表达式的语法,正斜杠字符不是特殊符号。当然,它可以转义为 \/,但只有在模式分隔符为斜杠时,它才需要用于正向搜索命令 (/) 或替换命令 (:s) 中的模式。跨度>
  • 您也可以将这些行放入.vimrc 中,使用autocmd,可能bufread 就是其中之一,以触发函数。
【解决方案2】:

创建此文件~/.vim/ftdetect/node.vim 有这个内容

fun! s:DetectNode()
    if getline(1) == '#!/usr/bin/env node'
        set ft=javascript
    endif
endfun

autocmd BufNewFile,BufRead * call s:DetectNode()

【讨论】:

  • 实际上,"ft=javascript" 更有可能奏效。大多数人都定义了“javascript”而没有定义“节点”。
【解决方案3】:

如果您对某个插件感兴趣,那么确实有一个插件:

https://github.com/vitalk/vim-shebang

这包含node -> javascript 突出显示的模式。

AddShebangPattern! javascript ^#!.*\s\+node\>

【讨论】:

    【解决方案4】:

    聚会有点晚了,但Node.vim 会为您处理检测此类 JavaScript 文件。然后还有一些。 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-30
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多