標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

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 として機能するようになった。

(さらに追記)

Windows Terminal 1.4.3.141.0 では直ってた。