emacs的M-!如何与bash脚本交互呢?

例如

M-! read -p "input:" v; echo $v

但是没有提示就结束了,应该如何解决呢?

(progn
  (async-shell-command  "read -p 'input:' v; echo $v")
  (switch-to-buffer "*Async Shell Command*"))

M-x async-shell-commandread -p "input:" v; echo $v

2 个赞

要不要 M-! 再运行个 Vim 就更好了?:roll_eyes:

没有什么问题是一个参数解决不了的,如果有,那就两个。

感谢!能不能解释一下原因呢?

如果 Emacs 是运行在终端里的话:

M-: (suspend-emacs "vim ; fg")
1 个赞

其实 shell-command (也就是M-!)也是可以的:

M-x shell-commandread -p "input:" v; echo $v&

async-shell-command 只不过自动在末尾加了个 &

……我是说:传参显然是更为漂亮优雅的做法。

过度追求奇技淫巧有时会搞得软件臃肿不堪。

  • shell-command 创建的是一个 synchronous 进程,进程结束之前,用户是不能操作的(划重点),但是可以 C-g 强制结束。所以这里出现了一个"悖论",如果用户可以输入(跟 read 命令交互),说明进程结束了;既然进程结束了,用户就不应该看到 read 命令提示。

  • async-shell-command 创建的是一个 asynchronous 进程,用户不必等待进程结束就可以操作了(划重点),也就可以看到运行中的 read 命令在等待输入。

关于 synchronous / asynchronous,可以分别输入命令 sleep 10 感受一下。

2 个赞

”传参数“是什么意思?譬如在 Emacs 中使用 Shell M-!、Python M-x run-python 等么?


另外,似乎 Vim 就是这么做的(?)在 Vim 中打开 Emacs::! emacs -Q

async-shell-command 的效果跟 M-x shell 类似,都运行在 comint-mode,也都有非常基本的 I/O 能力。M-x run-python 等也是。

就是……bash 脚本你传递个参数嘛 install ./ 或者 ici emacs 什么的。重点说的是 bash 脚本,不是 emacs。

用之前 help 一下。哦,要安装 207 个包?install ./ -Y 慢慢安去吧,谁等你。没事少 read,跑来问我。


Vim 中打开 Emacs 在 neovim 上体验更好一点,我截了一张图:

可以简单普及下comint mode相关知识么?

M-x shell 更基本,除了响应命令输入,其他什么都做不了。

1 个赞