Отправить код интерпретатору схемы из информационного буфера

#emacs #scheme #sicp

#emacs #схема #sicp

Вопрос:

Я хочу изучить SICP в моем Emacs. Я установил MIT Scheme, Emacs 24 и загрузил информацию о sicp (используя это руководствоhttp://www.pchristensen.com/blog/articles/setting-up-and-using-emacs-infomode /). Теперь я могу запустить интерпретатор схемы в выделенном буфере (M-x run-scheme), но я получаю следующую ошибку при попытке отправить одно из выражений define из информационного буфера (C-x C-e):

 Debugger entered--Lisp error: (void-function define)
  (define (abs x) (cond ((> x 0) x) ((= x 0) 0) ((< x 0) (- x))))
  eval((define (abs x) (cond ((> x 0) x) ((= x 0) 0) ((< x 0) (- x)))) nil)
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp nil nil)
  

Похоже, Emacs пытается выполнить этот код с помощью интерпретатора Lisp. В качестве решения этой проблемы теперь я открываю scheme buffer (файл *.scm), копирую в него код из info, и они выполняют его с помощью C-x C-e. Но я хочу выполнить его непосредственно из информационного буфера. Как я могу это настроить?

Ответ №1:

Когда вы нажимаете (C-x C-e) в информационном режиме, Emacs вызывает eval-last-sexp , потому что это то, к чему привязана комбинация клавиш в info-mode

Что (C-x C-e) связано с in scheme-mode ? Вы можете узнать, используя (C-h c) ? Вы можете привязать какую-либо другую комбинацию клавиш к этой функции в info режиме и использовать эту комбинацию клавиш.

Обратите внимание, что информационный режим доступен только для чтения. Если функция scheme-eval вставляет результаты в текущий буфер, вам потребуется обходной путь.

Ответ №2:

Вы хотите запустить другую функцию, поэтому попробуйте это:

 (define-key Info-mode-map (kbd "C-x C-e") 'lisp-eval-defun)