Neovim实现完全lua配置

使用Neovim近三年了,最初对于lua并不是很熟悉,同时插件管理器也从packerlazy.nvim切换了一次,这两者的配置也不是完全相同,所以适应了一段时间。今天将我自己的主机搬到办公室后决定再次研究一下这个完全配置,完全实现lua配置,进一步提升性能。

关闭启动时的介绍信息

在使用vimscript配置init.vim文件中使用的命令为:

1
set shortmess+=I

切换为lua配置init.lua文件后,使用命令配置选项(Options)为:

1
vim.opt.shortmess:append({ I = true })

Fcitx5的中英文自动切换

参考:Fcitx5-Arch Wiki, 使用vimscript配置为

~/.config/nvim/init.vim
1
2
3
let fcitx5state=system("fcitx5-remote")
autocmd InsertLeave * :silent let fcitx5state=system("fcitx5-remote")[0] | silent !fcitx5-remote -c " Disable the input method when exiting insert mode and save the state
autocmd InsertEnter * :silent if fcitx5state == 2 | call system("fcitx5-remote -o") | endif

但是在Neovim中更推荐强大的插件fcitx.nvim或者参考neovimcraft-Fcitx.nvim

使用fcitx.nvim后,输入法自动切换的问题以纯lua更加高效强大的实现。

Lua 的版本问题

Neovim的插件依赖lua5.1版本,以前没有去关注这个信息,现在予以处理。Archlinux系统中lua4个版本:lua(Lua5.4), lua53(Lua 5.3), lua52(Lua 5.2)和lua51(Lua5.1), 因此直接安装lua51

1
sudo pacman -S lua51

关键配置文件

~/.config/nvim/init.lua
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
require("lazy-init")
-- 基础设置
require('lsp/base')
-- 配置主题
-- require('theme/catppuccin')
require('theme/tokyonight')
-- 状态栏主题
require('theme/lualine')
-- require('theme/evil_lualine')
-- require('theme/bubbles_lualine')
-- require('theme/slanted-gaps_lualine')
-- require('lsp/keybindings')
-- 编程语言配置
require('lsp/python')
require('lsp/mason')
require('lsp/shell')
require('lsp/texlab')
-- Packer 插件管理
require('plg/cmp')
require('plg/vim-latex')
require('plg/vim-template')
require('plg/nvim-comment')
require('plg/nvim-tree')
require('plg/lspkind')
-- require('plg/indent-blankline')
require('plg/hlchunk')
require('plg/rainbow-delimiters')
require('plg/vista')
-- require('plg/telescope')
require('plg/treesitter')
require('plg/gitsigns')
~/.config/nvim/lua/lsp/base.lua
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

-- 设置文件编码格式为 utf-8
vim.g.encoding = "utf-8"
-- 设置文件格式转换
vim.o.fileencodings = "utf-8,gbk,big5,cp936,gb18030,euc-jp,euc-kr,latin1,ucs-bom,ucs "
-- 设置终端编码格式为 utf-8, neovim 已经移除,不再开启
-- vim.o.termencoding = "utf-8"
-- 开启语法高亮
vim.o.syntax = "enable"
-- 显示相对行号
vim.o.relativenumber = true
-- 显示行号
vim.o.number = true
-- 高亮所在行
vim.o.cursorline = true
-- 自动换行
vim.o.wrap = true
-- 显示光标位置
vim.o.ruler = true
-- 边输入边搜索
vim.o.incsearch = true
-- 开启搜索匹配高亮
vim.o.hlsearch = true
-- 搜索时自行判断是否需要忽略大小写
vim.o.smartcase = true

-- tab键转换为 4 个空格
vim.o.tabstop = 4
vim.o.softtabstop = 4
vim.o.shiftwidth = 4
-- 新行对齐当前行,tab转换为空格
vim.o.expandtab = true
vim.bo.expandtab = true
vim.o.autoindent = true
vim.bo.autoindent = true
vim.o.smartindent = true

-- << >> 缩进时移动的长度
vim.o.shiftwidth = 4
vim.bo.shiftwidth = 4

