2007年11月26日月曜日

D言語で自作のプロンプトをつくりたい

 D言語でプロンプトを使い易くするためのツールを自作しています。なんでD言語かっていうと、それはなんとなくで。なんかD言語ってインディーズな雰囲気がして好きなのです。あと、プログラム歴は何気にVBが一番長いので、ガーベージコレクションがないと不安なのです。(freeとかmallocってなに?)
 フリーのコンパイラだと、gccとかbccとかありますが、gccはwindowsだと使いずらそうだし、bccはダウンロード時に登録が必要なのがあまり好きじゃない。

 コマンドプロンプトだと標準入力で手軽にツールを作成できるのもいいところです。だいたいプログラムを勉強すると始めにやるのは"Hello! world!!"だと思うのですが、普通にプログラムしてる人ってprintf(標準出力)なんてほとんど使わないのでは?

 最終的には migemoが利用できるプロンプトを自作したいな、なんて考えているのですが、地道にちまちまやっていこうと思っています。とりあえず第一歩として、プロンプトの骨格を以下にメモメモ。

import std.stdio;
import std.process;
import std.c.stdio;

void main(){

char c;
string com;
bool loop = true;

writef(">");

while(loop){

c = getc(stdin);

switch(c){
case 0x0a: // ret
if(com == "exit"){
// loop exit
loop = false;
} else {
// cmd execute
system(com);
}
com.length = 0;
writef(">");
break;

default:
com ~= c;
}
}
}

 D言語だとデフォルトがutf8で、Shift-JISが使えないので、標準ライブラリの readln とかが使えません。んで色々試行錯誤した結果上記な感じになりました。getcの仕組みとか、あんまりよく調べてはないけど、 たぶんそんなに的外れでもないと思ってます。switch文の中をいじれば、Ctrl+P,Nで履歴表示や、TABでのキーワード補完とかも作れそう。
 (でもホントは GNU readline が使いたい~。けどwindowsでの使い方がわからない~)

2007年11月9日金曜日

コマンドプロンプトで2画面ファイラ(風)


 今までファイラは主に「あふ(Afx)」を利用していました。キーボードだけで操作ができたり(というかマウスは利用できない)とか、DLLさえあれば、圧縮ファイルをそのまま開けたりとか、もうすごい便利。
 特に、もう定番の画面構成ですが、2画面あるっていうのは便利でした。


 パソコン使っててのファイル操作で一番利用するのって、コピーとか移動だと思うのですが、Windows標準のエクスプローラーだと、移動元、移動先のフォルダが一度に指定できないんですよね。
 2枚立ち上げればいいんでしょうが、それもメンドくさい。

 あふ使う場合は、
  1. 移動元のフォルダを左に開いて、
  2. TABキーで操作を右に切り変えて、
  3. 移動先のフォルダを右に開いて、
  4. コピー処理
なんて感じでコピーします。


 という訳で、コマンドプロンプトでも同じ操作がしたい!と思いバッチファイルを作成しました。

mark.bat

@echo off
if "%1"=="" (
set mark=%cd%
echo Mark : %cd%
prompt $_--------------------$_$d$s$g$s$c$s%cd%$s$f$_$s$s$p$_$$s
) else if "%1"=="1" (
set mark1=%cd%
echo Mark1 : %cd%
) else if "%1"=="2" (
set mark2=%cd%
echo Mark2 : %cd%
) else if "%1"=="3" (
set mark3=%cd%
echo Mark3 : %cd%
) else (
set mark=%1
echo Mark : %1
prompt $_--------------------$_$d$s$g$s$c$s%1$s$f$_$s$s$p$_$$s
)


ch.bat

@echo off
set markswap=%mark%
set markswap1=%mark1%
set markswap2=%mark2%
set markswap3=%mark3%

if "%1"=="" (
set mark=%cd%
cd /D %markswap%
echo swap : %markswap%
prompt $_--------------------$_$d$s$g$s$c$s%cd%$s$f$_$s$s$p$_$$s
) else if "%1"=="1" (
set mark1=%cd%
cd /D %markswap1%
echo swap : %markswap1%
) else if "%1"=="2" (
set mark2=%cd%
cd /D %markswap2%
echo swap : %markswap1%
) else if "%1"=="3" (
set mark3=%cd%
cd /D %markswap3%
echo swap : %markswap1%
)

 mark.bat でコマンドプロンプトでそのとき開いているパスを環境変数に設定します。履歴として過去3回分保存します。
 ch.bat で環境変数に保存しているパスと開いているパスを交換します。履歴パスに移動したい場合は、「ch 2」とか入力します。
 prompt は好みです。


 コピーする際の実際の操作は、
  1. コマンドプロンプトで移動元のAフォルダを開く。
  2. markコマンドで、移動元のAフォルダを設定。
  3. 移動先のBフォルダを開く。
  4. chコマンドで、A⇔Bを交換。Aフォルダに移動。
  5. コピーする。cp コピーするファイル %mark%
みたいな感じです。
 ch 連打で、A⇔B が自由に切り変わるので、コピーだけでなくて普通に作業するときもイイ感じです。
 2画面ファイラとは違うけれども、TABキーで左右を切り変えるのと、chで切り変えるのが似てるので、気持ち的にはあふの操作っぽいと思っているのですが、どうでしょう。




2007年11月6日火曜日

dir じゃなくって、つい ls って入力してしまう。

コマンドプロンプトいじるキッカケになったのが、
Linux の bash なので、
ついファイル構成を確認するのに、lsって入れてしまいます。

そもそも ファイル確認 って一番よく入力するコマンドだと思うんだけど、
l と s がホームポジションの右薬指→左薬指 って入力し易すぎます。
毎回毎回、dir なんて3ストロークも打ってられません。

unix のシステムってひょっとしてここまで考えて作られてるのでしょうか?
深いです。。。

ということで、
NT版UNIX-like tools」。
使わせてもらってます。
Windowsのコマンドプロンプトで、
ls とか cp とか mv とか rm とか使えるようになるコマンド集です。
あと何気に head とか tail も便利。

もう今後一生使い続けたい。
Vista とかにも対応してるんでしょうか?
開発者様にはなるべく長~い対応を
よろしくお願いしたいものです。

2007年11月2日金曜日

CUI が好きです。

CUIが好きなのです。
「GUIなんて飾りです!えらい人にはそれがわからんのです!!」
なんて言葉がありますが、まったくその通りだと考えてます。
えらい人にはわからんのですよ。。。

PCの操作では基本的にマウスは使わない方が効率的に利用できるはず。
もともとGUIってのはPCの不得手な人が、特別な知識なしで利用できるように、
というためのモンだと思ってるので、
初心者を卒業できる人はキーボードのみで利用するべきです。

なんて思いたち、なんとなく、
これからはコマンドプロンプトでPCの操作をすることにしました。
もともとファイラはAfx、fenrir、ブラウザはFirefoxのVimperatorを利用してるので、
マウスを使う機会もほとんどないのですが、
今後はさらに徹底してコマンドプロンプトで行こう!なんて。

とは言うものの、
やっぱりプロンプトだけでは使いづらいので、
いろんなツールをつくろうと考えつきました。
Rubyの松本さんも言っているように、
Geekは不満を言わずに、必要なものは自分でつくる!!

そんなこんなで自分で作成したモンをネット上で置いておけるように、
ブログ始めてみました。
これで、職場と自宅で同じ環境を再現できる♪

ちなみに環境はWindowsだったりする。
Linux はshell が使い易くていいなぁぁぁ。。。