【问题标题】:set vim filetype for files with no extension, only为没有扩展名的文件设置 vim 文件类型,仅
【发布时间】:2012-08-09 19:02:33
【问题描述】:

如何为 vim 中没有扩展名的文件设置文件类型和/或语法?

注意

这是vim default syntax for files with no extension 的副本。我再次询问,因为在我看来没有人正确回答。

我不想知道如何为无法识别的文件类型设置默认语法,我想知道如何为无扩展名的文件设置默认语法。

【问题讨论】:

  • 如果filetype可以在vim中检测到这个文件,你可以使用下面的配置(例如sh脚本,:set filetype?在vim中是sh):autocmd BufNewFile,BufRead * if (&ft == "sh") | set noexpandtab tabstop=4 shiftwidth=4 | endif

标签: vim


【解决方案1】:

您可以创建一个自动命令来检查文件名是否包含.,如果不包含,则切换到给定的语法:

autocmd BufNewFile,BufRead * if expand('%:t') !~ '\.' | set syntax=perl | endif

这个选择perl 作为默认语法,但您可以简单地使用合适的语法。

【讨论】:

  • 使用expand()函数,可以直接从文件名中提取扩展名。所以,测试也可以写成expand('%:e') != ''
  • @ib。不,请参阅我在 Geoff Reedy 的回答中的评论。问题是点命名文件(如 .vimrc)也不会得到 %:e。
  • @Chico:这在技术上是正确的:像.vimrc 这样的文件没有扩展名;前导点不会使名称的其余部分成为扩展名。
  • @Chico:嗯,这取决于我们同意的定义。 :-) 由于没有对所有平台和文件系统都接受的文件扩展名的严格定义,因此问题应该明确指出,在讨论的上下文中,“没有扩展名的文件”被理解为不包含的文件名点。
  • 这个设置与 netrw 一起非常慢。将 eventto 更改为 BufNewFile 已为我修复。
【解决方案2】:

:help ftdetect 将显示 vim 文档中有关如何编写文件类型检测脚本的部分。

以下是我对这个案例的建议:

~/.vim/ftdetect 中创建一个以您的文件类型命名的文件,例如myfiletype.vim.

放在这个文件里

au BufRead,BufNewFile * if expand('<afile>:e') == '' | set ft=myfiletype | end

这将导致 vim 将没有任何扩展名的文件的文件类型设置为 myfiletype。如果您希望仅在未检测到其他文件类型时使用它,请使用 setfiletype myfiletype 而不是 set ft=myfiletype

然后创建语法文件~/.vim/syntax/myfiletype.vim。这只是一个普通的 vim 语法定义文件,没什么特别的。如果您不想创建自己的文件类型,只需在自动命令中使用普通文件类型而不是 myfiletype。例如

au BufRead,BufNewFile * if expand('<afile>:e') == '' | set ft=html | end

将设置加载 html 语法文件的 html 文件类型。

【讨论】:

  • 你的解决方案看起来很酷,因为 ':e',但是当我打开我的 .vimrc 时,它是由这个设置的,所以我选择了 grep \。解决方案。
【解决方案3】:
1) Hit escape to make sure you're in normal mode
2) Type ":set syntax=java" (or equivalent language)
3) :set filetype=FILETYPE, where FILETYPE is the filetype.

如果您希望自动执行此操作,请尝试使用上一个答案中的解决方案:

autocmd BufNewFile,BufRead * if expand('%:t') !~ '\.' | set syntax=perl | endif

【讨论】:

    【解决方案4】:

    最后,我为我的 C++ 配置选择了这个:

    let s:reserved = '^NERD_tree\|^GoToFile$'
    au BufNewFile,BufRead *
    \ if expand('%:e') =~ '^\(h\|hh\|hxx\|hpp\|ii\|ixx\|ipp\|inl\|txx\|tpp\|tpl\|cc\|cxx\|cpp\)$' ||
    \    expand('%:t') !~ '\.\|'.s:reserved && expand('%:t') =~ '[a-z]'                            |
    \   if &ft != 'cpp'                                                                            |
    \     set ft=cpp                                                                               |
    \   endif                                                                                      |
    \   set syntax=cpp11                                                                           |
    \   call CSyntaxAfter()                                                                        |
    \ endif
    

    而不是只检查尾部是否缺少.。这样可以避免设置多个非 cpp 文件,例如来自 CommandT 的 COMMIT_EDITMSGREADMEGoToFile 和来自 NERD 树的 NERD_tree*

    编辑

    我刚刚放弃了这个想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-19
      • 2012-09-27
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2014-06-14
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多