🕛

来年もneovimを使い続けるためのおすすめ設定

2024/11/02に公開

記事を書いた経緯

一時期neovimを使っていたことがあったのですが 設定が色々うまくいかなかったため
vscode vimに移行しました そのあとvscode vimの速度やjsonの設定が嫌になりvscode neovimに移行しました そしたらneovimの設定がついつい 楽しくなり結局neovimにまた復帰しました
そのアウトプットも兼ねてこの記事を書きました
そしてvimmerを減らしたくないです

プロフィール

中1不登校
atcoder 茶色(15回ぐらいで入茶した)
Paiza S(イキって解いてみた結果)

  • 使用言語
    • Python(メイン)
    • rust(すこしかじった程度)
    • C++(競プロ用 基本Python)
環境
  • pcの環境
    • windows11
    • wsl2
  • neovimの環境
    • neovim 0.10.2(バイナリインストール)
    • lazyvim

この記事の対象

neovimをインストールしていてlspなどの設定を済ませている方
vscodeに以降しようと考えている方 考え直してみてください

定番の設定

ここに書いている設定は超定番なので飛ばしても全然いいです
設定する項目

jjをEscにする設定

insertモードでjjを押すだけでノーマルモードに戻れる設定です
ただ二重ループを書くときjが突っかかるのでk(変数)とかにしないと少しイライラします

vim.api.nvim_set_keymap("i", "jj", "<Esc>", { noremap = true, silent = true })

これだけで設定できます指をあまり動かさなくていいので楽です
kkにしたい場合はjjをkkに変えてください

レジスタをシステムのクリップボードと同期させる

レジスタとはneovim独自のクリップボードと考えていいですが、pでシステムのクリップボードの情報が貼り付けられないと不便ですよね
それを解消する設定はたった一行で書けます(テレビショッピングの口調)
同期するとxで一文字とか削除するだけでクリップボードが汚れるので後述の設定でそれを解消します

vim.opt.clipboard:append({ "unnamedplus" })

xで削除するときレジスタを汚さないようにする

xで一文字削除するときシステムのクリップボードが汚れるとうざいので設定します

vim.api.nvim_set_keymap("n", "x", '"_x', { noremap = true, silent = true })

leaderキーを設定する

leaderキーはvim neovimの独自の考えでプラグインの機能の呼び出しなどによく使います
基本的にスペースキーにマップされます
下の設定はスペースキーのmapです

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

行番号を相対的に表示する

多くのエディタでは行番号は絶対的にしますがvimは相対的行番号のほうが使い勝手がいいので
後者の設定をします
まあ僕はhop.nvim使っているから関係ないんですけどねw
下のopt.numberは今いる行を絶対行番号にしています

vim.opt.relativenumber = true
vim.opt.number = true

tips 設定を分割する

どうしても設定をしているとinit.luaが肥大化しますよね
なのでlua/配下に設定ファイルを分割してinit.luaの肥大化を防ぎます
真似しなくてもいいですが僕はこんな感じにディレクトリ構成にしています

init.lua
- lua
    - core # これはキーマップとかプラグイン以外の設定
    - plugins # プラグインの設定
    lazyvim.lua # lazyvimのセットアップ

本題の読み込み方は

require("lua/においたファイルの名前")で読み込めます

こんな感じで読み込めます
ディレクトリのluaは省略可能です
ですがlua以外に置くとエラーが出ます

uiの設定

ここからはプラグインマネージャーのインストールが必須となります
インストール例はすべてlazyvimになります

設定する項目

ファイルツリーをインストールする

ファイルツリーをインストールするとファイルの移動が便利になって快適です
使うプラグインはneotreeです
下の感じになります

僕は<leader>eを開く方法に割り当てています
閉じる方法はqを押すだけです

インストール例
  {
    "nvim-neo-tree/neo-tree.nvim",
    branch = "v3.x",
    dependencies = {
      "nvim-lua/plenary.nvim",
      "nvim-tree/nvim-web-devicons", 
      "MunifTanjim/nui.nvim",
    },
    cmd = { "Neotree" },
    keys = { { "<leader>e", ":Neotree<CR>" } },
  },

ステータスラインをインストールする

ステータスラインをインストールすると格段にuiの質が上がります
プラグインはlualine.nvimを使います。
下の感じになります
画像がちっちゃくてすいません
ドキュメントの画像を見るとわかりやすいです

インストール例
{
    "nvim-lualine/lualine.nvim",
    dependencies = { "nvim-tree/nvim-web-devicons" },
    config = function()
      require("lualine").setup({
      })
    end,
    event = "VeryLazy",
}

バッファーラインをインストールする

バッファーラインとはタブバーのことです
ただタブ移動などのマッピングがされていないため自分でやる必要があります
僕はタブ移動にgtとgTを使ってタブを閉じるのに<leader>qを使ってます
下のインストール例ではその設定ができているので良かったら使ってください

インストール例
  {
    "akinsho/bufferline.nvim",
    dependencies = "nvim-tree/nvim-web-devicons",
    event = { "BufReadPre", "BufNewFile" },
    config = function()
      local bufferline = require("bufferline")
      require("bufferline").setup({
        options = {
          -- mode = "tabs",
          style_preset = bufferline.style_preset.minimal,
          always_show_bufferline = false,
          color_icons = true,
          diagnostics = "nvim_lsp",
        },
      })

      vim.api.nvim_set_keymap("n", "gt", ":BufferLineCycleNext<CR>", { noremap = true, silent = true })
      -- 前のバッファへ移動
      vim.api.nvim_set_keymap("n", "gT", ":BufferLineCyclePrev<CR>", { noremap = true, silent = true })
      -- バッファを削除
      vim.api.nvim_set_keymap("n", "<leader>q", ":bdelete<CR>", { noremap = true, silent = true })
    end,
  },

