Windows Terminal で Ctrl-H が Backspace と認識されないケースについて調べてみた(5/24追記あり)

nyagos では大丈夫なんだけど、コンソール版 vim.exe だと、Ctrl-H をタイプすると Backspace と認識されず豆腐(□)が表示される。

ちょっとしたコードを書いて、違いを比較してみた。

package main

import (
    "fmt"

    "github.com/zetamatta/go-console/getch"
)

func main() {
    getch.Flush()

    // get console event
    fmt.Println("Type ESC-Key to program shutdown.")
    for {
        e := getch.All()
        if k := e.Key; k != nil {
            fmt.Printf("key down: code=%04X scan=%04X shift=%04X\n",
                k.Rune, k.Scan, k.Shift)
        }
        if k := e.KeyUp; k != nil {
            fmt.Printf("key up: code=%04X scan=%04X shift=%04X\n",
                k.Rune, k.Scan, k.Shift)
            if k.Rune == 0x1B {
                break
            }
        }
    }
}

コマンドプロンプトでは:

$ ./example5.exe
Type ESC-Key to program shutdown.
key up: code=000D scan=000D shift=0000
key down: code=0000 scan=0011 shift=0008
key down: code=0008 scan=0048 shift=0008
key up: code=0008 scan=0048 shift=0008
key up: code=0000 scan=0011 shift=0000
key down: code=001B scan=001B shift=0000
key up: code=001B scan=001B shift=0000

Ctrl-H のコードがBackspace文字通り Ctrl + H (code=0008,shift=0008)と認識されている。

Windows Terminal では:

$ ./example5.exe
Type ESC-Key to program shutdown.
key down: code=0000 scan=0011 shift=0008
key down: code=007F scan=0008 shift=0008
key up: code=007F scan=0008 shift=0008
key up: code=0000 scan=0011 shift=0000
key down: code=001B scan=001B shift=0000
key up: code=001B scan=001B shift=0000

Ctrl-H のコードが Ctrl+Del(code=007F,shift=0008) と認識されている。なるほど。

.vimrc で Ctrl+Del を Backspace 相当にアサインすればよさそうだけど、どうすりゃいいんだ?

inoremap <C-Del> <Bs>
inoremap <Del> <Bs>

と書いてみたけど、効いてなさそう…うーむ

(追記)
inoremap <C-Char-0x7f> <Bs>

で Ctrl-H がBackspace として機能するようになった。