【NeoVim】自分用のNeoVim環境を作った話
はじめに
キーボードだけで完結する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
にて一括読み込みしています。
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を使用します。キーマッピングを以下のように設定しています。
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が必要なのでインストール/設定を行います
local treesitter = require("nvim-treesitter")
treesitter.setup({
ensure_installed = {
"php",
"lua",
},
highlight = {
enable = true,
},
indent = {
enable = true,
}
})
インストール後、適当なファイルを開き、以下のコマンドを入力して必要な言語のサポートを有効にします。複数選択したい場合はそれぞれ繰り返してください。
:TSInstall php
hlchunk.nvimの設定は以下の通りです。
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側は以下のように設定しています。
clipboard = "unnamedplus", -- ヤンクとクリップボードを共有
LSPを使用する
NeoVimにはLSPが搭載されているため、それを使用するようにします。
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が起動するようにしています
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というエディタ画面をディスプレイの中央に寄せるプラグインを導入します。
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]Coc.nvim+init.vimからBuiltin LSP+init.luaに移行しました💪
【Neovim】toggleterm.nvimとlazygitを組み合わせてgit操作を快適にする
ちなみに、ターミナルは「Tabby」を使っています
モダンなターミナルソフト「Tabby」の紹介
Discussion