博士: vim似乎在编辑html文件时同时使用indent/javascript.vim和indent/html.vim;这是有意的还是错误的?如何使html文件仅为源html.vim
最近,我发现在编辑html文件时,vim似乎都在为javascript和html使用缩进文件类型插件,并且我已经根据这种行为在最小的vim配置上做了一些测试。
这是我的单行.vimrc
filetype plugin indent on在我的.vim目录中:
~ % tree .vim
.vim
└── indent
├── html.vim
└── javascript.vim
1 directory, 2 files其中:
~ % cat .vim/indent/javascript.vim
setlocal formatprg=js-beautify
let g:testvar_js="js testvar"
let g:testvar="testvar defined in javascript.vim"和
~ % cat .vim/indent/html.vim
setlocal formatprg=html-beautify
let g:testvar_html="html testvar"
let g:testvar="testvar defined in html.vim"然后使用vim foo.html打开一个新的空vim缓冲区,并使用一些命令进行测试:
:set filetype?
filetype=html
:set formatprg?
formatprg=js-beautify
:echo g:testvar
testvar defined in javascript.vim
:echo g:testvar_html
html testvar
:echo g:testvar_js
js testvar好像vim提供了两个缩进的文件类型插件,首先使用indent/html.vim,然后使用indent/javascript.vim。
因此,我的问题是:
html.vim上的vim仅为源?一些可能有用的补充信息:
ftplugin/,只有indent/。indent/html.vim影响:在indent/html.vim中定义的变量都是在javascript缓冲区中未定义的formatprg总是处于打开状态,不管该html文件中是否有javascript代码片段或<script>标记。indent/css.vim --我已经测试过了js-beautify和html-beautify是两个单独的可执行文件(存储库是这里) bin % ls -n js-美化lrwxr-xr-x1 501 80 53 js-beautify 19 17:59 js美化-> -> bin % ls -n html美化lrwxr-xr-x1 501 80 55 js-beautify 19 17:59 html-美化->->如果你想让我做一些额外的测试或者需要更多的信息,就喊一声。
非常感谢
发布于 2022-05-23 16:27:25
下面是一个非常有效的HTML示例:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Sample</title>
<script>
console.log('Hello, World!');
</script>
<style>
body {
background: orange;
}
</style>
</head>
<body>
<h1>Sample</h1>
</body>
</html>您将注意到它中包含少量的嵌入式JavaScript,这对于$VIMRUNTIME/indent/html.vim来获取$VIMRUNTIME/indent/javascript.vim来说是一个很好的理由。毕竟,javascript缩进脚本应该知道如何缩进JavaScript,那么为什么不在可以包含嵌入式JavaScript的html缓冲区中使用它呢?
FWIW,下面是应对这种行为负责的片段:
if !exists('*GetJavascriptIndent')
runtime! indent/javascript.vim
endif注意,$VIMRUNTIME/indent/html.vim的维护人员为javascript选择了外部路由,为css选择了内部路由。也许是因为$VIMRUNTIME/indent/css.vim不符合要求?我不知道,坦白说,我觉得这不重要。
现在,让我们来看看你的错误,…
1. `~/.vim/indent/<filetype>.vim`,
2. `$VIMRUNTIME/indent/<filetype>.vim`
3. `~/.vim/after/indent/<filetype>.vim`如果您不是很小心,您在早期脚本中放置的内容可能会在后面的脚本来源时被覆盖。因此,将您自己的东西放在after/下的脚本中就更有意义了。
所以…
我犯了什么愚蠢的错误吗?
是的,见上文。
如果不是,那么这是一个有意的设计,一个bug,还是vim与此完全无关?
是的,这是一种有意设计,效果很好。这只会引起问题,因为你滥用了它。
在编辑html文件时,是否有一种方法可以使
html.vim上的vim仅为源?
indent/html.vim?是的,这当然是可能的,但你为什么要这么做呢?ftplugin/html.vim?它已经按照您想要的方式工作了,而且它是您在indent/html.vim中错误放置的东西的正确位置。编辑
奇怪的是,
indent/文件应该设置正确的缩进选项,那么为什么我不应该在那里设置缩进程序呢?
当将相应文件类型的文件加载到缓冲区时,通常只需获取一次特定于文件类型的脚本。由于嵌入其他语言的语言(HTML中的JavaScript)或其他语言的超集(C++ vs C)中的语言是相对常见的,所以Vim使获取其他特定于文件类型的脚本成为可能。这是代码重用的一个具体例子,通常被认为是一件好事。
缩进脚本可以源其他缩进脚本,语法脚本可以提供其他语法脚本,ftplugins可以提供其他ftplugins。
所以Vim给了我们一个有用的低层次机制,但它是由我们决定什么放置在哪里,这始终取决于上下文。
在HTML的情况下,使用现有的JavaScript缩进内容是有意义的,因此$VIMRUNTIME/indent/html.vim在早期使用$VIMRUNTIME/indent/javascript.vim,然后继续设置特定于HTML的内容。最终的结果是一个html缩进脚本,它也支持嵌入式JavaScript。html语法脚本使用类似的机制来突出显示嵌入式JavaScript。在一些简单的情况下,您甚至可以让一个ftplugin采购另一个ftplugin,但$VIMRUNTIME/ftplugin/html.vim没有。
但这并不总是有意义的:选项可能被覆盖,映射可能被覆盖或定义在没有意义的上下文中,等等。在这种特殊情况下,用于格式化的外部工具是高度上下文敏感的:您不能真的期望js-beautify正确地格式化HTML,或者html-beautify正确地格式化JavaScript,因此必须为javascript和html文件类型分别设置formatprg。
ANd,这是你的第一个错误所在。
下面是从$VIMRUNTIME/indent/javascript.vim中获取$VIMRUNTIME/indent/html.vim的代码片段
if !exists('*GetJavascriptIndent')
runtime! indent/javascript.vim
endif:help :runtime是:help :source的一个明智的替代方案,它在:help 'runtimepath'中查找文件。因为您的~/.vim/indent/javascript.vim在您的runtimepath中,所以它将被来源于。因为有一个!,所以每个匹配的文件都将被获取。因为它在runtimepath中是第一位的,所以以后的脚本可能会覆盖它。
在您的示例中,$VIMRUNTIME/indent/html.vim自动来源于您的~/.vim/indent/javascript.vim,其中包含不应该在html缓冲区中设置的内容。
after目录允许您了解为给定文件类型设置的内容,因为内置脚本很少(如果有的话)执行runtime! after/indent/<filetype>.vim。
这就解释了为什么不小心地将特定于文件类型的东西放在~/.vim/{ftplugin,indent,syntax}/中是个坏主意,也解释了为什么你应该把它放在~/.vim/after/{ftplugin,indent,syntax}/中。
https://stackoverflow.com/questions/72350973
复制相似问题