9

neovim入门指南(一)

 1 year ago
source link: https://youngxhui.top/2023/07/neovim-%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97-%E4%B8%80/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在编程的世界中,有两个上古神器。一个叫做 “神之编辑器 Emacs”,另一个叫做 “编辑器之神 vim”。这两个编辑器从诞生到现在,圣战从未结束。无论是 vim 还是 emacs 都在不断的进化和发展,渐渐的 vim 的分支上出现了一颗夺目的新星,他就是 neovim。

什么是 neovim

neovim 从名称来看:新星的vim。按照官方说明: nvim 是一个 vim 的 fork,主要关注了扩展性和易用性。大量的 vim 用户迁移到 nvim,而 vim 的魅力出了经典的快捷键还有丰富的插件系统,这些 nvim 都继承了下来,同时内置了 LSP,增加了 异步 IO 等新特性。

以下是 Neovim 的一些主要特点和优势:

  1. 兼容性:Neovim 是 Vim 的兼容版本,几乎可以无缝地使用现有的 Vim 配置文件和插件。它支持 Vim 的命令和操作方式,因此 Vim 用户可以很容易地切换到 Neovim。
  2. 异步支持:Neovim 引入了异步任务处理的机制,使得编辑器可以在后台执行长时间运行的任务,而不会阻塞用户界面。这使得插件和脚本可以更高效地处理耗时操作,提高了编辑器的响应性。
  3. 现代化的插件系统:Neovim 提供了更灵活、更易于扩展的插件系统。它支持各种编程语言编写的插件,并提供了对外部进程通信的接口,使得插件可以与其他程序进行交互。
  4. 社区活跃:Neovim 拥有一个活跃的社区,不断推动编辑器的发展和改进。社区提供了大量的插件、主题和配置文件,以及对新功能的贡献和支持。

总体而言,Neovim 是一款非常强大和灵活的文本编辑器,旨在提供现代化的编辑体验,并为用户提供高度的定制能力。无论是初学者还是有经验的 Vim 用户,都可以从 Neovim 的功能和特性中受益。

📃基础配置

neovim 中配置可以通过 init.vim 或者 init.lua 进行配置,当前大部分的配置都采用了 lua ,本文也将会通过 lua 进行配置 nvim。如果你还不会使用 lua 也不许需要担心,lua 可以快速上手。你可以直接通过 :h lua-guide 进行查看 lua 教程。

init.lua

在 mac/linux 中,该配置文件位于 ~/.config/nvim/ 目录下,而在 windows 系统中,该目录位于 %USERPROFILE%\AppData\Local\nvim\。nvim 启动时会加载该目录下的 init.lua 文件,那么只需要在该文件中进行配置即可。

首先对文件的编码格式设置,统一为 UTF-8 。只需要在 init.lua 中添加相关配置。

vim.g.encoding = "UTF-8"
vim.o.fileencoding = "UTF-8"

这里的 og 是什么意思呢?

vim.o 意味着可以对全局的选项进行设置,而 vim.g 是进行全局设置。

类似的相关方法还有 vim.wo 设置 window-local 选项、vim.bo 设置 buffer-local 选项等。

对 tab 进行设置, tab 默认为 4 个空格。

vim.o.tabstop = 4
vim.bo.tabstop = 4
vim.o.softtabstop = 4
vim.o.shiftround = true

还可以将其他的基础配置添加进来,例如显示行号等,具体配置如下

-- 编码方式 utf8
vim.g.encoding = "UTF-8"
vim.o.fileencoding = "utf-8"
-- jkhl 移动时光标周围保留8行
vim.o.scrolloff = 8
vim.o.sidescrolloff = 8
-- 显示行号
vim.wo.number = true
-- 使用相对行号
vim.wo.relativenumber = true
-- 高亮所在行
vim.wo.cursorline = true
-- 显示左侧图标指示列
vim.wo.signcolumn = "yes"
-- 右侧参考线
vim.wo.colorcolumn = "160"
-- 缩进字符
vim.o.tabstop = 4
vim.bo.tabstop = 4
vim.o.softtabstop = 4
vim.o.shiftround = true
-- >> << 时移动长度
vim.o.shiftwidth = 4
vim.bo.shiftwidth = 4
-- 空格替代
tabvim.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.hlsearch = false

