init.luaでNeovimの設定を書いてみた

# init.lua?

久しぶりにNeovimを導入したら、Neovim 0.5からはinit.vimの代わりにinit.luaが使えるらしいと知りました。

ちなみに私の環境は以下の通り：

* Windows11
* Neovim 0.6.1(chocolatey経由でインストール)

利用条件は満たしてそうなので、使ってみることにしました。

---

ファイルの設置場所はinit.vimと同様。Linix/Unix等では`~/.config/nvim/`、Windowsでは`~\AppData\Local\nvim\`。

ちなみにinit.vimとinit.luaは共存できないので注意。

ちなみに[Getting started using Lua in Neovim](https://github.com/nanotee/nvim-lua-guide)によくまとまってるので、まずはここを見るといいと思います。日本語版もあるし。

https://github.com/nanotee/nvim-lua-guide

## :set xxxx

とりあえず`vim.opt.xxxx = true`とか書いておけば良さそう。

うまく動かなかったりよく分からないときはVimscriptやEXコマンドを実行できる`vim.cmd()`を利用すると良さそう。

`vim.o`とか`vim.bo`とかあるみたいだけど正直よく分からなかったので使ってない。

> これらには、Luaで設定するのに便利なより洗練されたラッパーとしてvim.optがあります。

（[Getting started using Lua in Neovim（日本語版）](https://github.com/willelz/nvim-lua-guide-ja/blob/master/README.ja.md)より引用。）

ガイドにもこう書いてあるのでよく分からなければ`vim.opt`を使う、でもいいはず。

## 引っかかったところ

`set noswapfile`の動作を期待して`vim.opt.noswapfile = true`と書いたら次のようなエラーが出た。

```
E5113: Error while calling lua chunk: vim/_meta.lua:659: Not a valid option name: noswapfile
stack traceback:
        [C]: in function 'assert'
        vim/_meta.lua:659: in function 'make_option'
        vim/_meta.lua:723: in function '__newindex'
```

`vim.opt.swapfile = false`にしたらエラーが消えた。init.vimおよび.vimrcで`set noXXXX`と記載するところは`vim.opt.XXXX = false`にしないといけないらしい。ブーリアン値で設定するのだから当然といえば当然。

また、Luaの文法にのっとるので当然、`set mouse=a`みたいなのは`vim.opt.mouse = a`ではなく`vim.opt.mouse = 'a'`としなくてはいけない。クオーテーションで囲み忘れるとエラーが吐くので注意。

## init.lua晒し

最後に、今使っているinit.luaを晒します。設定事項はだいたい「init.vim」とか「.vimrc」とかでググって出てきたやつです。

mapの設定とかはしてません。ぜんぶinit.vimだと`set`からはじめて書いてたやつです。

毎行`vim.opt`を書くのは面倒なので`local opt = vim.opt`を最初に宣言しています。

``` lua:init.lua
local opt = vim.opt

-- マウス有効化
opt.mouse = 'a'
opt.title = true
-- 全角文字表示設定
opt.ambiwidth = 'double'

opt.swapfile = false
opt.backup = false
opt.hidden = true
opt.clipboard:append({unnamedplus = true})

opt.number = true
opt.list = true
opt.listchars = 'tab:>-', 'trail:*', 'nbsp:+'
opt.smartindent = true
opt.visualbell = true

opt.showmatch = true

opt.expandtab = true
opt.tabstop = 4
opt.shiftwidth = 4

opt.ignorecase = true
opt.smartcase = true
opt.wrapscan = true

opt.whichwrap = 'b', 's', 'h', 'l', '<', '>', '[', ']'
opt.backspace = 'start', 'eol', 'indent'
-- Windows環境なのでdosが最初
opt.fileformats = 'dos', 'unix', 'mac'

opt.helplang = 'ja', 'en'

opt.updatetime = 300

opt.showtabline = 2
```

Githubにも置いてます。↓の最初のコミットと上に貼ったコードは同一です。

https://github.com/msattova/dotfiles/blob/main/nvim/init.lua

## 追記（2022年2月17日）

上のinit.luaの`opt.listchars = 'tab:>-', 'trail:*', 'nbsp:+'`という設定の仕方は誤りです。

```lua
opt.listchars = {tab = '>-', trail = '*', nbsp = '+'}
```
とするのが正しいやり方のようです。

上の誤った設定を書いても設定が反映されないだけでエラーは出てこなかったので気付きませんでした。申し訳ありません。

正しい書き方についてはneovimの公式ドキュメント（下記リンク）を見て知りました。Vimscriptの場合との比較つきで説明があるので非常にわかりやすいです。
（はじめにちゃんと読んでおくんだった……）

https://neovim.io/doc/user/lua.html

## これから

そのうちプラグインとか導入していくと思うので、たぶんinit.luaを複数のファイルに分割していくことになると思います。

現状、Luaにした恩恵はあまり感じてない（気持ち起動が速くなった気がする？くらい）のですがやっぱり新しいことをするのは新鮮で楽しいですね。

## 参考

https://github.com/nanotee/nvim-lua-guide

https://zenn.dev/slin/articles/2020-11-03-neovim-lua2

https://zenn.dev/mah_shee/articles/81e04b840322e4

https://mr-oliva.medium.com/neovim%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92lua%E3%81%A7%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F-8d3c219d5b42

https://imokuri123.com/blog/2020/12/neovim-init-lua/

https://neovim.io/doc/user/lua.html