dynamic-abbreviation,dynamic-abbreviation-ja,kill-summary,(yasnippet)

より快適になりましたよ。ん? de-ja vu?


目的は,関数名補完や変数名補完。理想は,インテリセンスみたいなん。
けど,動的略語展開でがんばっているけど,いやがんばっているのは,emacs の方だ。
だけど,いろんなバッファを開いていると,補完候補がたくさんになってきて面倒。
というのが,動機。

dabbrev の対象バッファをバッファにより切り替える

これは,すごくうれしい。
けど,正規表現の `|' のエスケープではまりましたよ。
2回エスケープ?するなんて,びっくらこいたよ。
つまり,a または b なら 「a\\|b」ですよ,殿。
で,正規表現なんてほとんど知らないのに,C 関連のソースに関しては,頑張ってみたよ。
たぶん,大丈夫なはず。
ついでに,日本語対応を導入。

;; dabbrev の対象バッファをバッファにより切り替える
;; http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=dabbrev%20ignored
(defvar *dabbrev-buffer-name-inclusion-list* '())
(defvar *dabbrev-buffer-name-exclusion-list* '())
(defun dabbrev-buffer-in-list-p (buffer-name buffer-name-regexps)
  (cond ((null buffer-name-regexps) nil)
        ((string-match  (car buffer-name-regexps) buffer-name) t)
        (t (dabbrev-buffer-in-list-p buffer-name (cdr buffer-name-regexps)))))

(defun dabbrev-filter-buffers (buffer-list)
  (let ((dabbrev-buffers nil))
    (while buffer-list
      (if (and (dabbrev-buffer-in-list-p (buffer-name (car buffer-list))
                                         *dabbrev-buffer-name-inclusion-list*)
               (not (dabbrev-buffer-in-list-p (buffer-name (car buffer-list))
                                              *dabbrev-buffer-name-exclusion-list*)))
          ()
        (setq dabbrev-buffers
              (cons (buffer-name (car buffer-list))
                    dabbrev-buffers)))
      (setq buffer-list (cdr buffer-list)))
    dabbrev-buffers))

(setq dabbrev-my-ignored-case
      '(
        ;; buffer-name include exclude
		;; (例) バッファ名に scratch という文字を含んでいれば
        ;; texi をバッファ名に含むバッファのみを補完対象とし,
        ;; navi2ch や gnus をバッファ名に含むバッファは補完対象としない
        ;; ("scratch" ("texi") ("navi2ch" "gnus"))
	("\.[chs]$\\|\.[ch]pp$\\|\.cc$\\|\.hh$" ;; for C, C++ and assembly
	 ("\.[chs]$\\|\.[ch]pp$\\|\.cc$\\|\.hh$") ;; .c, .h, .s, .C, .H, .S, .cpp, .hpp, .cc, .hh
         ("\.[^chs]$\\|\.\\([^ch]p\\|.[^p]\\)p$\\|\...[^p]$\\|\.[^c]c$|\..[^c]$\\|\.[^h]h$\\|\..[^h]$")) ;上記以外のファイルは,除外対象
        ("el" ("el") ())
        ("texi" ("texi") ())
        ("." ("^[^ ]+") ()) ;; Default
        ))

(defadvice dabbrev-expand (around dabbrev-ignored-buffer activate)
  ""
  (if (or (eq last-command 'abbrev-expand)
          (eq last-command 'dabbrev-expand))
      ()
    (let ((alist dabbrev-my-ignored-case)
          (case-fold-search t)
          (command nil)
          (name (buffer-name (current-buffer))))
      (while (and (not command) alist)
        (if (string-match (car (car alist)) name)
            (setq command (car (car alist))))
        (setq alist (cdr alist)))
      (setq *dabbrev-buffer-name-inclusion-list*
            (nth 1 (assoc command dabbrev-my-ignored-case)))
      (setq *dabbrev-buffer-name-exclusion-list*
            (nth 2 (assoc command dabbrev-my-ignored-case)))
      (setq dabbrev-ignored-buffer-names (dabbrev-filter-buffers (buffer-list)))
      ))
  ad-do-it
  )

;; 日本語でも,dynamic abbreviation を快適に。
;; http://namazu.org/%7Etsuchiya/elisp/dabbrev-ja.el
(load "dabbrev-ja")

kill-summary

M-y は,頻繁に使われているそうですが,当方,ぶっちゃけしらんかったです。
はずかしいです。でも,別にいいです。
こりゃー便利だわさ。

;; kill-summary.el
;; M-y で,kill-ring を表示し,選択,yank。使い方は,ソースファイル中にあり。
;; http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Programs/elisp/kill-summary.el
(autoload 'kill-summary "kill-summary" nil t)
(global-set-key "\M-y" 'kill-summary)

minibuf を快適に

minibuf でのインクリメンタルサーチ,ほしかったんだよねぇ。
いやー,便利便利。んで,人間様は退化と。

;; minibuf のインクリメンタルサーチ
;; http://www.sodan.org/%7Eknagano/emacs/minibuf-isearch/
(require 'minibuf-isearch)

;; minibuf で,ヒストリから補完
;; http://homepage1.nifty.com/bmonkey/emacs/elisp/mcomplete.el
;; http://www.bookshelf.jp/elc/mcomplete-history.el
(require 'mcomplete)
(require 'cl)
(load "mcomplete-history")
(turn-on-mcomplete-mode)


作者様方に,大変感謝します。


yasnippet を試してみたけど,すげー便利なのはわかったが,
私が欲しているモノとはちとちがったので,コメントアウトしておいた。
これをやっちまうと,私みたいな阿呆は,ほんとにダメ人間になってしまいそうで。
つまり,電卓的な強力さを感じてしまったんですよ。