2009年1月12日月曜日

Emacs-Lisp mode を調べる

どんな便利があるのかな。

  • M-? m でモードの記述をみる。(私はヘルプをM-?にバインドしている)
    あれ、

    key binding
    --- -------

    TAB lisp-indent-line
    ESC Prefix Command
    DEL backward-delete-char-untabify

    M-TAB lisp-complete-symbol
    C-M-q indent-pp-sexp
    C-M-x eval-defun

    C-M-q indent-sexp
    (that binding is currently shadowed by another mode)

    しかない。C-xC-eとかは???
  • lisp interaction modeかな、と*scratch*でモード検査。

    key binding
    --- -------

    TAB lisp-indent-line
    C-j eval-print-last-sexp
    ESC Prefix Command
    DEL backward-delete-char-untabify

    M-TAB lisp-complete-symbol
    C-M-q indent-pp-sexp
    C-M-x eval-defun

    C-M-q indent-sexp
    (that binding is currently shadowed by another mode)

    あり、C-jしかふえてない。C-x系は違うとこで定義? 移動系のC-M-fとかもない、、、
  • ソースを調べる。
    lisp-mode.el

    (defvar emacs-lisp-mode-map ()
    "Keymap for Emacs Lisp mode.
    All commands in `lisp-mode-shared-map' are inherited by this map.")

    (if emacs-lisp-mode-map
    ()
    (let ((map (make-sparse-keymap "Emacs-Lisp")))
    (setq emacs-lisp-mode-map (make-sparse-keymap))
    (set-keymap-parent emacs-lisp-mode-map lisp-mode-shared-map)
    (define-key emacs-lisp-mode-map "\e\t" 'lisp-complete-symbol)
    ...

    なので、lisp-mode-shared-mapなのかな。

    (defvar lisp-mode-shared-map
    (let ((map (make-sparse-keymap)))
    (define-key map "\t" 'lisp-indent-line)
    (define-key map "\e\C-q" 'indent-sexp)
    (define-key map "\177" 'backward-delete-char-untabify)
    ;; This gets in the way when viewing a Lisp file in view-mode. As
    ;; long as [backspace] is mapped into DEL via the
    ;; function-key-map, this should remain disabled!!
    ;;;(define-key map [backspace] 'backward-delete-char-untabify)
    map)
    "Keymap for commands shared by all sorts of Lisp modes.")

    ちがう。
  • キーバインディングで調べてみる。するとC-xC-eとかは major mode bindingsではなく、global bindingsだった。ここから調べればよかった。global-bindingsということはtext-modeとかでもつかえるということ? やってみる。C-xC-e、使えた、、、
  • さて、global bindingsでキーにバインドされている機能って、どういう単位で整理されているのか概念としてまとめられているのか?
  • ソースを調べる。C-x C-e (eval-last-sexp)はどこにいる? あり? lisp-mode.elじゃん。実体はここでバインディングはbindings.elですでに実施されている。
  • bindings.elって? loadup.elによって起動時に必ずloadされるようだ。なので、ここで定義されたものは、mode等に関わらず常に有効だ。
  • ということは、Elisp編集用に用意されている機能をきっちりおさえるには、Emacsのソースの中のlisp/emacs-lisp/*.elを読めということだな。なるほど、、、
  • とりあえず、lisp/emacs-lisp/lisp-mode.elとlisp/emacs-lisp/lisp.elを眺める。
  • あ!! 以前欲しいと言ってた編集機能があった!

    ;; After Zmacs:
    (defun kill-backward-up-list (&optional arg)
    "Kill the form containing the current sexp, leaving the sexp itself.
    A prefix argument ARG causes the relevant number of surrounding
    forms to be removed."
    (interactive "*p")
    (let ((current-sexp (thing-at-point 'sexp)))
    (if current-sexp
    (save-excursion
    (backward-up-list arg)
    (kill-sexp)
    (insert current-sexp))
    (error "Not at a sexp"))))

    いや、yankがいまいちか。でも希望がもてる。
  • なるほど、おもしろい。

みなさん、こんな感じでやっているのだろうか???

こつこつ。

0 件のコメント: