19 февраля 2011

Emacs. Дар провидения

Для того, чтобы превратить emacs в небольшую clojure ide, скачайте следующие расширения в папку ~/.emacs.d/site-lisp
auto-complete
ac-slime
clojure-mode
slime
elein
highlight-symbol
linum [linum+]
paredit
swank-clojure
sr-speedbar
Многие из них доступны на github.org, поэтому лучшим способом будет git clone —depth 1 project-url.

auto-complete

ac-slime

Как Вы уже догадались расширения предоставляют функцию автодополнения для различных языков программирования. У разработчика ac-slime я позаимствовал метод настройки emacs. Настройки разместите в файле ~/.emacs.d/init-auto-complete.el
;; Autocomplete
(require 'auto-complete-config nil t) ;; don't break if not installed
(add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
(setq ac-comphist-file  "~/.emacs.d/ac-comphist.dat")
(ac-config-default)
(provide 'init-auto-complete)

clojure-mode

Данный режим осуществляет подсветку синтаксиса и автоматические отсупы для кложурного кода. Настройки в ~/.emacs.d/init-clojure-mode.el
;; Clojure mode
(require 'clojure-mode)

(defun slime-clojure-repl-setup ()
  (when (string-equal "clojure" (slime-connection-name))
    (message "Setting up repl for clojure")
    (set-syntax-table clojure-mode-syntax-table)
    (clojure-mode-font-lock-setup)
    (setq lisp-indent-function 'clojure-indent-function)
    (when (and (featurep 'paredit) paredit-mode (>= paredit-version 21))
      (define-key slime-repl-mode-map "{" 'paredit-open-curly)
      (define-key slime-repl-mode-map "}" 'paredit-close-curly))))

(add-hook 'slime-repl-mode-hook 'slime-clojure-repl-setup)

(eval-after-load 'clojure-mode
  '(font-lock-add-keywords
    'clojure-mode `(("(\\(fn\\>\\)"
                     (0 (progn (compose-region (match-beginning 1)
                                               (match-end 1) "ƒ")
                               nil))))))

(provide 'init-clojure)

slime

Пакет предоставляет возможность подключиться к swank repl серверу и взаимодействовать с ним. Например загружать содержимое буфера emacs, отображать документацию по объектам, ну и собственно экспериментировать без компилирования/линкования. Настройка в файле ~/.emacs.d/init-slime.el
(load "slime-autoloads")
(require 'slime)
(slime-setup '(slime-repl))
;; ac-slime
(require 'ac-slime)
(add-hook 'slime-mode-hook 'set-up-slime-ac)
(eval-after-load "slime"
  `(progn
     (slime-setup '(slime-repl))
     (custom-set-variables
       '(inhibit-splash-screen t)
       '(slime-complete-symbol*-fancy t)
       '(slime-net-coding-system 'utf-8-unix)
       '(slime-startup-animation nil)
       '(slime-protocol-version 'ignore))))
(provide 'init-slime)

elein

Небольшой вспомогательный модуль для запуска lein swank сервера, либо "глобального" `~/.lein/bin/swank-clojure`, либо локального `lein swank` Оформим его загрузку отдельно, мало ли что. Мне кажеться, что lein будет только прибавлять в мощности в будущем. ~/.emacs.d/init-elein.el
(require 'elein)
(provide 'init-elein)

highlight-symbol

Минорный режим для подсветки одинаковых слов. Возможно более продвинут. Мы добавили к нему несколько популярных "горячих" клавиш. ~/.emacs.d/init-highlight-symbol.el
(require 'highlight-symbol)
(global-set-key [(control f3)] 'highlight-symbol-at-point)
(global-set-key [f3] 'highlight-symbol-next)
(global-set-key [(shift f3)] 'highlight-symbol-prev)
(global-set-key [(meta f3)] 'highlight-symbol-prev)
(global-set-key [(control meta f3)] 'highlight-symbol-query-replace)
(provide 'init-highlight-symbol)

linum

Пакет для нумерации строк открытого окна emacs. Для версии emacs >= 23.2 уже встроен. Нам остается только подключить linum+.el ~/.emacs.d/init-linum.el
;; Line numbers
(custom-set-variables
 '(linum-format "%d "))

(require 'linum+)
(global-linum-mode 1)

(provide 'init-linum)

paredit

Минорный режим для более удобной работы с s-выражениями. ~/.emacs.d/init-paredit.el
(require 'paredit)
(provide 'init-paredit)

swank-clojure

Не подключайте данный пакет. Для того, чтобы воспользоваться сервером swank, Вам достаточно в файле project.clj указать "девелоперскую" зависимость и выполнить lein deps.
:dev-dependencies [ [ swank-clojure "1.3.0-SNAPSHOT" ] ]

lein compile
lein install

sr-speedbar

~/.emacs.d/init-speedbar.el
(custom-set-variables
 '(speedbar-mode-specific-contents-flag t)
 '(speedbar-show-unknown-files t)
 '(speedbar-use-images nil))

(require 'sr-speedbar)

(provide 'init-speedbar)

Измененный ~/.emacs.d/init.el

;;----------------------------------------------------------------------------
;; Set load path
;;----------------------------------------------------------------------------
(if (fboundp 'normal-top-level-add-subdirs-to-load-path)
    (let* ((my-lisp-dir "~/.emacs.d/site-lisp/")
           (default-directory my-lisp-dir))
      (progn
        (setq load-path (cons my-lisp-dir load-path))
        (normal-top-level-add-subdirs-to-load-path))))
(setq load-path (cons (expand-file-name "~/.emacs.d") load-path))

;;----------------------------------------------------------------------------
;; Load configs for specific features and modes
;;----------------------------------------------------------------------------
(require 'init-linum)
(require 'init-highlight-symbol)
(require 'init-slime)
(require 'init-clojure)
(require 'init-speedbar)
(require 'init-paredit)
(require 'init-auto-complete)
(require 'init-elein)
;;----------------------------------------------------------------------------
;; Allow access from emacsclient
;;----------------------------------------------------------------------------
(server-start)

;;----------------------------------------------------------------------------
;; Variables configured via the interactive 'customize' interface
;;----------------------------------------------------------------------------
(setq custom-file "~/.emacs.d/custom.el")
(load custom-file)

(require 'init-locale)

(provide 'init)
После просмотра некоторого количества статей/заметок/wiki касаемо emacs, я даже и не знаю как охарактеризовать эту программу одним словом. Вы можете всё. Причем не Вы создаете программы, программа создает Вас. Буквально сейчас я подумал: "Eclipse лучше, он обладает современным графическим интерфейсом, системой рефакторинга,". И Emacs ответил мне:
Я прост, чтобы не отвлекать тебя.
Я прост, чтобы ты учился разрабатывать простые программы.
Я мощен, и ты должен чувствовать гармонию мощности и простоты.
Я расширяем, и это может продолжаться бесконечно.
Хм, наверно не зря в него включили психотерапевта. Я даже и знаю получиться ли у меня когда-нибудь в жизни сделать что-либо подобное на эту программу.

4 комментария:

  1. В указаном коде есть ошибочки...

    (require 'auto-complete-config nil) ;; don't break if not installed


    Замени на:
    (require 'xxx nil t)

    Без последнего 't' будет: don't break if not installed ))

    ОтветитьУдалить
  2. Анонимный21 мая 2014 г., 23:13

    Добрый вечер!
    Понравилась цветовая схема в Emacs, не могли бы вы выложить ее?

    ОтветитьУдалить