网站搜索

6 个最终改善了我编码工作流程的 Neovim 插件


Neovim 本身已经非常强大,但充分利用它的关键不在于堆砌插件,而在于选择合适的插件。下面的插件之所以受欢迎,不是因为它们时髦,而是因为它们解决了在编辑器中使用足够长时间(通常比你预期的还久)后出现的特定问题。

正确使用 Neovim 并不需要任何插件。它们之所以存在,是因为可以解锁只有在你想充分利用编辑器时才会用到的功能。下面各部分的安装步骤假设使用 Lazy(常被误认为是 LazyVim),这是 Neovim 广泛使用的插件管理器。

赎罪

第一个是一个意外的发现,因为我没想到这样的东西竟然以如此干净和可用的形式存在(而且仍然感觉如此连贯)。Atone 将你的撤销历史呈现为一个你可以实际探索的树,而不是像通常那样不断撤销,撤销,再撤销直到达到目标。

我相信你一定有过这样的经历:当你进行了一系列编辑,继续工作一段时间后,却发现之前的某个修改更好,或者至少没那么错误。自那以后撤销已经不可能。Atone 正是为了解决这个问题而设计的,它能够将你每次编辑所创建的分支可视化,你可以在同一文件的不同历史版本之间切换,并将文件恢复到你想要的准确状态。

使用起来很简单,只需运行:Atone,一个侧窗打开,并打开一个撤销树。你用方向键在节点间导航,并用提供的快捷键恢复状态。

安装就这么简单:

return {
    "XXiaoA/atone.nvim",
    cmd = "Atone",
    opts = {},
}

遵守

也许是 Go 导致了这种迷恋,但我需要格式化的代码。正确的格式化可以去除所有杂乱(如果你的代码很差,可能不会全部去除),并保持差异可读。

Conform 将自己定义为一个轻量但强大的格式化工具,这一描述在实际使用中也得到了验证。它不是替换整个缓冲区,而是计算最小的差异,并只应用需要更改的部分。这可以保留标记、折叠和光标位置,听起来可能微不足道,但当你体验到其他方式时就会明白其重要性。

它还通过截取 LSP 格式化程序的输出并将其转换为正确的增量编辑来修复表现不佳的 LSP 格式化程序。此外,即使底层格式化程序不支持,它也可以对范围进行格式化。

要安装和配置,请运行以下命令:

return {
    'stevearc/conform.nvim',
    opts = {
        lua = { "stylua" },
        -- Conform will run multiple formatters sequentially
        python = { "isort", "black" },
        -- Use a sub-list to run only the first available formatter
        javascript = { { "prettierd", "prettier" } },
        markdown = { { "prettierd", "prettier" } },
        typescript = { "eslint_d" },
        sh = { "shfmt" },
        bash = { "shfmt" },
    },
    config = function()
        vim.api.nvim_create_user_command("Reformat", function(args)
            local range = nil
            if args.count ~= -1 then
                local end_line = vim.api.nvim_buf_get_lines(0, args.line2 - 1, args.line2, true)[1]
                range = { start = { args.line1, 0 }, ["end"] = { args.line2, end_line:len() },
                }
            end
            require("conform").format({ async = true, lsp_fallback = true, range = range })
        end, { range = true })

闪光

你在 Neovim 中的时间并不全用来写代码;很大一部分时间用在浏览代码上(不幸的是),而 Flash 就专注于这一点。

在基本层面上,它通过让跳转目标更清晰、更精确来改进内置的 f、F、t、T 移动方式,但它的功能不仅限于字符导航。它还允许你跳转到单词、行、语法节点或由正则表达式定义的模式。

令人着迷的是它与操作符待定模式的完美结合。你启动一个操作符,调用闪现,然后在你想要的位置准确应用该操作符,而无需任何尴尬的中间步骤。它还使搜索具有上下文相关性,让你可以根据缓冲区在函数和变量之间跳转。

安装 Flash:

return {
  "folke/flash.nvim",
  event = "verylazy",
  ---@type flash.config
  opts = {},
  keys = {
    { "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "flash" },
    { "S", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "flash treesitter" },
    { "r", mode = "o", function() require("flash").remote() end, desc = "remote flash" },
    { "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "treesitter search" },
    { "<c-s>", mode = { "c" }, function() require("flash").toggle() end, desc = "toggle flash search" },
  },
}

微型内联诊断

Neovim 中的内联诊断非常有用,但当诊断信息很长时,往往会被截断,你只能看到部分内容。如果是非常啰嗦的语言,情况会更糟。这个插件可以解决这个问题。

它使诊断消息能够正确展开,支持多行显示,并且无需额外操作即可保持可读性。你可以在工作的位置实时查看完整消息,这大大简化了调试过程。

要安装 TiD,请使用以下代码:

return {
    "rachartier/tiny-inline-diagnostic.nvim",
    event = "VeryLazy",
    priority = 1000,
    opts = {
        add_messages = {
            display_count = true,
        },
        multilines = {
            enabled = true,
            always_show = true,
        },
        show_source = {
            enabled = true,
        }
    },
}

Neogit

我安装 Neogit 很久了,但实际上很少使用。主要是因为习惯很难改变。一旦我添加了快捷键并决定将其作为主要的 Git 界面来使用,这种情况就改变了。

Neogit 在 Neovim 中提供了一个专注的 Git 用户界面。它允许你检查仓库状态、暂存代码块、编写提交、管理分支以及解决冲突,而无需切换上下文。在浮动窗口中运行它可以保持界面整洁,并避免占据整个屏幕。

安装 Neogit:

return {
    "NeogitOrg/neogit",
    dependencies = {
        "nvim-lua/plenary.nvim",     -- required
        "sindrets/diffview.nvim",    -- optional - Diff integration
        "nvim-telescope/telescope.nvim", -- optional
    },
    opts = {
        kind = "floating",
    },
    config = true
}

野蛮人

我们大多数人都是多任务处理者,通常不会只打开一个文件。实际上,情况正好相反,我们通常会同时打开多个文件。这几乎和浏览器中的标签页一样。Barbar 承认这一现实,并为你提供了一个合适的缓冲栏。

它提供可重新排序的标签、图标、Git 状态指示器,以及一种缓冲区选择模式,使缓冲区切换变成肌肉记忆。在缓冲区选择模式中,每个标签都会被分配一个字母,并在该缓冲区的整个生命周期内保持稳定。过一段时间后,你无需再思考文件名,就可以直接跳转(你的手在大脑之前就已经记住了)。

要安装 Barbar,请使用以下代码:

return{
    {
        'romgrk/barbar.nvim',
        dependencies = {
            'lewis6991/gitsigns.nvim',
            'nvim-tree/nvim-web-devicons',
        },
        init = function() vim.g.barbar_auto_setup = false end,
        opts = {
            sidebar_filetypes = {
                ['neo-tree'] = { event = 'BufWipeout' }
            },
        },
    },
}

单独来看,这些插件可能并不显得特别出众,而这正是它们重要的原因。这些插件中的每一个都消除了日常使用 Neovim 时的一些小而持续的限制,从撤销历史和格式化到导航和缓冲区管理。综合来看,它们有助于超越单纯使用 Neovim,并充分发挥其潜力。

相关文章