(3)。XE Linuxコンソール版と他のDOS系の版との違い。

     XE Linuxコンソール版と他のDOS系の版との違いを述べる前に、
     移植作業で気のついた UNIX系 と DOS系 の 違いを整理しておきます。

  - ファイル名。
    . A:などのドライブIDを含まない 。
    . 経路の分離文字。 "\" と "/"。
    . 大文字/小文字が区別される。
      コマンドは小文字が普通。
    . "."や ".." もファイル名として許されるが(WindowsでもOK)、
      "!" は bash が解釈するので使用できない。
    . "*"や "?" もファイル名として許されるがコマンドで指定すると
      シェルが展開するので注意が必要。ファイルを rm したつもりが
      すべてのファイルを削除してしまうことにもなる。
    . "~" は ホーム Dir を指し示す。
    . ワイルドカード "*.*" は 間に "." を含まないファイルとは一致しない。
  - ファイル操作。
    . 0x1a(Ctrl+z)はEOFIDの意味を持たない(以降も読める)。
    . ファイル、ディレクトリーはパーミッションフラグで保護される 。
        更に t ビットオンのディレクトリーでは root か所有者以外が
        ファイルを rename/unlinkできない。
        x ビットオフのディレクトリーの中は見れない。
        mkdirの mode パラメータ指定は umask 設定により修正を受けるので
        改めて chmod が必要になることがある。
        マウントされたDOSパーティションのファイルは属性変更できない。
    . ファイルのタイムスタンプが秒単位。DOSは2秒単位。
    . cd コマンドのオペランド無しは "cd ~" の意味になる。
#ifdef XXE
      (gxe では 以下のキーボード関連説明は関係ありません)
