初めに
今、エディタはVSCodeの一人勝ち状態ですよね
かつてはvim vs emacsやatom、Sublime Text、Eclipse、NetBeans、 Innteli J、PHP Stormと開発者の数だけ異なった開発環境があるような印象さえ持っていました
(ここでは、エディタとIDEをどちらもコードを書くためのツールとして一纏めにします)
私がよく書くのはPythonで、続いてTypeScript、時折golangといったところです
Yaml、JSON、TOMLといった設定系を書くことも多く有ります
PythonならInnteli J、TypeScriptならVSCodeといった感じで適当に使い分けています
ちょっとしたきっかけでNeovimを使い始め、それの使い勝手が大変良く、もうこれで良いんじゃないかと思ったので、こちらをPostします
VimとNeovimってどう違うの?
よく分かっていません
Vimの良いところはそのままに、メインブランチに取り込まれまれるのが難しそうなモダンな機能を盛り込んだものぐらいの認識です
新しい方が良いのではと思い、Neovimを使っています
→探してみたところ、この記事で解説されていました
色々設定しないといけないんでしょ?
そうです、けど難しいものではありません
設定は大きく分けて、Vim自体な設定とプラグインの設定があります
基本的な設定は、適当に検索して丸々Copy&Pasteして、違和感あるところを変更していけば良いかと思います
プラグインの設定は、プラグインのサイト(Github)にサンプル設定が提示されていますので、まずはそれをCopy&Pasteすれば大丈夫です
設定とかプラグインとか
設定
init.luaを使っています
ディレクトリ構成は下のようにしています(なお、nvim-treeのスナップショットです)
Vim自体の設定をbase.luaとkeymap.luaに分けて、プラグインの設定はpluginディレクトリの置いています
vim.scriptencoding = "utf-8"
vim.opt.encoding = "utf-8"
vim.opt.fileencoding = "utf-8"
vim.opt.backup = false
vim.opt.writebackup = false
vim.opt.number = true
vim.opt.hidden = true
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.autoindent = true
vim.opt.smartindent = true
vim.opt.expandtab = true
vim.opt.signcolumn = "yes"
vim.opt.laststatus = 2
vim.cmd 'colorscheme tokyonight-storm'
vim.opt.mouse = 'a'
vim.g.mapleader = " "
vim.opt.updatetime = 300
vim.opt.signcolumn = "yes"
ポイントは、vim.g.mapleader = " "
でしょうか
プラグインの呼び出しとかをspace + 任意のキーに割り当てられるので、いい感じに作業を進められます
keymapは下のようにしています
Cocの内容を含めるとかなり長くなるので、一部の掲載です
local builtin = require('telescope.builtin')
local keyset = vim.keymap.set
keyset('n', '<leader>f', builtin.find_files, {})
keyset('n', '<leader>g', builtin.live_grep, {})
keyset('n', '<leader>b', builtin.buffers, {})
keyset('n', '<leader>h', '<C-w>h')
keyset('n', '<leader>l', '<C-w>l')
keyset('n', '<leader>j', '<C-w>j')
keyset('n', '<leader>k', '<C-w>k')
keyset('n', '<leader>n', ':NvimTreeFocus<CR>')
keyset("n", "[g", "<Plug>(coc-diagnostic-prev)", {silent = true})
keyset("n", "]g", "<Plug>(coc-diagnostic-next)", {silent = true})
keyset("n", "gd", "<Plug>(coc-definition)", {silent = true})
keyset("n", "gy", "<Plug>(coc-type-definition)", {silent = true})
keyset("n", "gi", "<Plug>(coc-implementation)", {silent = true})
keyset("n", "gr", "<Plug>(coc-references)", {silent = true})
<space>-b
でバッファの一覧をインクリメンタルに絞り込めますし、Windowの移動も<space>-[hljk]
で出来ます
これらの設定で、自分がやりたい作業を直観的に出来るようになりました
プラグインマネージャー
プラグインのインストールを良い感じにやってくれます
luaベースだと、packer.nvimがよく出てきますが、unmaintainedになっていますので、lazy.nvimを使っています
(個人的に)必須パッケージ
Coc.Nvim
補完とか、関数の定義元に移動したり、参照元を探したりしてくれるプラグイン
これがなければ、Nvimを使おうとは思いませんでした
このパッケージプラスcoc extensionsで幸せになれます
nvim-tree
ファイラーです
ファイルに関する作業がvim内で完結出来るのは大きな利点かと思います
使い方が分からない場合は、g?
で一覧が表示されるので、そちらを検索すれば問題なく作業を進められます
telescope.nvim
Emacsでいうanythingです(知っている方いらっしゃいますかね?)
特定ディレクトリとか作業中のファイルの一覧を出し、インクリメンタルに絞り込んでくれます
作業中ファイルの移動ストレスがかなり軽減されます
お好みで
FTerm
ターミナルを表示したり、裏面に隠したりしてくれるプラグインです
コマンドを打って戻っての作業コストが激減します
toggleterm等もっと多機能なプラグインもありますが、私の場合はこれで十分でした
vim-commentary
良い感じにコメントアウトしてくれます
nvim-cursorline
カーソル下と同じ変数等を教えてくれるプラグインです
nvim-lualine
画面下部のステータスラインをいい感じにしてくれるプラグインです
作業中のファイルが分からなくなったため、初めはステータスラインをセットしていましたが、こちらの方がテーマや配置をえらべるので使うようになりました
notice.nvim
:をうった後に出てくるコマンド入力欄を画面の真ん中に出したりするプラグインです
目線の移動が少なくて済む点や、罫線に色がついていたりして、少し楽しくなります
Tokyo Night
今使っているカラースキームはこちらになります
vimcolorschemesから好みで選べば良いかと思います
GUI
Vimを使うのに、ターミナルを起動して、vimコマンドを打ってというのは、繰り返すのを日々繰り返すのはアレですので、ラップしてくれるGUIを探しました
何種類か試した結果、Neovim Qt が起動が早く、フリーズすることもなかったので、こちらを利用しています
私の環境はMacなので、brewでinstallしました。Dockに追加してそちらから起動しています
終わりに
使い始めてそんなに日数が経っていませんし、新たなプラグインを導入したり、設定を変えたり、やっぱりIntelli Jサイコーとか言って乗り換える可能性もありますが、今のところ気持ちよく使っています
もし、(Neo)vimの利用を検討されている方がいらっしゃり、その一助となれば嬉しく思います