Выполнение Perl в Emacs, самое простое

Я учусь использовать Perl в Emacs. Раньше я запускал R с R-Studio.

Как выполнить команду, не выходя из Emacs?

Пример: в R-studio я набираю

    print("hello world") 

и нажмите Ctrl+Enter, и R-studio выполнит команду и напечатает "hello world". Как сделать то же самое в Emacs для команды Perl?

Обычно я набираю Ctrl+X Ctrl+F test.pl

    print "hello world";

и тогда я не знаю, что делать, чтобы Emacs выполнил команду.


person Federico C    schedule 29.11.2012    source источник


Ответы (4)


Для всех видов интерпретируемых языков я использую isend-mode, который позволяет отправлять части буфера на терминал в другом буфере.

Вот как вы будете его использовать (после его установки):

  1. Откройте буфер ansi-term:

    M-xansi-termRET/bin/bashRET

    и запустите интерактивный сеанс perl внутри:

    perl -d -e 42RET

    В качестве альтернативы можно установить term-run.el и напрямую запустить интерактивный сеанс Perl в буфере term. :

    M-xterm-run-shell-commandRETperl -d -e 42RET

  2. Откройте буфер с кодом, который вы хотите выполнить, и свяжите его с буфером интерпретатора:

    M-xisendRET*ansi-term*RET

  3. Нажмите C-RET в буфере perl, чтобы отправить текущую строку интерпретатору в буфере ansi-term. Если регион активен, будут отправлены все строки, охватывающие этот регион.


Ниже приведена предлагаемая настройка, позволяющая лучше использовать специальные команды отладчика perl. При следующей настройке x добавляется ко всем инструкциям (чтобы вы видели результаты), кроме команд print.

(defun isend--perl (buf-name)
  "Prepend 'x ' to normal perl instructions.
Leave 'print' instructions untouched."
  (with-current-buffer buf-name
    (goto-char (point-min))
    (unless (looking-at "[[:space:]]*print")
      (insert "x ")))
  (insert-buffer-substring buf-name))

(defun isend-default-perl-setup ()
  (when (eq major-mode 'perl-mode)
    (set (make-local-variable 'isend-send-line-function) #'isend--perl)))

(add-hook 'isend-mode-hook #'isend-default-perl-setup)
person François Févotte    schedule 29.11.2012
comment
Я работаю над получением isend-mode, надеюсь, это сработает. Спасибо за помощь. Я обновлю, когда мне удастся получить расширение. - person Federico C; 30.11.2012
comment
@Франческо. Это здорово, но в моих экспериментах интерпретатор ничего не печатает и не запускает, пока вы не отправите интерпретатору EOF (что вы должны сделать из буфера, в котором запущен интерпретатор). В любом случае isend-mode мог бы как-то сделать это для вас? - person Amelio Vazquez-Reina; 01.04.2013
comment
Вы можете запустить perl в режиме отладки, чтобы получить интерактивную среду Perl (в которой строки интерпретируются на лету). На man-странице perldebug(1) есть все подробности, но вы можете начать с perl -d -e 42 - person François Févotte; 01.04.2013
comment
@Francesco Это решение не работает для меня. Как запустить perl в режиме отладки в ansi-term. Также как я могу передать символ EOF, если Perl не работает в режиме отладки? Спасибо! - person Kaushal Modi; 03.02.2015
comment
@kaushalmodi ansi-term принимает только имя программы; можно не аргументировать. Первое решение — запустить обычную оболочку (например, bash) в вашем ansi-term, а оттуда запустить perl -d -e 42. Второе решение состоит в создании пользовательского сценария оболочки, который запускает отладчик Perl вместо вас. - person François Févotte; 03.02.2015
comment
@kaushalmodi, что касается отправки EOF, в настоящее время это не функция isend-mode. Но я не думаю, что это было бы уместно здесь: как только вы отправляете EOF интерпретатору perl, он выполняет ваш код, и (не очень) интерактивный сеанс завершается. В этом случае я бы сказал, что вам лучше использовать простые скрипты Perl в файле. - person François Févotte; 03.02.2015
comment
@Francesco Спасибо за совет запустить bash в ansi-term. Но мне все еще чего-то не хватает. Я не могу сразу запустить какой-либо perl-скрипт в отладчике perl, который сейчас работает в экземпляре оболочки bash в ansi-term. Мне нужен собственный elisp для отправки строки LINE в моем script.pl как x LINE в буфере ansi-term, верно? И операторы print выглядели бы лучше, если бы print LINE в моем script.pl отправлялись как p LINE в буфере ansi-term. - person Kaushal Modi; 03.02.2015
comment
@kaushalmodi isend поддерживает преобразование содержимого буфера перед его отправкой интерпретатору. Но вы правы, вам придется написать немного elisp, чтобы проинструктировать его именно то, что вам нужно. Следующий суть должен дать вам приблизительное представление о том, как это должно быть сделано. - person François Févotte; 03.02.2015
comment
@Франческо Спасибо! Наконец-то у меня есть работоспособный поток: установка Perl. - person Kaushal Modi; 03.02.2015
comment
@kaushalmodi term-run, похоже, позволяет запускать программы с аргументами в буфере term. Это помогло бы запустить интерактивный отладчик Perl. - person François Févotte; 25.02.2015

Это то, что я использую:

Мета-x shell

perl test.pl

person mob    schedule 29.11.2012

Если вы можете загрузить режим CPerl (Emacs должен делать это по умолчанию, если вы загружаете файл с расширением .pl), вы также должны получить меню Perl в строке меню (при условии, что вы работаете в графическом интерфейсе, а не в простом терминале) .

В меню Perl просто выберите «Выполнить»! Будет запущен текущий буфер (сценарий Perl) (сначала вам будет предложено ввести любые аргументы), а результаты отобразятся в новом буфере.

person jimtut    schedule 29.11.2012
comment
Я использую графический интерфейс, но не вижу меню Perl. - person Federico C; 29.11.2012
comment
@FedericoC, ты уверен, что находишься в cperl-mode, а не в perl-mode? - person jordanm; 29.11.2012
comment
@jordanm Я понятия не имел, как это проверить или установить. Я попробовал Ctrl+x cperl-mode, но не увидел никаких изменений. - person Federico C; 30.11.2012
comment
@ФедерикоК M-x cperl-mode - person jordanm; 30.11.2012

Если я запускаю Perl из Emacs, я обычно обрабатываю область текста или вставляю результаты команды в буфер.

M-! (это Meta-Shift-1) выполнит команду оболочки и отобразит результаты в мини-буфере.

Префикс команды с аргументом префикса (M-1) вставит вывод команды в точку.

Например, заглушка (x)HTML-файла в пустой буфер: M-1 M-! perl -MCGI=:standard -e 'print start_html("Hello World"),end_html'

будет производить следующее:

<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Hello World</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
person willwillis    schedule 30.11.2012