[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
この章では困った時に役立つことを紹介していきます.前半がヘルプやマニュアルの読み 方,関連する Elisp ,後半がトラブル解決のための方法や知識などになります.
ただし,基本については以下で紹介しましたので,そちらを参照ください.
Meadow に附属のマニュアルの読み方.
キーバインドの調べ方など。M-x help-for-help で実行できるものはここで説明し ています。
タイトル通り.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
参考サイト:http://plaza28.mbn.or.jp/~kitaj/diary/200102.html#20010207-2
Unix の基本で述べた通り, Unix はたくさんのコマンドを組み合わせることでたくさんの 機能を実現できます.しかし,初心者にとっては,そもそもコマンドが何をするのかよく 分からないものです.
そこで, Unix には man というコマンドが用意されています.これは, bash で
man ls
のようにして実行します.これで, ls のマニュアルを読むことができます.
他のコマンドのマニュアルを読みたい場合には ls の部分を適当に変えると,入力したコ マンドのマニュアルを読むことができます.
また, bash で以下のように入力することも勉強になります.
% cd /bin % for i in *; do > man $i > done
これを実行すると,マニュアルのあるものが順番に次々と表示されます.最初の数行だけ でもさっと目を通していくと,どんなコマンドがあるかなということが把握できます.
65.1.1 コマンドのマニュアル (2004/12/16) 65.1.2 man の検索 ― apropos (2004/12/16) 65.1.3 man を Meadow で実行する (2004/12/16) 65.1.4 man を Meadow で読む ― woman (2004/12/16) 65.1.5 man と info を補完選択 ― iman (2004/12/17)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
man でマニュアルが用意されていない場合もあります.
その場合は, C:/cygwin/usr/info などに, Meadow で読むことのできる info ファイル が用意されている場合もあります.一度,エクスプローラなどで info というフォルダが ないか調べてみるといいです.そして,暇な時にでも少しずつ読んでいきましょう.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Unix のコマンドである apropos , makewhatis の説明.
man コマンドでコマンドの説明を見ることができますが,コマンド名が思い出せない時に は表示させることができません.
man コマンドで表示できるマニュアルをキーワードで検索できます.
パスについては自分の環境に合わせて,適宜読み換えてください.
Cygwin の man コマンドの他に, c:/cygwin/bin/apropos , c:/cygwin/usr/sbin/makewhatis , c:/cygwin/bin/whatis がインストールされている必 要があります.
無いようであれば, Cygwin のインストーラで入れておきます.
まず c:/cygwin/usr/sbin/と c:/cygwin/bin/にパスが通っていることを確認します. bash を起動して,
makew
と入力し,TABを押してみてください.
makewhatis
と補完することができれば,問題ありません.
補完できたら,実行します.これで, man コマンドの目次を作成してくれます.
準備はこれで完了です.
man -l "ls"
としてみてください.そうすると,「 ls 」をコマンド名や説明に含むコマンドが表示され ます.
同じことは
apropos "ls"
としてもできます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow から man コマンドを呼び出し,その結果を Meadow に表示する方法
Cygwin には man というコマンドが附属しています.これは,コマンドのマニュアルを読 むことができる機能です.
このコマンドを Meadow から呼び出し,その結果を Meadow に表示させることができます.
そのために, man.el を使用します.
man.el は Meadow に附属しています.当然ですが, man コマンドが必要です.
M-x manとします.その後で,知りたいコマンドを入力します.例えば,「 ls 」と 入力すると,以下のように出力されます.
LS (1) FSF LS (1) NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... DESCRIPTION List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuSUX nor --sort. -a, --all do not hide entries starting with . -A, --almost-all do not list implied . and ..
また,M-x man RET -k "directory" RET と入力することで,apropos の結果一覧 が
FcConfigAppFontAddDir (3) - Add fonts from directory to font database FcDirCacheValid (3) - check directory cache timestamp FcDirSave (3) - save a directory cache FcDirScan (3) - scan a font directory FcStrDirname (3) - directory part of filename basename (1) - strip directory and suffix from filenames bindtextdomain (3) - set directory containing message catalogs
のように表示されます.適当な行で m RET を入力するとそのマニュアルが表示され ます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
man コマンドを利用せずに, Meadow で man を読む方法.
UNIX には「 man 」というコマンドがあります.これは,入力したコマンドのマニュアル を読むことのできる機能です.
例えば,「 man ls 」とコマンドを入力すると,「 ls 」というコマンドの機能や使い方 のマニュアルを読むことができます.
このマニュアルは Cygwin をインストールすると,インストールされます.探せば,いく つかのフォルダに「 man 」や「 man1 」といったフォルダがみつかると思います.これ が,マニュアルです.
しかし,このファイルは普通にテキストエディタで見ても,
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.24. .TH LS "1" "April 2001" "ls (fileutils) 4.1" FSF .SH NAME ls \- list directory contents .SH SYNOPSIS .B ls [\fIOPTION\fR]... [\fIFILE\fR]...
といった風に,「.B 」など邪魔な文字がたくさんあって読みにくいものです (この「.B 」 などを man コマンドが解釈して,その部分を太字やアンダーラインにしています)
man ファイルを Meadow 上で読むことができます.当然,リンクはリンクとして機能しま すし,太字なども正しく表示してくれます.
日本語マニュアルを付属して,日本語マニュアルが検索できるようにしてあります.
Meadow に附属しています.
.emacs に以下を追加します. man のパスについては,適当に変更してください.「 man1 」 などのディレクトリを指定すればいいです.
(setq woman-cache-filename "~/.wmncach.el") (setq woman-manpath '( "c:/cygwin/usr/man" "c:/cygwin/local/man" "c:/cygwin/usr/autotool/devel/man" "c:/cygwin/usr/local/man" "c:/cygwin/usr/local/man/ja" "c:/cygwin/usr/ssl/man" "c:/cygwin/usr/X11R6/man" "c:/cygwin/usr/man/ja" "c:/namazu/man" "c:/unix/local/kakasi/doc" )) |
M-x woman lsのようにすると,以下のようにマニュアルを読むことができます. 「 ls 」などのコマンド名はTABやSPCで補完できます.
LS (1) -- April 2001 -- ls (fileutils) 4.1 -- FSF NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... DESCRIPTION List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuSUX nor --sort.
Meadow 1.15 には附属していませんので,動きません.そのため,以下のようにしてイン ストールする必要があります.
WoManからダ ウンロードして,ロードパスの通ったところへ置いておきます..emacs には上記の設定に 加えて,以下も追加しておきます.
(autoload 'woman "woman" "Decode and browse a UN*X man page." t) (autoload 'woman-find-file "woman" "Find, decode and browse a specific UN*X man-page file." t) |
日本語のマニュアルは http://www.linux.or.jp/JM/ にあります。設定済み Meadow にはこのマニュアルを付属してあります。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
M-x man や info で読むマニュアルを補完しながら選択できます.
M-x man や M-x info(M-x help-for-help i) でマニュアルを読むことが できます.
しかし,M-x man では補完入力できませんので,正確に入力しなければなりません. info ではカーソルを移動させて選択する必要がありめんどくさい.
info や man を補完入力で選択できます. completing-help と使うと,簡単なコメントも表示 されます.
iman.elをダウンロー ドし,ロードパスの通ったところへ置きます.
また、makewhatis を実行し、 man コマンドの目次をあらかじめ作成 しておきます。
以下を.emacs に追加します.
(setq iman-Man-index-command-and-args '("man" "-k" "[a-z]")) (require 'iman) |
M-x iman とします.そうすると, man や info を補完入力できます. man のコマ ンドが多いために, info は見つけにくいですが,ちゃんと info も選択できます.
このコマンドは初回はかなり遅いです.これは,マニュアルの一覧を作成しているためで す.
completing-help の設定 が iman よりも先にあると,補完ウィン ドウが
Possible completions are: 822-date (1) - Print date and time in RFC822 format AllPlanes (3) - Display macros and functions AnyDBM_File (3pm) - provide framework for multiple DBMs Archetype (n) - base class for all [incr Tk] mega-widgets AutoLoader (3pm) - load subroutines only on demand AutoSplit (3pm) - split a package for autoloading B (3pm) - The Perl Compiler
のようになります.
「 man program returned error exit status 1 」というエラーが表示され, 「*iman-man-index*」というバッファが表示されることがあります.
「*iman-man-index*」のバッファに man のコマンド一覧らしきものが表示されていれば, man コマンド部分については正常に動作しています.問題は Elisp です.関数 iman-make-Man-index の一部を下記のパッチのようにコメントにしてしまいます.
「*iman-man-index*」のバッファに man のコマンド一覧らしきものが表示されていなけれ ば,パスなどを確認します.後は, bash を起動し,「 man -k "[a-z]"」や「 man -k "ls"」 などと入力してみます.これで,コマンドの一覧が表示されれば,問題ありません.
これでもコマンドの一覧が表示されなければ,「 makewhatis 」を実 行したかを確認します.後は,パスを再確認します.
--- d:/akihisa/mylisp/iman.el 2003-07-09 12:29:27.000000000 +0900 +++ d:/akihisa/tmp/ediff1884etp 2003-07-09 12:29:37.000000000 +0900 @ -408,10 +408,10 @ buffer ; > current temporary buffer nil ; no redisplay args))) - (when (not (zerop exit-status)) - (switch-to-buffer-other-window buffer) - (goto-char (point-max)) - (error "%s program returned error exit status %s" program exit-status)) +;; (when (not (zerop exit-status)) +;; (switch-to-buffer-other-window buffer) +;; (goto-char (point-max)) +;; (error "%s program returned error exit status %s" program exit-status)) (with-current-buffer buffer (goto-char (point-min)) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
M-x help-for-helpに関連した設定を紹介します.
65.2.1 ヘルプを拡張する ― helpex (2004/12/19)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ヘルプにあるモードのキーバインド一覧表示などの機能を追加することができる.
M-x help-for-help でヘルプを呼び出すことができます。この画面ではいくつかの コマンドを実行することができます。
helpex.el を使うと、ここにコマンドを追加することができます。
http://groups.google.co.jp/groups?dq=&hl=ja&lr=&ie=UTF-8&oe=UTF-8&group=gnu.emacs.sources&c2coff=1&selm=buhb0j%24hu8n8%242%40ID-39741.news.uni-berlin.de,gnu.emacs.sources からコピーし, helpex.el としてロードパスの通ったところへ保存します.
以下を.emacs に追加します.
(require 'helpex) (helpex-setup-keys) |
M-x help-for-help の後で,L を入力します.そして,「 gnus RET 」と入力 すると, gnus.el を開くことができます.
L の他に以下のようなキーが追加されます.
最新の Meadow では L に別の機能が割り当てられたため、そのキーを上書きするよう になりました。使用の際にはキーバインドを変更しておくといいでしょう。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
参考:http://www.jpl.org/elips/BUGS-ja.html
Emacs をいじったりしていくと動かないとかバグかなということもあると思います.
だからといって, すぐに掲示板などで質問しても原因は分かりません.なぜならほとんど の場合,情報が不足しているからです.
そこで,質問する前にまずは以下のようにして確認をしてみましょう.
エラーは多くの場合,最新版で直っています.そのため,最新版よりも古いのを使ってい るのであれば,一度最新のもので試してみましょう.
一度, bash で meadow -q として起動してみてください. こうすると, Meadow は .emacs を読み込みません.
あるいは,ショートカットを右クリックして,
のように,「リンク先」の最後に「-q」を追加して,「OK」を押します.そして,その ショートカットで起動します.
次に, *scratch* に
(setq debug-on-quit t) |
と書き,最後で C-j と入力します.
そして,この状態で .emacs を開き,リージョンで少しずつ選択し,M-x eval-region とします.そうすると,リージョンで選択した範囲の設定のみが有効になり ます.一気に全部などは行わないで怪しいと思った部分はできるだけ少しずつやっていく といいでしょう.また,今回関係なさそうだなと思ったところは省略すると問題を切り分 けやすくなります.
この時,何らかのエラーがあれば, *Message* バッファにメッセージが出たり,別のウィ ンドウに Backtrace というものが出力されます.
これが出れば,原因の把握が随分と楽になります.
この Backtrace (バックトレース) とは,どこでどういうエラーが起こったかが出力され るものです.見る人が見れば,原因の特定がある程度可能です.
これで,バックトレースやエラーが出なければ,次の段階へ進みましょう.
バックトレースやエラーが出れば,設定がおかしいものと考えられます.もう一度設定を よく確認してみてください.
自分が困ったことは,大体誰かは同じことで困っています.そこで,以下のようなサイト を検索してみましょう.
解決策が見つからなければ,エラーを再現する必要があります.
どうやってエラーが出たか覚えてますか.確かこんな感じだったかなぁといろいろと操作 してみてください.
これで,バックトレースやエラーが出れば,それとその再現方法を記録しておきます.
バックトレースには日本語や英語以外の文字が含まれている場合があります.これをその ままテキストとして保存すると,文字化けの原因となります.
そこで,以下のようにして,バックトレースを保存します.
最低限,以下の情報は必要でしょう.
Emacs のバージョンは, M-x emacs-version RETで確認できます.
また,*scratch*バッファで
(Meadow-version) |
を評価すると,
"Meadow-1.99 Alpha6-dev (IKADUCHI)" |
のようにバージョンを確認できます.
ただし,エラーを出さないようにしている等で,バックトレースが出ないこともあります. その場合には,取れないかもしれません
ここまでできれば,答えが返ってくる可能性は非常に大きくなります.そこで,これらの 情報を入れて,質問しましょう.
上記のようなことを,そのままメールに書いてバックトレースを添付します.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow は.emacs を読み込まずに起動することができます.設定のミスの確認など,これ を知らないと手間取りますので,ぜひ覚えておいてください.
まず, Meadow のショートカットを右クリックし,プロパティを選びます.そうすると,
このような画面が現われます.リンク先には, Meadow のパスが入っているはずです.そ して,作業フォルダには Meadow のパスが入っています.
このリンク先の最後に「 -q 」を追加します.
これで,そのショートカットを使うと,.emacs を読み込まずに起動することができます.
「-q 」で起動することが多いのであれば,ショートカットをコピーして,「-q 」での起動 専用にしておくといいです.
ただし,「-q 」付きで起動していることを忘れないように..emacs が読み込まれてない, と騒いた挙句に「-q 」で起動していたと気付くと,ものすごぉく自己嫌悪に陥ります.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
設定したけど有効にならない.うまく,.emacs が読み込まれていないという時には,以下 のことを確認しましょう.
実は読み込まれていたけど,設定が間違っていたということはありませんか? 一度,「-q 」 を付けて起動してみます.そして,.emacs を開き,M-x eval-bufferとします.
正しく設定できましたか? これでうまくいけば,.emacs に問題はないでしょう.
正しく設定できていなければ,*Messages*バッファのエラーを参考に設定を見直します.
Meadow を「-q 」有りで起動し,.emacs の先頭に
(setq debug-on-error t) |
を追加してから,M-x eval-bufferとすると,問題点が分かるかもしれません.ある いは,リージョンで選択しながら,M-x eval-region も有効でしょう.
Meadow はまず.emacs.elc というファイルを探します.次に.emacs.el を探し,最後に. emacs を探します.そして,読み込まれるのは,最初に見つかったファイルのみになりま す.
したがって,これら 3 つのファイルがあったとしても読み込まれるのは,.emacs.elc だけ です.
.emacs.elc があった場合には,一度削除して,起動し直してみます.
Meadow を起動後,M-x getenv RET HOME RET とします.これで, HOME が正しいか どうかが確認できます.結果はミニバッファに出ますので,ちゃんと .emacs のあるフォ ルダになっているかを確認します.
間違っているようであれば,環境変数の設定を参考に, HOME を設定しま す.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
エラーが出ても何をやってたかなということがあります. Meadow では自分のキー入力を ファイルに保存することができます.
そのためには,.emacs に以下を追加しておきます.
(open-dribble-file "~/dribble")
|
これで,このファイルにキー入力が保存されます.
また,最近のキー入力は M-x help-for-help l で確認できます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow がうまく動作しない場合には,「 meadow -q 」を実行します.こうすると,.emacs を読み込まないため,他の設定が影響しているかどうかを確認できます.
しかし,そこまで徹底したテストである必要はないということもあるでしょう.例えば, フォントや背景色ぐらいは設定しておきたいという時です.
こんな時のために,最低限の設定のみを書いたファイルを用意しておきましょう.そして, それを適当なファイル名で保存しておきます.ここでは,例として「 d:/home/.test.el 」とします.
次に, Meadow のショートカットを適当なところへコピーします.そして,アイコンを選 択し,右クリックします.
そうすると,ショートカットのプロパティが表示されます.次は,ショートカットタブを 選択し,リンク先に
E:\unix\Meadow2\2.20\bin\RunMW32.exe -q -l d:/home/.test.el
のように書いておきます.
これでこのリンクを使うと,.emacs は読み込まずに,テスト用の「 d:/home/.test.el 」 のみを読み込んで起動します.
ちょっとした動作確認などの時に便利です.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
適当に思いついたものを紹介.
65.8.1 void-function と void-variable (2004/12/19) 65.8.2 Lisp nesting exceeds max-lisp-eval-depth (2004/12/19)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
関数や変数が存在しないと,以下のようなエラーが表示されます.
Debugger entered--Lisp error: (void-function nothing) (nothing arg) eval((nothing arg)) eval-last-sexp-1(t) eval-last-sexp(t) eval-print-last-sexp() * call-interactively(eval-print-last-sexp)
この場合だと,「nothing」が「void-function」だ,つまり「存在しない」といわれてい るわけです.変数だったら,「void-function」が「void-variable」になります.
「void-function」が出た場合,その関数がないわけですから,その関数があるファイル を探し,「load」や「autoload」などを使って Meadow に場所を教える必要があります.
「void-variable」の場合も同じですが,変数の場合には,
(defvar nothing nil) |
のように適当に定義して逃げることもできるでしょう。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Lisp nesting exceeds max-lisp-eval-depth というエラーになった場合の対処方法.
たまに Lisp nesting exceeds max-lisp-eval-depth というエラーメッセージが出てしま う時があります.
関数内で eval や apply , funcall を利用して関数を呼び出すことがあります.
この呼び出しが規定回数 (デフォルトは 300) を超えるとこのエラーになります.
単純な例では
(defun test () (while 1 (funcall 'test))) |
でエラーが出ます.
これは,こんな風な無限ループなどを防止するために設けられています.
このエラーが出た場合には,エラーを出したコマンドを修正するのが最良の方法です.そ れが不可能であれば,
(setq max-lisp-eval-depth 1000) |
のように,適当な大きさに変更してやります.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
あらかじめ調べたい関数を登録し,その関数の実行時間を調べることができます.
M-x で何らかのコマンドを実行してもなかなか処理が終わらないことがあります.
これはバグや余分な処理など,様々な理由が考えられますが,関数を眺めていてもなかな か分かりにくいものです.
例えば
Function Name Call Count Elapsed Time Average Time =================================== ========== ============ ============ dmoccur 1 5.423 5.423 moccur-regexp-read-from-minibuf 1 3.032 3.032 moccur-search 1 1.125 1.125 moccur-search-buffer 73 0. 0. dmoccur-in-list-p 2201 0. 0.
のように,各関数が何回呼ばれて,どれだけの時間がかかったかを表示できます.
Meadow には標準で付属しています.
不要です.
とりあえずある関数がどれだけ時間が知りたいというのであれば,
M-x elp-instrument-function とし,関数を登録します.そして,その関数を実行 した後で,M-x elp-results とします.これで,その関数の実行にかかった時間が 表示されます.
M-x elp-results を実行する前に関数を 10 回実行すると, 10 回分の実行結果に なります.そして,M-x elp-results か M-x elp-reset-all を実行するとリ セットされます.
ただ,これだと 1 個 1 個関数を登録しないといけないので,かなり面倒です.
そこで以下のように elp-function-list に調べたい関数を登録します.
(setq elp-function-list '( make-overlay insert moccur-buffer-string< moccur-buffer-in-list-p moccur-filter-buffers moccur-kill-buffer )) |
そして,M-x elp-instrument-list を実行します.これで,設定した関数が調査対 象になります.
後は同じように関数を実行し,M-x elp-results で結果を表示できます.
状況によって経過時間は変化しますから,あまりに時間がかかるような場合でなければ, 10 回ほど関数を実行して評価するといいでしょう.
関数を追加しなくて済む方法として、次の方法があります。
まず、M-x elp-instrument-package として、関数名を入力しておきます。そして、 その関数を実行します。これで、その関数内にある関数の経過時間を調べてくれます。結 果は M-x elp-results で表示できます。
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |