在Emacs中执行Perl,最基本的方法

4

我正在学习如何在Emacs中使用Perl。以前我是在R-Studio中运行R的。

我怎样才能在不离开Emacs的情况下执行命令呢?

例如:在R-Studio中,我输入以下命令

    print("hello world") 

按下Ctrl+Enter,R-studio会执行命令并打印"hello world"。如何在Emacs中为Perl命令执行相同的操作?

通常我会键入Ctrl+X Ctrl+F test.pl

    print "hello world";

然后我不知道该怎么做才能让Emacs执行该命令。

4个回答

4
对于各种解释型语言,我使用isend-mode,它允许将缓冲区的部分发送到另一个缓冲区中的终端。
以下是使用方法(安装后):
  1. 打开一个ansi-term缓冲区:

    M-xansi-termRET/bin/bashRET

    并在其中运行一个交互式的perl会话:

    perl -d -e 42RET

    或者安装term-run.el,直接在term缓冲区中启动交互式perl会话:

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

  2. 打开包含要执行代码的缓冲区,并将其关联到解释器缓冲区:

    M-xisendRET*ansi-term*RET

  3. 在perl缓冲区中按C-RET,将当前行发送到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)

我正在努力获取isend-mode,希望这会奏效。谢谢你的帮助。我在获得扩展时会进行更新。 - Federico C
@Francesco。这很棒,但在我的实验中,解释器不会打印或运行任何内容,直到您向解释器发送EOF(您必须从运行解释器的缓冲区执行此操作)。是否有任何方法可以让“isend-mode”以某种方式为您完成此操作? - Amelio Vazquez-Reina
您可以在调试模式下启动 perl,以获取交互式的 perl 环境(其中行会即时解释)。perldebug(1) 手册中包含了所有细节,但您可以从 perl -d -e 42 开始。 - François Févotte
@kaushalmodi ansi-term 只接受程序名称;您不能提供参数。第一种解决方案是在您的 ansi-term 中运行常规 shell(例如 bash),然后从那里运行 perl -d -e 42。第二种解决方案是创建一个自定义 shell 脚本,为您运行 perl 调试器。 - François Févotte
1
@kaushalmodi term-run 似乎允许在 term 缓冲区中带参数运行程序。这将有助于启动 Perl 的交互式调试器。 - François Févotte
显示剩余5条评论

2
这是我使用的方法: Meta-x shell perl test.pl

2
如果您可以加载CPerl模式(如果使用.pl扩展名加载文件,则Emacs应默认执行此操作),则还应在菜单栏中获得Perl菜单(假设您正在GUI中运行,而不是简单终端)。
从Perl菜单中,只需选择“运行”!当前缓冲区(Perl脚本)将被运行(首先会提示您输入任何参数),并且结果将显示在新缓冲区中。

我正在使用GUI,但是我看不到“Perl菜单”。 - Federico C
@FedericoC,你确定你在“cperl-mode”而不是“perl-mode”中吗? - jordanm
@jordanm 我不知道如何检查或设置它。我尝试了Ctrl+x cperl-mode,但是我没有看到任何更改。 - Federico C
@FedericoC M-x cperl-mode - jordanm

1
如果我在Emacs中运行Perl,通常是为了处理文本区域或将命令的结果插入到缓冲区中。
使用M-!(Meta-Shift-1)可以执行shell命令,并在迷你缓冲区中显示其结果。
在命令前加上前缀参数(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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接