モード毎の設定

Last modified: "2019/01/02 17:49:36"

Table of contents


text-mode

auto-fill を on にし、行カーソルを表示する。

(add-hook '*text-mode-hook*
          #'(lambda ()
              (auto-fill-mode t)
              (set-local-window-flags (selected-buffer) *window-flag-cursor-line* t)
              ))

lisp-mode / lisp-interaction-mode

[xyzzy:02447](山本 真二さん)とかを参考に。キーワード色付け、 キーワード補完用キーバインドの追加など。 lisp のキーワードを補完するには、ふつう ESC TAB (lisp-complete-symbol) するらしい。 このコマンドを長らく知り得なかったため、苦労を強いられた(私だけ?)。 でもちょっと押しにくいので、C-. にもバインドしてみた。

キーワードファイルは、 こんな感じでつくってます。

(in-package "editor")

(defvar *lisp-keyword-hash-table* nil)

(defun use-lisp-keyword ()
  "キーワード色付け"
  (if (null *lisp-keyword-hash-table*)
      (setq *lisp-keyword-hash-table*
            (load-keyword-file "lisp")))
  (when *lisp-keyword-hash-table*
    (make-local-variable 'keyword-hash-table)
    (setq keyword-hash-table *lisp-keyword-hash-table*)))

(add-hook '*lisp-mode-hook*
          #'(lambda ()
              (use-lisp-keyword)
              (define-key *lisp-mode-map* #\C-. 'lisp-complete-symbol)))

(add-hook '*lisp-interaction-mode-hook*
          #'(lambda ()
              (use-lisp-keyword)
              (define-key *lisp-interaction-mode-map* #\C-. 'lisp-complete-symbol)))

(in-package "user")

ただし、[xyzzy:02450](亀井さん)によると、

| Lisp モードでもキーワードの色づけが出来てもいいんじゃないかと思い、

んー、Lisp の場合は普通の言語と違って予約語というわけではないで
すからねぇ。

  (setq setq 'setq)

こんなのとか出来ちゃうし(^^;

とのこと。

その他、こんなのも便利 → 「TAB で indent と同時に補完

[2003/06/10]
・キーワードの色付けで余計なものが混ざっていたので削除した。
[2003/02/14]
・さっぱりさせた。

css-mode

css-mode 強化版。インデントを上手くしてくれます。 xyzzyでタグ打ってる人の数 → 339, 340 より。(酔いを醒ましていただけたようです。感謝。)
補完用キーバインドだけ追加した。

;;; css-enhance

; library
(load-library "css-mode")
; indent (お好みでどうぞ)
(defvar *css-indent-level* 4)
(defvar *css-continued-statement-offset* 4)
(defvar *css-brace-offset* -4)
(defvar *css-brace-imaginary-offset* 0)
(defvar *css-argdecl-indent* 0)
(defvar *css-label-offset* 0)
; keymap (お好みでどうぞ)
(define-key *css-mode-map* #\{ 'c-electric-insert)
(define-key *css-mode-map* #\: 'c-electric-insert)
(define-key *css-mode-map* #\} 'c-electric-close)
(define-key *css-mode-map* #\C-h 'backward-delete-char-untabify-or-selection)
(define-key *css-mode-map* #\TAB 'c-indent-line)
(define-key *css-mode-map* #\C-M-q 'indent-sexp)
(define-key *css-mode-map* #\RET 'c-newline-and-indent)
(define-key *css-mode-map* #\C-. 'ed::css-completion)

; function for hook
(defun css-enhance ()
  ;; indent command
  (make-local-variable 'mode-specific-indent-command)
  (make-local-variable 'c-comment-indent-variable)
  (setq c-comment-indent-variable 'c-comment-indent)
  (setq mode-specific-indent-command 'c-indent-line)
  ; indent
  (make-local-variable 'c-indent-level)
  (make-local-variable 'c-continued-statement-offset)
  (make-local-variable 'c-brace-offset)
  (make-local-variable 'c-brace-imaginary-offset)
  (make-local-variable 'c-argdecl-indent)
  (make-local-variable 'c-label-offset)
  (setq c-indent-level *css-indent-level*)
  (setq c-continued-statement-offset *css-continued-statement-offset*)
  (setq c-brace-offset *css-brace-offset*)
  (setq c-brace-imaginary-offset *css-brace-imaginary-offset*)
  (setq c-argdecl-indent *css-argdecl-indent*)
  (setq c-label-offset *css-label-offset*)
  ; comment
  (setq comment-indent-function 'c-comment-indent)
  (setq comment-start "/* " comment-end " */")
  (setq comment-start-skip "/\\(\\*+\\|/\\)[ \t]*"))
; hook
(add-hook '*css-mode-hook* 'css-enhance)
[2003/06/10]
・css-completion にパッケージ名がついてなかったのを修正した。

diff-mode

背景色を変更する。

paren を off にするも追加した。 OHKUBO Hiroshi さんのぺーじより。

(in-package "editor")
(add-hook '*diff-mode-hook*
          #'(lambda ()
              ;paren off
              (turn-off-paren)
              ;背景色
              (setq *diff-old-file-background* 3)
              (setq *diff-new-file-background* 6)))
(in-package "user")

info-mode

info-mode 用のバッファ構成にする。

(add-hook '*info-mode-hook*
          #'(lambda ()
              (set-local-window-flags (selected-buffer) *window-flag-line-number*  nil)
              (set-local-window-flags (selected-buffer) *window-flag-ruler* nil)
              (set-local-window-flags (selected-buffer) *window-flag-newline* nil)
              (set-local-window-flags (selected-buffer) *window-flag-tab* nil)
              (set-local-window-flags (selected-buffer) *window-flag-zenkaku-space* nil)
              (set-local-window-flags (selected-buffer) *window-flag-eof* nil)
              (set-local-window-flags (selected-buffer) *window-flag-cursor-line* t)))

shell-mode

より。M-x shell したときに別のフレームにする。

(require "shell")    ; or (require "shell3")
(defun shell () 
  (interactive) 
  (let (pframe (pframe-name "Shell")) 
    (if (setq pframe (find-pseudo-frame pframe-name)) 
        (select-pseudo-frame pframe) 
      (new-pseudo-frame pframe-name))) 
  (set-buffer (get-buffer-create "*Shell*")) 
  (let ((proc (buffer-process (selected-buffer)))) 
    (and proc (eq (process-status proc) ':run) 
         (return-from shell t))) 
  (goto-char (point-max)) 
  (ed::shell-mode) 
  (make-process *eshell* :output (selected-buffer)))

calc-mode

calc-mode で割算結果を小数表記にする。xyzzy Part7 750 より。

(setq ed::*calc-ratio* 'float)

自分は、ウィンドウを分割して使っている。

(defun my-calc ()
  (interactive)(split-window 4)(calc))

sql-mode

-- で始まる行をコメント文にする。

(in-package "editor")
(add-hook '*sql-mode-hook*
          #'(lambda ()
              (set-syntax-start-c++-comment *sql-mode-syntax-table* #\-)
              (set-syntax-end-c++-comment *sql-mode-syntax-table* #\LFD)))
(in-package "user")
[2003/02/14]
・「sql-mode」を追加した。

Misc

モード選択メニュー

モード一覧をポップアップメニューで表示し,切替える。 C-x F3 に割り当てている。

(defun mode-selecter ()
  (interactive)
  (let ((menu1 (create-popup-menu nil))
        (menu2 (create-popup-menu nil))
        l ol)
    (continue-pre-selection)
    (dolist (m *auto-mode-alist*)
      (pushnew (cdr m) l :test 'equal))
    (dolist (sym (ed::apropos-find-matches "-mode$" #'commandp))
      (unless (or (member sym l)
                  (member sym
                          ;[その他(O)...] にも表示しないモード
                          '(latex-mode clickable-url-set-attribute-any-mode
                            life-mode changelogmemo-mode buffer-menu-mode
                            edit-abbrevs-mode tterm-char-mode fortran-auto-fill-mode
                            info-modoki-mode extlib-mode instant-toggle-tab-mode
                            qanda-mode ese-fortune-mode imm-search-mode)))
        (pushnew sym ol)))
    (flet ((add-menu (li mn)
             (dolist (i li)
               (let ((m i))
                 (add-menu-item mn nil
                                (format nil "~S" m)
                                #'(lambda () (interactive)
                                    (funcall m))
                                #'(lambda ()
                                    (when (eq buffer-mode m)
                                      :check)))))))
      (add-menu (sort l #'string-lessp) menu1)
      (add-menu (sort ol #'string-lessp) menu2))
    (add-menu-separator menu1)
    (add-popup-menu menu1 menu2 "その他(&O)...")
    (track-popup-menu menu1)))
(define-key ctl-x-map #\F3 'mode-selecter)