从 NERDTree 切换到 nvim-tree

0x0 NERDTree 的问题

使用 neovim 时,有时会遇到在启动过程中长时间卡住的问题。通过 vi --startuptime /tmp/1 这样的调试方式启动,发现多数时间开销在 NERDTree 插件里。

考虑到 NERDTree 项目 目前已经不再是活跃开发状态,所以结合网上搜索到的信息,经过比较后,决定切换到 nvim-tree.lua 插件。

0x1 切换过程

以下是切换过程中的一些记录。

按照文档说明,在配置文件 init.lua 的开始位置,先禁用 netrw:

vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1

下载并安装 Nerd Font 字体,比如 DejaVuSansM Nerd Font。

之后,按照文档配默认置即可。

之前一直通过 <leader>n 来打开 NERDTree,现在要修改:

vim.api.nvim_set_keymap("n", "<leader>n", ":NvimTreeToggle<CR>", {})

这样设置后,就可以使用了。

0x2 微调

1. 文件夹的图标

对于文件夹,nvim-web-devicons 里有专门的图标。考虑到已经习惯了 NERDTree 里使用的箭头图标,所以进行了调整:

require("nvim-tree").setup({
  renderer = {
    icons = {
      glyphs = {
        folder = {
          arrow_closed = "⏵",
          arrow_open = "⏷",
        },
      },
    },
  },
})

2. 按键

在学习 nvim-tree.lua 按键操作的过程中,发现有几处跟原先 NERDTree 不一致的地方。

之前 NERDTree 的按键,多数与 vim 保持一致,比如 H 是移动到窗口起始行,M 是移动到中间,L 是移动到底部,C-e 是整体向上移动,C-y 向下等等。

nvim-tree 把这些重新定义了,比如 H 是打开或关闭隐藏文件的显示,M 是切换显示标记的文件,C-e 是原地打开当前选中文件,等等。考虑到目前这些功能并不是最常用,所以重新分配了按键:

on_attach = function(bufnr)
  local api = require("nvim-tree.api")
  local function opts(desc)
    return { desc = "nvim-tree: " .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
  end
  api.config.mappings.default_on_attach(bufnr)
  vim.keymap.set("n", "H", "H", opts("To line [count] from top (Home) of window"))
  vim.keymap.set("n", "M", "M", opts("To Middle line of window"))
  vim.keymap.set("n", "L", "L", opts("To line [count] from bottom of window"))
  vim.keymap.set("n", "<C-e>", "<C-e>", opts("Scroll window [count] lines downwards"))
  vim.keymap.set("n", "<C-h>", api.tree.toggle_hidden_filter, opts("Toggle Filter: Dotfiles"))
  vim.keymap.set("n", "<C-t>", api.tree.toggle_no_bookmark_filter, opts("Toggle Filter: No Bookmark"))
end,

这样就恢复到了跟以前相同的操作习惯,并把几个新的功能分配到了其他按键上。

另外,nvim-tree 按键较多,对于不是那么常用的功能,也不需要额外记忆,使用时通过 g? 来查看即可。

Read More: