xyzzy

ENTRANCEINFORMATION | DIARY | LABORATORY | LINK
CAGE(一般掲示板)Developper's Nest(開発掲示板)こころ宙


xyzzy って何?

 xyzzy は、Windows 上で動作するテキストエディタです。
 ですが、中身はほとんど UNIX で広く使われている「emacs」ソックリです。これまで emacs を使っていた人であれば、それほどの違和感なく、xyzzy を使うことができるでしょう。もちろん、emacs にあって xyzzy に無い機能もたくさんありますけれどね。

 xyzzy のポイントは、Common LISP (emacs LISP ではない) でプログラムを組んであげることにより、xyzzy を自由に拡張できるという点です。秀丸など、他のメジャーなエディタでも、そのエディタ独自のプログラム (BASIC 風だったり) を書いてあげることで、機能を拡張できますよね。それと同じようなものです。ただ、xyzzy の方が、きめ細かく設定できる…と思います。極めたわけではないので、ハッキリとは言えませんけれども。逆に言えば、そう簡単には設定を書くことができないということです。

 UNIX を使ってきた人、UNIX のキーバインドに慣れてしまった人、などが主なターゲットです。ドキュメントも完全に整備されているというわけではないので、初心者であれば、秀丸や QX エディタを使った方がいいでしょう。
 Windows 上で動作する emacs に meadow というものがありますけれども、xyzzy の方が動作も軽く、設定など簡単なので、よほどのこだわりがあるのでもなければ、xyzzy の方をオススメします。

xyzzy TIPS

  1. タグジャンプについて
  2. find-file 時にディレクトリを作るようにする
  3. ヘッダファイル用の識別子を作る
  4. インクリメンタルサーチのサポート

タグジャンプについて
 xyzzy には、二通りのタグジャンプがあります。ひとつは、XTAGS ファイルを作成するもの。もうひとつは、コンパイラなどが出力するエラーメッセージによってジャンプするものです。
 XTAGS ファイルを作成する方では、関数名からその関数が定義されている行に直接飛ぶことができます。たとえば、カーソル位置に「foo」という単語が書かれていれば、タグジャンプすると関数 foo が定義されたファイルが自動的にオープンされ、さらに、その定義行へジャンプするわけです。
 もうひとつの、エラーメッセージによるタグジャンプ (これをタグジャンプと言うのかは微妙な気がしますけれど) は、コンパイラが出力した
foo.c: In function `main':
foo.c:7: warning: assignment from incompatible pointer type
foo.c:9: warning: return makes integer from pointer without a cast
のようなエラーを使い、対応するファイルを開いて書かれた行番号の位置へジャンプするという事を行います。

 最初の XTAGS は「ツール(T)」の「TAGSファイルの作成(G)...」を選ぶことで作成することができます。基本的に、一つのディレクトリ内にある全ファイルを検索します。オプションを指定すれば任意数の階層や、サブディレクトリを検索することもできます。スキャンが終了すると、ルートとなるディレクトリに XTAGS というファイルが作成されます。
 これで、タグジャンプをする準備が整いました。

 デフォルトでは、タグジャンプは F4 に割り当てられています。または、「ツール(T)」の「タグジャンプ(J)」を選びます。コマンドは「jump-tag」です。

 エラーメッセージによるタグジャンプは、F10 で行います。次のエラーに移るときは F11 です。それぞれ、「first-error」と「next-error」というコマンドになります。

 うまく使えるようになると、プログラミングが楽になるはずです。

find-file 時にディレクトリを作るようにする
from [xyzzy:08055] and [xyzzy:08078]
(defun make-directory-unless-directory-exists (filename)
  (let (
         (d (directory-namestring filename))
       )
    (unless (check-valid-pathname d)
      (when (yes-or-no-p "~a~%ディレクトリがないけど作る?"  d)
        (create-directory d))
      )
    )
  nil
)
(add-hook '*before-find-file-hook*
          #'make-directory-unless-directory-exists)
 ファイルを開こうとしたとき、途中にあるディレクトリが存在しなければ、自動的に作成するようになります。

ヘッダファイル用の識別子を作る
(require "timestmp")
(export '(insert-header-ID))
(defun insert-header-ID ( id )
  (interactive "sID : ")
  (with-output-to-selected-buffer
    (princ (concat "_" (concat id (format-date-string "_%Y%m%d%a_%H%M%S_"))))
  )
)
 C 言語のヘッダファイルなどで、#ifdef などの識別子に使うことができます。
 M-x insert-header-ID でプロンプトが出ますので、適当な文字列を打ち込むと、カレントバッファに識別子文字列が出力されます。

インクリメンタルサーチのサポート
(load-library "isearch")
 C-rC-s がインクリメンタルサーチになります。

ENTRANCEINFORMATION | DIARY | LABORATORY | LINK
CAGE(一般掲示板)Developper's Nest(開発掲示板)こころ宙