例如
M-! read -p "input:" v; echo $v
但是没有提示就结束了,应该如何解决呢?
例如
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
要不要 M-! 再运行个 Vim 就更好了?
没有什么问题是一个参数解决不了的,如果有,那就两个。
感谢!能不能解释一下原因呢?
如果 Emacs 是运行在终端里的话:
M-: (suspend-emacs "vim ; fg")
其实 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
感受一下。
”传参数“是什么意思?譬如在 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
更基本,除了响应命令输入,其他什么都做不了。