语言服务器
djlint --lsp 通过 stdio 将 djLint 作为语言服务器运行。它会持续运行,因此编辑器可以在输入时获得检查结果,并且格式化文档时无需每次启动新进程。
它报告检查结果并格式化整个文档,不需要额外的软件包。
无论使用哪种编辑器,都请把 djLint 安装在编辑器能找到的位置,最好是项目的虚拟环境中,并从该环境启动编辑器,或让编辑器指向该环境中的 djlint。这样编辑器运行的就是项目固定的版本,结果与 pre-commit 钩子或 CI 一致。
Visual Studio Code
安装 djLint 扩展,或者在 VSCodium 中使用 Open VSX 上的版本。它会在你的环境中查找 djLint,找不到时使用内置版本,并在你的 djLint 支持时使用语言服务器。
Neovim
在 Neovim 0.11 或更高版本中:
vim.lsp.config("djlint", {
cmd = { "djlint", "--lsp" },
filetypes = { "html", "htmldjango", "jinja", "jinja.html", "handlebars", "liquid", "gotmpl" },
root_markers = { "pyproject.toml", "djlint.toml", ".djlint.toml", ".djlintrc", ".git" },
})
vim.lsp.enable("djlint")
要格式化文档,请调用 vim.lsp.buf.format()。
要在保存时格式化,请在同一配置中添加:
vim.api.nvim_create_autocmd("BufWritePre", {
pattern = {
"*.html", "*.jinja", "*.jinja2", "*.j2",
"*.hbs", "*.handlebars", "*.liquid", "*.gotmpl",
},
callback = function(args)
vim.lsp.buf.format({ bufnr = args.buf, name = "djlint" })
end,
})
Zed
安装 djLint 扩展。
Helix
在 languages.toml 中:
[language-server.djlint]
command = "djlint"
args = ["--lsp"]
[[language]]
name = "html"
language-servers = ["djlint", "vscode-html-language-server"]
JetBrains IDE
在 PyCharm 和其他基于 IntelliJ 的 IDE 中,使用免费的 LSP4IJ 插件:
- 从 Marketplace 安装 LSP4IJ。
- 打开 LSP Consoles 工具窗口,添加新的语言服务器。
- 在 Server 选项卡中,将名称设为
djLint,命令设为djlint --lsp;如果djlint不在 PATH 中,请使用项目虚拟环境中的完整路径。 - 在 Mappings 选项卡中,为模板添加文件名模式,例如
*.html。对于 Django 项目,将语言 ID 设为htmldjango,以便选择正确的配置。 - 在 Configuration 选项卡中,可以用 JSON 在
djlint键下填写设置。
检查结果会显示在编辑器中,Reformat Code 也可以对这些文件使用服务器。
Sublime Text
安装 LSP 包后,运行 Preferences: LSP Server Configurations 并添加:
{
"djlint": {
"enabled": true,
"command": ["djlint", "--lsp"],
"selector": "text.html"
}
}
Emacs
使用 Emacs 29 及更高版本自带的 Eglot:
(with-eval-after-load 'eglot
(add-to-list 'eglot-server-programs
'((html-mode web-mode) . ("djlint" "--lsp"))))
然后在模板中运行 M-x eglot。eglot-format-buffer 用于格式化。
设置
服务器像命令行一样读取项目的配置,从每个文件所在的文件夹向上查找。编辑器的设置优先于它,但与命令行一样,只能开启选项或设置值:false 不会关闭项目已开启的选项。设置名称与命令行选项相同,可使用下划线或 camelCase,逗号分隔的值可以写成列表:
vim.lsp.config("djlint", {
settings = { djlint = { profile = "django", ignore = { "H013", "H016" } } },
})
服务器通过 workspace/configuration 请求 djlint 部分。无法响应的编辑器可以在 initializationOptions 中发送相同的键。
有两个设置没有对应的命令行选项:
use_editor_indentation:使用编辑器的制表符大小而不是indent进行格式化。python_rules:设为false时跳过带有python_module的自定义规则,这样不会运行项目中的代码。
如果两处都没有设置 profile,则由文档的语言决定:例如 htmldjango 使用 django 配置。
工作方式
- 检查结果会在输入短暂停顿后到达。支持拉取诊断的编辑器会主动请求,其他编辑器则由服务器推送。
exclude、extend_exclude和use_gitignore对打开的文档生效。被排除的文档没有检查结果,也不会被格式化。- 如果编辑器支持监视文件,服务器会在
pyproject.toml、djlint.toml、.djlint.toml、.djlintrc、.djlint_rules.yaml、.editorconfig或.gitignore变化时重新加载配置;否则在打开或保存文档时重新加载。修改自定义规则的python_module代码后需要重启。 - 服务器一次只做一件事,因此较慢的规则会延迟后续操作。