恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

Neovimのオプション設定(init.lua)

Neovimのオプション設定をしてみたのですが、Lua形式の設定を知らなかったので時間がかかりました。

目次


Lua-guide

Lua-guide - Neovim docs

NeovimでLuaを使う場合の基礎が上記のページに記述されています。このページを拾い読みしながらinit.lua(Neovimの設定ファイル)を作成しました。

設定を記述するファイル

Neovimの各種設定を記述するファイルはinit.luaです。オプションの設定もこのファイルに記述します。

~/.config/nvim/init.lua


オプション設定の基本形

オプションを設定する時の基本形は

vim.opt.[オプション名] = [引数]

です。

Vimで次のようなオプション設定をしていたとして、

" 現在行から見た行番号を表示する
set relativenumber

これをNeovimのinit.luaファイルに記述する場合、次のようになります。

-- 現在行から見た行番号を表示する
vim.opt.relativenumber = true

(備考)-- から右側はコメントとなります。

ちなみに、オプションには種類があり、「グローバルオプション、バッファローカルオプション、ウィンドウローカルオプション」の3つです。この3つを区別して次のように記述することもできます。

vim.o.[オプション名]  = [value]  グローバルオプション
vim.bo.[オプション名] = [value]  バッファローカルオプション
vim.wo.[オプション名] = [value]  ウィンドウローカルオプション


vim.optとvim.o等

vim.o、vim.bo、vim.woではグローバル、バッファローカル、ウィンドウローカルを区別して記述しますが、vim.optはそれらを区別することなく使用できるので便利です。

NeovimのLua-guideによると、vim.optの不便な所はオプションの値を調べる時に:get()を使う必要があることだそうです(以下はLua-guideからの引用です)。

print(vim.opt.smarttab)
--> {...} (big table)
print(vim.opt.smarttab:get())
--> false

vim.optを使用した1行目のprint文ではsmarttabオプションに設定されている値を取得できていません。3行目のprint文では :get()を使うことで値を取得できています。

一方、vim.o vim.bo vim.wo を使用した場合、オプションの値を直接調べられます(以下はLua-guideからの引用です)。

vim.o.smarttab = false   -- :set nosmarttab
print(vim.o.smarttab)
--> false

1行目の「-- :set nosmarttab」はコメントなので無視してください。
1行目でsmarttabにfalseという値をセットし、2行目のprint文では(:get()を使うことなく)セットした値を取得できています。

ついでに引用しておくと、Lua-guideには以下の記述もありました。

vim.o : behaves like :set
vim.go: behaves like :setglobal
vim.bo: for buffer-scoped options
vim.wo: for window-scoped options


オプション設定例

オプションの設定例をいくつか記載します。

数値を指定する場合

vim.opt.tabstop = 4


bool値を指定する場合

vim.opt.relativenumber = true

(備考)trueかfalseを指定します。

文字列を指定する場合

vim.opt.clipboard = 'unnamedplus'


Vimの +=、^=、-=に相当するもの(以下はLua-guideからの引用です)。

vim.opt.shortmess:append({ I = true })
vim.opt.wildignore:prepend('*.o')
vim.opt.whichwrap:remove({ 'b', 's' })

たとえば、Vimの.vimrcにおいて

set formatoptions+=mM

と記述していたものは、次のように記述します。

vim.opt.formatoptions:append({m = true, M = true})


以下はNeovimのオプションではなく、Vaffleというプラグインのオプションですが、これを例にして変数を使う場合に触れておくと、

let g:vaffle_show_hidden_files = 1

Vimで記述していた場合、Neovimでは

vim.g.vaffle_show_hidden_files = 1

と記述します。

Lua-guideから引用しておきます。

vim.g: global variables (g:)
vim.b: variables for the current buffer (b:)
vim.w: variables for the current window (w:)
vim.t: variables for the current tabpage (t:)
vim.v: predefined Vim variables (v:)
vim.env: environment variables defined in the editor session


ヘルプでオプションを調べる

ヘルプを調べる場合、調べたいオプション名にシングルクォーテーションを付けます。

:h 'relativenumber'


なお、オプションがグローバル、バッファローカル、ウィンドウローカルのいずれなのかはヘルプの冒頭に記述されています。以下はrelativenumberのヘルプです。

'relativenumber' 'rnu'   boolean (default off)
                        local to window
    Show the line number relative to the line with the cursor
    in front of each line. (以下略)

local to windowという記述から、このオプションはウィンドウローカルオプションだと分かります。

booleanという記述があるので指定する値はtrueかfalseです。

vim.opt.relativenumber = true


オプションの一覧を見る

オプションの一覧を見る場合は次のようにします。

:h option-list


失敗談

失敗談を書きます。undoファイルの場所を指定する場合、

vim.opt.undodir = '/home/hoge/.nvim/undo'

のようにしますが、これを

vim.opt.undodir = '~/.nvim/undo'

と記述したら、ホームディレクトリに ~ という名前のディレクトリが作成されていました(汗)。そこで、~を使わずに/home/hoge/という風に書いています。


記法をいくつか試した時のメモ

whichwrapオプションを設定するにあたり、NeovimのLua-guideに載っていた記法をいくつか試しました。以下はその時のメモです(私がLuaという言語を分かっていないので、意味不明なことをしているだけだと思いますが)。

結果だけ先に書いておきますと、

vim.opt.whichwrap = 'h,l,<,>,[,],~'

と記述するのが一番楽だなと思いました。

以下、試したことを羅列します。

Lua-guideにある

vim.opt.wildignore = { '*.o', '*.a', '__pycache__' }

という記述例を真似して

vim.opt.whichwrap = {'h', 'l'}

と記述したらinit.lua読み込み時にエラーとなりました。

Lua-guideに

vim.opt.whichwrap:remove({ 'b', 's' })

という記載があったので、append、prepend、removeは使えそうだと思い、試してみました。

vim.opt.whichwrap:append('h', 'l')

と記述したら、h は機能しますが l は機能しませんでした。先頭のものしかappendされていないようです。

vim.opt.whichwrap:append('h')
vim.opt.whichwrap:append('l')

と記述したら、h も l も機能しました。しかし、これだと行数が多くなるので使いたくありませんね。

vim.opt.whichwrap:append('h,l')

と記述すると h も l も機能しましたが、これなら

vim.opt.whichwrap = 'h,l'

と記述した方が文字数が少なくて良いですね。

次に

vim.opt.whichwrap = { h = true, l = true }

と記述したら、これは h も l も機能しました。
しかし、< 等の記号には使用できませんでした。たとえば、

vim.opt.whichwrap = {< = true}

と記述したら、init.lua読み込み時にエラーとなりました(< をエスケープすれば良いのかもしれませんが、Luaの知識が無いので不明です)。

< 等の記号でもappendでは使用できました。たとえば

vim.opt.whichwrap:append('<')

と記述すると、< が機能しました。