从零开始配置Neovim
1 安装
以 Ubuntu
操作系统为例,执行一下命令安装:
apt install neovim
安装完成后,在 .config
文件夹中创建 nvim
文件夹:
mkdir -p .config/nvim
然后进入 .config/nvim
文件夹中,创建 init.lua
文件:
touch init.lua
写这篇文章的时候,我的 neovim 版本是 0.9.1
2 配置 neovim
我们采用模块化的方式来配置 neovim ,所以还需要新建一些文件夹和文件,在 nvim
文件夹中依次执行下面的命令:
mkdir lua && cd lua
mkdir core && cd core
touch options.lua
上面的命令创建了一个 options.lua
文件,在这个文件里面配置选项功能:
local opt = vim.opt
-- 行号
opt.relativenumber = true
opt.number = true
-- 缩进
opt.tabstop = 2
opt.shiftwidth = 2
opt.expandtab = true
opt.autoindent = true
-- 防止包裹
opt.wrap = false
-- 光标行
opt.cursorline = true
-- 启用鼠标
opt.mouse:append("a")
-- 系统剪切板
opt.clipboard:append("unnamedplus")
-- 默认新窗口右和下
opt.splitright = true
opt.splitbelow = true
-- 搜索 区分大小写
opt.ignorecase = true
opt.smartcase = true
-- 外观
opt.termguicolors = true
opt.signcolumn = "yes"
接下来是改键,在 options.lua
同级目录下创建文件 keymaps.lua
:
touch keymaps.lua
在 keymaps.lua
文件中配置改键:
vim.g.mapleader = " "
local keymap = vim.keymap
-- ---------- 视觉模式 ---------- --
-- 当行或多行移动
keymap.set("v", "J", ":m '>+1<CR>gv=gv")
keymap.set("v", "K", ":m '<-2<CR>gv=gv")
-- ---------- 正常模式 ---------- --
-- 窗口
keymap.set("n", "<leader>sv", "<C-w>v") -- 水平新增窗口
keymap.set("n", "<leader>sh", "<C-w>s") -- 垂直新增窗口
-- 取消高亮
keymap.set("n", "<leader>nh", ":nohl<CR>")
最后,在 init.lua
文件中写入:
require("core.options")
require("core.keymaps")
3 安装插件管理器
在 .config/nvim
文件夹中创建一个 plugins
文件夹:
mkdir ~/.config/nvim/plugins
然后创建一个 plugins-setup.lua
文件:
touch ~/.config/nvim/plugins/plugins-setup.lua
打开 packer 仓库,复制 Bootstrapping
下面的所有代码到 plugins-setup.lua
文件中
然后在 local packer_bootstrap = ensure_packer()
这行代码的下方添加一段代码,使得保存 plugins-setup.lua
文件之后能够自动同步:
-- 保存此文件自动更新安装软件
-- 注意PackerCompile改成了PackerSync
-- plugins.lua改成了plugins-setup.lua,适应本地文件名字
vim.cmd([[
augroup packer_user_config
autocmd!
autocmd BufWritePost plugins-setup.lua source <afile> | PackerSync
augroup end
]])
最后在 init.lua
文件中写入 require("plugins.plugins-setup")
:
require("plugins.plugins-setup")
require("core.options")
require("core.keymaps")
4 安装插件
4.1 主题
这里我安装的主题是 one dark pro ,可根据自己喜好安装其它主题。
首先打开 plugins-setup.lua
文件,在如下的位置添加一行代码:
use 'olimorris/onedarkpro.nvim'
修改位置及结果:
return require('packer').startup(function(use)
use 'wbthomason/packer.nvim'
use 'olimorris/onedarkpro.nvim'
if packer_bootstrap then
require('packer').sync()
end
end)
然后打开 options.lua
文件,在末尾添加一行代码:
vim.cmd("colorscheme onedark")
4.2 底部状态栏
安装的是 lualine 。
打开 plugins-setup.lua
文件,在如下的位置添加几行代码:
use {
'nvim-lualine/lualine.nvim',
requires = { 'nvim-tree/nvim-web-devicons', opt = true }
}
修改位置及结果:
return require('packer').startup(function(use)
use 'wbthomason/packer.nvim'
use 'olimorris/onedarkpro.nvim'
use {
'nvim-lualine/lualine.nvim',
requires = { 'nvim-tree/nvim-web-devicons', opt = true }
}
if packer_bootstrap then
require('packer').sync()
end
end)
在 .config/nvim/plugins
文件夹中创建 lualine.lua
文件:
require('lualine').setup({
options = {
theme = 'onedark'
}
})
在 init.lua
文件中添加一行代码 require("plugins.lualine")
:
require("plugins.plugins-setup")
require("core.options")
require("core.keymaps")
-- 插件
require("plugins.lualine")
4.3 文档树和窗口切换
安装的是 nvim-tree 和 vim-tmux-navigator 。
打开 plugins-setup.lua
文件,如上面安装插件一样,在相同的位置,新增几行代码:
use {
'nvim-tree/nvim-tree.lua',
requires = {
'nvim-tree/nvim-web-devicons', -- optional
},
}
use "christoomey/vim-tmux-navigator" -- 用ctl-hjkl来定位窗口
在 .config/nvim/plugins
文件夹中创建 nvim-tree.lua
文件:
-- 默认不开启nvim-tree
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
require("nvim-tree").setup()
在 init.lua
文件中添加一行代码 require("plugins.nvim-tree")
:
require("plugins.plugins-setup")
require("core.options")
require("core.keymaps")
-- 插件
require("plugins.lualine")
require("plugins.nvim-tree")
4.4 语法高亮和彩色括号
安装的是 nvim-treesitter 和 nvim-ts-rainbow 。
依旧是打开 plugins-setup.lua
文件,新增几行代码:
use "nvim-treesitter/nvim-treesitter" -- 语法高亮
use "p00f/nvim-ts-rainbow" -- 配合treesitter,不同括号颜色区分
在 .config/nvim/plugins
文件夹中创建 treesitter.lua
文件:
require'nvim-treesitter.configs'.setup {
-- 添加不同语言
ensure_installed = { "vim", "bash", "c", "cpp", "javascript", "json", "lua", "python", "typescript", "tsx", "css", "rust", "markdown", "markdown_inline" }, -- one of "all" or a list of languages
highlight = { enable = true },
indent = { enable = true },
-- 不同括号颜色区分
rainbow = {
enable = true,
extended_mode = true,
max_file_lines = nil,
}
}
在 init.lua
文件中添加一行代码 require("plugins/treesitter")
:
require("plugins.plugins-setup")
require("core.options")
require("core.keymaps")
-- 插件
require("plugins.lualine")
require("plugins.nvim-tree")
require("plugins/treesitter")
4.5 LSP和自动补全
照葫芦画瓢,不多赘述了,首先是 plugins-setup.lua
文件要加的代码:
use {
"williamboman/mason.nvim",
"williamboman/mason-lspconfig.nvim", -- 这个相当于mason.nvim和lspconfig的桥梁
"neovim/nvim-lspconfig"
}
-- 自动补全
use "hrsh7th/nvim-cmp"
use "hrsh7th/cmp-nvim-lsp"
use "L3MON4D3/LuaSnip" -- snippets引擎,不装这个自动补全会出问题
use "saadparwaiz1/cmp_luasnip"
use "rafamadriz/friendly-snippets"
use "hrsh7th/cmp-path" -- 文件路径
然后在 .config/nvim/plugins
文件夹中创建 lsp.lua
文件:
require("mason").setup({
ui = {
icons = {
package_installed = "✓",
package_pending = "➜",
package_uninstalled = "✗"
}
}
})
require("mason-lspconfig").setup({
-- 确保安装,根据需要填写
ensure_installed = {
"lua_ls",
},
})
local capabilities = require('cmp_nvim_lsp').default_capabilities()
require("lspconfig").lua_ls.setup {
capabilities = capabilities,
}
在 .config/nvim/plugins
文件夹中创建 cmp.lua
文件:
local cmp_status_ok, cmp = pcall(require, "cmp")
if not cmp_status_ok then
return
end
local snip_status_ok, luasnip = pcall(require, "luasnip")
if not snip_status_ok then
return
end
require("luasnip.loaders.from_vscode").lazy_load()
-- 下面会用到这个函数
local check_backspace = function()
local col = vim.fn.col "." - 1
return col == 0 or vim.fn.getline("."):sub(col, col):match "%s"
end
cmp.setup({
snippet = {
expand = function(args)
require('luasnip').lsp_expand(args.body)
end,
},
mapping = cmp.mapping.preset.insert({
['<C-b>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-e>'] = cmp.mapping.abort(), -- 取消补全,esc也可以退出
['<CR>'] = cmp.mapping.confirm({ select = true }),
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expandable() then
luasnip.expand()
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
elseif check_backspace() then
fallback()
else
fallback()
end
end, {
"i",
"s",
}),
["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, {
"i",
"s",
}),
}),
-- 这里重要
sources = cmp.config.sources({
{ name = 'nvim_lsp' },
{ name = 'luasnip' },
{ name = 'path' },
}, {
{ name = 'buffer' },
})
})
最后在 init.lua
文件中添加代码:
require("plugins/lsp")
require("plugins/cmp")
4.6 快速注释和自动补全括号
同样在 plugins-setup.lua
文件添加代码:
use "numToStr/Comment.nvim" -- gcc和gc注释
use "windwp/nvim-autopairs" -- 自动补全括号
在 .config/nvim/plugins
文件夹中创建 comment.lua
文件:
require('Comment').setup()
然后在 .config/nvim/plugins
文件夹中创建 autopairs.lua
文件:
local npairs_ok, npairs = pcall(require, "nvim-autopairs")
if not npairs_ok then
return
end
npairs.setup {
check_ts = true,
ts_config = {
lua = { "string", "source" },
javascript = { "string", "template_string" },
},
fast_wrap = {
map = '<M-e>',
chars = { '{', '[', '(', '"', "'" },
pattern = [=[[%'%"%)%>%]%)%}%,]]=],
end_key = '$',
keys = 'qwertyuiopzxcvbnmasdfghjkl',
check_comma = true,
highlight = 'Search',
highlight_grey='Comment'
},
}
-- 配置这个使得自动补全会把括号带上
local cmp_autopairs = require "nvim-autopairs.completion.cmp"
local cmp_status_ok, cmp = pcall(require, "cmp")
if not cmp_status_ok then
return
end
cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done { map_char = { tex = "" } })
在 init.lua
文件中添加代码:
require("plugins/comment")
require("plugins/autopairs")
4.7 其它一些插件
摆烂了,因为写到这儿我发现有一个开箱即用的 lunarvim ,不用这么麻烦的去配置,但是我觉得还是要写完,所以接下来的插件我将一笔带过。
安装的几个插件分别是:git提示插件、类似 VSCode 那样的打开的文件选项卡插件和文件搜索插件。
plugins-setup.lua
文件:
use "akinsho/bufferline.nvim" -- buffer分割线
use "lewis6991/gitsigns.nvim" -- 左则git提示
use {
'nvim-telescope/telescope.nvim', tag = '0.1.1', -- 文件检索
requires = { {'nvim-lua/plenary.nvim'} }
}
在 .config/nvim/plugins
文件夹中创建 bufferline.lua
文件:
vim.opt.termguicolors = true
require("bufferline").setup {
options = {
-- 使用 nvim 内置lsp
diagnostics = "nvim_lsp",
-- 左侧让出 nvim-tree 的位置
offsets = {{
filetype = "NvimTree",
text = "File Explorer",
highlight = "Directory",
text_align = "left"
}}
}
}
在 .config/nvim/plugins
文件夹中创建 gitsigns.lua
文件:
require('gitsigns').setup {
signs = {
add = { text = '+' },
change = { text = '~' },
delete = { text = '_' },
topdelete = { text = '‾' },
changedelete = { text = '~' },
},
}
在 .config/nvim/plugins
文件夹中创建 telescope.lua
文件:
local builtin = require('telescope.builtin')
-- 进入telescope页面会是插入模式,回到正常模式就可以用j和k来移动了
vim.keymap.set('n', '<leader>ff', builtin.find_files, {})
vim.keymap.set('n', '<leader>fg', builtin.live_grep, {}) -- 环境里要安装ripgrep
vim.keymap.set('n', '<leader>fb', builtin.buffers, {})
vim.keymap.set('n', '<leader>fh', builtin.help_tags, {})
最后在 init.lua
文件中添加代码:
require("plugins/bufferline")
require("plugins/gitsigns")
require("plugins/telescope")
改键:
编辑 keymaps.lua
文件,添加两行配置:
-- 切换buffer
keymap.set("n", "<C-L>", ":bnext<CR>")
keymap.set("n", "<C-H>", ":bprevious<CR>")
修改的是,切换打开的文件选项卡的快捷键,使用 ctrl
+ shift
+ h
和 ctrl
+ shift
+ l
,但是我这里试着没效果,不想搞了,摆烂。
5 写在最后
这篇文章是跟着B站up主技术蛋老师的视频【全程讲解】Neovim从零配置成属于你的个人编辑器 来写的,配置基本上都是照抄的,相当于是看着视频做了个笔记。
不过说实话,折腾下来太麻烦了 (;′⌒`) ,但是秉着写都写了的原则,还是跟着视频配置了一遍。