VIM:为每个新文件设置filetype=txt [无名称]

9
我尝试了各种方法让vim将新建文件(在新标签页中)的filetype设置为“txt”,但都无效。以下是我在网上阅读到的一些内容:
au BufRead,BufNewFile *.txt setlocal ft=txt (放入 _vimrc 文件中)
然而,这并没有起作用。请问有人可以帮忙吗?

你可能想使用 Vim 的 text 文件类型而不是你的 txt 文件类型。text 文件类型是在 Vim 7.3.388(2011-12-30)中添加的。 - Flux
3个回答

25
以下一行代码添加到你的.vimrc中,如果尚未设置,则会将filetype设置为text
autocmd BufEnter * if &filetype == "" | setlocal ft=text | endif

2
问题是,如果我创建一个新文件,然后将其保存为test.py,则文件类型仍将保持为txt。 我如何确保新文件的类型为txt,除非它显式保存为另一种类型? - charlax
@charlax: 我认为使用BufWrite(或BufWritePost)而不是BufEnter会确保文件类型仅在保存时设置,而不是在加载时设置。 - undefined

5

除非您开启了文件类型检测或明确设置了文件类型,否则所有文件都被视为纯文本。但是,Vim允许您将文件类型设置为任何旧文本,因此您确定它不起作用吗?

:set filetype=banana
:set filetype?
  filetype=banana

设置文件类型不会有任何明显的效果,除非在ftplugin Vim目录中有相应的文件,并且Vim没有提供txt.vim文件类型文件。当然,您可以在此处添加txt.vim,但我不确定这将为您带来什么优势,因为对于文本文件,您想要什么特殊行为而不是默认行为呢?

(如果您想要语法突出显示(无论这对于文本文件意味着什么!),则还必须在syntax Vim目录中创建一个txt.vim文件。)

您想要实现什么效果?


嗨保羅,是的,我在語法目錄中有一個txt.vim。我需要在ftplugin中放一個文件來設置新文件的ft=text嗎? - Reman
不,语法设置将是自动的(参见 syntax/syntax.vim),只要自动检测文件类型成功。因此,我猜测语法失败是因为缺少 ftplugin\txt.vim — 尝试添加一个空白文件。(此外,请确保你已经打开了语法:在你的 .vimrc/_vimrc 中输入 syntax on)。 - Paul Ruane
@Remonn:话虽如此,我刚刚尝试了你的au命令,即使没有ftplugin\txt.vim,语法也被正确设置为txt。我现在最好的猜测是你在.vimrc中没有打开语法。 - Paul Ruane
@Remonn:好的,我已经将syntax/cs.vim复制到syntax/txt.vim,重新打开了Vim,在您的au命令中运行,然后打开了一个.txt文件,语法完美地工作。所以肯定是你的.vimrc中没有包含syntax on。您可以在编辑器中运行:syntax on来确认这一点。 - Paul Ruane
@Paul,如果我设置ft=text,则语法在文本文件中可见。但问题是Vim不会将(新的,未保存的)无名称文件设置为ft=text。Paul,你把“au bufread.....”这行放在哪里了? - Reman
对于我的测试,我直接在 ex 模式下输入了 au 命令。这相当于从 .vimrc 中加载它。问题是你创建了一个没有扩展名的新文件,因此它不符合文件类型检测规则。要么在创建后将文件保存为 .txt 扩展名,要么使用名称创建新文件,例如 new fred.txt - Paul Ruane

2
实际上,这很简单。只需将以下内容作为您的.vimrc文件中的第一行即可。
set ft=txt

每次打开一个新文件时,文件类型将被设置为txt。但是,如果您打开具有已知现有类型的文件,则仍将覆盖它,没有问题。

它只在VIM启动时为“无名称”选项卡执行此操作(直到我保存并重新加载文件,才会显示语法)。新缓冲区(选项卡)未设置为ft = txt。 - Reman
哎呀,说得好。Curt Nelson的回答是正确的方法。 - Nick Knowlson

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