首页 > 其他分享 >从零开始配置 Neovim(Nvim)

从零开始配置 Neovim(Nvim)

时间:2024-01-28 21:57:53浏览次数:24  
标签:Neovim -- vim lua 从零开始 Nvim nvim cmp

版本信息

我使用的是 Macbook pro M2Pro 版本,系统版本为 macOS 14.1。我的 Nvim 版本信息如下

$ nvim --version
NVIM v0.9.5
Build type: Release
LuaJIT 2.1.1703358377

     系统 vimrc 文件: "$VIM/sysinit.vim"
         $VIM 预设值: "/opt/homebrew/Cellar/neovim/0.9.5/share/nvim"

Run :checkhealth for more info

为什么选择 Neovim

在使用 Vim 一年多之后,我越发觉得 Vim 的配置麻烦,启动加载速度也不尽人意。我也很不喜欢 Vimscript 的写法,这导致我决定使用 Neovim(Nvim)。我决定重新配置 Nvim。为什么会想要重新配置而不是迁移配置呢?因为我想顺便趁着这个机会,重新审视我本来 Vim 的配置,以及将本来用到的的插件替换为现在的 SOTA(State-of-the-art)。我自从看完 MIT 的 Missing semester 的课配置了 ~/.vimrc 之后就很长时间都没有再编辑 ~/.vimrc 文件了

我认为在配置 Nvim 的时候弄清楚每一个选项的意思是很有必要的,因此我在这篇博客中会尽量解释清楚每个选项的含义,同时将解释放在注释里面,即我尽量让我自己的配置文件是 self-contained 而且可读性强的

当然,这难免有疏漏。别忘了我们永远可以在 Nvim 里面输入 :h <name> 来看到更为详细的解释

该篇博客假定你对 Vim 有基本了解

Nvim 配置基础知识

Lua 语言

在配置 Nvim 的时候,我会 尽可能 使用 Lua 语言编写配置文件,因此你有必要了解一下 Lua 的基本语法和语义。可以快速浏览一下 Learn Lua in Y minutes 了解大概

配置文件路径

Nvim 的配置目录在 ~/.config/nvim 下。在 Linux or macOS 系统上,Nvim 会默认读取 ~/.config/nvim/init.lua 文件,理论上来说可以将所有配置的东西全部放在此文件中,但这样不是一个好的做法,因此需要划分不同的目录分管不同的配置

首先看下按照本篇教程 Nvim 之后,目录结构看起来会是怎么样的 ↓

nvim
├── init.lua
└── lua
    ├── colorscheme.lua
    ├── config
    │   └── nvim-cmp.lua
    ├── keymaps.lua
    ├── lsp.lua
    ├── options.lua
    └── plugins.lua

解释如下:

  • init.lua 为 Nvim 配置的 Entry point,我们主要用来导入其他 *.lua 文件
    • colorscheme.lua 配置主题
    • keymaps.lua 配置按键映射
    • lsp.lua 配置 LSP
    • options.lua 配置选项
    • plugins.lua 配置插件
  • config 用于存放各种插件自身的配置,文件名为插件的名字,这样比较好找。这里的 nvim-cmp.lua 就是 nvim-cmp 插件的配置文件
  • lua 目录。当我们在 Lua 里面调用 require 加载模块(文件)的时候,它会自动在 lua 文件夹里面进行搜索
    • 将路径分隔符从 / 替换为 .,然后去掉 .lua 后缀就得到了 require 的参数格式
    • 比如要导入上面的 nvim-cmp.lua 文件,可以用 require('config.nvim-cmp')

选项配置

主要用到的就是 vim.gvim.optvim.cmd 等,我制造了一个快速参照对比的表格

In Vim In Nvim Note
let g:foo = bar vim.g.foo = bar
set foo = bar vim.opt.foo = bar set foo = vim.opt.foo = true
some_vimscript vim.cmd(some_vimscript)

按键配置

在 Nvim 里面进行按键绑定的语法如下,具体的解释可以看 :h vim.keymap.set

vim.keymap.set(<mode>, <key>, <action>, <opts>)

从零开始配置 Nvim

