IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    neovim入门指南(一):基础配置

    youngxhui发表于 2023-07-05 10:23:17
    love 0

    在编程的世界中,有两个上古神器。一个叫做 “神之编辑器 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 中添加相关配置。

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

    这里的 o 和 g 是什么意思呢?

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

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

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

    1
    2
    3
    4
    
    vim.o.tabstop = 4
    vim.bo.tabstop = 4
    vim.o.softtabstop = 4
    vim.o.shiftround = true
    

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

     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
    
    -- 编码方式 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"
    

    📦插件系统

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

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

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

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

    插件管理器

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

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    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()
    

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

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

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

    第一个插件

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

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

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

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

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

    1
    
    vim.cmd.colorscheme("catppuccin")
    

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

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

    配置的组织

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

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

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

    1
    2
    3
    4
    5
    
    .
    ├── init.lua
    └── lua
         ├── basic.lua
         └── plugin.lua
    

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

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

    1
    2
    
    require("basic")
    require("plugin")
    

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

    最后的目录结构如下:

    1
    2
    3
    4
    5
    6
    7
    
    .
    ├── init.lua
    ├── lazy-lock.json
    └── lua
        ├── basic.lua
        ├── plugin.lua
        └── theme.lua
    

    ⌨️ 快捷键绑定

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

    认识快捷键

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

    键位 简写
    Ctrl C-
    shift S-
    Alt A-

    这三个键位在配置中会非常常见。当然,并不是只有这三个键位可以找到相关的缩写,可以通过 :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 键。

    1
    2
    
    vim.g.mapleader = " "
    vim.g.maplocalleader = " "
    

    关于 mapleader 和 maplocalleader 的区别可以看 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 相关的设置
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    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+ 。

    Alacritty

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

    1
    2
    3
    4
    5
    6
    7
    
    window:
      # Make `Option` key behave as `Alt` (macOS only):
      #   - OnlyLeft
      #   - OnlyRight
      #   - Both
      #   - None (default)
      option_as_alt: Both
    

    参考资料

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

    BurntSushi/ripgrep



沪ICP备19023445号-2号
友情链接