Как ограничить количество "предложений", которые дает flyspell?

В режиме emacs flyspell иногда список предложений очень длинный, поэтому всплывающее меню выше экрана и требует вертикальной прокрутки меню, поскольку параметр "Сохранить слово" находится в нижней части меню.

Есть ли способ сделать одно из следующих действий:

  1. Переместить "Сохранить слово" в верхнюю часть меню?
  2. Установить жесткое ограничение на количество отображаемых предложений?
  3. Изменить порог совпадения слова?

2 ответа

Решение

Этот код ограничит все решения ispell максимумом limit-ispell-choices-to, который получает желаемый предел в flyspell,

(defvar limit-ispell-choices-to 5
  "Number indicating the maximum number of choices to present")

(defadvice ispell-parse-output (after limit-ispell-choices activate)
  (when (and (listp ad-return-value)
             ad-return-value)
    (let* ((miss-list-end (nthcdr (- limit-ispell-choices-to 1) 
                                  (nth 2 ad-return-value)))
           (guess-list-end (nthcdr (- limit-ispell-choices-to 1) 
                                   (nth 3 ad-return-value))))
      (when miss-list-end (setcdr miss-list-end nil))
      (when guess-list-end (setcdr guess-list-end nil)))))

Это поместит "Сохранить слово" вверху. Я просто поменял два слова в источнике. Это что-то вроде хака, но я не вижу лучшего способа.

(defun flyspell-emacs-popup (event poss word)
  "The Emacs popup menu."
  (unless window-system
    (error "This command requires pop-up dialogs"))
  (if (not event)
      (let* ((mouse-pos  (mouse-position))
         (mouse-pos  (if (nth 1 mouse-pos)
                 mouse-pos
               (set-mouse-position (car mouse-pos)
                           (/ (frame-width) 2) 2)
               (mouse-position))))
    (setq event (list (list (car (cdr mouse-pos))
                (1+ (cdr (cdr mouse-pos))))
              (car mouse-pos)))))
  (let* ((corrects   (if flyspell-sort-corrections
             (sort (car (cdr (cdr poss))) 'string<)
               (car (cdr (cdr poss)))))
     (cor-menu   (if (consp corrects)
             (mapcar (lambda (correct)
                   (list correct correct))
                 corrects)
               '()))
     (affix      (car (cdr (cdr (cdr poss)))))
     show-affix-info
     (base-menu  (let ((save (if (and (consp affix) show-affix-info)
                     (list
                      (list (concat "Save affix: " (car affix))
                        'save)
                      '("Accept (session)" session)
                      '("Accept (buffer)" buffer))
                   '(("Save word" save)
                     ("Accept (session)" session)
                     ("Accept (buffer)" buffer)))))
               (if (consp cor-menu)
               (append save (cons "" cor-menu))
             save)))
     (menu       (cons "flyspell correction menu" base-menu)))
    (car (x-popup-menu event
               (list (format "%s [%s]" word (or ispell-local-dictionary
                            ispell-dictionary))
                 menu)))))
Другие вопросы по тегам