WindowsにNeovimの環境構築をした

作成日:

概要

最近、コンソールのエディタとしてNeovimを使っています。今回はWindowsのPowerShellで使うためのNeovim環境を作ったので、設定内容を書いておきます。IDE的にするような機能はまだ入れていないので、ここに記載したのは単なるエディタとして使いやすくするための設定だけです。なお、Neovimのバージョンは2024年3月3日現在の最新版である 0.9.5 です。

設定後のスクリーンショット

図1

設定後のスクリーンショット

インストール

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つのプラグインを入れています。

プラグイン以外の設定は最小限にして、別ファイルを読み込む構成になっています。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で配布されています。おすすめです。



© 神和電子 2017-2023