在阅读了前面一些配置基础之后,现在我们可以从头开始,由简到易一步步配置 Nvim 了

安装 Nvim

我是使用 macOS,用 Brew 命令安装即可

brew install neovim
# or in Manjaro Linux

在安装完成之后,如果 ~/.config/nvim 目录不存在,创建目录并新建 init.lua 文件

$ mkdir ~/.config/nvim
$ mkdir ~/.config/nvim/lua
$ touch ~/.config/nvim/init.lua

配置文件编辑保存之后,重启 Nvim 就能看到效果,后面默认每次小章节配置完成后就重启,或者执行生效命令::source %

选项配置

选项配置功能一览:

  • 默认采用系统剪贴板,同时支持鼠标操控 Nvim
  • Tab 和空格的换算
  • UI 界面
  • “智能”搜索

新建 ~/.config/nvim/lua/options.lua 文件并加入如下内容⬇️

-- Hint: use `:h <option>` to figure out the meaning if needed
vim.opt.clipboard = 'unnamedplus' -- use system clipboard
vim.opt.completeopt = { 'menu', 'menuone', 'noselect' }
vim.opt.mouse = 'a' -- allow the mouse to be used in Nvim

-- Tab
vim.opt.tabstop = 4 -- number of visual spaces per TAB
vim.opt.softtabstop = 4 -- number of spacesin tab when editing
vim.opt.shiftwidth = 4 -- insert 4 spaces on a tab
vim.opt.expandtab = true -- tabs are spaces, mainly because of python

-- UI config
vim.opt.number = true -- show absolute number
vim.opt.relativenumber = true -- add numbers to each line on the left side
vim.opt.cursorline = true -- highlight cursor line underneath the cursor horizontally
vim.opt.splitbelow = true -- open new vertical split bottom
vim.opt.splitright = true -- open new horizontal splits right
-- vim.opt.termguicolors = true        -- enabl 24-bit RGB color in the TUI
vim.opt.showmode = false -- we are experienced, wo don't need the "-- INSERT --" mode hint

-- Searching
vim.opt.incsearch = true -- search as characters are entered
vim.opt.hlsearch = false -- do not highlight matches
vim.opt.ignorecase = true -- ignore case in searches by default
vim.opt.smartcase = true -- but make it case sensitive if an uppercase is entered

然后打开 init.lua,用 require 导入刚才写的 options.lua 文件

require('options')

按键配置

按键功能一览:

  • 用 <C-h/j/k/l> 快速在多窗口之间移动光标
  • 用 Ctrl + 方向键进行窗口大小的调整
  • 选择模式下可以一直用 Tab 或者 Shift-Tab 改变缩进

新建 ~/.config/nvim/lua/keymaps.lua 文件并放入如下内容⬇️

-- define common options
local opts = {
    noremap = true,      -- non-recursive
    silent = true,       -- do not show message
}

-----------------
-- Normal mode --
-----------------

-- Hint: see `:h vim.map.set()`
-- Better window navigation
vim.keymap.set('n', '<C-h>', '<C-w>h', opts)
vim.keymap.set('n', '<C-j>', '<C-w>j', opts)
vim.keymap.set('n', '<C-k>', '<C-w>k', opts)
vim.keymap.set('n', '<C-l>', '<C-w>l', opts)

-- Resize with arrows
-- delta: 2 lines
vim.keymap.set('n', '<C-Up>', ':resize -2<CR>', opts)
vim.keymap.set('n', '<C-Down>', ':resize +2<CR>', opts)
vim.keymap.set('n', '<C-Left>', ':vertical resize -2<CR>', opts)
vim.keymap.set('n', '<C-Right>', ':vertical resize +2<CR>', opts)

-----------------
-- Visual mode --
-----------------

-- Hint: start visual mode with the same area as the previous area and the same mode
vim.keymap.set('v', '<', '<gv', opts)
vim.keymap.set('v', '>', '>gv', opts)

然后在 init.lua 文件里面再次加上一行导入这个文件

...
require('keymaps')

... 表示我们省略了其他部分的代码(为了节省博客的篇幅)

安装插件管理器

