WindowsでGauche環境構築 / Emacs設定の勉強

cygwinEmacsがC-x C-cで終了できないのは、cygwinのコンソール内ではCtrl-Cがコマンドプロンプトの終了シグナルと競合してしまって認識されないから、らしい。
いちおう回避方法はあるようですが、いろいろとめんどくさいことになりそうなのでcygwin emacsはやめてMeadowを使うことに。

やったこと

この設定で、Meadow内でgoshが動くようになりました。

  • cygwin上で meadow と打つ。
  • Meadowが立ち上がる。
  • C-c S(Shift-s) と打つと、Meadowの下半分に新しいバッファができて、そこでgoshインタプリタが起動する。

Emacsの設定を勉強しよう

今回Scheme用に追加した設定は、上記のサイトからコピーしてきたものを、ほぼそのまま使わせてもらいました。

(setq process-coding-system-alist
      (cons '("gosh" utf-8 . utf-8) process-coding-system-alist))
(setq gosh-program-name "C:/cygwin/usr/local/bin/gosh -i")
(autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)
(defun scheme-other-window ()
  "Run scheme on other window"
  (interactive)
  (switch-to-buffer-other-window
   (get-buffer-create "*scheme*"))
  (run-scheme gosh-program-name))
(define-key global-map
  "\C-cS" 'scheme-other-window)

(show-paren-mode)

(put 'and-let* 'scheme-indent-function 1)
(put 'begin0 'scheme-indent-function 0)
……

それぞれどういう意味なのか見ていってみる。

process-coding-system-alist
(setq process-coding-system-alist
      (cons '("gosh" utf-8 . utf-8) process-coding-system-alist))

というわけで、この設定の意味は
「process-coding-system-alistという連想配列の先頭に、["gosh" => (utf-8, utf-8)]というエントリを追加する」
といったところか。これで、goshプロセスへの入出力がutf-8で行われるということでしょう。

gosh-program-name
(setq gosh-program-name "C:/cygwin/usr/local/bin/gosh -i")

gosh-program-name という変数に、文字列 "C:/cygwin/usr/local/bin/gosh -i" を設定している。

autoload
(autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)
  • autoload function filename docstring interactive type の形式。functionという名前の関数やマクロを filenameから自動的にロードするように定義する。
    • filename に拡張子がなければ、.el か.elc が自動的に付加される。
    • docstring は関数の説明文。optional。
    • interactive は定義をいつロードするか。nil以外なら、実際に呼び出すまで関数定義をロードしない。定義をロードしなくても補完は効く。optional。
    • type には、定義しているものが関数ではないときに何を定義しているのかの情報を書く。具体的には、マクロならmacro、キーマップならkeymap。optional。
    • リファレンスマニュアル 14.4 自動ロード

つまり、この設定は
scheme-modeという関数・run-schemeという関数を、cmuscheme.elから動的にロードする」
という意味。cmuscheme.elは {Meadowインストールフォルダ}\lisp にありました。【TODO】検索パスはどうなってるんだろう。
→【追記】検索パスは load-path 変数の値。

defun
(defun scheme-other-window ()
  "Run scheme on other window"
  (interactive)
  (switch-to-buffer-other-window
   (get-buffer-create "*scheme*"))
  (run-scheme gosh-program-name))

つまり、この設定は
scheme-other-window関数を定義する。その動作は、"*scheme*"という名前のバッファを作って、それにフォーカスを移動して、goshのパスを引数としてrun-scheme関数を起動する」というもの。

define-key
(define-key global-map
  "\C-cS" 'scheme-other-window)
show-paren-mode
(show-paren-mode)

対応する括弧を光らせる設定。paren.elの中に書いてある。
【TODO】paren.elはどのタイミングでロードされてるのだろう?

put
(put 'and-let* 'scheme-indent-function 1)

つまり、この設定は
「属性リストand-let*のscheme-indent-function属性値を1にする」という意味。

まとめ

今回出てきた中で重要そうなのは、

  • 変数に値をセットするsetq
  • 関数を定義するdefun
  • キーマップを定義するdefine-key
  • 属性値を設定するput

といったあたりか。

しまった

リファレンスマニュアル、古い版を見ちゃってた。
リンク張り直すの大変なので、このまんまで…