переопределите C-x C-e для оценки выражения пользовательского языка

#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 ), дает вашему скрипту ожидаемый синтаксис.