通知とコマンドラインをおしゃれにする

まとめて書いちゃいましたが同じプラグインでできます
使うプラグインはnoice.nvimです
通知はアニメーション付きでコマンドラインは画面の真ん中に表示され見やすくなります
画像を撮るのがめんどくさくなったのでドキュメントを見てください

インストール例
  {
    "folke/noice.nvim",
    event = "VeryLazy",
    dependencies = {
      "MunifTanjim/nui.nvim",
      "rcarriga/nvim-notify",
    },
    config = function()
      require("noice").setup({
        lsp = {
          override = {
            ["vim.lsp.util.convert_input_to_markdown_lines"] = true,
            ["vim.lsp.util.stylize_markdown"] = true,
            ["cmp.entry.get_documentation"] = true,
          },
        },
        presets = {
          bottom_search = true,
          command_palette = true,
          long_message_to_split = true,
          inc_rename = false,
          lsp_doc_border = false,
        },
      })
    end,
  },

インデントを見やすくする

このプラグインはその名の通りインデントが見やすくなります
僕はpython使っているのでインデントが見やすくなっていいです
これも色々種類がありますがindent-blankline.nvimを使っています
下のインストール例ではドキュメントのインデントごとに色を変える設定を採用しています

インストール例
  {
    "lukas-reineke/indent-blankline.nvim",
    event = "VimEnter",
    main = "ibl",
    ---@module "ibl"
    ---@type ibl.config
    config = function()
      local highlight = {
        "RainbowRed",
        "RainbowYellow",
        "RainbowBlue",
        "RainbowOrange",
        "RainbowGreen",
        "RainbowViolet",
        "RainbowCyan",
      }

      local hooks = require("ibl.hooks")
      -- create the highlight groups in the highlight setup hook, so they are reset
      -- every time the colorscheme changes
      hooks.register(hooks.type.HIGHLIGHT_SETUP, function()
        vim.api.nvim_set_hl(0, "RainbowRed", { fg = "#E06C75" })
        vim.api.nvim_set_hl(0, "RainbowYellow", { fg = "#E5C07B" })
        vim.api.nvim_set_hl(0, "RainbowBlue", { fg = "#61AFEF" })
        vim.api.nvim_set_hl(0, "RainbowOrange", { fg = "#D19A66" })
        vim.api.nvim_set_hl(0, "RainbowGreen", { fg = "#98C379" })
        vim.api.nvim_set_hl(0, "RainbowViolet", { fg = "#C678DD" })
        vim.api.nvim_set_hl(0, "RainbowCyan", { fg = "#56B6C2" })
      end)

      require("ibl").setup({ indent = { highlight = highlight } })
    end,
  },

カラースキームをインストールする

カラースキームはご自由にどうぞと言いたいところですがおすすめを紹介します
僕のおすすめはonedark.nvimです
サポートを終了したatomのテーマです 結構見やすくていいです(atomは僕がプログラミングを始めた頃にはもうメンテ終了していた)

他には

便利なプラグインのインストール

設定する項目

telescope.nvimのインストール

telescope.nvimfzfのneovim版みたいな感じです
ファイルの内容も検索できます(ripgrepが必要)
ripgrepはRust製なのでcargoを使うと素早くインストールができます
neovimの三種の神器の一つです
あとの二つは補完エンジンのnvim-cmpと後で紹介するtoggleterm.nvimです
ファイル検索は

Telescope find_files

でできます

インストール方法
  {
    "nvim-telescope/telescope.nvim",
    tag = "0.1.8",
    -- or                              , branch = '0.1.x',
    dependencies = {
      "nvim-lua/plenary.nvim"
      {
        "nvim-telescope/telescope-fzf-native.nvim",
        build = "cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release",
      },
    },
    cmd = { "Telescope" },
    keys = {
      { "<leader>ff", ":Telescope find_files<CR>" },
      
    },
  },

hop.nvimのインストール

hop.nvimは高速に動作する移動プラグインです
文字で伝えてもわからないと思うので公式ドキュメントを見てください
ちなみに現在のhop.nvimはアーカイブされた物のforkです

インストール例
  {
    "smoka7/hop.nvim",
    version = "*",
    opts = {
      keys = "etovxqpdygfblzhckisuran",
    },
    lazy = true,
    keys = { { "<leader>w", ":HopWord<CR>" }, { "<leader>s", ":HopChar2<CR>" }, { "<leader>l", ":HopLine<CR>" } },
  },

toggleterm.nvimのインストール

toggleterm.nvimは呼び出すと画面にターミナルが現れます :termを使うより全然作業効率が上がるためいいです
lazygitやlazydockerをneovimから出ずに呼び出すことも可能です
neovimからneovimを呼び出すことも可能ですw(組み込みのやつでもできます)
先ほどいったneovim三種の神器の一つです

インストール例
  {
    "akinsho/toggleterm.nvim",
    version = "*",
    opts = {
      size = 10, -- ターミナルのサイズ
      open_mapping = [[<c-\>]], -- キーマッピング
    },
    keys = { [[<C-\>]], ":ToggleTerm<CR>" },
    cmd = "ToggleTerm",
  },

最後に

少しはneovimをもう少し使おうと思いましたでしょうか(vscodeに移行しようとしている人用)
gitなどのプラグインは入れてませんがそのへんはlazygitなどを使うなりしてください
zenn初投稿ですが結構uiが使いやすかったです

Discussion