のらりくらり

物理化学分野のポスドクです。プログラミング、読書、自転車などが好きです。

Ctrl+(lとかJとかmとかhとか・・・)

この前1週間ほどコンピュータの事が好きだったりそれで研究している人たちと色々話をしているときに複数回話した事なんだけど、terminalとかxtermとかそういうUNIX端末みたいなのを弄ってるとわりと頻繁にCtrl+mで改行とかCtrl+hで一文字戻る(即ちdelete)とかそういう機能を使う事になるかと思う。
なんで?っていうのを言っている人がいたのでそのカラクリを簡単に喋ってました。

別にこれって結構単純な話で、改行とか一文字消去にはそれぞれ、LineFeed(\nのこと)とかBack Spaceっていうキーコードが当てられてます。つまりキーボードから端末に情報が入力されたときは単純にAとかBとか打ってるのとなんら変わりない。
だけれどLineFeedとかはメタ文字って言って、それを端末にエコーバックするときに記号をそのまま表示するのとは違って少々それぞれで勝手の違う動きをする印だから分かりにくく感じるだけってことですね。

多分ここまではC言語をかじった事のある方ならたいてい分かると思うし、他の言語を弄った事のある人でもわかる人は普通にいると思う。

じゃあ何でCtrl+jで改行したりCtrl+hでBackSpaceなのか???ReturnキーとかDeleteキーがキーボードの右っかわについてるのになんでわざわざそんなことが出来るのか?ってなるけれど、実はCtrlはアルファベットのキー(正確には、@, A~Z,_)と一緒に押されたとき、もともとは一緒に押されたキーボードのASCIIコードから64(16真数の場合0x40)を引いた数字を端末に送るようになっていたのだ。
だからそれで計算したときに、Ctrl+Hで表されるキーコード、すなわち72-64=8のコードはBackSpaceのコードに一致していて、こういう事ができるようになる。
というかそのコードを送るための専用のキーとして、わざわざreturnとかdeleteキーがキーボードの右の方にもうけられた、と言った方が正確なのかもしれない。

ちなみに、Macでターミナル以外のソフトを弄ってるとCtrl+Hは比較的よく実装されているんだけど、それ以外、Ctrl+Mとかはほとんど使えなくなっていることを考えると、今はそういう方式ではないんだろうね。ちゃんと調べてみた訳ではないけれど。だけどググってみると無理矢理それが出来るようにされている方もいるので、やはりエミュレートする事はできるみたい。

だからキミも今日からキーコードとCtrlで64(0x40)を引いたときにどうなるかを計算してみて、もっといろいろな事が左指のCtrlと右手はホームポジションのままでコマンドラインを打てるようになろうではないか!捗るよ。

ちなみに僕はこれを

例解UNIXプログラミング教室

例解UNIXプログラミング教室

  • 作者: 冨永和人,権藤克彦
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2007/09/28
  • メディア: 単行本(ソフトカバー)
  • 購入: 6人 クリック: 185回
  • この商品を含むブログ (21件) を見る

で読んでいて、それを覚えてたのでこんなことを喋ってました。

この本はシステムコールの使い方以前にマニュアルの読み方から丁寧に書いてあって、LinuxからMac OS Xのターミナルまでそのまま書いて走らせられるサンプルが乗っているので、システムコールとかOSのAPIというものに触れた事の無い方には個人的にはすごくおすすめです。これを読んだらUNIXとWindowsのシステムコール(API)の違いが見えてきて、Windowsでのプログラミングの際でもすいすいとMSDNAPIの説明が読めるようになるかと思う。
ただ、システムコールの主要部分を大体知るには良いけれど、一方で主要部分に絞っている感もあるので(これで普段必要になるものは十分網羅できるのだけれど。)、リファレンスっぽい使い方にはならないかもしれないのと、あくまでC言語の皮をかぶったシステムコールとしての説明にとどまっているのでシステムコールの内部でなにが起こってるの?とか、その辺を取り持ってるハードウェアの部分がどういう風にうごいているのか(要はアセンブラに興味があるとかw)、というのを知りたい方には高レイヤーすぎるかもですね。