пятница, 19 октября 2012 г.

Функциональная и информативная mode-line

Давно хотелось сделать отображаемую в emacs mode-line информацию более понятной. В то же время, слишком отходить от стандартного вида тоже не хотелось, т.к. уже есть много всего удобного, например всплывающее меню для основного режима. Конечно, прежде всего хотелось поменять обозначение кодировки, признак read-only и признак того, что буфер был изменен. По этому поводу Xah Lee верно подметил, что начало mode-line выглядит загадочно :). За основу я взял описание конфигурации в emacs-fu.

Несколько ключевых моментов:

  • mode-line-mule-info
    о сдной стороны не слишком красива и информативна, зато позволяет переключать кодировки и символ завершения строк мышкой (и да, я польуюсь мышкой в emacs :)).
  • buffer-file-coding-system
    все что нужно для красивого описания текущей кодировки.
  • mode-line-buffer-identification
    имя буфера (как в стандартой mode-line)
  • mode-line-modes
    еще одна важная деталь из стандартной mode-line, которая отображает список minor-mode, сужения и ассоциированный с буфером процесс.
  • Положение курсора в буфере, идентификация режима Insert/Overwrite взята из emacs-fu.

В итоге получилось так:

Полный вариант данной конфигурации на bitbucket.

понедельник, 8 октября 2012 г.

PageUp/PageDown в меню auto-complete

После длительного сидения на 1.2, обновился до версии 1.4 auto-complete.el (через ELPA). Красота, да еще и со всплывающими подсказками. Первое что захотелось сделать перевесить вызов как в популярных IDE:
 (define-key ac-mode-map (kbd "C-SPC") 'auto-complete)
Уже на списке автодополнений захотелось нажать привычную для IDE PageDown для прокрутки по списку. Ан нет, emacs выполняет прокрутку на странице. Сделаем возможность PageDown/PageUp на меню автодополнений:
 (defun ac-page-next ()
   "Select next completion candidate per `ac-menu-height' range.
 Pages down through completion menu."
   (interactive)
   (let ((counter 0))
     (dotimes (counter (1- ac-menu-height))
       (ac-next))))

 (defun ac-page-previous ()
   "Select previous completion candidate per `ac-menu-height' range.
 Pages up through completion menu."
   (interactive)
   (let ((counter 0))
     (dotimes (counter (1- ac-menu-height))
       (ac-previous))))
(define-key ac-complete-mode-map [next] 'ac-page-next)
(define-key ac-complete-mode-map [prior] 'ac-page-previous)
Поиск в меню давно хотелось перевесить, но все ни как руки не доходили. isearch-forward у меня висит на C-f, соответственно меняем:
(define-key ac-complete-mode-map (kbd "C-f") 'ac-isearch)