vim.o.incsearch = true
-- 命令模式行高
vim.o.cmdheight = 1
-- 自动加载外部修改
vim.o.autoread = true
vim.bo.autoread = true
-- 禁止折行
vim.wo.wrap = false
-- 光标在行首尾时<Left><Right>可以跳到下一行
vim.o.whichwrap = "<,>,[,]"
-- 允许隐藏被修改过的buffer
vim.o.hidden = true
-- 鼠标支持
vim.o.mouse = "a"
-- 禁止创建备份文件
vim.o.backup = false
vim.o.writebackup = false
vim.o.swapfile = false
-- smaller updatetime
vim.o.updatetime = 300

vim.o.timeoutlen = 500

vim.o.splitbelow = true
vim.o.splitright = true
-- 自动补全不自动选中
vim.g.completeopt = "menu,menuone,noselect,noinsert"
-- 样式
vim.o.background = "dark"
vim.o.termguicolors = true
vim.opt.termguicolors = true
-- 不可见字符的显示,这里只把空格显示为一个点
vim.o.list = false
vim.o.listchars = "space:·,tab:>-"

vim.o.wildmenu = true

vim.o.shortmess = vim.o.shortmess .. "c"
-- 补全显示10行
vim.o.pumheight = 10
vim.o.clipboard = "unnamedplus"

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/image.png

📦插件系统

vim/neovim 经过多年的发展仍旧活跃,其中插件系统功不可没。丰富的插件可以使得 neovie 分分钟化身为 IDE 。

在社区的发展过程中,vim 的插件系统也不断的壮大,目前 vim 的插件基本可以涵盖编辑的方方面面。针对 neovim,可以通过 awesome-neovim 这个项目查询相关插件。

无论是 vim 还是 neovim,本身并没有插件管理器,并不像 vscode 或者其他编辑器一样,可以方便的对查件进行添加,删除或者更新等操作。当然你也无需要担心,各路大神已经开发出了多个插件管理工具。目前,对于 neovim 来说,比较有名的插件管理工具有 packer.nvimlazy.nvim (注意:不要和 LazyVim 混淆)。

本文采用将会采用 lazy.nvim 作为插件管理工具进行插件管理。如果你使用了 packer.nvim 作为插件管理,并不影响阅读,可以跳过插件管理器章节。

插件管理器

lazy.nvim 作为现在比较流行的插件管理工具,安装其实很简单。在 init.lua 中添加相关代码。

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()

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/image_1.png

保存退出后,再次进入 nvim。 nvim 会检查是否存在 lazy, 如果不存在会从 github 上 clone 下来。

通过 :Lazy 命令,如果看到下面的图像,那么就证明 lazy.nvim 安装成功了。

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/image_2.png

有了 lazy,之后就可以快速的安装,更新和卸载插件。

第一个插件

为了验证 lazy 功能是否正常,那么先安装个主题插件看看。主题插件我选择 catppuccin.nvim

通过 catppuccin 文档可以查到如何安装,将插件添加到 lazy 配置中。

require("lazy").setup(
    { "catppuccin/nvim", name = "catppuccin", priority = 1000 }
)

退出 neovim,再次进入,就会看到 lazy 在下载相关插件。

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/image_3.png

安装完成后,发现我们的主体已经被应用,但是等到退出再次进入的时候,发现主题颜色又恢复了默认配色,只需要在配置文件末尾添加一句,用于设置相关的配色。

vim.cmd.colorscheme("catppuccin")

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/image_4.png

其中 catppuccin 还有很多配置,这里不多赘述,可以到相关仓库中查看配置内容。

有了插件管理器,那么就可以添加不同的插件了。

配置的组织

经过上面简单的了解,目前所有的配置都写在 init.lua 中,当添加更多的插件的时候, lua 中的代码也会不断的增加,那么当需要进行修改的时候,查询相关配置也成了一大问题,而通过 lua 的特性,我们可以将不同的配置文件进行拆分,做到高内聚低耦合。

对于 lua 来说,可以通过 require 函数来将不同的 lua 脚本进行导入。

