方便无 Language Server 开发的 Neovim 插件

最近实习工作开始写 C/C++ 了,由于项目结构过于复杂导致 VSCode 的 language server 几乎是不可用的状态,所以心想不如换回最顺手的 neovim,但从来没有用 neovim 做过大项目,所以要研究如何实现我在 VSCode 里常用的一些功能:

搜索

这里用的是 nvim-spectre,用起来和 VSCode 差不多,默认搜索用的是 ripgrep 所以速度很快,目前在用的快捷键:

local map = vim.keymap.set -- 之后不再重复
 
map('n', '<leader>S', require('spectre').open)
map('n', '<leader>fw', function() require('spectre').open_visual({select_word=true}) end) -- 查找函数定义或引用很有用

文件相关

VSCode 里ctrl + p(Windows)/cmd + p(MacOS) 可以呼出文件跳转,在 Neovim 里可以用 telescope 的 find_files picker 实现,唯一美中不足就是不会优先显示最近打开的文件且没有缓存所以加载会稍慢一点点。

map('n', '<Leader>ff', require"telescope.builtin".find_files)

常用文件跳转可以用harpoon

map('n', '<Leader>fm', require("harpoon.ui").toggle_quick_menu)
map('n', '<Leader>ma', require("harpoon.mark").add_file)

大纲/Symbol

之前用的 symbols-outline.nvim 但可惜不支持 treesitter,然后发现了更好用的 aerial:不仅支持 treesitter 还有 lualine 扩展(显示当前函数),telescope picker(比 telescope 自带的 symbol picker)好用。

require('telescope').load_extension('aerial')
 
map('n', '<Leader>s', require'telescope'.extensions.aerial.aerial)

终端

nvim-toggleterm.lua管理终端,一个很好用的功能是自定义终端,比如定义一个默认打开 lazygit 的终端:

自定义 lazygit 示意图
自定义 lazygit 示意图 (来自官方 README)
local Terminal  = require('toggleterm.terminal').Terminal
local lazygit = Terminal:new({
    cmd = "lazygit",
    hidden = true,
    direction = 'float',
    float_opts = {
        border = 'double'
    }
})
map('n', '<Leader>g', function() lazygit:toggle() end)