Emacs для clojure и общего lisp с slime-fancy (slime-autodoc)

Я установил emacs как для clojure, так и для обычного lisp, но я хочу также (slime-setup '(slime-fancy)) для обычного lisp. Если я добавлю эту строку в init.el, clojure не будет работать: она дает мне repl, но она зависает после запуска любого кода.

Моя конфигурация

Для clojure:

  • Я установил clojure -мод, слизь, slime-repl через ELPA
  • Я запускаю $lein swank в каталоге проекта
  • Затем M-x slime-connect to hack clojure

Для общего lisp я помещаю это после ELPA-кода в init.el:

(add-to-list 'load-path "~/.elisp/slime")
(require 'slime)
(add-to-list 'slime-lisp-implementations '(sbcl ("/opt/local/bin/sbcl") :coding-system utf-8-unix))
;; (slime-setup '(slime-fancy))

Итак, если я раскомментирую последнюю строку, clojure будет нарушен. Но слизь представляет собой очень важный мета-пакет для взлома общих lisp.


Есть ли способ заставить их работать как без изменения конфигурации и перезапуска, когда мне нужно переключать языки?


Update

Я обнаружил, что slime-autodoc, загруженный слизью, является причиной зависания.

(slime-setup '(slime-fancy))
(setq slime-use-autodoc-mode nil)

Эта конфигурация позволяет запускать как общие lisp, так и clojure SLIME. Даже одновременно. Но без slime-autodoc.

Я также обнаружил, что использую CVS-версию SLIME, так как я вручную делаю (добавить-к-списку "load-path" ~/.elisp/slime ") после ELPA-кода. Это не решает проблему. Может быть, есть версия с какой-то волшебной даты, которая работает с clojure? Здесь парень говорит, что для него работает версия CVS: http://www.youtube.com/watch?v=lf_xI3fZdIg&feature=player_detailpage#t=221s

Ответ 1

Вот решение. (используя крючки)
Это уродливо, но довольно удобно.

(add-hook 'slime-connected-hook
          (lambda ()
            (if (string= (slime-lisp-implementation-type) "Clojure")
                (setq slime-use-autodoc-mode nil)
              (setq slime-use-autodoc-mode t))
            ))

(add-hook 'slime-mode-hook
          (lambda ()
            (if (eq major-mode 'clojure-mode)
                  (slime-autodoc-mode 0)
                (slime-autodoc-mode 1))))

Обновление Если проблема по-прежнему существует в буфере slime-repl, попробуйте следующий код:

(add-hook 'slime-repl-mode-hook
          (lambda ()
            (if (string= (slime-lisp-implementation-type) "Clojure")
                (progn (setq slime-use-autodoc-mode nil)
                       (slime-autodoc-mode 0))
              (progn (setq slime-use-autodoc-mode t)
                     (slime-autodoc-mode 1)))))

Ответ 2

Недавно я размышлял над той же проблемой. Проблема в том, что SLIME в ELPA обрезается и находится рядом с бесполезным для Common Lisp. Один из способов обойти эту проблему - проверить SLIME из CVS с той же даты, что и для проверки пакета ELPA, и вручную добавить недостающий материал. Кто-то из # clojure сказал мне, что он это сделал, и решение сработало. Я лично считаю такое решение довольно уродливым, но пока кому-то не удается получить поддержку Clojure в верхнем слое SLIME, не будет лучшего.

В качестве альтернативы вы можете добавлять функции в slime-setup по-одному и видеть, какая функция именно вызывает проблему с оценкой Clojure - после того, как все слизь-фантазия - это просто метафаза, которая просто загружает самые популярные функции Contrib.

Btw вам не нужны строки

(add-to-list 'load-path "~/.elisp/slime/contrib")
(setq slime-backend "~/.elisp/slime/swank-loader.lisp")
(require 'slime)

Файл-источник будет автоматически добавлен в путь загрузки, фоновый код будет по умолчанию, и если вы используете "slime-autoloads", перед этим вам понадобится слизь, так как это приведет к потере цели автозагрузки.