我正在学习如何在 Emacs 中使用 Perl。我曾经使用 R-Studio 运行 R。
如何在不离开 Emacs 的情况下执行命令?
示例:在 R-studio I 中输入
print("hello world")
然后按 Ctrl+Enter,R-studio 执行命令并打印
"hello world"
。
如何在 Emacs 中对 Perl 命令执行相同的操作?
我通常输入 Ctrl+X Ctrl+F test.pl
print "hello world";
然后我不知道如何让Emacs执行该命令。
对于各种解释语言,我使用 isend-mode,它允许将缓冲区的一部分发送到另一个缓冲区中的终端。
以下是如何使用它(安装后):
打开
ansi-term
缓冲区:
M-x
ansi-term
RET/bin/bash
RET
并在其中运行交互式 Perl 会话:
perl -d -e 42
RET
或者,安装 term-run.el 并直接在
term
缓冲区中启动交互式 Perl 会话:
M-x
term-run-shell-command
RETperl -d -e 42
RET用要执行的代码打开缓冲区,并将其关联到解释器缓冲区:
M-x
isend
RET*ansi-term*
RET在 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)
如果您可以加载 CPerl 模式(如果您加载扩展名为 .pl 的文件,Emacs 应该默认这样做),您还应该在菜单栏中获得 Perl 菜单(假设您在 GUI 中运行,而不是在简单的终端中运行) ).
从 Perl 菜单中,只需选择“运行”! 当前缓冲区(Perl 脚本)将运行(系统将首先提示您输入任何参数),并将结果显示在新缓冲区中。
这就是我用的:
元
-x shell
perl test.pl
如果我从 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>
我用
Meta-x编译。
Meta 是 alt 键。 缓冲区将在第一次打开命令 make -k 。 您可以删除它并输入
perl file.pl
第一次运行该命令,emacs 下次会记住它。 如果你想要真正喜欢,你可以打开 ~/.emacs.d/init.el 文件并输入以下内容
(add-hook 'cperl-mode-hook
(lambda ()
(set (make-local-variable 'compile-command)
(format "perl %s" (file-name-nondirectory buffer-file-name)))))
(add-hook 'perl-mode-hook
(lambda ()
(set (make-local-variable 'compile-command)
(format "perl %s" (file-name-nondirectory buffer-file-name)))))
(global-set-key (kbd "<f5>") 'compile)
现在要编译,您只需按 f5 即可,emacs 应该运行正确的命令。 Emacs 也会保存该命令以供下次编译时使用。 我更喜欢 cperl 模式,但这也应该适用于 perl 模式。 我从一个做同样事情的人那里得到了这个,但是这里是 javascript
你也可以跑步
Meta-x外壳
并使用打开的 shell 窗口来运行
perl file.pl
我通常懒得做其中任何一个。 我将用 & 符号打开 emacs 以返回这样的命令行
emacs file.pl &
如果您正在运行 GUI,终端将在 Emacs 中打开该文件并返回命令行。 当我想运行它时,我只需返回终端窗口并运行
perl file.pl
如果我没有运行 GUI,例如通过 ssh 或 wsl,我通常只会打开两个终端窗口。 一种用于 emacs,一种用于运行命令。