我有一个.sh
带有 shell 命令的文件,例如:
echo "What shall are we running?"
if [ "$0" == "-bash" ]; then
echo "I'm running a bash"
else
echo "Not a bash"
fi
ls -al | less
htop
我想在 Emacs (27.2) 中一次一行地浏览这些文件(出于教学目的),并将每一行发送到 macOS (12.1) 终端应用程序Terminal.app
。
与此最密切相关的帖子似乎是
this,但没有一个解决方案效果很好。例如,使用tmux
inside Terminal.app
,组合 withemamux
不起作用,因为后者不允许发送完整的行(并且 with 的解决方案tmux
除了矫枉过正之外还有一些缺点)。这里最不赞成的答案为 iTerm 提出了一个想法。最重要的功能是iterm-send-string
,但我没有使用 Emacs Lisp 编程的经验,所以无法让它工作。
我发现的另一个想法是eepitch
,但我不想将我的 shell 脚本与其他输入混淆(同样,出于教学目的)。还有一个想法是this,但对于 GNU/Linux。
对此类问题的常见回答似乎是“为什么不用 Mx (e)shell?” 到目前为止,最有效的方法确实是M-x ansi-term
与
这种方法相结合。问题是既不shell
,eshell
也不ansi-term
等同于Terminal.app
,例如,上面示例 shell 脚本 ( less
, htop
)中的最后两行在ansi-term
. 所以我现在最好的解决方案是单步执行 shell 脚本中的“大部分”行,ansi-term
并偶尔拉起Terminal.app
执行在ansi-term
.
我尝试使用 AppleScript 脚本向终端发送命令。这行得通,但从 Emacs 与 AppleScript 交谈却没有。经过较长时间的搜索,我遇到了
vterm
here,这是一个与我预期不同的解决方案,但vterm
可以在 Emacs 缓冲区中运行更好的解决方案。所以我的解决方案是这样的:安装
vterm
. 对我来说这是brew install cmake libvterm
, 然后M-x list-packages
(=> installvterm
)。在
.emacs
我有(global-set-key (kbd "C-c v") #'vterm-other-window)
,然后是以下(直接改编这篇文章的解决方案):vterm
viaC-c v
,然后我可以通过重复将当前行vterm
从代码缓冲区(例如某个.sh
文件)发送到C-RET
。主要的一点是它vterm
比shell
,eshell
或更有能力ansi-term
。如果您不想弄乱
.emacs
,那么只需执行M-x vterm-other-window
,然后(从.sh
文件中)执行即可M-x isend-associate + RET + *vterm* + RET
,您将获得相同的功能。