一个强大的 Nvim 离不开插件的支持。我选用的是当下最为流行,而且完全用 Lua 语言编写的 Packer.nvim。它支持如下许多特性:

  • 支持配置第三方插件的依赖
  • 支持 Lazy loading
  • 支持设置插件安装之后的钩子函数

后续考虑切换到 Lazy.vim 进行插件管理

在 Packer.nvim 配置里面指定第三方插件很简单,用 use ... 即可

新建 ~/.config/nvim/lua/plugins.lua 文件并放入如下内容。下面的模板只完成了 Packer.vim 自身的安装,还没有指定其他第三方插件。这个模板的功能主要是

  1. 初次启动的时候自动安装 Packer.nvim
  2. 当我们保存对这个文件(plugins.lua)文件的修改的时候,Packer.nvim 会自动帮我们自动更新插件和帮我们做好配置。你可以看到Nvim 右边看到多了一个窗口显示进度

标签:Neovim,--,vim,lua,从零开始,Nvim,nvim,cmp
From: https://www.cnblogs.com/RioTian/p/17993485

相关文章

  • 45从零开始用Rust编写nginx,静态文件服务器竟然还有这些细节
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,websocket代理,反向代理,静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透等,力争打造和nginx的性能。项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmproxy静态文件服务器静态......
  • 25从零开始用Rust编写nginx,序列化之serde是如何工作的
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmproxy序......
  • 从零开始搭建Go语言开发环境
    从零开始搭建Go语言开发环境–雨林霖(yuyulinlin.cn)    ......
  • 从零开始知识蒸馏(自用版)
    一、什么是知识蒸馏,为什么要使用知识蒸馏?知识蒸馏是一种将预先训练的教师网络的知识转移到学生网络的方法,使小型网络可以在网络部署阶段取代大型教师网络。知识蒸馏的概念最初是由Hinton等人提出的,已广泛应用于各个领域和任务。知识蒸馏的基本原理是通过训练一个更小、更轻量级的......
  • 44从零开始用Rust编写nginx,命令行参数的设计与解析及说明
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/......
  • 从零开始:直播电商APP开发全流程解析
    本篇文章,小编将从零开始,全面解析直播电商APP的开发流程,涵盖了关键的技术要点和开发阶段的关键步骤。 第一阶段:需求分析与规划此阶段的关键任务包括:1.用户需求调研2.功能规划3.技术选型第二阶段:设计与原型设计阶段是将需求转化为可执行计划的关键环节。在这一阶段,团队需要完成以下......
  • 【从零开始重学Java】第13天 Java网络功能
    前情提示从零开始重学Java第0天从零开始重学Java第1天Java概述从零开始重学Java第2天标识符和数据类型从零开始重学Java第3天表达式和流程控制语句从零开始重学Java第4天数组、向量和字符串从零开始重学Java第5天对象和类从零开始重学Java第6天异常从零开始......
  • NVIM 配置
    大部分代码来自https://martinlwx.github.io/zh-cn/config-neovim-from-scratch/。预先安装gitclangnvim与windowsterminal。找好nerdfont。在Appdata/Local/nvim/下新建以下结构。│init.lua│├─lua││colorscheme.lua││keymaps.lua││l......
  • 机器视觉 - YoloV8 是采用预训练还是从零开始训练的模型
    关于Fine-tuning和预训练和fromscratch训练yolo命令行model的参数的说明既可以选择yolov8n.pt,也可以选择yolov8n.yaml,区别是:model=yolov8n.pt,即为Fine-tuning训练,yolov8n.pt模型文件已经包含了yolov8网络结构、超参数、训练参数、权重参数信息,它是官方的pre......
  • 从零开始的源码搭建:详解连锁餐饮行业中的点餐小程序开发
    时下,点餐小程序成为了许多餐饮企业引入的一种创新工具,不仅方便了顾客的用餐体验,同时也提高了餐厅的运营效率。本文将详细探讨如何从零开始搭建一个源码,并深入解析连锁餐饮行业中的点餐小程序开发过程。 一、需求分析与规划在开始源码搭建之前,首先需要明确点餐小程序的具体需求。这......