cygwinほど大規模なのは嫌だけど、そこそこにUNIXっぽい環境(ビルドのため)が欲しい人用の環境。

link *

MSYS *

Minimal SYStemの略らしい。ビルドに必要な最低限の環境を提供するのが目的なのだそうだ。

私の場合は

コマンドプロンプトで使う *

下にrxvtでの使用に関することが書いてあるが、なんだか日本語が崩れることがあったので、何じゃこりゃと思った。

rxvt_japanese_collapse.png

再描画させる(他のウィンドウで一旦隠す)と普通の表示になるので、問題は「中身」というよりは表示だけの問題なのだろう。致命的に困ることはないのだが、個人的に気にくわないし、その一方でパッチをこさえるスキルもないので、rxvtの使用をやめる方向でいろいろと考えた。他のWindows用rxvtを探してみたものの、Cygwin不要なものは無いようであった。(cygwin1.dllだけ用意すればいいのかな?)

で、結構コマンドプロンプト(/bin/sh.exeを直接実行)でもいいじゃんという感じになりつつある。cmd.exeが貧弱なのはあちこちで言われている通りだが、コマンドヒストリや補完などの機能は/bin/sh.exeが提供してくれるし、使い勝手はイマイチだがコピー&ペーストも問題ない(プロパティのオプションから簡易編集モードにチェックしておくとよい)。フォントも、自由ではないが変更は可能(参考:cmd.exe(コマンド プロンプト)のフォントを変更する | Windows | POOH.GR.JP)。最大の利点は動作の軽さとOS標準ということである。新shellであるWindows Power Shell (旧Monad)は重い上に標準とはいえない。ckwは非常に良さそうなのだが、私の環境ではCPU使用率が妙な挙動を示すため使いにくい。

以下のようなバッチファイルにWindows形式のパスを引数として与えると、下記rxvtの場合と同様に、初期ディレクトリを指定することができる。パスをshに渡す前に区切り文字を置換し、ドライブの表記を少しいじっている。

@echo off

REM remove '"'
set arg=%~1

REM replace '\' to '/'
set str=%arg:\=/%

REM remove ':'
set str=%str::=%

REM do not forget to add '/' at the beginning
C:\msys\1.0\bin\sh.exe -c "{ export INITIAL_DIR='/%str%'; exec /bin/sh --login; }"

プロンプトの表示の色がやたら暗いので、明るい色にするとよい。参考:Bash Prompt HOWTO: ANSI エスケープシーケンス: 色とカーソル操作

export PS1='\[\033]0;\w\007
\033[1;32m\]\u@\h \[\033[1;33m\w\033[0m\]
$ '

## original
#export PS1='\[\033]0;$MSYSTEM:\w\007
#\033[32m\]\u@\h \[\033[33m\w\033[0m\]
#$ '

以上を$HOME/.profileに記述し、/etc/profileには

if [ -e "$HOME/.profile" ]; then
  source $HOME/.profile
fi

という記述を追加した。また、ビープ音を消すために、~/.inputrcに

set bell-style none

を加えておく。参考:ビープ音を止める

rxvt *

操作感はlinuxのそれと変わらずなかなか良さそうである。

ペーストはshift + insert で行う。窓使いの憂鬱

window rxvt /rxvt/ : Global
key C-y = S-Insert

としてしまった。

起動は、以下を記述したバッチファイルから行う。

start C:\MSYS\1.0\bin\rxvt.exe -sl 1000 -fg White -bg Black -sr -geometry 180x70+50+50 -fn "BDF Mplus-13" -e /bin/sh -c  "{ export INITIAL_DIR="%1"; export PATH=/usr/bin:$PATH; exec /bin/sh --login -i; }"

環境変数INITIAL_DIR(バッチファイルの引数)は、初期ディレクトリを指定するために設定した。これは私が勝手に設定しただけなので、このままでは何も起こらない。/etc/profileに

if [ "$INITIAL_DIR" == "" ]; then
  cd "$HOME"
else
  cd "$INITIAL_DIR"
fi

などと記述しておくことで初めて有効になる。

フォントの指定については、MSYS-1.0.11-2004.04.30-1.exe なるものから導入したrxvtだと、Courier以外では文字の間隔の幅が異常(通常の3倍程度)に拡がってしまい、使用に耐えなかった。MSYS-1.0.10.exe だとそのようなことは起こらなかった。

geometryオプションでウィンドウのサイズを指定できるが、これがターミナルの幅(?用語はよくわからない。誤用かも)には反映されないようである。例えば、めちゃくちゃ大きい幅をgeometryで指定しても、そこでのlsの出力はせいぜい2、3列で、幅がデフォルトの80文字以内に収まるようになってしまう(せっかく大きい幅にしたのに使われない領域がありもったいない)。一方で実際にウィンドウサイズを枠のドラッグで変更すると、その幅に応じた出力がなされる(領域はフルに使われ、満足)。つまり、ターミナルとしての幅は、geometryの指定からは変更されず、ウィンドウサイズ変更時に初めて反映されるようなのである。

起動後に手動でちょこっと(1文字分以上)サイズを変えて変更を通知ればまあいいのだが、これは面倒である。是非、起動した状態で、ウィンドウ枠をフルに使える状態になっていてほしい。スキルフルな方はここでrxvtのソースをいじるのだろうが、私は安直に以下のようなプログラムを書いた。

#include "stdafx.h"
#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib,"shlwapi.lib")

int _tmain(int argc, _TCHAR* argv[])
{
  const int max_text = 256;
  TCHAR str[max_text];
  const int max_wins = 50;
  bool found = false;
  HWND hwnd = GetTopWindow(NULL);
  for(int i=0; i<max_wins; i++){
    hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
    if(!IsWindowVisible(hwnd)){
      i--;
      continue;
    }
    GetClassName(hwnd, str, max_text - 1);
    if(NULL != StrStr(str, TEXT("rxvt"))){  // found
      //sprintf(str, TEXT("%d"), i);
      //MessageBox(NULL, str, NULL, MB_OK);
      found = true;
      break;
    }
  }
  if(!found){
    MessageBox(NULL, TEXT("rxvt not found"), NULL, MB_OK);
    return 0;
  }
  
  RECT rect;
  GetWindowRect(hwnd, &rect);  
  const int x = rect.left;
  const int y = rect.top;
  const int w = rect.right - rect.left;
  const int h = rect.bottom - rect.top;
  MoveWindow(hwnd, x, y, w/2, h, FALSE);
  MoveWindow(hwnd, x, y, w, h, FALSE);
  return 0;
}

要は、rxvtを見つけてサイズを縮め、直後にもとのサイズに戻すのである。これを/binに放りこんで、/etc/profileに

/bin/RefreshRxvtSize.exe

としておくと、rxvt起動後に「サイズちょこっといじり」が自動で行われる。


添付ファイル: filerxvt_japanese_collapse.png 3756件 [詳細]

Last-modified: Sun, 19 Nov 2006 03:41:31 JST