[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] dired-do-shell-command (learning lisp)



井上です。

まず、Emacs-20のヘルプでは足りない情報が一つあります。
Emacs-21のcall-processに関するヘルプを見ると、最初はこうなってます。

------
call-process is a built-in function.
(call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)
------
これがないと、文章の意味がかなり分からないのではないでしょうか。
この2行目はcall-processの関数の呼び出し形式を示したもので、引数が大文字
で書かれています。
後に続く説明文は、この大文字の単語一つ一つについて、その意味を示している
のです。
&optional以降はなくてもいい引数という意味です。
それをふまえて読んでみるとかなりの疑問は氷解するのではと思います。

Reiko TAKAHASHI <HFC03614@...> writes:

>  /dev/null は、DOSでいったら <nul (なんてできるかどうか知らないけど……)
> みたいな雰囲気でしょうか?

たぶんそうです。
だから、入力を受け取るようなコマンドを起動するときは注意が必要です。

> Insert output in BUFFER before point; t means current buffer;
>  nil for BUFFER means discard it; 0 means discard and don't wait.

このBUFFERは上の関数呼び出し形式でオプショナル引数の二つ目にあるBUFFERを
指しています。BUFFERには(get-buffer "名前")などで得られるバッファ型の値
(これについての質問がきたらどうしよう)が入ります。tにすると、勝手に
(current-buffer)
の結果を入れてくれるようです。
nilか0ではどこにも結果を吐き出さず、0の場合は起動した子プロセスに勝手に
仕事をさせておいてEmacsの処理に戻るということです。
0はシングルタスクであるDOSでは使えないでしょう。

> BUFFER can also have the form (REAL-BUFFER STDERR-FILE); in that case,
> REAL-BUFFER says what to do with standard output, as above,
> while STDERR-FILE says what to do with standard error in the child.

起動したプログラムの標準出力と標準エラー出力をどう扱うかという話です。

> Fourth arg DISPLAY non-nil means redisplay buffer as output is inserted.

プロセスが終了した時点で勝手にバッファを再表示するかということみたいです
ね。。。

>  ↑は全然わからないのですが、ひとまずわからなくてもいいですか?(^.^)

とりあえずBUFFERにtを指定すると現在(プログラム実行の中で)いるバッファ
に起動したコマンドの結果が帰ってくるということだけ分かればいいでしょう。


> Remaining arguments are strings passed as command arguments to PROGRAM.

......

>  ↑はわかっていたほうがよさそう……でしょうか?

残した部分だけは引数を渡すのに使うので分かっておく方がいいでしょう。

> BUFFER is 0 の意味は……引数がなかったら(nil だったら?)ということです
> か???

ここは上に書いたように、BUFFERの位置にある引数が0だったとき、つまりコマ
ンドの終了を待たないという指定の時です。DOSではできないので関係ないです
が。

> (call-process gr nil nil nil -g1 nil)

コマンド名と引数は文字列なので
(call-process "gr.exe" nil nil nil "-g1")
#最後のnilはいらない?
とかになると思います。
でも、これを*scratch*で評価したら固まってしまった・・・


> に、(defun ...(でなにかの名前を付けて、それになにかのキーを割り当てて……
> のような手順でできるでしょうか?

まずcall-processさえうまく行けばできるでしょう。

>  なるほど! でも……、だったら↓は、なぜ interactive なんでしょう?
> もしかして、"s"に秘密があるのでしょうか。
> 
> ;;; diredでディレクトリを削除
> (add-hook 'dired-mode-hook
>           '(lambda ()
>              (defun delete-directory-recursive (dir)
>                (interactive "s")
>                (call-process "deltree" nil nil nil "-y" dir))

分かりません。つくった人がM-xでテストしたかったとか?

# やっぱり元のキーボードに戻してみようかな・・・

-- 
                    Koichi Inoue, ARGV
                    E-Mail: inoue@...
                    ICQ UIN: 74900690