玉树州wap网站建设公司,做试玩网站,网站 筛选功能,网站平台建设做好公司宣传文章目录 前言#xff08;劝退#xff09;neovim 安装neovim 配置配置文件位置第一个 hello world 代码拆分 neovim 配置正式配置 neovim基础配置自定义键位Lazy 插件管理器配置tokyonight 插件配置BufferLine 插件配置自动补全括号 / 引号 插件配置 前言#xff08;劝退劝退neovim 安装neovim 配置配置文件位置第一个 hello world 代码拆分 neovim 配置正式配置 neovim基础配置自定义键位Lazy 插件管理器配置tokyonight 插件配置BufferLine 插件配置自动补全括号 / 引号 插件配置 前言劝退
neovim 是一个现代化高扩展的 vim 编辑器 fork 版本适合程序员打造极致高效的开发环境。
在正式开始 neovim 配置之前我还是要劝退一下的。
很多人说使用 neovim 的都是变成高手但我认为能搞明白 neovim 一定是高手居多但不一定都是顶尖的大牛但起码技术一定不差也正因如此很多人使用使用 neovim 单纯是因为脑子一热导致最后不仅耽误了手头的工作还啥都没学会。要学习neovim建议先把 vim 的操作搞熟悉可以全程使用 vim 的语法做出一个完整的项目注意我说的只是语法而 vim 学习的曲线前期有点难度导致很多人也挂在了第一关所以
如果你编程能力不足那么请不要碰 vim / neovim 等任何需要大量自定义的编辑器。IDEA / VsCode 就够了。如果你对 折腾 这件事没有太大兴趣那么请不要碰 vim / neovim 等任何需要大量自定义的编辑器。IDEA / VsCode 就够了。虽然也有现成的 LazyVim但是我不建议这样做原因后面会讲。
neovim 安装
1github 上搜索 neovim在 Releases 中找到一个最近发的稳定版https://github.com/neovim/neovim/releases下载 安装一路 next 即可。
2打开终端输入 nvim test.txt 可以正常打开文本编辑器即表示安装成功 neovim 配置
配置文件位置
neovim 会在启动时加载 init.lua 文件当我们修改了配置文件之后重启 neovim 即可生效虽然也可以通过 :so 实现但是配置复杂了之后就不好用了
1init.lua 文件的位置在哪以下路径和lua文件如果不存在需要手动创建
Windows~/AppData/Local/nvim/init.lua~ 表示 C:\Users\${你的用户名}\Unix~/.config/nvim/init.lua
2你也打开终端输入 nvim 打开 neovim 编辑器然后输入 :vim.fn.stdpath(config) 来查看配置文件位置.
: 表示 vim 中的命令模式 表示执行 lua 代码并输出结果当然你也可以通过 :lua 执行代码但是不会有任何输出结果vim.fn.stdpath(config) 表示答应配置文件的完整路径
输出结果如下 第一个 hello world 代码
1通过 nvim init.lua 编辑配置文件如下 2保存退出后输入 nvim 重新打开 neovim可以看到左下角的显示如下图表示配置生效。 拆分 neovim 配置
随着我们的配置不断增多全写到一个 init.lua 文件中肯定是不利于维护的因此我们将配置拆分成多个模块。
一个通用的做法如下
1在 init.lua 的同级目录下创建 lua 文件夹然后再 lua 文件夹下创建 module.lua 文件文件内容输入print(hello world)为了验证后续正确引入。 2那么就可以在 init.lua 中使用 require(module) 引入 module.lua 文件。
在 neovim 中打开文件的命令是:e filename因此在通过 nvim 创建 module.lua 之后直接可以通过 e: ./init.lua 打开 init.lua 文件 Pse 表示 edit编辑的意思。 在 init.lua 中使用 require(“module”)如下 3保存退出后再打开 nvim可以看到左下角 hello world 打印正常表示上述操作步骤正确。 Ps这里只是简单认识一下怎么拆分模块后续的操作步骤中会把上面演示的 module.lua 删掉包括 init.lua 中 require 也删掉开始正式配置 neovim。 正式配置 neovim
基础配置
1这里我习惯将基础配置放到 ~/AppData/Local/nvim/lua/core/basic.lua 中。 同样记得在 init.lua 中引入这个文件如下 2nvim 打开 basic.lua配置如下
-- 显示行号
vim.opt.number true
-- 相对行号
vim.opt.relativenumber true-- 高亮当前光标所在行
vim.opt.cursorline true-- 将 tab 水平制表符转化成空格
vim.opt.expandtab true
-- tab 长度设置成4个空格
vim.opt.tabstop 4
-- shiftwidth 设置成0可以避免换行后回车带来的 tab 长度不一致问题
vim.opt.shiftwidth 0-- 当 neovim 中打开的文件被其他程序修改了(例如idea)neovim 会自动加载
vim.opt.autoread truePswin 终端通过 cat 读取 lua 文件会中文乱码可以通过 Get-Content .\lua\core\basic.lua -Encoding utf8 来查看. 自定义键位
1这里先说一下neovim 向下是兼容通过 vimscript 配置自定义键位的但是我们既然使用 neovim还是建议使用 lua 进行统一化配置。
2自定义键位的 apivim.keymap.set(mode, lhs, rhs, opts)
mode快捷键生效的模式. 不同模式用一个字母表示例如 n 表示普通模式、i 表示插入模式、c 表示命令模式…可以是 字符单一模式生效例如n表示在普通模式下生效或者是 table多模式生效例如{n, i}表示在普通模式和插入模式下都生效 lhs表示要改哪个键位. 如果是普通键位就直接写了.但如果要改 Ctrl a就要写成 C-a但如果要改 Alt a就要写成 A-a rhs表示要改成什么样子可以映射另一组按键或者一个 lua 函数opts是一个 table包含了对快捷键一些额外的配置
3案例一
vim.keymap.set(n, C-a, :lua print(hello world)CR, { silent true })在 normal 模式下生效.按下 Ctrl a 后会打印 hello world其中 CR 表示回车silent true 表示让快捷键 “静默执行”不显示执行过程中的命令或提示信息
演示如下 然后按下 Ctrl a 效果如下 4案例二如果想让快捷键在 插入模式 下也生效.
错误的写法如下有坑
vim.keymap.set({n, i}, C-a, :lua print(hello world)CR, { silent true })真的可以这样么思考一下因为我们在插入模式下直接按下 C-a他会替换成 :lua print(hello world)CR相当于直接把这段话直接写下来了模拟键盘输入:lua print(hello world)CR 的场景如下 正确的写法如下
vim.keymap.set({n, i}, C-a, Cmdlua print(hello world)CR, { silent true })Cmd 并不是一个具体的按键只表示进入命令模式。
此时你在 insert模式 按下 Ctrl a 虽然是正确的但是看不到效果因为在默认 neovim 会在右下加固定显示你当前的模式不过你也可以通过 :lua vim.opt.showmode false 关闭他然后在 insert 模式下按下 Ctrl a 就可以看到效果了
5rhs 也可以是一个函数例如如下
vim.keymap.set(n, C-a, function ()print(hello world)
end, { silent true})这里写的是 lua 中的匿名函数使用 end 表示结尾
6 leader key
可以理解成在配置中定义了一个叫做 leader 的变量实现复用效果。
例如如下设置 leader key 为 空格当我在 normal 模式下按下 空格 a a就会打印 cyk 字符串。
vim.g.mapleader
vim.keymap.set(n, leaderaa, :lua print(cyk)CR, { silent true})7正式配置创建 ~/AppData/Local/nvim/lua/core/keymap.lua 文件如下这里是我自己习惯的
vim.keymap.set(i, jk, esc, { silent true })vim.keymap.set(n, L, $, {silent true})
vim.keymap.set(v, L, $, {silent true})vim.keymap.set(n, H, ^, {silent true})
vim.keymap.set(v, H, ^, {silent true})最后在 init.lua 中引入如下
require(core.keymap)Lazy 插件管理器配置
1neovim 的插件一般都需要从 github 上手动 clone 并在 neovim 中引用。但是随着插件的逐渐增多这种方式会变得非常繁琐这就需要使用插件管理器来自动化这个过程。我使用 lazy 插件管理器进行配置。
lazy.nvim 是 Neovim 的一款现代插件管理器主打的是懒加载理念只有当我使用某个插件时才加载他从而极大的提升启动性能。
lazy.nvim 会读取 ~/AppData/Local/nvim/plugins/ 目录下的所有 lua 插件配置文件。常见的写法如下
return {插件名, -- 如 nvim-treesitter/nvim-treesittername 别名, -- 可选为插件指定别名event VeryLazy, -- 懒加载触发时机支持多种事件cmd 命令名, -- 使用命令时加载ft lua, -- 打开某种文件类型时加载keys {...}, -- 使用某些快捷键时加载opts {...}, -- 插件的配置直接传入插件的 setup 或 optsconfig function() ... end, -- 更复杂的配置dependencies {...}, -- 插件依赖
}
每项具体如何编写会在后续的使用中讲到。
2首先需要安装 git 和 nerd font。git 就不多说了这里主要讲一下 nerd fonthttps://www.nerdfonts.com/font-downloads Ps如果不安装字体将来很多符号无法显示。 这里建议使用 JetBrainsMono Nerd Font 下载后解压到你常用的目录即可。
3在 neovim 配置中自动安装和加载插件管理器逻辑。
创建 ~/AppData/Local/nvim/lua/core/lazy.lua 文件内容如下
-- 构造 lazy.nvim 的安装路径
-- vim.fn.stdpath(data) 表示返回 neovim 的数据目录例如 win 是 ~/AppData/Local/nvim-datalinux/mac 是 ~/.local/share/nvim
-- .. 是 lua 用来拼接字符串的
-- win 最后拼接成 ~/AppData/Local/nvim-data/lazy/lazy.nvim
local lazypath vim.fn.stdpath(data) .. /lazy/lazy.nvim-- 如果 lazypath 不存在lazy.nvim 未安装就执行内部逻辑
if not vim.uv.fs_stat(lazypath) then-- 把 lazy.nvim 下载到 lazypath 目录vim.fn.system({git,clone,--filterblob:none,https://github.com/folke/lazy.nvim.git,--branchstable,lazypath})
end-- 把 lazy.nvim 加入到 neovim 的运行时路径(runtimepath)的最前面
-- 这样才能使用 require(lazy) 正确加载插件管理器
-- 此处的 : 表示 lua 中的方法调用(表示传入一个方法)
vim.opt.rtp:prepend(lazypath)-- 加载 lazy.nvim 插件管理器并调用 setup 函数
-- 传入 {} 空表表示还没有配置任何插件后续可以加
require(lazy).setup({})保存后记得在 init.lua 中引入如下
require(core.lazy)保存退出后重新打开 neovim你会发现卡住了这是因为正在执行刚刚写的命令neovim 是单线程的会阻塞主线程。
4打开 neovim然后输入 “:Lazy”就可以看到一个面板如下 例如按下 Shift p 就可以看到插件的一些启动时的性能情况 面板上其他选项的介绍
Install用来安装插件的相当于运行 :Lazy install 只安装在 lazy.nvim 中声明的并且还没有下载的插件。不会更新已有的插件Update更新插件相当于运行 :Lazy Update他会执行 git pull 来拉取所有插件的最新版本Sync同步插件状态安装缺失的插件 更新已安装的插件 清理不在配置中的插件 构建插件相当于执行 :Lazy sync通常用来保证插件和配置完全一致Clean清理插件相当于执行 :Lazy clean用来删除配置中不再引用的插件Check检查插件状态相当于执行 :Lazy check用来删除配置中不再引用的插件Log查看插件管理器中日志的输出主要调试用的Restore恢复快照从 snapshot 文件中恢复插件状态回滚版本需要提前使用 Lazy snapshot 创建快照Profile性能分析分析各个插件加载时的性能情况Debug调试 lazy.nvim 插件管理器的自身行为会打开一个窗口输出插件加载时的详细信息哪些插件怎么加载的、懒加载生效情况、报错信息、路径、加载顺序等适合在插件不工作配置失效、性能分析时使用
tokyonight 插件配置
1如下配置会让 neovim 自动读取 lua/plugins 目录下的文件用来对插件进行配置。
require(lazy).setup({spec {{ import plugins }}
})然后创建 ~/AppData/Local/nvim/lua/plugins 文件夹之后在这个此目录下每配置一个插件就是一个 lua 文件这种写法看起来直观。
此时使用 nvim 可能会报错不过不用管这是因为 plugins 目录下还没有任何插件。
2安装 tokyonight 主题
创建 ~/AppData/Local/nvim/lua/plugins/tokyonight.lua 文件内容如下从 tokyonight 的 github 上就可以看到怎么配置
return {-- 这里写主题的 github 链接-- 但是由于插件基本都来自github因此 lazy 会自动补全前缀 https://github.com/因此插件的前缀就不用写了folke/tokyonight.nvim
}保存退出后重新打开就可以看到 lazy 就直接开始帮我们安装了然后输入 :colorscheme tokyonight 回车后就可以看到效果了 3如果我们再重新打开 neovim 的时候就会发现还需要继续手动让主题生效为了解决这个问题可以重写 tokyonight 的 config 项如下
return {-- 这里写主题的 github 链接-- 但是由于插件基本都来自github因此 lazy 会自动补全前缀 https://github.com/因此插件的前缀就不用写了folke/tokyonight.nvim,-- 可以通过此配置项更换成 tokyonight 的浅色主题opts {style day},-- 下面的 config 本来是 lazy 默认配置好的但是为了能在插件启动时自定义一些东西(比如启动时就加载好主题)可以重写此配置-- 这个方法的第一个参数几乎用不上opts 就是上一个配置项config function (_, opts)require(tokyonight).setup(opts) -- 这一步是 lazy 给我们自动配置好的这里再写一遍主要是因为我们自己手动重写了此函数vim.cmd(colorscheme tokyonight) -- 执行这个命令end
}Ps大多数情况是不用手动编写 config 的除非在 lazy 默认加载之外还有些别的操作。 4这里你可能会有一个疑问为什么一定要把加载主题的配置写到 config 中而不写外部去加载
因为切换主题这个命令必须要在插件加载完成之后才能执行。
例如如下我这样写就是会报 “找不到主题的错误”。 原因lazy.nvim 是异步懒加载插件的读取所有的插件完之后再统一加载而 vim.cmd(colorscheme tokyonight) 这行代码在 tokyonight 插件真正被加载之前就被执行了所以就会报错 E185: Cannot find color scheme tokyonight
BufferLine 插件配置
默认情况下所有的 buffer 都是隐藏的通过使用 bufferline 插件可以使所有的 buffer 以类似浏览器标签页的方式呈现在页面的最上方。
1首先创建 ~/AppData/Local/nvim/lua/plugins/bufferline.lua 文件内容如下
return {akinsho/bufferline.nvim,-- 此插件必须手动指定一下 opts 才会进行 setupopts {}
}2使用 neovim 随便打开一个文件例如 nvim aaa 打开文件 aaa就可以看到效果如下:
再使用 e bbb 编辑一个新文件 bbb都是可以看到 tab 的 3可以通过 :BufferLineCyclePrev 前往上一个 tab使用 :BufferLineCyclePrev 前往下一个 tab… 但是这样太麻烦了
但是我们使用的使 neovim 啊用的就是的自定义当然这里还有一种更强的自定方式就是直接在插件上配置 keys 来自定义键位例如如下我这样配置主要是为了减少和 IDEA 相关操作迁移的成本
return {akinsho/bufferline.nvim,-- 此插件必须手动指定一下 opts 才会进行 setupopts {},keys {{ leaderbn, :BufferLineCycleNextCR, silent true },{ leaderbo, :BufferLineCloseOthersCR, silent true },{ leaderbp, :BufferLineCyclePrevCR, silent true },{ leaderbd, :bdeleteCR, silent true },{ leaderbh, :BufferLinePickCR, silent true },},
}Pskeys 中配置的键位默认就是在 normal 模式中生效不用手动指定 mode 4此处重新打开 nvim 会发现 tab 不见了这里涉及到一个高级特性就是 懒加载实际上我们配置了 keys 他的实际含义是开启懒加载只有在按下自定义 keys 中的键位时开始加载。
为什么要会这样设计呢因为 neovim 在启动时会加载所有插件一旦插件变多了neovim 的打开速度会越来越慢因此就设计成在 neovim 启动后进入主页用不上的插件就先不加载只有用到这个插件的时候再加载。而 keys 就是启动懒加载开关的其中之一还有的后续会讲到
当然对于 bufferline 显示 tab 这种在启动后就会用到的我们还是希望他不要懒加载因此可以手动设置 lazy 属性为 false如下
return {akinsho/bufferline.nvim,-- 此插件必须手动指定一下 opts 才会进行 setupopts {},keys {{ leaderbn, :BufferLineCycleNextCR, silent true },{ leaderbo, :BufferLineCloseOthersCR, silent true },{ leaderbp, :BufferLineCyclePrevCR, silent true },{ leaderbd, :bdeleteCR, silent true },{ leaderbh, :BufferLinePickCR, silent true },},lazy false
}5目前的 bufferline 配置出来还是有点丑的因为 icon 图标因此这里还需要一个插件给 tab 显示小图标。
但是由于这个插件只是辅助于 bufferline 的因此没有必要单独在 plugins 下创建一个 lua 文件可以通过 lazy 提供的 dependencies 属性实现如下
return {akinsho/bufferline.nvim,dependencies {nvim-tree/nvim-web-devicons},-- 此插件必须手动指定一下 opts 才会进行 setupopts {},keys {{ leaderbn, :BufferLineCycleNextCR, silent true },{ leaderbo, :BufferLineCloseOthersCR, silent true },{ leaderbp, :BufferLineCyclePrevCR, silent true },{ leaderbd, :bdeleteCR, silent true },{ leaderbh, :BufferLinePickCR, silent true },},lazy false
}保存后重新进入效果如下 自动补全括号 / 引号 插件配置
这个见名思意输入 {自动补全 }其他的也同理。
如果删除 { 也会自动把配对的 } 删除其他也同理。
这时候我们可以思考一个关于优化的问题这个插件在 neovim 启动的时候真的需要加载么么并不需要因为他不涉及 ui 的渲染并且 normal 模式下也不会用到因此我们希望他进入 insert 模式下才需要使用到此时就可以使用 event 属性进行懒加载如下
return {windwp/nvim-autopairs,event InsertEnter, -- 仅在 insert 模式才加载此插件opts {}
}1那么重新进入 neovim并输入 :Lazy 可以看到 nvim-autopairs 并没有被加载。 2当进入 insert 的模式之后再查看就加载了说明懒加载配置成功。 Ps有的插件可以懒加载但是是在 normal 模式下就使用的然而已进入 neovim 就是 normal 模式类似这种你不清楚什么时候进行懒加载的情况就可以配置成 event VeryLazy这也是 lazy 插件管理器提供的一种方式。