#emacs #development-environment #elisp
#emacs #среда разработки #elisp
Вопрос:
В Emacs есть всевозможные классные режимы языка программирования, написанные на elisp, но, по-видимому, нет специальной поддержки самого elisp.
Поскольку slime не работает для elisp, я спрашиваю себя, не был ли весь этот код elisp просто взломан в буфере scratch? Нет ли необходимости в чем-то вроде slime при написании elisp, или его просто нет? Кто-нибудь использует ECB и semantic для более крупных проектов elisp?
Комментарии:
1. Какие функции вы ищете? По общему признанию, я не использую другие lisps, поэтому я незнаком с подобными slime, но я никогда не замечал, чтобы Emacs испытывал недостаток в поддержке разработки на elisp. Могут существовать способы сделать то, что вы хотите.
2. Поскольку я начинаю с elisp, это скорее общий вопрос. Я хотел бы знать, как другие подходят к программированию на elisp, просто чтобы убедиться, что я не упускаю что-то важное. В Google-space почти пусто для «настройки elisp». Если это просто открытие файла .el с использованием загруженного emacs-lisp-mode и встроенного отладчика (или edebug), я уверен.
Ответ №1:
ielm
является ли Emacs Lisp REPL: интерактивным режимом Emacs Lisp.
M-x ielm поможет вам в этом.
Комментарии:
1. но, похоже, нет хорошего способа отправить части буфера процессу. Я хотел бы сделать то, что позволяют мне elpy или ess, то есть отправить область, буфер или файл в интерактивный процесс, чтобы я мог поиграть с этим там
2. @Dodgie: чтобы «отправить регион», выполните
M-x eval-region RET
. Обычно вы используете либоC-M-x
, либоC-x C-e
, хотя.
Ответ №2:
Сам Emacs поставляется с поддержкой Emacs Lisp. Такие базовые и промежуточные функции, как завершение ( M-TAB
), поиск в библиотеке ( M-x apropos
), документация ( C-h f
, C-h v
, C-h S
), запуск кода «на лету» ( C-M-x
, M-:
), выполняются непосредственно в запущенном Emacs.
Основная цель Slime — взаимодействие с внешним процессом. Для Emacs Lisp это не нужно (если только вы не разрабатываете для другой версии Emacs, но это редко вызывает беспокойство).
Функции ECB и semantic в основном полезны для больших проектов (состоящих из более чем нескольких исходных файлов). Люди не склонны писать большие проекты на Emacs Lisp.
Комментарии:
1. Можно даже сказать, что смысл Slime в том, чтобы сделать разработку на CL почти такой же удобной, как Elisp из коробки.
Ответ №3:
Всегда есть emacs-lisp-mode, который (по крайней мере, в Emacs 23) автоматически загружается всякий раз, когда вы редактируете файл .el. Похоже, именно это используют многие хакеры emacs lisp для написания своих программ. В нем есть несколько приятных функций (например, компиляция или оценка буфера, некоторые инструменты отладки, профилирование). Буфер *scratch * по умолчанию редактируется из lisp-interaction-mode, который немного отличается.
Он не такой полнофункциональный, как, скажем, slime (сообщество elisp гораздо меньше, чем common lisp), но он определенно работает. Вам придется покопаться в документации и поэкспериментировать с режимом, чтобы увидеть, какие функции вы можете использовать.
Комментарии:
1. Итак, есть 3 варианта: scratch-buffer и ielm для интерактивного использования и emacs-lisp-mode для более «серьезного» программирования на elisp. Буквально минуту назад я нашел огромную коллекцию Yasnippets для elisp, даже для заголовка файла, что может еще больше ускорить процесс: emacswiki.org/emacs-en/AndyStewart_YasnippetTemplate#toc2
2. SLIME был написан потому, что хакеру elisp хотелось чего-то такого же хорошего, как edebug, ielm и связанные с ними инструменты для Common Lisp. Это было бы трудно проверить, но я бы предположил, что количество программистов на elisp намного больше, чем количество программистов на Common Lisp.
Ответ №4:
Как указано, Emacs уже является окончательной средой разработки elisp и внутренне предоставляет вам большую часть функциональности, которая вам, вероятно, понадобится.
Потенциально вы могли бы также использовать ctags / etags для генерации внешнего индекса для вашей базы кода elisp, если вы хотели перейти к определениям функций, которые еще не были загружены (и в которых отсутствовали объявления автоматической загрузки). M-x find-function
RET обрабатывает это иначе. (Я привязываю это к C-hC-f)
Функции «по назначению» являются ключом к поиску вещей в целом. Для удобства доступа я использую следующие привязки:
(define-prefix-command 'Apropos-Prefix nil "Apropos (a,c,d,i,l,v,C-v)")
(global-set-key (kbd "C-h C-a") 'Apropos-Prefix)
(define-key Apropos-Prefix (kbd "a") 'apropos)
(define-key Apropos-Prefix (kbd "C-a") 'apropos)
(define-key Apropos-Prefix (kbd "c") 'apropos-command)
(define-key Apropos-Prefix (kbd "d") 'apropos-documentation)
(define-key Apropos-Prefix (kbd "i") 'info-apropos)
(define-key Apropos-Prefix (kbd "l") 'apropos-library)
(define-key Apropos-Prefix (kbd "v") 'apropos-variable)
(define-key Apropos-Prefix (kbd "C-v") 'apropos-value)
;; Use prefix arg (C-u) to see more results for a call,
;; or uncomment the next line to do this by default:
;; (setq apropos-do-all t)
;; See C-h v apropos-do-all RET for details.
Я также включаю eldoc-mode
и у меня есть imenu-ido-goto-symbol
привязка (но очень редко используется).
Существуют другие библиотеки, которые могут оказаться полезными. Я знаю, что некоторые люди ругаются, например, Parredit. По общему признанию, немного сложно настроить поиск библиотек elisp, которые полезны для написания elisp. Я не уверен, есть ли в Emacs Wiki категория для этого?
Ответ №5:
-
Обычно я использую
emacs-lisp-mode
вместо режима по умолчанию для*scratch*
. В 99% случаев я хочу сэкономить даже одноразовые интерактивные тесты (по крайней мере временно), поэтому я чаще использую*.el
файл, чем*scratch*
. -
Icicles могут очень помочь при взаимодействии с Emacs Lisp. Способов слишком много, чтобы перечислять их здесь. Вот два обзора, которые могут дать представление:
Ответ №6:
Я думаю, добавить это к вам .emacs
(define-key emacs-lisp-mode-map (kbd "M-.") 'find-function-at-point)
будет очень полезно.
Комментарии:
1.
M-.
уже делает это по умолчанию (черезxref
библиотеку) в достаточно последних версиях Emacs.
Ответ №7:
M-x edebug-defun
для отладки функции
Я думаю, что это лучшие инструменты отладки для elisp.