Neovim 从Vimscript向Lua的迁移

Neovim 从Vimscript向Lua的迁移

近几年发现Neovim的许多插件都在向Lua迁移
前段时间看到了几个插件想去试试结果发现都是需要Lua支持的(笑
索性决定从Vimscript迁移到Lua
期间遇到了很多问题
索性写了这一篇Blog记录一下

文件结构

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
nvim
├── init.lua
├── lazy-lock.json
├── lua
│   ├── config
│   │   ├── autocmds.lua
│   │   ├── keymaps.lua
│   │   ├── lazy.lua
│   │   └── options.lua
│   └── plugins
│   ├── auto-save.lua
│   ├── bufferline.lua
│   ├── dashboard-nvim.lua
│   ├── flash.lua
│   ├── gitsigns.lua
│   ├── glance.lua
│   ├── indent-blankline.lua
│   ├── lspkind-nvim.lua
│   ├── lspsaga.lua
│   ├── lsp-status.lua
│   ├── lualine-lsp-progress.lua
│   ├── lualine.lua
│   ├── luasnip.lua
│   ├── markdown-preview.lua
│   ├── mason-lspconfig.lua
│   ├── mason.lua
│   ├── modes.lua
│   ├── nocie.lua
│   ├── nvim-autopairs.lua
│   ├── nvim-cmp.lua
│   ├── nvim-colorizer.lua
│   ├── nvim-drawer.lua
│   ├── nvim-lspconfig.lua
│   ├── nvim-tree.lua
│   ├── nvim-treesitter.lua
│   ├── nvim-web-devicons.lua
│   ├── sentiment.lua
│   ├── smoothcursor.lua
│   ├── tokyonight.lua
│   └── which-key.lua
└── README.md

4 directories, 37 files

也欢迎clone我的nvim配置使用
planetarium1001/nvim

Config

Neovim使用Lua依赖init.lua文件,该文件位于~/.config/nvim/下面
init.lua不与以往的init.vim
语法发生了一些变化,以往使用set设置一些内容
在lua中需要使用vim.opt等参数设置
为了使得init.lua更加清晰简单,我选择在专门的目录写配置文件
而不是都写在init.lua
所以init.lua文件中的内容就变成了如下:

1
2
3
4
require("config.lazy")
require("config.keymaps")
require("config.autocmds")
require("config.options")

其中config.xxxx在这里指的是文件位于~/nvim/lua/config/xxx
这里采用Lazy.nvim作为插件管理
部分基础快捷键配置写在lua/config/keymaps.lua
启动时默认光标位于上一次编辑文件位置,用lua/config/autocmds.lua实现
原先在Vimscript中用set配置的一些基础设置移动到了lua/config/options.lua

这样的文件结构让我感觉会舒服一点(?)

Lazy.lua

Lazy.nvim的设置直接参考的Lazy.nvim的Github

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
-- Bootstrap lazy.nvim
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
if vim.v.shell_error ~= 0 then
vim.api.nvim_echo({
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" },
{ out, "WarningMsg" },
{ "\nPress any key to exit..." },
}, true, {})
vim.fn.getchar()
os.exit(1)
end
end
vim.opt.rtp:prepend(lazypath)

-- Make sure to setup `mapleader` and `maplocalleader` before
-- loading lazy.nvim so that mappings are correct.
-- This is also a good place to setup other settings (vim.opt)
vim.g.mapleader = " "
vim.g.maplocalleader = "\\"

-- Setup lazy.nvim
require("lazy").setup({
spec = {
-- import your plugins
{ import = "plugins" },
},
-- Configure any other settings here. See the documentation for more details.
-- colorscheme that will be used when installing plugins.
install = { colorscheme = { "habamax" } },
-- automatically check for plugin updates
checker = { enabled = true },
})

其中{ import = “plugins” }的目的是引入lua/plugins目录下的lua文件
用于插件管理
其余就没有再调整Lazy.nvim的配置了,都采用默认的了

Keymaps

由于习惯使用大写的H J K L快速转跳
所以第一件事就是定义了H J K L的快捷键

1
2
3
4
5
vim.keymap.set("", "H", "10h")
vim.keymap.set("", "J", "10j")
vim.keymap.set("", "K", "10k")
vim.keymap.set("", "L", "10l")

使用H J K L代替10h 10j 10k 10l
在Normal模式下面快速调整光标位置

再就是没找到开关Nvim-Tree的api,只好在Keymaps单独定义了一个快捷键用于打开Nvim-Tree

1
vim.keymap.set("", "<C-t>", ":silent NvimTreeToggle<CR>")

autocmds.lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
return {
vim.api.nvim_create_autocmd('BufReadPost', {
pattern = { '*' },
callback = function()
local line_index = vim.fn.line("'\"")
local max_line = vim.fn.line('$')

if line_index > 1 and line_index <= max_line then
vim.api.nvim_exec("normal! g'\"", false)
end
end,
})
}

在网上抄来的代码(
可以在启动Neovim的时候自动恢复到上一次编辑文件的位置
init.lua中引入就可以使用了
以前在Vim的时候就喜欢这个功能
我感觉还挺方便的(?)

options.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
vim.opt.relativenumber = true
vim.opt.number = true
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.softtabstop = 4
vim.opt.smartindent = true
vim.opt.termguicolors = true
vim.opt.scrolloff = 10
vim.opt.sidescrolloff = 5
vim.opt.expandtab = true
vim.opt.wildmenu = true
vim.opt.ignorecase = true
vim.opt.spell = true
vim.opt.spelllang = { 'en', 'cjk' }
vim.opt.list = true
vim.opt.autoread = true
vim.opt.exrc = true
vim.opt.splitbelow = true
vim.opt.hlsearch = true
vim.opt.incsearch = true
vim.opt.showcmd = true
vim.opt.et = true
vim.opt.clipboard = "unnamed"
vim.opt.shortmess = atI
vim.wo.cursorline = true
vim.wo.signcolumn = "yes"
vim.o.expandtab = true
vim.bo.expandtab = true
vim.o.autoindent = true
vim.bo.autoindent = true
vim.o.smartindent = true
vim.o.ignorecase = true
vim.o.smartcase = true
vim.o.incsearch = true
vim.o.autoread = true
vim.bo.autoread = true
vim.opt.listchars = { trail = "·", precedes = "←", extends = "→" }
-- vim.scriptencoding = "utf-8"

主要设置了

  • 相对行号的显示
  • Tab缩进使用4个空格
  • 屏幕上下端预览预留10行
  • ·符号代替空格显示
    其余的都大差不差,好像没什么特别需要说明的(?)
    除了最后的UTF-8的问题,因为使用了强制使用UTF-8会导致有些文件的字符显示出现问题
    索性就直接放弃了(
    暂时没有发现有什么特别影响使用的地方

plugins

lua/plugins文件夹下面我放入了一些插件配置文件
使用Lazy.nvim可以通过{ "import plugins" }来让其管理plugins文件夹下面所有的插件配置文件
我觉得单独丢到一个文件夹按照插件名字作为文件名管理会比全部写在Lazy.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
auto-save.lua
bufferline.lua
dashboard-nvim.lua
flash.lua
gitsigns.lua
glance.lua
indent-blankline.lua
lsp-status.lua
lspkind-nvim.lua
lspsaga.lua
lualine-lsp-progress.lua
lualine.lua
luasnip.lua
markdown-preview.lua
mason-lspconfig.lua
mason.lua
modes.lua
nocie.lua
nvim-autopairs.lua
nvim-cmp.lua
nvim-colorizer.lua
nvim-drawer.lua
nvim-lspconfig.lua
nvim-tree.lua
nvim-treesitter.lua
nvim-web-devicons.lua
sentiment.lua
smoothcursor.lua
tokyonight.lua
which-key.lua

目前就使用了这一些插件

其中对于代码提示和自动补全采用的是LSPcmp
以前使用的coc.nvim
Neovim最近的几个版本中已经把LSP内置了
但是配置起来有些麻烦,折腾了好几天都无功而返
前几天突然看见一个项目lsp-zero.nvim
用这个项目确实很快速方便的配置好了一个基础的LSP和’cmp’
有些进一步的配置,比如使用Tab键跳转补全内容,使用Enter键选择补全内容的设置在他的文档里面都有提到
只需要无脑的复制粘贴就行了(笑
其他的一些设置,比如一些符号标注的设置可以去nvim-lspconfignvim-cmp的文档里面找,然后丢进去
其他的插件更多的是对于Neovim的美化
比如主题tokonight,提示和Neovim cmd的美化noice等等之类的

lsp-zero.nvim

无论怎么样我在对于nvim-lspconfignvim-cmp的配置踩了很多坑
花了三四天都没有装好,所以决定在这里把我的配置经历写下来
或许是这篇文章最有价值的地方(?)

如果你对于下述内容没有自己操作的把握或者想直接抄作业,我会把我的完整配置放在这部分的最后
然后标明我修改的部分,可以自行修改使用

鉴于nvim-lspconfignvim-cmp的Github配置文档比较复杂而且我没有太看懂(
所以我直接选择了用lsp-zero.nvim

首先先使用包管理安装lsp-zero.nvim
这里建议直接参照lsp-zero.nvim的官方文档Getting-Started
Installing中有提到几种主流包管理的安装方式
这里我用的是Lazy.nvim,为了后续的进一步配置,我用的是他给的Advance config安装的代码
在这里面他有提供两种针对LSP服务管理的不同配置代码
因为可以使用mason.nvim更加方便且可视的管理LSP服务
所以我使用了automatic setup of LSP servers的代码

按照文档安装
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
return {
{
'williamboman/mason.nvim',
lazy = false,
opts = {},
},

-- Autocompletion
{
'hrsh7th/nvim-cmp',
event = 'InsertEnter',
config = function()
local cmp = require('cmp')

cmp.setup({
sources = {
{name = 'nvim_lsp'},
},
mapping = cmp.mapping.preset.insert({
['<C-Space>'] = cmp.mapping.complete(),
['<C-u>'] = cmp.mapping.scroll_docs(-4),
['<C-d>'] = cmp.mapping.scroll_docs(4),
}),
snippet = {
expand = function(args)
vim.snippet.expand(args.body)
end,
},
})
end
},

-- LSP
{
'neovim/nvim-lspconfig',
cmd = {'LspInfo', 'LspInstall', 'LspStart'},
event = {'BufReadPre', 'BufNewFile'},
dependencies = {
{'hrsh7th/cmp-nvim-lsp'},
{'williamboman/mason.nvim'},
{'williamboman/mason-lspconfig.nvim'},
},
init = function()
-- Reserve a space in the gutter
-- This will avoid an annoying layout shift in the screen
vim.opt.signcolumn = 'yes'
end,
config = function()
local lsp_defaults = require('lspconfig').util.default_config

-- Add cmp_nvim_lsp capabilities settings to lspconfig
-- This should be executed before you configure any language server
lsp_defaults.capabilities = vim.tbl_deep_extend(
'force',
lsp_defaults.capabilities,
require('cmp_nvim_lsp').default_capabilities()
)

-- LspAttach is where you enable features that only work
-- if there is a language server active in the file
vim.api.nvim_create_autocmd('LspAttach', {
desc = 'LSP actions',
callback = function(event)
local opts = {buffer = event.buf}

vim.keymap.set('n', 'K', '<cmd>lua vim.lsp.buf.hover()<cr>', opts)
vim.keymap.set('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<cr>', opts)
vim.keymap.set('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<cr>', opts)
vim.keymap.set('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<cr>', opts)
vim.keymap.set('n', 'go', '<cmd>lua vim.lsp.buf.type_definition()<cr>', opts)
vim.keymap.set('n', 'gr', '<cmd>lua vim.lsp.buf.references()<cr>', opts)
vim.keymap.set('n', 'gs', '<cmd>lua vim.lsp.buf.signature_help()<cr>', opts)
vim.keymap.set('n', '<F2>', '<cmd>lua vim.lsp.buf.rename()<cr>', opts)
vim.keymap.set({'n', 'x'}, '<F3>', '<cmd>lua vim.lsp.buf.format({async = true})<cr>', opts)
vim.keymap.set('n', '<F4>', '<cmd>lua vim.lsp.buf.code_action()<cr>', opts)
end,
})

require('mason-lspconfig').setup({
ensure_installed = {},
handlers = {
-- this first function is the "default handler"
-- it applies to every language server without a "custom handler"
function(server_name)
require('lspconfig')[server_name].setup({})
end,
}
})
end
}
}

由于我是在Lazy.nvim中直接导入一个文件夹的全部文件分别管理插件的
所以需要在官方给的这部分代码前面补上一个return
此外由于我使用K来快速移动光标,所以需要将vim.keymap.set('n', 'K', '<cmd>lua vim.lsp.buf.hover()<cr>', opts)中的K修改为其他按键
其中的快捷键和部分配置按照个人续修进行修改就行

到这里通过运行Lazy自动安装之后我们就拥有的最基础的LSPcmp功能
但是显然这些是不够用的

首先给mason.nvim加一些Nerdfont用来方便查看LSP服务的状态

1
2
3
4
5
6
7
8
ui = {
icons = {
package_installed = "✓",
package_pending = "➜",
package_uninstalled = "✗"
}
}

将上述内容丢入require('mason').setup({})函数中
这样就可以在mason界面显示这些Nerdfont符号

然后修改cmp配置
加入关于TabEnter键的支持
这里需要LuaSnip提供Super Tab的支持
安装方法直接参照他的文档也可以
或者在plugins文件夹下面新建一个luaship.lua文件,加上以下内容

1
2
3
4
5
6
7
return {
"L3MON4D3/LuaSnip",
-- follow latest release.
version = "v2.*", -- Replace <CurrentMajor> by the latest released major (first number of latest release)
-- install jsregexp (optional!).
build = "make install_jsregexp"
}

当然你也可以用普通的Tab
具体的文档可以在官方文档的这里找到
普通Tab

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- Simple tab complete
['<Tab>'] = cmp.mapping(function(fallback)
local col = vim.fn.col('.') - 1

if cmp.visible() then
cmp.select_next_item({behavior = 'select'})
elseif col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') then
fallback()
else
cmp.complete()
end
end, {'i', 's'}),

-- Go to previous item
['<S-Tab>'] = cmp.mapping.select_prev_item({behavior = 'select'}),

Super Tab

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
-- Super tab
['<Tab>'] = cmp.mapping(function(fallback)
local luasnip = require('luasnip')
local col = vim.fn.col('.') - 1

if cmp.visible() then
cmp.select_next_item({behavior = 'select'})
elseif luasnip.expand_or_locally_jumpable() then
luasnip.expand_or_jump()
elseif col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') then
fallback()
else
cmp.complete()
end
end, {'i', 's'}),

-- Super shift tab
['<S-Tab>'] = cmp.mapping(function(fallback)
local luasnip = require('luasnip')

if cmp.visible() then
cmp.select_prev_item({behavior = 'select'})
elseif luasnip.locally_jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, {'i', 's'}),

普通Tab和超级Tab二选一就可以了
Enter

1
['<CR>'] = cmp.mapping.confirm({select = false}),

这些内容丢进cmp.setup()函数的mapping = mapping.preset.insert()里面就可以了

现在拥有了基础的按键配置就可以正常使用这些功能了

下面贴出我的配置文件

我的配置

plugins/nvim-lspconfig.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
return {
-- LSP
{
'neovim/nvim-lspconfig',
cmd = {'LspInfo', 'LspInstall', 'LspStart'},
event = {'BufReadPre', 'BufNewFile'},
dependencies = {
{'hrsh7th/cmp-nvim-lsp'},
{'williamboman/mason.nvim'},
{'williamboman/mason-lspconfig.nvim'},
},
init = function()
-- Reserve a space in the gutter
-- This will avoid an annoying layout shift in the screen
vim.opt.signcolumn = 'yes'
end,
config = function()
local lsp_defaults = require('lspconfig').util.default_config

-- Add cmp_nvim_lsp capabilities settings to lspconfig
-- This should be executed before you configure any language server
lsp_defaults.capabilities = vim.tbl_deep_extend(
'force',
lsp_defaults.capabilities,
require('cmp_nvim_lsp').default_capabilities()
)

-- LspAttach is where you enable features that only work
-- if there is a language server active in the file
vim.api.nvim_create_autocmd('LspAttach', {
desc = 'LSP actions',
callback = function(event)
local opts = {buffer = event.buf}

vim.keymap.set('n', 'gk', '<cmd>lua vim.lsp.buf.hover()<cr>', opts)
vim.keymap.set('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<cr>', opts)
vim.keymap.set('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<cr>', opts)
vim.keymap.set('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<cr>', opts)
vim.keymap.set('n', 'go', '<cmd>lua vim.lsp.buf.type_definition()<cr>', opts)
vim.keymap.set('n', 'gr', '<cmd>lua vim.lsp.buf.references()<cr>', opts)
vim.keymap.set('n', 'gs', '<cmd>lua vim.lsp.buf.signature_help()<cr>', opts)
vim.keymap.set('n', '<F2>', '<cmd>lua vim.lsp.buf.rename()<cr>', opts)
vim.keymap.set({'n', 'x'}, '<F3>', '<cmd>lua vim.lsp.buf.format({async = true})<cr>', opts)
vim.keymap.set('n', '<F4>', '<cmd>lua vim.lsp.buf.code_action()<cr>', opts)
end,
})

require('mason-lspconfig').setup({
ensure_installed = {},
handlers = {
-- this first function is the "default handler"
-- it applies to every language server without a "custom handler"
function(server_name)
require('lspconfig')[server_name].setup({})
end,
}
})
local signs = {
{ name = "DiagnosticSignError", text = "" },
{ name = "DiagnosticSignWarn", text = "" },
{ name = "DiagnosticSignHint", text = "" },
{ name = "DiagnosticSignInfo", text = "" },
}

for _, sign in ipairs(signs) do
vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = "" })
end

-- set the style of lsp info
local config = {
-- disable virtual text
-- the message show after the current line.
virtual_text = false,
-- show signs
signs = {
active = signs,
},
update_in_insert = true,
underline = true,
severity_sort = true,
float = {
focusable = false,
style = "minimal",
border = "rounded",
source = "always",
header = "",
prefix = "",
},
}

vim.diagnostic.config(config)

-- set the popup window border
vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {
border = "rounded",
})

vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, {
border = "rounded",
})

end
}
}

plugins/mason.lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
return{
'williamboman/mason.nvim',
lazy = false,
opts = {},
config = function ()
require('mason').setup({
ui = {
icons = {
package_installed = "✓",
package_pending = "➜",
package_uninstalled = "✗"
}
}
})

end
}

plugins/mason-lspconfig.lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
return {
"williamboman/mason-lspconfig.nvim",
dependenice = {
"williamboman/mason.nvim",
"neovim/nvim-lspconfig",
},
config = function()
require('mason-lspconfig').setup({
-- Replace the language servers listed here
-- with the ones you want to install
ensure_installed = {'lua_ls', 'rust_analyzer', 'pylsp'},
handlers = {
function(server_name)
require('lspconfig')[server_name].setup({})
end,
},
})

end
}

plugins/nvim-cmp.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
-- Autocompletion
return {
'hrsh7th/nvim-cmp',
event = { 'InsertEnter', 'CmdlineEnter' },
dependencies = {
'neovim/nvim-lspconfig',
'hrsh7th/cmp-nvim-lsp',
'hrsh7th/cmp-buffer',
'hrsh7th/cmp-path',
'hrsh7th/cmp-cmdline',
'hrsh7th/nvim-cmp',
},
config = function()
local cmp = require('cmp')

cmp.setup({
sources = {
{name = 'nvim_lsp'},
{name = 'buffer'},
{name = 'path'},
{name = 'cmdline'}
},

snippet = {
expand = function(args)
-- vim.snippet.expand(args.body)
require('luasnip').lsp_expand(args.body)
end,
},

mapping = cmp.mapping.preset.insert({
['<C-Space>'] = cmp.mapping.complete(),
['<C-u>'] = cmp.mapping.scroll_docs(-4),
['<C-d>'] = cmp.mapping.scroll_docs(4),
['<CR>'] = cmp.mapping.confirm({select = false}),
-- ['<Tab>'] = cmp.mapping.select_next_item({select = false}),
-- ['<S-Tab>'] = cmp.mapping.select_prev_item({select = false}),
-- Super tab
['<Tab>'] = cmp.mapping(function(fallback)
local luasnip = require('luasnip')
local col = vim.fn.col('.') - 1

if cmp.visible() then
cmp.select_next_item({behavior = 'select'})
elseif luasnip.expand_or_locally_jumpable() then
luasnip.expand_or_jump()
elseif col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') then
fallback()
else
cmp.complete()
end
end, {'i', 's'}),

-- Super shift tab
['<S-Tab>'] = cmp.mapping(function(fallback)
local luasnip = require('luasnip')

if cmp.visible() then
cmp.select_prev_item({behavior = 'select'})
elseif luasnip.locally_jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, {'i', 's'}),

}),

formatting = {
fields = {'abbr', 'kind', 'menu'},
format = require('lspkind').cmp_format({
mode = 'symbol_text', -- show only symbol annotations
maxwidth = 50, -- prevent the popup from showing more than provided characters
ellipsis_char = '...', -- when popup menu exceed maxwidth, the truncated part would show ellipsis_char instead
})
},

window = {
completion = cmp.config.window.bordered(),
documentation = cmp.config.window.bordered(),
},

})
end
}

luaship.lua

1
2
3
4
5
6
7
return {
"L3MON4D3/LuaSnip",
-- follow latest release.
version = "v2.*", -- Replace <CurrentMajor> by the latest released major (first number of latest release)
-- install jsregexp (optional!).
build = "make install_jsregexp"
}

其中我替换了一个快捷键
LSP中的K因为我和Keymaps的配置冲突,将其换成了gk
除此之外使用了Super TabEnter来选择自动补全项


Neovim 从Vimscript向Lua的迁移
http://planetarium1001.github.io/2024/11/17/2024-11-17_19:30:40_Neovim_从Vimscript向Lua的迁移/
Author
Planetarium
Posted on
November 17, 2024
Licensed under