Next: , Previous: Major Mode Conventions, Up: Major Modes   [Contents][Index]


22.1.2 ¥á¥¸¥ã¡¼¥â¡¼¥É¤ÎÎã

´ðËÜ¡Êfundamental¡Ë¥â¡¼¥É¤ò½ü¤¯¤È¡¢ ¥Æ¥­¥¹¥È¡Êtext¡Ë¥â¡¼¥É¤Ï¤â¤Ã¤È¤âñ½ã¤Ê¥â¡¼¥É¤Ç¤¹¡£ ¾å¤Ë½Ò¤Ù¤¿´·½¬¤ÎÎ㼨¤È¤·¤Æ¡¢text-mode.el¤ÎÈ´¿è¤ò¤¢¤²¤Æ¤ª¤­¤Þ¤¹¡£

;; ¥â¡¼¥É¸ÇÍ­¤Î¹½Ê¸¥Æ¡¼¥Ö¥ë¤òºî¤ë
(defvar text-mode-syntax-table nil 
  "Syntax table used while in text mode.")
(if text-mode-syntax-table
    ()              ; ¹½Ê¸¥Æ¡¼¥Ö¥ë¤¬´û¸¤Ê¤é¤ÐÊѹ¹¤·¤Ê¤¤
  (setq text-mode-syntax-table (make-syntax-table))
  (modify-syntax-entry ?\" ".   " text-mode-syntax-table)
  (modify-syntax-entry ?\\ ".   " text-mode-syntax-table)
  (modify-syntax-entry ?' "w   " text-mode-syntax-table))
(defvar text-mode-abbrev-table nil
  "Abbrev table used while in text mode.")
(define-abbrev-table 'text-mode-abbrev-table ())
(defvar text-mode-map nil)   ; ¥â¡¼¥É¸ÇÍ­¤Î¥­¡¼¥Þ¥Ã¥×¤òºî¤ë

(if text-mode-map
    ()              ; ¥­¡¼¥Þ¥Ã¥×¤¬´û¸¤Ê¤é¤ÐÊѹ¹¤·¤Ê¤¤
  (setq text-mode-map (make-sparse-keymap))
  (define-key text-mode-map "\t" 'indent-relative)
  (define-key text-mode-map "\es" 'center-line)
  (define-key text-mode-map "\eS" 'center-paragraph))

¤Ä¤®¤Ï¡¢¥Æ¥­¥¹¥È¡Êtext¡Ë¥â¡¼¥É¤Î¥á¥¸¥ã¡¼¥â¡¼¥É´Ø¿ô¤Î´°Á´¤ÊÄêµÁ¤Ç¤¹¡£

(defun text-mode ()
  "Major mode for editing text intended for humans to read...
 Special commands: \\{text-mode-map}
Turning on text-mode runs the hook `text-mode-hook'."
  (interactive)
  (kill-all-local-variables)
  (use-local-map text-mode-map)
  (setq local-abbrev-table text-mode-abbrev-table)
  (set-syntax-table text-mode-syntax-table)
  (make-local-variable 'paragraph-start)
  (setq paragraph-start (concat "[ \t]*$\\|" page-delimiter))
  (make-local-variable 'paragraph-separate)
  (setq paragraph-separate paragraph-start)
  (setq mode-name "Text")
  (setq major-mode 'text-mode)
  (run-hooks 'text-mode-hook))      ; ºÇ¸å¤Ë¡¢¥Õ¥Ã¥¯¤Ë¤è¤ë¥â¡¼¥É¤Î
                                    ;   ¥«¥¹¥¿¥Þ¥¤¥º¤ò¥æ¡¼¥¶¡¼¤Ëµö¤¹

3¤Ä¤Îlisp¥â¡¼¥É¡Êlisp¥â¡¼¥É¡¢emacs-lisp¥â¡¼¥É¡¢lispÂÐÏå⡼¥É¡Ë¤Ë¤Ï¡¢ ¥Æ¥­¥¹¥È¡Êtext¡Ë¥â¡¼¥É¤è¤ê¿¤¯¤Îµ¡Ç½¤¬¤¢¤ê¡¢ ¤½¤ì¤Ë±þ¤¸¤Æ¥³¡¼¥É¤â¤è¤êÊ£»¨¤Ç¤¹¡£ ¤³¤ì¤é¤Î¥â¡¼¥É¤Î½ñ¤­Êý¤òÎ㼨¤¹¤ë lisp-mode.el¤«¤é¤ÎÈ´¿è¤ò¤¢¤²¤Æ¤ª¤­¤Þ¤¹¡£

;; ¥â¡¼¥É¸ÇÍ­¤Î¹½Ê¸¥Æ¡¼¥Ö¥ë¤òºîÀ®¤¹¤ë
(defvar lisp-mode-syntax-table nil "")  
(defvar emacs-lisp-mode-syntax-table nil "")
(defvar lisp-mode-abbrev-table nil "")
(if (not emacs-lisp-mode-syntax-table) ; ¹½Ê¸¥Æ¡¼¥Ö¥ë¤¬´û¸¤Ê¤é¤Ð
                                       ;   Êѹ¹¤·¤Ê¤¤
    (let ((i 0))
      (setq emacs-lisp-mode-syntax-table (make-syntax-table))
      ;; 0¤Þ¤Ç¤Îʸ»ú¤Ë¡¢Ã±¸ì¹½À®Ê¸»ú¤Ç¤Ï¤Ê¤¤¤¬
      ;; ¥·¥ó¥Ü¥ë̾¹½À®Ê¸»ú¤Ç¤¢¤ë¥¯¥é¥¹¤òÀßÄꤹ¤ë
      ;; (ʸ»ú0¤Ï¡¢ASCIIʸ»ú½¸¹ç¤Ç¤Ï48)
      (while (< i ?0) 
        (modify-syntax-entry i "_   " emacs-lisp-mode-syntax-table)
        (setq i (1+ i)))
      …
      ;; ¾¤Îʸ»ú¤Î¹½Ê¸¤òÀßÄꤹ¤ë
      (modify-syntax-entry ?  "    " emacs-lisp-mode-syntax-table)
      (modify-syntax-entry ?\t "    " emacs-lisp-mode-syntax-table)
      …
      (modify-syntax-entry ?\( "()  " emacs-lisp-mode-syntax-table)
      (modify-syntax-entry ?\) ")(  " emacs-lisp-mode-syntax-table)
      …))
;; lisp¥â¡¼¥É¸þ¤±¤Îά¸ìɽ¤òºî¤ë
(define-abbrev-table 'lisp-mode-abbrev-table ())

3¤Ä¤Îlisp¥â¡¼¥É¤Ï¿¤¯¤Î¥³¡¼¥É¤ò¶¦Í­¤·¤Æ¤¤¤Þ¤¹¡£ ¤Ä¤®¤Î´Ø¿ô¤Ï¤µ¤Þ¤¶¤Þ¤ÊÊÑ¿ô¤ËÀßÄꤷ¤Þ¤¹¡£ lisp¥â¡¼¥É¤Î³Æ¥á¥¸¥ã¡¼¥â¡¼¥É´Ø¿ô¤¬¸Æ¤Ó½Ð¤·¤Þ¤¹¡£

(defun lisp-mode-variables (lisp-syntax)
  (cond (lisp-syntax
	  (set-syntax-table lisp-mode-syntax-table)))
  (setq local-abbrev-table lisp-mode-abbrev-table)
  …

forward-paragraph¤Ê¤É¤Î´Ø¿ô¤Ï¡¢ ÊÑ¿ôparagraph-start¤ÎÃͤò»È¤¤¤Þ¤¹¡£ Lisp¤Î¥³¡¼¥É¤ÏÉáÄ̤Υƥ­¥¹¥È¤È¤Ï°Û¤Ê¤ë¤Î¤Ç¡¢ Lisp¤ò°·¤¨¤ë¤è¤¦¤ËÊÑ¿ôparagraph-start¤òÆÃÊ̤ËÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¤Þ¤¿¡¢Lisp¤Ç¤Ï¥³¥á¥ó¥È¤Î»ú²¼¤²¤ÏÆÃ¼ì¤Ê·Á¤Ê¤Î¤Ç¡¢ ³Ælisp¥â¡¼¥É¤Ë¤ÏÆÈ¼«¤Î¥â¡¼¥É¸ÇÍ­¤Îcomment-indent-function¤¬É¬ÍפǤ¹¡£ ¤³¤ì¤é¤ÎÊÑ¿ô¤ËÀßÄꤹ¤ë¥³¡¼¥É¤¬¡¢ lisp-mode-variables¤Î»Ä¤ê¤ÎÉôʬ¤Ç¤¹¡£

  (make-local-variable 'paragraph-start)
  (setq paragraph-start (concat page-delimiter "\\|$" ))
  (make-local-variable 'paragraph-separate)
  (setq paragraph-separate paragraph-start)
  …
  (make-local-variable 'comment-indent-function)
  (setq comment-indent-function 'lisp-comment-indent))

³Ælisp¥â¡¼¥É¤Ç¤Ï¡¢¥­¡¼¥Þ¥Ã¥×¤¬Â¿¾¯°Û¤Ê¤ê¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢lisp¥â¡¼¥É¤Ç¤ÏC-c C-z¤òrun-lisp¤Ë¥Ð¥¤¥ó¥É¤·¤Þ¤¹¤¬¡¢ ¾¤Îlisp¥â¡¼¥É¤Ç¤Ï¤½¤¦¤·¤Þ¤»¤ó¡£ ¤Ä¤®¤Î¥³¡¼¥É¤Ï¡¢¶¦Ä̤¹¤ë¥³¥Þ¥ó¥É¤òÀßÄꤷ¤Þ¤¹¡£

(defvar shared-lisp-mode-map ()
  "Keymap for commands shared by all sorts of Lisp modes.")

(if shared-lisp-mode-map
    ()
   (setq shared-lisp-mode-map (make-sparse-keymap))
   (define-key shared-lisp-mode-map "\e\C-q" 'indent-sexp)
   (define-key shared-lisp-mode-map "\177"
               'backward-delete-char-untabify))

¤Ä¤®¤Ïlisp¥â¡¼¥É¸þ¤±¤Î¥­¡¼¥Þ¥Ã¥×¤òÀßÄꤹ¤ë¥³¡¼¥É¤Ç¤¹¡£

(defvar lisp-mode-map ()
  "Keymap for ordinary Lisp mode...")

(if lisp-mode-map
    ()
  (setq lisp-mode-map (make-sparse-keymap))
  (set-keymap-parent lisp-mode-map shared-lisp-mode-map)
  (define-key lisp-mode-map "\e\C-x" 'lisp-eval-defun)
  (define-key lisp-mode-map "\C-c\C-z" 'run-lisp))

ºÇ¸å¤Ë¡¢emacs-lisp¥â¡¼¥É¤Î¥á¥¸¥ã¡¼¥â¡¼¥É´Ø¿ô¤Î´°Á´¤ÊÄêµÁ¤ò¼¨¤·¤Þ¤¹¡£

(defun lisp-mode ()
  "Major mode for editing Lisp code for Lisps other than GNU Emacs Lisp.
Commands:
Delete converts tabs to spaces as it moves back.
Blank lines separate paragraphs.  Semicolons start comments.
\\{lisp-mode-map}
Note that `run-lisp' may be used either to start an inferior Lisp job
or to switch back to an existing one.
Entry to this mode calls the value of `lisp-mode-hook'
if that value is non-nil."
  (interactive)
  (kill-all-local-variables)
  (use-local-map lisp-mode-map)          ; ¥â¡¼¥É¤Î¥­¡¼¥Þ¥Ã¥×¤òÁªÂò¤¹¤ë
  (setq major-mode 'lisp-mode)           ; ¤³¤ì¤Ë¤è¤êdescribe-mode¤Ï
                                         ; ÀâÌÀʸ¤òõ¤·½Ð¤»¤ë
  (setq mode-name "Lisp")                ; ¥â¡¼¥É¹Ô¤Ëɽ¼¨¤µ¤ì¤ë
  (lisp-mode-variables t)                ; ¤µ¤Þ¤¶¤Þ¤ÊÊÑ¿ô¤òÄêµÁ¤¹¤ë
  (setq imenu-case-fold-search t)
  (set-syntax-table lisp-mode-syntax-table)
  (run-hooks 'lisp-mode-hook))           ; ¥Õ¥Ã¥¯¤Ë¤è¤ë¥â¡¼¥É¤Î
                                         ; ¥«¥¹¥¿¥Þ¥¤¥º¤ò¥æ¡¼¥¶¡¼¤Ëµö¤¹

Next: , Previous: Major Mode Conventions, Up: Major Modes   [Contents][Index]