😸

【NeoVim】自分用のNeoVim環境を作った話

2025/04/04に公開

はじめに

キーボードだけで完結するVim/NeoVimを使いたいなぁとは思いつつも、設定の煩雑さからこれまで本格的な環境を作らずに日々を過ごしてきました。
とあるよく晴れた日に、「こんなことではいかんな」と思い立ち本格的にNeoVimの設定に取り掛かることにしました。

ゴール設定

今回の環境設定においては以下をゴールとします。

  • NeoVimの最新版をインストールする
  • ファイル検索できるようにする
  • 括弧やTabを見やすくする
  • ヤンクとクリップボードを共有する
  • Built-In LSPを使う
  • Git操作を行う
  • Docker操作を行う
  • エディタを画面中央に寄せる

使用した環境

WSLのUbuntu-20.04にて環境を構築しました。

NeoVimの最新版をインストールする

aptでインストールした場合最新版がインストールされなかったため、最新のAppImageを取得してインストールします。

必要なライブラリのインストール

sudo apt install -y curl git ninja-build gettext libtool libtool-bin cmake g++ pkg-config unzip

最新のAppImageダウンロード

curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.appimage
chmod u+x nvim-linux-x86_64.appimage
./nvim-linux-x86_64.appimage

ファイル移動

公式の手順に従いファイルを移動します

mkdir -p /opt/nvim
mv nvim-linux-x86_64.appimage /opt/nvim/nvim
export PATH="$PATH:/opt/nvim/"

nvimコマンドを実行してNeoVimが起動したら正常にインストールされています

NeoVim設定ファイル配置について

各種設定ファイル群は以下のように管理しています。

  • プラグイン毎の設定や、その他一般設定を別ファイルで管理
  • init.lua内で各種設定ファイルを呼び出すようにする

今回の設定がすべて反映されると以下のようなファイル配置になります。

~/.config/nvim
└ init.lua
   ├ lua
   │ ├ cmp_config.lua
   │ ├ colorscheme.lua
   │ ├ hlchunk_cfg.lua
   │ ├ keymap_cfg.lua
   │ ├ lsp_config.lua
   │ ├ noneckpain_cfg.lua
   │ ├ options.lua
   │ ├ plugins.lua
   │ ├ telescope_cfg.lua
   │ ├ toggleterm_cfg.lua
   │ └ treesitter_cfg.lua
   └ plugin
     └ packer_compiled.lua

プラグインの読み込みについて

プラグインの読み込みはlua/plugins.luaにて一括読み込みしています。

~/.config/nvim/lua/plugins.lua
vim.cmd([[packadd packer.nvim]])

require('packer').startup(function(use)
    use 'wbthomason/packer.nvim'                -- プラグイン管理
    use 'nvim-treesitter/nvim-treesitter'       -- 構文解析エンジン
    use 'shellRaining/hlchunk.nvim'             -- インデントガイドを表示する
    use 'nvim-telescope/telescope.nvim'         -- ファイル検索
    use 'nvim-lua/plenary.nvim'                 -- Telescopeの依存ライブラリ
--    use 'sainnhe/everforest'                    -- カラースキーマ
    use 'jdkanani/vim-material-theme'           -- カラースキーマ
    use 'neovim/nvim-lspconfig'                 -- LSPの各種設定を行う
    use 'williamboman/mason.nvim'               -- Language Server/Linter/FormatterをNeoVim上で管理する
    use 'williamboman/mason-lspconfig.nvim'     -- nvim-lspconfig と mason.nvimの連携
    use 'hrsh7th/nvim-cmp'                      -- 補完エンジン本体
    use 'hrsh7th/cmp-nvim-lsp'                  -- LSPを補完ソースにする
    use 'hrsh7th/cmp-buffer'                    -- bufferを補完ソースにする
    use 'hrsh7th/cmp-path'                      -- pathを補完ソースにする
    use 'hrsh7th/vim-vsnip'                     -- スニペットエンジン
    use 'hrsh7th/cmp-vsnip'                     -- スニペットを補完ソースに
    use 'onsails/lspkind.nvim'                  -- 補完欄にアイコンを表示
    use 'akinsho/toggleterm.nvim'               -- エディタ内でのターミナル開閉
    use {'shortcuts/no-neck-pain.nvim', tag = "*"}  -- エディタを画面中央に寄せる
end)

プラグインのインストールは上記ファイルをinit.luaで読み込ませた後、コマンドラインにて以下のコマンドを入力します。

:PackerSync

ファイル検索する

ファイル検索にはTelescopeを使用します。キーマッピングを以下のように設定しています。

~/.config/nvim/lua/telescope_cfg.lua
local telescope = require('telescope')

telescope.setup {
    defaults = {
        layout_config = {
            width = 0.75,
        },
        file_ignore_patterns = {
            "%.git/",
            "%vendor",
        },
    },
    pickers = {
        find_files = {
            hidden = true,
        },
    },
}

local vim = vim
vim.api.nvim_set_keymap('n', '<Leader>ff', "<cmd>Telescope find_files<CR>", { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<Leader>fg', "<cmd>Telescope live_grep<CR>", { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<Leader>fb', "<cmd>Telescope buffers<CR>", { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<Leader>fh', "<cmd>Telescope help_tags<CR>", { noremap = true, silent = true })

括弧やTabを見やすくする

括弧で囲まれている範囲を画面に表示してくれるプラグインとしてhlchunk.nvimを使用します。

前提としてnvim-treesitterが必要なのでインストール/設定を行います

~/.config/lua/treesitter_cfg.lua
local treesitter = require("nvim-treesitter")
treesitter.setup({
    ensure_installed = {
        "php",
        "lua",
    },
    highlight = {
        enable = true,
    },
    indent = {
        enable = true,
    }
})

インストール後、適当なファイルを開き、以下のコマンドを入力して必要な言語のサポートを有効にします。複数選択したい場合はそれぞれ繰り返してください。

:TSInstall php

hlchunk.nvimの設定は以下の通りです。

~/.config/nvim/lua/hlchunk_cfg.lua
local hlchunk = require("hlchunk")
hlchunk.setup({
    chunk = {
        enable = true,
        use_treesitter = true,
        style = {
            { fg = "#a1b56c" },
        },
    },
    indent = {
        enable = true,
    },
    line_num = {
        enable = false,
    },
})

ヤンクとクリップボードの共有

xclipを使用します

sudo apt install xclip

NeoVim側は以下のように設定しています。

~/.config/nvim/lua/options.lua
clipboard = "unnamedplus",  -- ヤンクとクリップボードを共有

LSPを使用する

NeoVimにはLSPが搭載されているため、それを使用するようにします。

~/.config/nvim/lua/plugins.lua
    use 'neovim/nvim-lspconfig'                        -- LSPの各種設定を行う
    use 'williamboman/mason.nvim'                            -- Language Server/Linter/FormatterをNeoVim上で管理する
    use 'williamboman/mason-lspconfig.nvim'                  -- nvim-lspconfig と mason.nvimの連携
e

設定周りは以下のエントリを参考にさせていただきました。

[Neovim]Coc.nvim+init.vimからBuiltin LSP+init.luaに移行しました💪

Git操作を行う/Docker操作を行う

Git/Docker操作にはLazyGit/LazyDockerを使用します。

これらはTUIですが、toggleterm.nvimを使用してNeoVim内で操作できるようにします。

LazyGitのインストール

LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | \grep -Po '"tag_name": *"v\K[^"]*')
curl -Lo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/download/v${LAZYGIT_VERSION}/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz"
tar xf lazygit.tar.gz lazygit
sudo install lazygit -D -t /usr/local/bin/

LazyDockerのインストール

curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash

toggleterm.nvimの設定

<Leader>lgとタイプするとlazygitが起動し、<Leader>ldとタイプするとlazydockerが起動するようにしています

~/.config/nvim/lua/toggleterm_cfg.lua
local Terminal = require('toggleterm.terminal').Terminal

-- LazyGit用のターミナルを作成
local lazygit_terminal = Terminal:new({
    cmd = "/usr/local/bin/lazygit",          -- 実行するコマンド
    direction = "float",      -- 浮動ウィンドウで表示
    hidden = true             -- 初期状態では隠す
})

-- LazyGitをトグルする関数を定義
_G.lazygit_toggle = function()
    lazygit_terminal:toggle()
end
-- Neovimのキー設定
vim.api.nvim_set_keymap("n", "<Leader>lg", "<cmd>lua lazygit_toggle()<CR>", { noremap = true, silent = true })

-- LazyDocker用のターミナルを作成
local lazydocker_terminal = Terminal:new({
    cmd = "/home/yositack/.local/bin/lazydocker",          -- 実行するコマンド
    direction = "float",      -- 浮動ウィンドウで表示
    hidden = true             -- 初期状態では隠す
})

-- LazyGitをトグルする関数を定義
_G.lazydocker_toggle = function()
    lazydocker_terminal:toggle()
end
-- Neovimのキー設定
vim.api.nvim_set_keymap("n", "<Leader>ld", "<cmd>lua lazydocker_toggle()<CR>", { noremap = true, silent = true })

エディタを画面中央に寄せる

通常エディタを開いた場合テキストは画面の左端から表示されると思います。ウルトラワイドディスプレイを使うと微妙に左を向きながら作業することになり具合が悪いので、no-neck-pain.nvimというエディタ画面をディスプレイの中央に寄せるプラグインを導入します。

~/.config/nvim/lua/noneckpain_cfg.lua
require("no-neck-pain").setup({
        width = 100,
})

local vim = vim
vim.api.nvim_create_autocmd("VimEnter", {
    callback = function ()
        vim.cmd("NoNeckPain")
    end,
})

参考URL

[Neovim] WSL2 の Ubuntu で Neovim の最新版を入れた

Neovim Part3.0 ~Telesopeの導入~

[Neovim]Coc.nvim+init.vimからBuiltin LSP+init.luaに移行しました💪

【Neovim】toggleterm.nvimとlazygitを組み合わせてgit操作を快適にする

ちなみに、ターミナルは「Tabby」を使っています
モダンなターミナルソフト「Tabby」の紹介

Discussion