体調はこのところ調子良さげです。日差しが強くなったから?今年の年末は朝散歩をしてみようかな。
さて、これまでプログラミング時には WSL2 上で vim を使用していたのですが、この度 neovim (nvim) に乗り換えました。 ちなみに文書を書くとき(このブログとか)は、emacs配列を使用しています。 でもプログラミングのときはvimがしっくり来るんですよね。
vimから移行したわけ
vimでlanguage serverを使ってtsxファイルを編集するとハングするという状態になったのがきっかけです。
最近react nativeというJavaScriptベースの開発フレームワークの勉強を始めて、 その構文チェックをするのにlanguage serverを使ったみたところ、 サンプルソースを見るだけでCPU 100%使用状態でハングする状態となったという経緯です。
素のvimにvim-lspとvim-lsp-settingsだけを入れた状態でも駄目で、vimユーザも少数派になったのかWeb検索してもヒットしない。 という訳で乗り換えることにしました。
ちなみにvscodeも試したのですが、プログラミングだけではなく、 設定ファイルの編集とかにも使うので統合環境は合わないかなと辞めておきました。
Neovimのインストールと設定
設定は結構右往左往してしまいましたが、最終的な手順は非常に簡単になりました。
linux用のバイナリが配られているのでそれを使用します。 WSL2でないとfuseが動作しないのでその場合はひと手間(neovim/INSTALL.md at master · neovim/neovim · GitHub)必要です。
$ curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.appimage $ chmod u+x nvim-linux-x86_64.appimage $ mv nvim-linux-x86_64.appimage ~/.local/bin/nvim
lazyvim の導入
プラグインなどのセットを一括でインストールしてくれる lazyvim を導入します。 ちょっとクセはありますが、language serverやtree sitter (インデントやシンタックスハイライト) などの設定が一発で完了します。
$ git clone https://github.com/LazyVim/starter ~/.config/nvim $ rm -rf ~/.config/nvim/.git
HackGen Console NFフォントのインストール
lazyvimはNerdFontというフォントを前提としていて、これを使用しないと記号などがうまく表示できません。 そこで、HackGen Console NFフォントを使用します。 詳細はこちら(オレオレ Neovim 環境構築 with LazyVim #neovim - Qiita)。
サイトのreleaseからHackGen_NF_v2.10.0.zipをダウンロードして、 HackGenConsoleNF-Regular.ttfとHackGenConsoleNF-Bold.ttfをWindowsにインストール、 wslttyのフォントを HackGen Console NF にします。
このHackGenというフォントかなり見やすくて気に入りました。
曖昧幅文字への対処
lazyvimを使用するとset ambiwidth=doubleの設定が使用できません(起動時にエラーとなる)。 そのため※などが半角幅で表示され、表示が乱れます。 HackGen Consoleフォントは、曖昧幅文字はできるだけ半角幅となるように作成されていますが、 対応していない文字もあり、そういう文字については、見つけたものを個別に幅を指定して対処します。 今のところ以下になります。
~/.config/nvim/init.lua
vim.fn.setcellwidths({
{ 0x2103, 0x2103, 2 }, -- ℃
{ 0x203B, 0x203B, 2 }, -- ※
{ 0x2460, 0x2473, 2 }, -- ①~⑳
})
カラースキームをHybridにする
カラースキームを見慣れているhybridに変更しました。 またイタリック体が若干見づらいので使用しないようにしました。
~/.config/nvim/lua/plugins/theme.lua
return {
{
"HoNamDuong/hybrid.nvim",
lazy = false,
priority = 1000,
opts = {
italic = {
strings = false,
comments = false,
},
},
},
{
"LazyVim/LazyVim",
opts = {
colorscheme = "hybrid",
},
},
}
options.lua
以下の設定を行います。 説明をコメントで入れています。 マウスのビジュアルモード、行番号、サインカラムはマウスでコピペするのに邪魔なので無効にしています。
~/.config/nvim/lua/config/options.lua
local opt = vim.opt
opt.mouse = "" -- マウスのビジュアルモードを無効化
opt.wrap = true -- 行を折り返して表示する
opt.clipboard = "" -- システムのクリップボードを使用しない
opt.number = false -- 行番号を使用しない
opt.relativenumber = false -- 相対行番号を表示しない
opt.signcolumn = "no" -- サインカラム(左側の空白)を使用しない
vim.g.snacks_animate = false -- 行移動のアニメーションをOFFにする
-- lspのvirual textを有効化する
vim.diagnostic.config({
virtual_text = true,
})
keymaps
lspのvirual textで、メッセージが文末にかかると途中までしか表示されないので、"<space>e"で表示するようにします。 また、j, kで折り返した行を一行として扱って移動できるようにします。
.config/nvim/lua/config/keymaps.lua
vim.keymap.set("n", "<space>e", "<cmd>lua vim.diagnostic.open_float()<CR>")
vim.keymap.set("n", "j", "gj")
vim.keymap.set("n", "k", "gk")
snacks
snacksのインデントの使用をやめます。縦線があるとマウスによるコピペに邪魔になるため。 そもそも縦線の必要性を感じない。
.config/nvim/lua/plugins/snacks.lua
return {
{
"snacks.nvim",
indent = {
enabled = false,
},
},
}
noice
cmdlineが上部に表示されるのが違和感があったので、最下部に移しました。
~/.config/nvim/lua/plugins/noice.lua
return {
"folke/noice.nvim",
opts = {
cmdline = {
view = "cmdline", -- cmdlineを最下行に表示 (デフォルト: cmdline_popup)
},
},
}
lsconfig
nvimの設定ファイル(.lua)を開いたときに'vim'変数で構文チェックとならないようにします。 これは回避処置ですがnvimのpluginを開発するのでもなければ十分でしょう。
.config/nvim/lua/plugins/lspconfig.lua
return {
{
"neovim/nvim-lspconfig",
opts = {
servers = {
lua_ls = {
settings = {
Lua = {
diagnostics = {
globals = { "vim" },
},
},
},
},
},
},
},
}
flash.nvimの無効化
flash.nvimを使用するとsキーの動作がデフォルトから変わります。 私はデフォルトのsキーで一文字置換に慣れているので、現状未使用のflash.nvimは無効化しておきます。
.config/nvim/lua/plugins/flash.lua
return {
{
"folke/flash.nvim",
enabled = false,
},
}
insert modeを抜けた際に日本語入力をオフにする
以下サイトの通りに設定しました。 ソースコードを編集していると、改行したときにプラグインが動いてオフになる事があるのですが、 プログラミング時に日本語入力で改行することはほぼないでしょうから気にしないことにします。
zenhan.exeをパスの通ったところに置く。
.config/nvim/lua/config/autocmds.lua
local group = vim.api.nvim_create_augroup("kyoh86-conf-ime", {})
if vim.fn.has("wsl") == 1 then
vim.api.nvim_create_autocmd("InsertLeave", {
group = group,
command = "silent! !zenhan.exe 0",
})
end
スペルチェックを無効化
スペルチェックは日本語だとうまく動かないし、IDなども引っかかるので無効化します。 opt.spell = false だとうまく行かない(lazyvimがファイルタイプ指定で有効化をしている?)ので、ファイルタイプで指定しました。 とりあえずテキストとgitcommit、後は個別で追加していく。
.config/nvim/lua/config/autocmds.lua
vim.api.nvim_create_autocmd("FileType", {
pattern = { "text", "gitcommit" }, -- txtファイルは通常filetypeがtext
callback = function()
vim.opt_local.spell = false
end,
})
設定したのはこれだけです。 lazyvimを使用すれば、必須なのはフォント設定と曖昧幅文字への対処位で、他の設定は好みの範囲かと。
後はしばらく使ってみて気になる所が出てこなければ、このまま乗り換えたいと思います。