Windows Terminal + WSL2 + Neovim で Autolist.nvim を使う場合のメモ

問題の内容

箇条書きの各行の末尾で改行したら自動的に - を追加して欲しいので、vim.keymap.set("i", "<S-CR>", "<CR><cmd>AutolistNewBullet<cr>") というキーバインドを設定しましたが、Shift-Enter をタイプしても単なる改行になっていました。

1// 期待する動作
2- hogehoge⏎ ← 末尾で改行したら
3- |         ← 自動的に `- ` を挿入してカーソルの位置を整えて欲しい
4
5// 実際の動作
6- hogehoge⏎ ← 末尾で改行したら
7|           ← 単なる改行になってカーソルが行頭に来る

<S-CR> を別のキーバインドに変更すると期待通りの動作になる上、他の機能はキチンと動作することから、プラグインの設定は問題ないと思われるのですが、<S-CR> だけが上手く動かない状態でした。

解決策

同様の問題が起きていないか調べたところ、Shift-Enter にキーバインドを割り当てても動かないという問題を複数見つけました。それらの問題への回答によると、この問題は Vim の問題ではなく、ターミナルが受け取ったキー入力をシェルに渡す部分での問題ということでした。そのため、ターミナルに対して、Shift-Enter を受け取ったらシェルに Shift-Enter を渡すよう設定する必要があるとのことでした。

幸いなことに、回答の中にターミナル毎の設定例が記載されており、Windows Terminal の設定例もありましたので、そちらを拝借して設定ファイルの actions に次のとおり設定を追加しました。

 1{
 2    "actions": 
 3    [
 4        {
 5            "command": 
 6            {
 7                "action": "sendInput",
 8                "input": "\u001b[13;2u"
 9            },
10            "id": "User.sendInput.8882FD6D"
11        },
12        {
13            "command": 
14            {
15                "action": "sendInput",
16                "input": "\u001b[13;5u"
17            },
18            "id": "User.sendInput.F8A79DCB"
19        }
20    ],

これで期待通りの動作を実現することができました。

1// 実現できた動作
2- hogehoge⏎ ← 末尾で改行したら
3-           ← 自動的に `- ` が挿入される

なお、現在の設定は次のとおりです。lazy.nvim を使ってプラグインを管理しているので、/lua/plugin/autolist-nvim.lua という名前で設定ファイルを作成しています。

 1return {
 2  {
 3    "gaoDean/autolist.nvim",
 4    ft = {
 5      "markdown",
 6      "text",
 7      "tex",
 8      "plaintex",
 9      "norg",
10    },
11    config = function()
12      require("autolist").setup()
13
14      vim.keymap.set("i", "<tab>", "<cmd>AutolistTab<cr>")
15      vim.keymap.set("i", "<S-tab>", "<cmd>AutolistShiftTab<cr>")
16      vim.keymap.set("i", "<C-t>", "<c-t><cmd>AutolistRecalculate<cr>") -- an example of using <c-t> to indent
17      vim.keymap.set("i", "<S-CR>", "<CR><cmd>AutolistNewBullet<cr>")
18      vim.keymap.set("n", "o", "o<cmd>AutolistNewBullet<cr>")
19      vim.keymap.set("n", "O", "O<cmd>AutolistNewBulletBefore<cr>")
20      vim.keymap.set("n", "<CR>", "<cmd>AutolistToggleCheckbox<cr><CR>")
21      vim.keymap.set("n", "<C-r>", "<cmd>AutolistRecalculate<cr>")
22
23      vim.keymap.set("n", "<leader>cn", require("autolist").cycle_next_dr, { expr = true })
24      vim.keymap.set("n", "<leader>cp", require("autolist").cycle_prev_dr, { expr = true })
25
26      vim.keymap.set("n", ">>", ">><cmd>AutolistRecalculate<cr>")
27      vim.keymap.set("n", "<<", "<<<cmd>AutolistRecalculate<cr>")
28      vim.keymap.set("n", "dd", "dd<cmd>AutolistRecalculate<cr>")
29      vim.keymap.set("v", "d", "d<cmd>AutolistRecalculate<cr>")
30    end,
31  },
32}

参考にしたサイト

vim - How to map Shift-Enter - Stack Overflow