ivy 인터페이스를 이용한 ispell/aspell 기반의 영어 단어 완성

6032 단어 Emacs
상당히 이전의 기사에는,ispell/aspell에 의한 영어 단어 보완을helm인터페이스를 사용해 구현한 이야기가 있었다.
  • h tp // 쇼헤 x. 하테나 bぉg. 코m/엔트리/20131123/1385184659

  • 이번은 그것을 helm이 아니라 ivy로 구현한 것이다. 영어 알파벳 3문자 이상을 입력하고 M-x ivy-ispell 하면 보완이 달린다. 적당한 키 바인드를 할당하는 것도 일흥일 것이다. 덧붙여서 바이너리는 ispell/aspell/hunspell의 어느 것을 준비해 둘 필요가 있다 (cf. ispell-program-name ).
    (require 'ispell)
    (require 'ivy)
    (require 'thingatpt)
    
    (defvar ivy-ispell--word-at-point nil)
    
    (defun ivy-ispell--case-function (input)
      (let ((case-fold-search nil))
        (cond ((string-match-p "\\`[A-Z]\\{2\\}" input) 'upcase)
              ((string-match-p "\\`[A-Z]\\{1\\}" input) 'capitalize)
              (t 'identity))))
    
    (defun ivy-ispell--compare-length (a b)
      (< (length a) (length b)))
    
    (defun ivy-ispell--make-candidate ()
      (let ((input (downcase ivy-ispell--word-at-point))
            (case-func (ivy-ispell--case-function
                        ivy-ispell--word-at-point)))
        (when (string-match-p "\\`[a-z]+\\'" input)
          (mapcar case-func
                  (sort (ispell-lookup-words (concat input "*")
                                             ispell-complete-word-dict)
                        'ivy-ispell--compare-length)))))
    
    (defun ivy-ispell ()
      (interactive)
      (setq ivy-ispell--word-at-point (thing-at-point 'word))
      (if (not ivy-ispell--word-at-point)
          (message "Nothing to complete.")
        (let ((candidate (ivy-read "Completion: "
                                   (funcall 'ivy-ispell--make-candidate)
                                   :initial-input ivy-ispell--word-at-point))
              (curpoint (point)))
          (backward-word 1)
          (delete-region (point) curpoint)
          (insert candidate))))
    
    

    동작 예
    "nece"를 입력하고 ivy 인터페이스에서 좁히고 "necessarily"를 입력하는 모습.

    좋은 웹페이지 즐겨찾기