现在同 init.lua 目录下建立 lua 文件夹,在其中新建两个 lua 文件,分别是 basic.lua 和 plugin.lua。

.
├── init.lua
└── lua
     ├── basic.lua
     └── plugin.lua

结构如上目录树所示,之后可以将配置内容分被复制到相关的文件中,将基础配置放在 basic.lua 中,将 lazy 相关的配置复制到 plugin.lua 中。

最后将 init.lua 中引入相关的配置文件即可。

require("basic")
require("plugin")

其中,对于颜色主题的配置我们可以新建一个 theme.lua 文件,将主题配色相关的配置存放,最后不要忘记在 init.lua 中添加该文件。

最后的目录结构如下:

.
├── init.lua
├── lazy-lock.json
└── lua
    ├── basic.lua
    ├── plugin.lua
    └── theme.lua

⌨️ 快捷键绑定

为了让 vim 更加的顺手,方便我们的使用,针对一些操作需要绑定我们的快捷键,这样让你的操作效率如虎添翼。按照上面的配置规则,新建文件为 keymapping.lua,并在 init.lua 中添加。

认识快捷键

vim 的一个重要点就是可以通过快捷键快速高效的完成任务,指哪里打哪里,而在配置快捷键中,其实有怎么几个键需要我们熟知,分被为 CtrlAltShift 键。这里并不是让大家知道这些按键在哪里,而是说配置中,这些键位很常用,并且在配置中这些键位常常简写。

键位简写
CtrlC-
shiftS-
AltA-

这三个键位在配置中会非常常见。当然,并不是只有这三个键位可以找到相关的缩写,可以通过 :h key-notations 看到所有的键位说明。

另外,对于 mac 来说是没有 Alt 键的,这样就需要我们修改 Option 键位,这部分可以看 附录/修改 Alt 键位。

Leader 键

leader 键对于 vim 来说是一个非常重要的键,它可以说是在 vim 中使用频率最高的键之一。 leader 顾名思义,处于领导位置,一般作为组合快捷键的先驱,使用其他按键的时候先按下 leader。对于 leader,vim 并没有规定谁是 leader,只要你想,哪个键也可以为 leader。一般会将 空格 等按键设置为 leader 键。

上面这些都是我们配置前的基础知识。下面开始设置相关快捷键。

设置快捷键

在 lua 文件夹下新建文件, keybinding.lua,并且在 init.lua 中添加, require("keybinding")

首先便是上面说过的 leader 键。这里我采用空格作为 leader 键。

vim.g.mapleader = " "
vim.g.maplocalleader = " "

关于 mapleadermaplocalleader 的区别可以看 https://luciaca.cn/posts/vimscript-learning-on-leaders 相关文档。

在 neovim 中,需要通过 vim.keymap.set() 函数进设置。这个函数需要传入四个参数,分别是 mode , lhs , rhs , opts

参数名说明
mode模式的简写,常见的有 n(normal), i(insert), v(view) 等
lhs可以理解为对应的按键
rhs对应的功能
opts相关的设置
vim.g.mapleader = " "
vim.g.maplocalleader = " "
local opt = { noremap = true, silent = true }

-- visual模式下缩进代码
vim.keymap.set("v", "<", "<gv", opt)
vim.keymap.set("v", ">", ">gv", opt)

-- 左右Tab切换
map("n", "<C-h>", ":BufferLineCyclePrev<CR>", opt)
map("n", "<C-l>", ":BufferLineCycleNext<CR>", opt)

-- 省略其他基础配置

这样就可以自定义添加相关按键。

修改 Alt 键位

iterm2

在 setting 中, Profiles-Keys 中, 将 Left Option Key 设置为 Esc+ 。

https://island-hexo.oss-cn-beijing.aliyuncs.com/neovim%E6%8C%87%E5%8D%97/neovim%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%200148d9f0831f494fbe505a595a51c2ef/Untitled.png

Alacritty

编辑 alacritty 的配置文件中window.option_as_alt

window:
  # Make `Option` key behave as `Alt` (macOS only):
  #   - OnlyLeft
  #   - OnlyRight
  #   - Both
  #   - None (default)
  option_as_alt: Both

为何 Emacs 和 Vim 被称为两大神器

BurntSushi/ripgrep


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK