Как известно, какая именно реализация CL будет запущена при запуске Slime определяется переменной inferior-lisp-program. Однако глобальное определение этой переменной и использование команды slime довольно неудобно, поскольку не позволяет легко запускать различные реализации CL. Я же часто запускаю как sbcl, так и clisp, а в планах поработать и с другими реализациями. Не переопределять же эту переменную каждый раз, когда хочешь поработать с другой реализацией? Поэтому, в свой конфиг Emacs я добавил следующее:
(defmacro lisp-slime (lisp path &optional coding)Теперь у меня доступны команды sbcl-slime и clisp-slime, которые позволяют легко запустить sbcl или clisp соответственно. Ну а макрос lisp-slime может быть использован для лёгкого добавления других реализаций.
(let ((funname (intern (format "%s-slime" lisp))))
`(defun ,funname ()
(interactive)
(let ((inferior-lisp-program ,path)
(slime-net-coding-system (or ,coding 'utf-8-unix)))
(slime)))))
(lisp-slime sbcl "/usr/bin/sbcl")
(lisp-slime clisp "/usr/bin/clisp")
Второй совет связан с использование hyperspec. Функция hyperspec-lookup отрывает документацию по символу в браузере и очень удобно, если это emacs-w3m. Для того, что бы так и происходило (в моей системе по умолчанию запускается Firefox), можно просто переопределить функцию browse-url-default-browser таким образом, что бы она вызывала w3m-browser-url. Однако, в таком случае функция browser-url всегда будет открывать указанный url в emacs-w3m, чего бы мне хотелось избежать (w3m хорош для работы с hyperspec, но для других задач я предпочитаю использовать Firefox). Добиться того, что бы hyperspec открывался в emacs-w3m (в том числе, при использовании slime-hyperspec-lookup), а другие url в браузере по умолчанию (в моём случае в Firefox) можно следующим образом:
(require 'hyperspec)Примечание: хотя в моей системе hyperspec загружается автоматически, мне всё же пришлось добавить (require 'hyperspec) до определения hyperspec-lookup, что бы гаранитровать правильный порядок инициализации.
(defun hyperspec-lookup (&optional symbol-name)
(interactive)
(let ((browse-url-browser-function 'w3m-browse-url))
(if symbol-name
(common-lisp-hyperspec symbol-name)
(call-interactively 'common-lisp-hyperspec))))
Вроде бы, для правильного указания порядка можно использовать eval-after-load
ОтветитьУдалитьЯ может припозднился, но вот читал доку по SLIME, и наткнулся на штатное решение вопроса выбора реализации лиспа: http://common-lisp.net/project/slime/doc/html/Multiple-Lisps.html#Multiple-Lisps
ОтветитьУдалить@dmitry_u
ОтветитьУдалитьНа мой взгляд это очень не удобно, я предпочитаю иметь отдельные команды sbcl-slime, clisp-slime, clozure-slime и т.п.