首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vim意外地在编辑html文件时提供javascript缩进文件类型插件。

Vim意外地在编辑html文件时提供javascript缩进文件类型插件。
EN

Stack Overflow用户
提问于 2022-05-23 15:18:33
回答 1查看 79关注 0票数 1

博士: vim似乎在编辑html文件时同时使用indent/javascript.vimindent/html.vim;这是有意的还是错误的?如何使html文件仅为源html.vim

最近,我发现在编辑html文件时,vim似乎都在为javascript和html使用缩进文件类型插件,并且我已经根据这种行为在最小的vim配置上做了一些测试。

这是我的单行.vimrc

代码语言:javascript
复制
filetype plugin indent on

在我的.vim目录中:

代码语言:javascript
复制
~ % tree .vim
.vim
└── indent
    ├── html.vim
    └── javascript.vim

1 directory, 2 files

其中:

代码语言:javascript
复制
~ % cat .vim/indent/javascript.vim
setlocal formatprg=js-beautify
let g:testvar_js="js testvar"
let g:testvar="testvar defined in javascript.vim"

代码语言:javascript
复制
~ % 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缓冲区,并使用一些命令进行测试:

代码语言:javascript
复制
: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

因此,我的问题是:

  • 我犯了什么愚蠢的错误吗?
  • 如果不是,那么这是一个有意的设计,一个bug,还是vim与此完全无关?
  • 在编辑html文件时,是否有一种方法可以使html.vim上的vim仅为源?

一些可能有用的补充信息:

  • 我正在使用vim 8.2,macOS arm64,使用Terminal.app
  • Neovim表现出了同样的行为,实际上这就是我第一次注意到它的地方。
  • 这种行为不发生在ftplugin/,只有indent/
  • javascript文件不受indent/html.vim影响:在indent/html.vim中定义的变量都是在javascript缓冲区中未定义的
  • html文件的formatprg总是处于打开状态,不管该html文件中是否有javascript代码片段或<script>标记。
  • 在编辑html时,根本不涉及indent/css.vim --我已经测试过了
  • ../lib/node_modules/js-beautify/js/bin/js-beautify.js js-beautifyhtml-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-美化->->

如果你想让我做一些额外的测试或者需要更多的信息,就喊一声。

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-23 16:27:25

下面是一个非常有效的HTML示例:

代码语言:javascript
复制
<!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,下面是应对这种行为负责的片段:

代码语言:javascript
复制
if !exists('*GetJavascriptIndent')
  runtime! indent/javascript.vim
endif

注意,$VIMRUNTIME/indent/html.vim的维护人员为javascript选择了外部路由,为css选择了内部路由。也许是因为$VIMRUNTIME/indent/css.vim不符合要求?我不知道,坦白说,我觉得这不重要。

现在,让我们来看看你的错误,…

  • 特定于文件类型的脚本(缩进、语法、ftplugins)按以下顺序提供:
代码语言:javascript
复制
1. `~/.vim/indent/<filetype>.vim`,
2. `$VIMRUNTIME/indent/<filetype>.vim`
3. `~/.vim/after/indent/<filetype>.vim`

如果您不是很小心,您在早期脚本中放置的内容可能会在后面的脚本来源时被覆盖。因此,将您自己的东西放在after/下的脚本中就更有意义了。

  • 下面的行在缩进脚本中没有什么可做的: setlocal formatprg=js-美化setlocal formatprg=html-美化 它们应该在ftplugins中: “后/ftplugin/javascript.vim setlocal formatprg=js-美化”后/ftplugin/html.vim setlocal formatprg=html-美化

所以…

我犯了什么愚蠢的错误吗?

是的,见上文。

如果不是,那么这是一个有意的设计,一个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,因此必须为javascripthtml文件类型分别设置formatprg

ANd,这是你的第一个错误所在。

下面是从$VIMRUNTIME/indent/javascript.vim中获取$VIMRUNTIME/indent/html.vim的代码片段

代码语言:javascript
复制
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}/中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72350973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档