Humanity

Edit the world by your favorite way

端末アプリで Ctrl-[ が Esc になる理由

理由

SHIFT キーはキーコードを -0x20、CTRL キーはキーコードを -0x40 する機能

全文

vim-jp.slack.com の #random から。

heavenshell [10:08 AM]
TouchBar MBP にしたら強制的に C-[ になるので、オススメです!ようやく矯正できた。

mattn [10:09 AM]
人間の方が最適化されている

yoshitia [10:12 AM]
Escが物理的にない状況用にデフォルトでCtrl-[ 用意してるのすごい

mattn [10:14 AM]
いや、用意した訳ではないです。
SHIFT キーはキーコードを -0x20、CTRL キーはキーコードを -0x40 する機能なのです。
なので `[` つまり 0x5b は 0x1b になる。
0x1b = ESC
同様に CTRL-H は H が 0x48 なので 0x08、つまり BS になる。

yoshitia [10:17 AM]
元からある仕組み上、代用ができちゃうだけなんですね

mattn [10:17 AM]
ですです。
逆に言うと
`;` は 0x3b なので CTRL を使うと 0 以下になる、つまり使えないという事です。
端末の場合はマッピング出来る事もありますが、gvim で出来ないのはそれが理由です。

yoshitia [10:19 AM]
符号付UNICODEの機運(ない

KoRoN [10:26 AM]
僕は ENTER の代わりに CTRL+M 使うことが多い。 (0x4D - 0x40 = 0x0D)
あれ? あれ?
M=0x4D, m=0x6D だな。
小文字基準で CTRL は -0x60 とすべきなのかな。 (edited)

mattn [10:30 AM]
あ、ですです
これちなみに Unicode も受け継いでてくれてて

KoRoN [10:30 AM]
でもそうすると 5b が説明つかん?

mattn [10:30 AM]
`a` と `A` は -0x60 なんすよね
CTRL は 0x40

KoRoN [10:31 AM]
やっぱ大文字基準で、 SHIFT=+0x20 CTRL=-0x40 のほうが合致しそう。

KoRoN [10:32 AM]
そういや昔のプログラム、全部大文字だったりしたな。

mattn [10:32 AM]
これ、0 割れした場合の処理が端末毎に異なってるのがイヤらしいんすよ。
* 受け付けない
* 300 から引く
みたいな色々流儀がある

コマンドラインで動くリンク切れチェッカー

ちょっと前 Twitter で教えてもらったのでブログに書いてみる。

qiita.com

最初 <a> タグを見つけて再帰的に調べてくれるやつが欲しかったので見た感じ linkchecker が最適かと思ったけど、 インストールにちょっとだけ躓いてしまってその間に wget でもできると教えてもらって試したらこれで十分だった。

こんな感じの結果が出る。

wget --spider --recursive --level=inf --no-verbose --execute robots=off localhost:8000

Found 3 broken links.

http://localhost:8000/aaa
http://localhost:8000/bbb.html
http://localhost:8000/js/foo.js

シングルページの場合は puppeteer とか使った方が良いんだろうけど、今回はそういうわけではなかったのでこれで良かった。 wget 便利。

linkcheckercrawler はあんまり調べてないけど、 linkchecker は色々高機能でサイトマップの生成なんかもできたりするっぽい。 crawler は "BFS webcrawler that implements Observable" とのことで recursive でも幅優先で見てくれるのが特徴かも。

Vim の端末ウィンドウから別のウィンドウに移る時にコマンドを実行中にしておく

tyru.hatenablog.com

を書いた後 vimrc を整理していたら書きかけの設定があったのでこれも公開。 autocmd vimrcvimrc は適当に変えてください(分からない人はそのままでもいいです)。

" Enter Terminal-Job mode when leaving terminal window
autocmd vimrc TerminalOpen *
\ autocmd vimrc WinLeave <buffer>
\   if term_getstatus('') =~# '\<normal\>' |
\     execute 'normal! GA'                 |
\   endif

これを vimrc に書くと、端末ウィンドウで <C-w>N で一旦端末ノーマルモードに移って出力を止めた後、 そのまま別のバッファに移動しようとすると端末ジョブモードに戻してコマンドを実行中の状態にします。 すごくニッチですが、個人的には端末ノーマルモードにしたいのはコピペする時や遡って出力を見たい時ぐらいなので、 別ウィンドウに移る時は端末ジョブモードにしておいて欲しいというのがあります。 上記の設定はそれを行ってくれます。

f:id:tyru:20180925004513g:plain