Neovim对LaTeX文件的语法高亮设置

近期为我的 Neovim 配置了 Ai 功能,但是发现每次打开 LaTeX 文件会有报错,同时语法高亮了会出现问题。今天经过研究发现是 nvim-treesitter 升级后导致了的兼容性问题,具体请参考:https://github.com/nvim-treesitter/nvim-treesitter, 其官方 README.md中说明:

[!CAUTION] This is a full, incompatible, rewrite: Treat this as a different plugin you need to set up from scratch following the instructions below. If you can't or don't want to update, specify the master branch (which is locked but will remain available for backward compatibility with Nvim 0.11).

新版 nvim-treesitter 的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#! /usr/bin/env lua
vim.api.nvim_create_autocmd("FileType",{
pattern = "tex",
callback = function()
-- 配置F4打开模板
vim.api.nvim_set_keymap("n", "<F4>", ":TTemplate<CR>", {noremap = true, silent = true})
-- 配置pdflatex编译,原vim-latex中使用\ll 默认 xelatex 编译, 注意使用%:t:r 截取文件名
vim.api.nvim_set_keymap("n", "<F6>", [[<cmd>!pdflatex % ; bibtex %:t:r.aux ; pdflatex % ; pdflatex % <CR>]], {noremap = true, silent = true})
vim.api.nvim_set_keymap("n", "<F8>", [[<cmd>!xelatex % ; bibtex %:t:r.aux ; xelatex % ; xelatex % <CR>]], {noremap = true, silent = true})
-- 配置F10编译多合一文件时,以当前目录名为主文件,以节省时间
vim.api.nvim_set_keymap("n", "<F10>", [[<cmd>!xelatex $(echo $PWD|awk -F"/" '{print $NF}').tex <CR>]], {noremap = true, silent = true})
end
})
vim.api.nvim_create_autocmd('FileType', {
pattern = 'tex',
callback = function(args)
-- 尝试停止可能存在的旧 Tree-sitter 实例(可选,更保险)
pcall(vim.treesitter.stop, args.buf)
-- 为当前 buffer 启动 Tree-sitter 解析器和高亮
vim.treesitter.start(args.buf, 'latex')
-- 关键步骤:显式关闭 Vim 原生的正则表达式高亮,避免冲突
vim.bo[args.buf].syntax = 'OFF'
end,
})
-- neovim将Shift+F5映射为F17,Shift+F7 映射为F19
vim.api.nvim_set_keymap('n', '<F17>' , '<S-F5>', { })
vim.api.nvim_set_keymap('i', '<F17>' , '<S-F5>', { })
vim.api.nvim_set_keymap('n', '<F19>' , '<S-F7>', { })
vim.api.nvim_set_keymap('i', '<F19>' , '<S-F7>', { })
-- set for vim-latex/latex-suit:winaltkeys
vim.g['Tex_Menus'] = 0
vim.g['Tex_Flavor'] = 'latex'
-- vim.g['Tex_IgnoreLevel'] = 8
-- vim.g['Tex_GotoError'] = 0
vim.g['Tex_DefaultTargetFormat'] = 'pdf'
-- 配置默认编译引擎为 xelatex
vim.g['Tex_CompileRule_pdf'] = 'xelatex -synctex=1 -interaction=nonstopmode -file-line-error-style $*'
-- 获取桌面环境,并根据桌面环境选择默认的PDF阅读器
if os.getenv("DESKTOP_SESSION") == "plasma" then
vim.g['Tex_ViewRule_pdf'] = 'okular'
else
vim.g['Tex_ViewRule_pdf'] = 'papers'
end
-- 控制统计过程中的警告信息
-- vim.g['TCLevel'] = 5
vim.g['Tex_IgnoredWarnings'] = [[
LaTeX Font Warning:
LaTeX Warning:
Warning:
Overfull
]]
vim.g['Tex_IgnoreLevel'] = 4
vim.g['Tex_GotoError'] = 0
-- 配置自定义模板路径
vim.g['Tex_CustomTemplateDirectory'] = "~/.latex-templates/"
-- 取消自动缩进
vim.g['tex_indent_items'] = 0
-- 开启Alt键
vim.g['Tex_AdvancedMath'] = 1
vim.api.nvim_set_option('winaltkeys','no')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#! /usr/bin/env lua
require('nvim-treesitter').setup {
-- 确保语法成功安装
ensure_installed = {"bash","python","markdown","latex","vim", "lua", "html", "ssh_config", "yaml", "css", "javascript", "typescript", "c", "cpp","fortran", "haskell", "perl", "json5", "rust", "go" },
-- 启用代码高亮
highlight = {
enable = true,
},
--启用增量选择
incremental_selection = {
enable = true,
keymaps = {
init_selection = '<CR>',
node_incremental = '<CR>',
node_decremental = '<BS>',
scope_incremental = '<TAB>'
}
},
-- 启用基于 Treesitter 的代码格式化(=)
indent = {
enable = true
},
}
-- 开启代码折叠
vim.wo.foldmethod = 'expr'
vim.wo.foldexpr = 'nvim_treesitter#foldexpr()'
-- 默认不折叠
vim.wo.foldlevel = 99

旧版 nvim-treesitter 的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#! /usr/bin/env lua
--绑定快捷键
vim.api.nvim_create_autocmd("FileType",{
pattern = "tex",
callback = function()
-- 配置F4打开模板
vim.api.nvim_set_keymap("n", "<F4>", ":TTemplate<CR>", {noremap = true, silent = true})
-- 配置pdflatex编译,原vim-latex中使用\ll 默认 xelatex 编译, 注意使用%:t:r 截取文件名
vim.api.nvim_set_keymap("n", "<F6>", [[<cmd>!pdflatex % ; bibtex %:t:r.aux ; pdflatex % ; pdflatex % <CR>]], {noremap = true, silent = true})
vim.api.nvim_set_keymap("n", "<F8>", [[<cmd>!xelatex % ; bibtex %:t:r.aux ; xelatex % ; xelatex % <CR>]], {noremap = true, silent = true})
-- 配置F10编译多合一文件时,以当前目录名为主文件,以节省时间
vim.api.nvim_set_keymap("n", "<F10>", [[<cmd>!xelatex $(echo $PWD|awk -F"/" '{print $NF}').tex <CR>]], {noremap = true, silent = true})
end
})
-- 开启treesitter提供的语法高亮
vim.api.nvim_create_autocmd( 'FileType', { pattern = 'tex',
callback = function(args)
vim.treesitter.start(args.buf, 'latex')
vim.bo[args.buf].syntax = 'on' -- only if additional legacy syntax is needed
end
})
-- neovim将Shift+F5映射为F17,Shift+F7 映射为F19
vim.api.nvim_set_keymap('n', '<F17>' , '<S-F5>', { })
vim.api.nvim_set_keymap('i', '<F17>' , '<S-F5>', { })
vim.api.nvim_set_keymap('n', '<F19>' , '<S-F7>', { })
vim.api.nvim_set_keymap('i', '<F19>' , '<S-F7>', { })
-- set for vim-latex/latex-suit:winaltkeys
vim.g['Tex_Menus'] = 0
vim.g['Tex_Flavor'] = 'latex'
-- vim.g['Tex_IgnoreLevel'] = 8
-- vim.g['Tex_GotoError'] = 0
vim.g['Tex_DefaultTargetFormat'] = 'pdf'
-- 配置默认编译引擎为 xelatex
vim.g['Tex_CompileRule_pdf'] = 'xelatex -synctex=1 -interaction=nonstopmode -file-line-error-style $*'
-- 获取桌面环境,并根据桌面环境选择默认的PDF阅读器
if os.getenv("DESKTOP_SESSION") == "plasma" then
vim.g['Tex_ViewRule_pdf'] = 'okular'
else
vim.g['Tex_ViewRule_pdf'] = 'papers'
end
-- 控制统计过程中的警告信息
-- vim.g['TCLevel'] = 5
vim.g['Tex_IgnoredWarnings'] = [[
LaTeX Font Warning:
LaTeX Warning:
Warning:
Overfull
]]
vim.g['Tex_IgnoreLevel'] = 4
vim.g['Tex_GotoError'] = 0
-- 配置自定义模板路径
vim.g['Tex_CustomTemplateDirectory'] = "~/.latex-templates/"
-- 取消自动缩进
vim.g['tex_indent_items'] = 0
-- 开启Alt键
vim.g['Tex_AdvancedMath'] = 1
vim.api.nvim_set_option('winaltkeys','no')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#! /usr/bin/env lua
for _, config in pairs(require("nvim-treesitter.parsers").get_parser_configs()) do
config.install_info.url = config.install_info.url:gsub("git@github.com:", "something else")
end
require('nvim-treesitter.configs').setup({
-- 支持的语言
ensure_installed = {"bash","python","markdown","latex","vim", "lua", "html", "ssh_config", "yaml", "css", "javascript", "typescript", "c", "cpp","fortran", "haskell", "perl", "json5", "rust", "go" },
-- 启用代码高亮
highlight = {
enable = true,
-- additional_vim_regex_highlighting = true,
disable = { "latex" },
additional_vim_regex_highlighting = { "latex", "markdown" },
},
--启用增量选择
incremental_selection = {
enable = true,
keymaps = {
init_selection = '<CR>',
node_incremental = '<CR>',
node_decremental = '<BS>',
scope_incremental = '<TAB>'
}
},
-- 启用基于 Treesitter 的代码格式化(=)
indent = {
enable = true
},
})
-- 开启代码折叠
vim.wo.foldmethod = 'expr'
vim.wo.foldexpr = 'nvim_treesitter#foldexpr()'
-- 默认不折叠
vim.wo.foldlevel = 99