-- 使用jk移动光标时,上下方保留8行
vim.o.scrolloff = 8
vim.o.sidescrolloff = 8

-- 设置自动折叠
vim.o.smartindent = true
-- 历史命令最多保存1000条
vim.o.history = 1000
-- 显示空白字符
vim.o.list = true
-- 样式
vim.o.background = "dark"
vim.o.termguicolors = true
vim.opt.termguicolors = true
-- 关闭错误提示,参考:https://neovim.io/doc/user/diagnostic.html
vim.diagnostic.config({ virtual_text = false })
vim.g.loaded_ruby_provider = 0
vim.opt.shortmess:append({ I = true })
~/.config/nvim/lua/lazy-init.lua
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133

local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", -- latest stable release
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
require("lazy").setup({
git = {
-- defaults for the `Lazy log` command
-- log = { "-10" }, -- show the last 10 commits
log = { "-8" }, -- show commits from the last 3 days
timeout = 120, -- kill processes that take more than 2 minutes
url_format = "https://github.com/%s.git",
-- lazy.nvim requires git >=2.19.0. If you really want to use lazy with an older version,
-- then set the below to false. This should work, but is NOT supported and will
-- increase downloads a lot.
filter = true,
},
"neovim/nvim-lspconfig",
"williamboman/mason.nvim",
"williamboman/mason-lspconfig.nvim",
-- 借用了vim插件,因为二者是兼容的,速度上vim-latex更快
{
"vim-latex/vim-latex",
lazy = false,
},
-- { "jbyuki/nabla.nvim" },
{ "agate/vim-align" },
-- 添加latex插件vimtex
-- {
-- "lervag/vimtex",
-- lazy = false,
-- },
-- { "mhinz/neovim-remote" },
-- 添加neovim主题
{
"folke/tokyonight.nvim",
"catppuccin/nvim",
},
-- 代码高亮
{ "nvim-treesitter/nvim-treesitter", build =":TSUpdate" },
-- 状态栏主题
{
"nvim-lualine/lualine.nvim",
dependencies = { "nvim-tree/nvim-web-devicons", lazy = true },
},
-- -- nvim-cmp
'hrsh7th/cmp-nvim-lsp',
'hrsh7th/cmp-buffer' ,
'hrsh7th/cmp-path' ,
'hrsh7th/cmp-cmdline' ,
'hrsh7th/nvim-cmp',
-- vsnip
'hrsh7th/cmp-vsnip' ,
'hrsh7th/vim-vsnip' ,
'rafamadriz/friendly-snippets' ,
-- lspkind
{ "onsails/lspkind.nvim" },
-- 自动插入模板
{ "aperezdc/vim-template" },
-- 旧式片段插入程序
{ "SirVer/ultisnips" },
{ "honza/vim-snippets" },
{"tpope/vim-speeddating"},
{"tpope/vim-repeat"},
-- 注释插件
{ "terrortylor/nvim-comment" },
{ "nvim-tree/nvim-web-devicons" },
-- 目录树插件
{ "nvim-tree/nvim-tree.lua" },
-- This plugin adds indentation guides to all lines (including empty lines).
-- { "lukas-reineke/indent-blankline.nvim" },
{
"shellRaining/hlchunk.nvim",
event = { "BufReadPre", "BufNewFile" }
},
-- 彩虹括号
{ "hiphish/rainbow-delimiters.nvim" },
-- 用来显示文件结构的插件,对于编写程序查看各定义时很有帮助
{ "liuchengxu/vista.vim" },
-- 模糊查找
{
"nvim-telescope/telescope.nvim", tag = "0.1.4",
-- or , branch = '0.1.x',
dependencies = { "nvim-lua/plenary.nvim" }
},
-- 2023-12-28 02:09 新增加的插件,有待学习应用
-- {
-- "ibhagwan/fzf-lua",
-- -- optional for icon support
-- dependencies = { "nvim-tree/nvim-web-devicons" },
-- config = function()
-- -- calling `setup` is optional for customization
-- require("fzf-lua").setup({})
-- end
-- },
{
"folke/todo-comments.nvim",
dependencies = { "nvim-lua/plenary.nvim" },
opts = {
-- your configuration comes here
-- or leave it empty to use the default settings
-- refer to the configuration section below
}
},
{
"kylechui/nvim-surround",
version = "*", -- Use for stability; omit to use `main` branch for the latest features
event = "VeryLazy",
config = function()
require("nvim-surround").setup({
-- Configuration here, or leave empty to use defaults
})
end
},
{
"lewis6991/gitsigns.nvim",
},
{
"NvChad/nvim-colorizer.lua",
},
{ "micangl/cmp-vimtex" },
{ "SirVer/ultisnips" },
-- fcitx5 自动切换,这也是Archlinux wiki上推荐的方法
{ "h-hg/fcitx.nvim" },
})
~/.config/nvim/lua/plg/vim-latex.lua
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
61
62
63

