cmd.exe

最近、Cygwin 使うのやめて、MinGW/MSYS 使うようにしたんだけど、それで cmd.exe から which コマンドが使えなくなった。Cygwin だったら which.exe があるのでそのまま使えるけど MSYS では which がシェルスクリプトで実装されてるので cmd.exe からは呼べないのだった。

というほとんどの人にとってはどうでもいいニッチな悩みを抱えていたのだけど sh 呼べばいいんじゃんか、と気付いたので解決しました。こういうバッチファイル作って PATH の通ってる場所に置いた。

[which.bat]

@sh -c "which %*"

このやり方ならシェルのビルトインコマンドとかも全部 cmd.exe から呼べるってことですな。まあ bash で作業するのが一番手っ取り早いって話もあるけども。

ちなみにバッチファイルの機能だけでも一応それっぽく実現できる。

[which.bat]

@echo off
setlocal
set _HIT=%~$PATH:1
if defined _HIT echo %_HIT%

[参考] http://pgkiss.web.fc2.com/windows/batch-file.html

バッチファイル、記法がわけわかんないけど案外いろんなことできる。

こういうこまごましたスクリプト結構たくさん書いてて、%HOME%\bin に PATH 通してそこに置いてる。

- - - -

cmd.exe はたしかにシェルとしては貧弱だけど、keyhac でキーバインドだけちょっとどうにかしたらまあまあそれなりに使えるようになってて、そんなに日常的に使うわけでもないし個人的にはこれで十分かなーと思ってる。

# cmd.exe
if 1:
    def type_and_enter(command):
        keymap.command_InputKey(u"Esc")()
        keymap.command_InputText(command)()
        keymap.command_InputKey(u"Enter")()

    def cmd_cls():
        type_and_enter(u"cls")

    def cmd_exit():
        type_and_enter(u"exit")

    keymap_cmd = keymap.defineWindowKeymap(class_name=u"ConsoleWindowClass")
    keymap_cmd["C-p"] = "Up"
    keymap_cmd["C-n"] = "Down"
    keymap_cmd["C-f"] = "Right"
    keymap_cmd["C-b"] = "Left"
    keymap_cmd["C-u"] = "Esc"
    keymap_cmd["C-m"] = "Enter"
    keymap_cmd["C-h"] = "Back"
    keymap_cmd["C-d"] = "Delete"
    keymap_cmd["C-a"] = "Home"
    keymap_cmd["C-e"] = "End"
    keymap_cmd["C-(219)"] = "Esc"
    keymap_cmd["C-l"] = cmd_cls
    keymap_cmd["A-f"] = "C-Right"
    keymap_cmd["A-b"] = "C-Left"
    keymap_cmd["C-q"] = cmd_exit

ただヒストリーまわりはどうしようもないのであきらめる。あとはコマンドランチャーを組み合わせればそれなりに快適な環境になる。

PowerShell とか ckw とかの選択肢もあるけど、実際使ってみるとなんだかんだで細かいところで不満が出てきて cmd.exe でいいやーってことになった。