#emacs #elisp
#emacs #elisp
Вопрос:
Я определил основной режим для своего языка. Я пытаюсь переопределить C-x C-e так, чтобы, когда я нахожусь в своем основном режиме, он оценивал выражение с помощью «моего» пользовательского интерпретатора.
Предположим, что мой интерпретатор — это просто программа командной строки, которую можно вызвать следующим образом:
$my-interpreter <some expression>
Я полагаю, все, что мне нужно сделать, это выполнить системный вызов, передав выражение «перед точкой» в качестве аргумента и напечатать возвращаемое значение в области echo.
Насколько это может быть трудно, не так ли?
Проблема: я понятия не имею, с чего начать! Какой-нибудь намек?
Спасибо.
Ответ №1:
Вы можете взглянуть shell-command
и на его родственников, заодно thing-at-point
. Вот действительно простой пример, который использует «интерпретатор» (просто команду оболочки echo
) для повторения слова в точке:
(defun my-interpreter ()
(interactive)
(let ((arg (thing-at-point 'word)))
(when arg
(shell-command (concat "echo " arg)))))
(Отредактируйте в ответ на комментарий.)
Если вы определили расклад для своего основного режима, вы можете выполнить привязку C-x C-e
в своем основном режиме с помощью вызова define-key
. В противном случае вы можете просто привязать его локально с (local-set-key (kbd "C-x C-e") 'my-interpreter)
помощью .
Мне пришло в голову, что вы могли бы быть заинтересованы в создании интерактивной функциональности, такой как REPL. Чтобы сделать это, вы могли бы подумать comint-mode
; посмотрите EmacsWiki и этот пост из Mastering Emacs, чтобы получить вдохновение.
Комментарии:
1. Потрясающе! Делает именно то, что мне нужно. Конечно, мне все еще нужно выяснить, как это связать
C-x C-e
. Но спасибо вам!!!2. Отредактированный ответ теперь объясняет, как привязать команду к комбинации клавиш.
3. Еще раз спасибо! просто сделал это «ответом». 🙂
4. Я получил эту ошибку при выполнении
local-key-set
: /bin/bash: -c: строка 1: синтаксическая ошибка рядом с неожиданным токеном)' /bin/bash: -c: line 1:
(local-set-key (kbd «C-x C-e») ‘my-interpreter)»5. Я мало что знаю о сценариях bash, поэтому не могу сильно помочь, но я бы удостоверился, что то, что вы передаете скрипту в виде строки (через
thing-at-point
и вызовconcat
), дает вашему скрипту ожидаемый синтаксис.