2009-08-11 [長年日記]
_ [Emacs] auto-completeのac-candidate-words-in-bufferを改良
Emacsでauto-completeを使っているのだが、小文字で入力しているときに大文字の補完候補があり、それが補完されると打ち直すことになって不便。また、数字の列が補完されるのも困る。そこでac-candidate-words-in-bufferを改良してac-candidate-words-in-buffer+として使っている。
(defun ac-candidate-words-in-buffer+ () "Default implemention for `ac-candidate-function'." (if (> (length ac-prefix) 0) (let ((i 0) (case-fold-search nil) candidate candidates (regexp (concat "\\b" (regexp-quote ac-prefix) "\\(\\s_\\|\\sw\\)*\\b"))) (save-excursion ;; search backward (goto-char ac-point) (while (and (< i ac-limit) (re-search-backward regexp nil t)) (setq candidate (match-string-no-properties 0)) (unless (or (member candidate candidates) (< (length candidate) 3) (string-match "\\(^[+-.0-9]+$\\)\\|\\([+-.0-9][+-.0-9][+-.0-9]+$\\)\\|\\(^[+-.0-9][+-.0-9][+-.0-9]+\\)" candidate)) (push candidate candidates) (setq i (1+ i)))) ;; search backward (goto-char (+ ac-point (length ac-prefix))) (while (and (< i ac-limit) (re-search-forward regexp nil t)) (setq candidate (match-string-no-properties 0)) (unless (or (member candidate candidates) (< (length candidate) 3) (string-match "\\(^[+-.0-9]+$\\)\\|\\([+-.0-9][+-.0-9][+-.0-9]+$\\)\\|\\(^[+-.0-9][+-.0-9][+-.0-9]+\\)" candidate)) (push candidate candidates) (setq i (1+ i)))) (nreverse candidates))))) (setq ac-source-words-in-buffer '((candidates . ac-candidate-words-in-buffer+)))
case-fold-searchをnilに設定することで大文字、小文字の違いでマッチしないようにしている。2文字以下の文字列と、数値を表すような文字列を除くようにもした。
[ツッコミを入れる]