«前の日記(2009-08-08) 最新 次の日記(2009-08-13)» 編集

ソフトウェアと本の覚え書き

2005|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|

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文字以下の文字列と、数値を表すような文字列を除くようにもした。