为没有扩展名的文件设置vim文件类型

6
我该如何在vim中为没有扩展名的文件设置文件类型和/或语法?
注意:
这是vim default syntax for files with no extension的重复问题。我再次提问是因为我认为没有人正确地回答过它。
我不想知道如何为未识别的文件类型设置默认语法,我只想知道如何为没有扩展名的文件设置它。

如果vim可以检测到此文件的filetype,则可以使用以下配置(例如sh脚本,vim中的:set filetype?sh):autocmd BufNewFile,BufRead * if (&ft == "sh") | set noexpandtab tabstop=4 shiftwidth=4 | endif - CodyChan
4个回答

10

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

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

这个默认使用perl语法,但你可以根据需要使用其他语法。

2
使用 expand() 函数,可以直接从文件名中提取扩展名。因此,测试也可以写成 expand('%:e') != '' - ib.
@ib。不,看看我在Geoff Reedy的答案下的评论。问题是以点命名的文件(如.vimrc)也不会得到%:e。 - oblitum
@Chico:从技术上讲,这是正确的:像.vimrc这样的文件没有扩展名;前导点不会使名称的其余部分成为扩展名。 - ib.
@Chico:嗯,这取决于我们达成的定义。 :-) 由于没有在所有平台和文件系统上都被接受的严格的文件名扩展名定义,所以问题应明确说明,在讨论的背景下,“没有扩展名的文件”是指不包含点的文件名。 - ib.
这个设定与 netrw 一起非常缓慢。将事件更改为 BufNewFile 对我有用。 - Jean Carlo Machado

6

: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语法定义文件,没有什么特别的。如果您不想创建自己的文件类型,请在autocommand中使用普通文件类型,而不是myfiletype。例如:
au BufRead,BufNewFile * if expand('<afile>:e') == '' | set ft=html | end

会设置HTML文件类型,该文件类型将加载HTML语法文件。


你的解决方案看起来很酷,因为有 '<afile>:e',但是当我打开我的 .vimrc 文件时,它已经被设置了,所以我选择了 grep . 的解决方案。 - oblitum

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

0
最终,我选择了这个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文件,例如COMMIT_EDITMSGREADMEGoToFile(来自CommandT)和NERD_tree*(来自NERD tree)。

编辑

我放弃了这个想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接