スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

xyzzyをLixp(xyzzy Lisp)で拡張する

参考・引用:
○『xyzzy』
(http://mechanics.civil.tohoku.ac.jp/soft/node47.html)

Emacsと同じように、xyzzyもLispによる拡張ができる。
拡張の方法としては、主に次の2種類がある。


  1. Lispコードを直接評価


    拡張子を".l"としたLispファイルに書き込んだtextコードを直接評価します.


    起動するたびに読み込むため,すぐに評価できることが特徴.



  2. バイトコンパイル


    textコードで記述したLispをバイトコンパイルします.そのため直接評価するより動作が高速です.
    しかし,変更を加えた場合は必ずバイトコンパイルしなければなりません.




初期設定
xyzzyの設定は, .xyzzy(ドットから始まっている)ファイルを用いる方法と siteinit.lを用いる方法の2種類あります.

.xyzzyを用いるのはLispを直接評価する方法で, siteinit.lを用いるのはバイトコンパイルする評価方法です.

設定の優先順位は .xyzzyが siteinit.lよりも上になります.

一度設定後はあまり変更しない,例えばxyzzyの全てのモードに対する拡張等は siteinit.lに記述し,それ以外は .xyzzyに記述するとよいと思います.


.xyzzyを用いる方法

環境変数にXYZZYHOMEを設定.
以下では, c:\xyzzyとします. XYZZYHOMEは xyzzy.exeが存在するディレクトリです.

set XYZZYHOME=c:\xyzzy

c:\xyzzyに .xyzzyを作成.
評価するためには

xyzzyを再起動

M-x load-fileで .xyzzyを読み込む

の2種類の方法があります.

siteinit.lを用いる方法

c:\xyzzy\site-lispの中に siteinit.lを作成.

M-x byte-compile-fileで siteinit.lを指定.

xyzzyを終了して,XYZZYHOMEに存在するダンプファイル(xyzzy.w98,xyzzy.w2kなど)を削除.

xyzzyを再起動(変更を取り込んだ新しいダンプファイルを作成してくれる)


変更例
まず,初めに行う拡張としてはキーバインドの変更があげられます.

以下はxyzzyのML等の情報などから最低限のものを記述しただけです.Web上にはたくさんの人がいろいろな情報を公開していますのでそちらの方を参考にされたほうが良いと思います.

デフォルトでのキーバインドは,ほぼEmacsと同じです.GNUな人はさらに各自の設定を行ってください.

Windowsのようなキーバインドに変更することも可能です.さらにC-cはGNUではcommand-prefixキーであり非常に重要なキーですが, Windowsでは''コピー''にキーバインドされています.

今までワープロでレポート作成程度でしかパソコンを使用したことがなければ,この際GNUな人になるのも一つの方法です.

C-cでコピー,C-xで切り取り等のWindows標準のキーバインドに慣れてしまっていてできればこれを使いたい,でもEmacsのようにも使いたいという場合には以下を記述します.


; キーバインドをWindowsと同じに
(load-library "winkey")



これでC-z(Undo),C-v(貼り付け)にキーバインドを変更し, C-c及びC-xは通常はEmacsと同様なprefixキーで,範囲指定している場合のみコピー及び切り取りになります.

これ以外のキーバインドも全てWindows風にしたい場合は以下を記述します.


; キーバインドをWindowsとほぼ完全に同じに 
(load-library "Gates")




これで,C-z(undo),C-v(貼り付け),C-c(コピー),C-x(切り取り),C-s(保存), C-s(全て選択),C-f(検索),Alt-F4(xyzzyを終了)などなど,ほとんどのキーバインドがWindows風になります.

なお,winkeyのような範囲指定している場合とそうでない場合でキーバインドの使い分けは,デフォルトでは行うことができません.winkeyのような使い分けを行いたい場合は /lisp/gates.lの24・25行目(?)をコメントアウトした上で,以下を記述します.


; C-x と C-c をWindowsとxyzzyで共存 
(setf (get 'ctl-x-prefix 'selection-keymap)
'kill-selection-to-clipboard)
(setf (get 'specific-command-prefix 'selection-keymap)
'copy-selection-to-clipboard)
(define-key esc-map #\C-x #'ctl-x-prefix)
(define-key esc-map #\C-c #'specific-command-prefix)




必要であれば, /lisp/gates.lから必要な設定のみを取り出して新たなLispファイルを作成し,それを読み込ませるのがよいのではないでしょうか.

終了時をWindows風に変更するには以下.


; Windows風な終了に 
(defun query-kill-xyzzy ()
(handler-case
(save-excursion
(dolist (buffer (buffer-list) t)
(when (need-buffer-save-p buffer)
(set-buffer buffer)
(refresh-screen)
(when (yes-no-or-cancel-p "~a~%をセーブしますか?"
(if (file-visited-p) (get-buffer-file-name) buffer))
(or (call-interactively (if (file-visited-p) 'save-buffer 'emacs-write-file))
(return nil))))))
(quit () nil)
(error () nil)))
(add-hook '*query-kill-xyzzy-hook* 'query-kill-xyzzy)




プログラムソースなどで,インデントをタブで行う人が結構います.まあ,本当はよいことではないのでしょうが・・・そんな人には以下の設定で Tabキーから常にタブを入力.


(let ((keymap (make-sparse-keymap))) 
(define-key keymap #\TAB 'self-insert-command)
(add-hook '*create-buffer-hook*
#'(lambda (buffer)
(set-minor-mode-map keymap buffer))))




dynamic abbreviation(同一バッファ内からの補完機能)はこちら.


; dynamic abbreviation
(require "dabbrev")
(global-set-key #\M-/ 'dabbrev-expand)




C-sでインクリメンタルサーチにするには以下.


; inclimental search 
(require "isearch")



モードラインにIMEの状態をEmacs風に示すには以下.


;IMEの状態をモードラインに表示
(setq-default mode-line-format "[%i] --%*- %b (%M) [%k:%l] %P %f")




C-q(これは任意,各自指定)で対応するカッコにジャンプするには以下.


;;対応するカッコにジャンプ
(progn
(defvar com-point nil
"Remember com point as a marker. \(buffer specific\)")
(set-default 'com-point (make-marker))
(defun getcom (arg)
"Get com part of prefix-argument ARG."
(cond ((null arg) nil)
((consp arg) (cdr arg))
(t nil)))
(defun paren-match (arg)
"Go to the matching parenthesis."
(interactive "P")
(let ((com (getcom arg)))
(if (numberp arg)
(if (or (> arg 99) (< arg 1))
(error "Prefix must be between 1 and 99.")
(goto-char
(if (> (point-max) 80000)
(* (/ (point-max) 100) arg)
(/ (* (point-max) arg) 100)))
(back-to-indentation))
(cond ((looking-at "[\(\[{]")
(if com (move-marker com-point (point)))
(forward-sexp 1)
(if com
(paren-match nil com)
(backward-char)))
((looking-at "[])}]")
(forward-char)
(if com (move-marker com-point (point)))
(backward-sexp 1)
(if com (paren-match nil com)))
(t (error ""))))))
(global-set-key #\C-q 'paren-match))







スポンサーサイト

コメントの投稿

非公開コメント

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。