WindowsにNeovimの環境構築をした
作成日:
概要
最近、コンソールのエディタとしてNeovimを使っています。今回はWindowsのPowerShellで使うためのNeovim環境を作ったので、設定内容を書いておきます。IDE的にするような機能はまだ入れていないので、ここに記載したのは単なるエディタとして使いやすくするための設定だけです。なお、Neovimのバージョンは2024年3月3日現在の最新版である 0.9.5 です。
インストール
Neovim本体
私は Scoop というWindows用パッケージマネージャを使っているので、scoop
でインストールしました。
scoop install neovim
他のインストール方法は Neovim公式サイト を参照してください。
プラグインマネージャ(vim-plug)
Neovimのプラグイン管理を行うプラグインにはいろいろありますが、私はVimでずっと vim-plug を使ってきたので、そのまま vim-plug を使うことにしました(Vimの設定ファイルからコピペでプラグインの移行もできるので)。
インストールはREADMEに書いてある通りのコマンドを叩きます。
iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
ni "$(@($env:XDG_DATA_HOME, $env:LOCALAPPDATA)[$null -eq $env:XDG_DATA_HOME])/nvim-data/site/autoload/plug.vim" -Force
設定ファイルについて
Vimの.vimrc
に相当する設定ファイルは、Neovimではinit.vim
(またはinit.lua
)になります。
設定ファイルの場所は、Windowsだとデフォルトで C:\Users\<ユーザー名>\AppData\Local\nvim\init.vim
になるようです。なお、Linuxでは~/.config/nvim/init.vim
です。
PowerShellだと以下のようにして設定ファイルを編集できます。
# 最初はフォルダがないのでつくる必要あり
mkdir $HOME\AppData\Local\nvim
nvim $HOME\AppData\Local\nvim\init.vim
なぜか$HOME
の代わりに~
を使うとnvimでは開けないようなので注意しましょう。
面倒なので、私は以下をPowerShellのプロファイル(nvim $profile
で編集できます)に書き込んで、editneoviminit
で設定ファイルを編集できるようにしました。
function editneoviminit {
nvim $HOME\AppData\Local\nvim\init.vim
}
Neovimの設定ファイルは init.vim
にVimと同様のVim scriptで書く以外に、init.lua
にLuaで書くこともできます。私は、次のような方針を選びました。
- 設定ファイルのルートはVim scriptの
init.vim
とする。 - 設定を小分けにし、
init.vim
から読み込む。小分けにした設定はLuaまたはVim scriptで書く。
これは、基本的にはVim向けの設定をそのままコピペできるようにした上で、Neovim専用のプラグイン等のLuaでの設定例のほうが多く見つかりそうなものはLuaで書く、という使い分けを考えた構成です(自分でVim scriptとLuaの間の相互変換をあまりしたくないので……)。
init.vim
からLuaの設定ファイルを呼ぶのは簡単で、$HOME\AppData\Local\nvim\lua\config-base.lua
というファイルを置いたとすると、
" init.vim に以下を書くと lua/config-base.lua が読み込まれる
:lua require("config-base")
のように1行書くだけです。Vim scriptからLuaを呼ぶには :lua
と書けばよく、これでLuaのモジュール読み込み関数であるrequire()
を呼んでいます。なお、逆にLua側からVim scriptを呼ぶにはvim.cmd()
を使います。詳細は Lua-guide - Neovim docs を参照してください。
init.vim
からVim scriptの設定ファイルを呼ぶには、$HOME\AppData\Local\nvim\vim\test.vim
というファイルを置いたとすると、
" init.vim に以下を書くと vim/test.vim が読み込まれる
:runtime! vim/test.vim
とします(今のところまだ使っていませんが)。
各設定ファイルの中身
init.vim
ルートであるinit.vim
は以下のようにしました。
call plug#begin()
" カラースキーム
Plug 'rose-pine/neovim', { 'as': 'rose-pine' }
" ファイルマネージャー
Plug 'lambdalisue/fern.vim'
" タブバー
Plug 'romgrk/barbar.nvim'
call plug#end()
" 基本的な設定
:lua require("config-base")
" Windows用の設定
:lua require("config-windows")
" カラースキーム
colorscheme rose-pine
" fern
nnoremap <C-n> :Fern . -reveal=%<CR>
" barbar
:lua require("config-barbar")
vim-plugで3つのプラグインを入れています。
- rose-pine/neovim: カラースキーム
- lambdalisue/fern.vim: ファイルマネージャー(ファイルをツリーで表示してくれるやつ)
- romgrk/barbar.nvim: タブバーを追加する
プラグイン以外の設定は最小限にして、別ファイルを読み込む構成になっています。fernの設定は直書きしてありますが、これは現状1行だけだからで、行数が増えたら別ファイルに切り出します。
fernの設定は、Ctrl + N
でfernの画面を開くという単純なものです。
lua/config-base.lua
エディタとしての基本的な設定です。設定として特筆するようなものはないです。
--------------
-- 基本設定 --
--------------
-- 文字コード
vim.scriptencoding = 'utf-8'
vim.opt.encoding = 'utf-8'
vim.opt.fileencoding = 'utf-8'
-- 見た目系
vim.opt.number = true
vim.opt.mouse = 'a' --マウス操作を有効化
vim.opt.hlsearch = true
vim.opt.backup = false
-- インデント系
vim.opt.expandtab = true
vim.opt.breakindent = true
vim.opt.shiftwidth = 4
vim.opt.tabstop = 4
vim.opt.wrap = true
vim.opt.cindent = true
-- エディタ挙動系
-- vim.opt.backspace = 'indent,eol,start' -- デフォルトなので無効化
-- その他
vim.opt.helplang = 'ja', 'en'
Vim scriptで set encoding=utf-8
と書いていたところはLuaでは vim.opt.encoding = 'utf-8'
と書くといったふうに、基本的にはvim.opt
以下の変数を設定します。設定できる項目は Options - Neovim docs に書いてあります。
lua/config-windows.lua
Windows特有の設定です。WSL環境などにコンフィグを流用することを考えて別ファイルにしています。
-- Windows特有の設定を入れる
-- ヤンクなどでクリップボードを使うようにする
vim.opt.clipboard = 'unnamed'
lua/config-barbar.lua
タブバーを表示するプラグインである barbar の設定です。設定を自分で書くと大変そうなので、基本的には全て公式のREADMEにある例のコピペです。最初の require'barbar'.setup
のところだけは追加したもので、アイコンフォントを使わないように設定しています(アイコンフォントまわりは面倒そうだったので)。
-- タブバーのプラグイン barbar の設定
require'barbar'.setup {
-- アイコンフォントを使わない
icons = {
filetype = { enabled = false }
}
}
local map = vim.api.nvim_set_keymap
local opts = { noremap = true, silent = true }
-- Move to previous/next
map('n', '<A-,>', '<Cmd>BufferPrevious<CR>', opts)
map('n', '<A-.>', '<Cmd>BufferNext<CR>', opts)
-- Re-order to previous/next
map('n', '<A-<>', '<Cmd>BufferMovePrevious<CR>', opts)
map('n', '<A->>', '<Cmd>BufferMoveNext<CR>', opts)
-- Goto buffer in position...
map('n', '<A-1>', '<Cmd>BufferGoto 1<CR>', opts)
map('n', '<A-2>', '<Cmd>BufferGoto 2<CR>', opts)
map('n', '<A-3>', '<Cmd>BufferGoto 3<CR>', opts)
map('n', '<A-4>', '<Cmd>BufferGoto 4<CR>', opts)
map('n', '<A-5>', '<Cmd>BufferGoto 5<CR>', opts)
map('n', '<A-6>', '<Cmd>BufferGoto 6<CR>', opts)
map('n', '<A-7>', '<Cmd>BufferGoto 7<CR>', opts)
map('n', '<A-8>', '<Cmd>BufferGoto 8<CR>', opts)
map('n', '<A-9>', '<Cmd>BufferGoto 9<CR>', opts)
map('n', '<A-0>', '<Cmd>BufferLast<CR>', opts)
-- Pin/unpin buffer
map('n', '<A-p>', '<Cmd>BufferPin<CR>', opts)
-- Close buffer
map('n', '<A-c>', '<Cmd>BufferClose<CR>', opts)
-- Wipeout buffer
-- :BufferWipeout
-- Close commands
-- :BufferCloseAllButCurrent
-- :BufferCloseAllButPinned
-- :BufferCloseAllButCurrentOrPinned
-- :BufferCloseBuffersLeft
-- :BufferCloseBuffersRight
-- Magic buffer-picking mode
map('n', '<C-p>', '<Cmd>BufferPick<CR>', opts)
-- Sort automatically by...
map('n', '<Space>bb', '<Cmd>BufferOrderByBufferNumber<CR>', opts)
map('n', '<Space>bd', '<Cmd>BufferOrderByDirectory<CR>', opts)
map('n', '<Space>bl', '<Cmd>BufferOrderByLanguage<CR>', opts)
map('n', '<Space>bw', '<Cmd>BufferOrderByWindowNumber<CR>', opts)
-- Other:
-- :BarbarEnable - enables barbar (enabled by default)
-- :BarbarDisable - very bad command, should never be used
操作はコメントにある通りで、
Alt + ,
とAlt + .
で 左右のタブに移動するAlt + 数字
で左からn番目のタブに移動するAlt + C
でタブを閉じる
ことができます。
その他
ターミナルのフォントには Sarasa Fixed Slab J
(更紗ゴシックの等幅、リガチャなし、スラブセリフ、日本語版)を使っています。これは、Adobe Source Han Sans(源ノ角ゴシック)と Iosevka (Slab) を合成したプログラミング用フォントで、be5invis/Sarasa-Gothicで配布されています。おすすめです。