#! /usr/bin/env lua
--
-- vim-latex.lua
-- Copyright (C) 2023 feng <feng@arch>
--
-- Distributed under terms of the MIT license.
--
-- vim-latex默认的局势键
-- F1 帮助菜单
-- F5 插入环境选择对话框,若在导言区将弹出插入宏包对话框
-- <S-F5> 修改环境
-- F7 插入引用选择对话框
-- <S-F7> 修改命令
--绑定快捷键
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 编译
vim.api.nvim_set_keymap("n", "<F6>", [[<cmd>!pdflatex % ; bibtex %:t:r.aux ; pdflatex % ; pdflatex % <CR>]], {noremap = true, silent = true})
-- 配置F8编译 aux辅助文件,直接根据数据库生成文献引用, 注意使用%:t:r 截取文件名
vim.api.nvim_set_keymap("n", "<F8>", [[<cmd>!bibtex %:t:r.aux <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'] = 'evince'
end
-- 控制统计过程中的警告信息
vim.g['Tex_IgnoredWarnings'] = {}
-- 配置自定义模板路径
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')
~/.config/nvim/lua/plg/vista.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /usr/bin/env lua
--
-- vista.lua
-- Copyright (C) 2023 feng <feng@archlinux>
--
-- Distributed under terms of the MIT license.
--
--绑定快捷键
vim.api.nvim_set_keymap("n", "<F3>", ":Vista!!<CR>", {noremap = true, silent = true})
vim.g['vista_icon_indent'] = {"╰─▸ ","├─▸ "}
-- vista_default_executive 可选项:ale, cod, ctags, lcn, nvim_lsp, vim_lsc, vim_lsp
vim.api.nvim_set_var('vista_default_executive', 'nvim_lsp')
vim.g['vista_fzf_preview'] = 'right:50%'
vim.api.nvim_set_var('vista#renderer#enable_icon', 1)
~/.config/nvim/lua/plg/vim-template.lua
1
2
3
4
5
6
7
8
9
10
11
12

#! /usr/bin/env lua
--
-- vim-template.lua
-- Copyright (C) 2023 feng <feng@arch>
--
-- Distributed under terms of the MIT license.
-- 设置自定义模板目录
vim.g['templates_directory'] = {'~/.vim_templates'}
vim.g['email'] = 'fengzhenhua@outlook.com'
vim.g['username'] = 'Zhen-hua Feng'
vim.g['license'] = 'MIT'

注意:github上有两个相当类似的插件aperezdc/vim-templatetibabit/vim-templates, 而前者才是我们需要的,记住千万不要下错。同时,在编写脚本时,如果需要输入作者,直接使用变量%USER%而不要使用函数自定义%AUTHOR%,仅仅一个变量,自定义太过麻烦,不提倡。 在配置变量时,可以打开nvim然后在命令行模式输入:help vim-template就可以获得全部可配置变量,在此不再记录。

除了上述列出的几个关键修改为适配lua配置的插件外,还有其他的配置,不再一一列出。如您需要其他配置,请发邮件联系本人索取。