#else
  - キーボード。
    . DOS系では スキャンコード/文字コードの組み合わせを受け取るが、
      UNIX系では F1、Insなどの拡張キーの時コンソールアプリケーションは
      エスケープシーケンス文字列を受け取る。
      (X-Applは別ですが、xtermなどのTerminalエミュレーターを使用すれば
      エスケープシーケンス文字列を受け取ることが出来る。)
      例えば Ins キーなら \x1b[2~ 等。

      以下は全画面コンソールモードの場合でX(TerminalEmulator上で動かす)の場合は(4)の章を見て下さい。

      Esc文字列はTERM 環境変数から決定されたTerminfoデータベース
      (/usr/lib/terminfo)に示されていますが、TerminfoはStringを
      シェルなどが解釈する方法を定義しているだけでキーとのマッピングは
      loadkeysで設定されます。
      loadkeys のデータは /usr/lib/kbd/keytablesにあります。
      通常は Terminfo に示された文字列が発生しますがこれを
      loadkeys コマンドで変更することができます。
    . loadkeys では左右の Alt キーを区別して設定できる。
    . 現在のマッピングの設定は dumpkeys コマンドで見ることができます。
      (この形式はそのまま loadkeys の入力にできます。)
      dumpkeys の出力の見方をサンプルで簡単に説明します。
      (私の理解で正しいかどうかは保証の限りではありません。)

       1) keymaps 0-2,4-6,8-9,12
       2) alt_is_meta
       3) keycode   1 = Escape           F83
       4)     control keycode   1 = F84
       5)     shift   alt keycode   1 = Meta_Escape
       6)     keycode  60 = F2               F14              Console_14       F2
       7)     alt      keycode  60 = Console_2
       8)     control   alt keycode  60 = Console_2
              :
              :
              :
       9) string F1 = "\033[[A"
          string F2 = "\033[[B"
          string F3 = "\033[[C"
              :

       1) マップIndexを指定します。keycode nn = の右側の各欄がどの
          シフトキーに対応するかを指定しています。
          数字は 0:Normal, 1:Shift, 2:AltGR(Alt-R), 4:Ctrl, 8:Alt(Alt-L),
          16:Shift-L, 32:Shift-R, 64:Ctrl-L, 128:Ctrl-Rの組み合わせです。
          したがって "keymaps 0-2,4-6,8-9,12" は
          Normal(0),Shift(1),AltGR(2),Ctrl(4),Shift+Ctrl(5),AltGR+Ctrl(6),
          Alt(8),Shift+Alt(9),Ctrl+Alt(12) の時の機能が "="の右に順に
          指定されていることを意味します。
       2) Alt+x(文字キー)で Meta-x を生成することを指定します。
          Meta-xが生成するコードは setmetamode コマンドで決まります。
          Esc+x か x|0x80 です。例えば Alt+a なら 0x1b61 か 0xe1 です。
       3) キーコードに割り当てられた機能を表示しています。
          キーコードは showkey コマンドで見ることができます。
          この例は keycode 1 はシフトなしで Escape,Shift+ で F83 と
          なります。F83 が具体的に何の機能かはアプリケーションが
          決めます。マッピングファイルでは 発生する文字列を定義する
          だけです。 9) 以降が文字列を定義した例です。
       4),5),7),8).
          各シフトキーとの組み合わせの機能指定は 1)で指定された欄に
          指定する以外に直接シフトキー名付きで指定できるようです。
       6) Shift+F2 に F14 が割り当てられています。
          AltGR(右Alt)+F2 が Console 14 になっていますがサポートされる
          コンソールの数は別途制限があります。
       7) Alt(左Alt)+F2 が Console 2 とあり Alt+F2で コンソール 2 の
          画面に切り替わります。
       9) Fxx が生成する文字列が表示されます。

    . Windowsでもそうですが Altキーとの組み合わせはシェルなどが先取り
      することがある。


    . xe は loadkeysコマンドでできることを初期化時にAPIを使用して設定します。
      Esc文字列の割り当ては 機能キー Fnn にしか出来ません。
      キーとShift/Ctrl/Altとの組み合わせで、xeが使用するものをにFnnを
      割り当ます。Fnnが生成する文字列は PCDOS で定義されたスキャンコード+
      文字コード+シフトIDに設定します。
      キーとScan+Charコードの対応は(9)-(a)表参照。
      例えば  F48 を Alt+キーコード 88(F12) に割り当て、
      Alt+F12 の PCDOSのScan+Charは0x8C00 なので F48 に Esc文字列
      0x1b~8C003を割り当てます。xe は Esc文字列をReadしたとき、
      先頭が 0x1b7e(^[~) なので xe 用に設定したの文字列と判断し、
      Scan+Char 0x8c00を取りだし、それから押されたキーを判定します。
      最後の一文字はシフトIDでSiftキー有り無しでScan+Charが同じ場合が
      あるのでシフトキーを判別するのに使用します。
      シフトIDは 0:なし、1:Shift、2:Ctrl、3:Alt です。

      kon(Kanji ON console)のもとで xe を実行する時はAPIによる内部的な
   設定ができないので添付のファイルで設定する必要があります。
      kon に入る前に "loadkeys xej106.map" としてください。
      但しとなりのConsoleでxeを揚げておけばAPIによる設定は効いているので
      loadkeyする必要はありませんが最後のxeが終了する時に設定は戻します。

      尚 F1 等 他の アプリケーションでも使う可能性のあるキーについては
      xe 独自の設定は避けて Terminfo で設定された 割り当て文字ストリング
      を解釈するようにしています。
      Terminfo ライブラリー(/usr/lib/terminfo)にはキーボードタイプごとの
      定義が置かれていますが、linux(/usr/lib/terminfo/l/linux)では
      例えば F1 は "^[[[A" と設定されています。
      xeの解釈するEsc文字列については(9)-(b)表 を参照してください
#endif

  - 画面。
#ifdef XXE
    . gxe 背景色はプルダウンSetupメニューからカラーダイアログで設定します。
      前景色はgxeのトップメニュー オプション 0 から設定変更します。
#else
    . curses ライブラリールーチンを利用すれば 画面の色を制御できますが
      Linuxでは背景色の高輝度がサポートされてないようです。
    . curses ライブラリールーチンではカーソルの形を変更できません。
#endif

  - その他。
    . コマンドパラメータのフラグとして "/" でなく "-" を使用する。
      また値を持つパラメータの場合UNIX系の場合、例えば "-o fnm1" でも
      "-ofnm1" でも受け入れられることが多い。
  - フロッピードライブのファイルに対するAPIはなく mtools コマンド使用。