Emacs 微调:`set process sentinel`|`set process filter`|`start process`

Emacs 微调:`set process sentinel`|`set process filter`|`start process`,emacs,elisp,Emacs,Elisp,在互联网上,很少有例子涉及到这个问题中讨论的所有三个功能——即,设置进程哨兵设置过程过滤器;和启动过程 我尝试了几种不同的方法来微调流程,以强制流程1(推送)在流程2(推送)开始之前完成。在我所有的尝试中,第二个进程总是在我为进程1输入完密码之前运行并完成。进程2的密码存储在osxkeychain中 我尝试的第一种方法是使用Magit,包括同步和异步进程。我尝试的第二种方法是在搜索包含所述列表的缓冲区中的遥控器列表。下面列出了第三种尝试——它使用在函数开始时创建的远程列表,然后使用Git将列表向

在互联网上,很少有例子涉及到这个问题中讨论的所有三个功能——即,
设置进程哨兵
<代码>设置过程过滤器;和
启动过程

我尝试了几种不同的方法来微调流程,以强制流程1(
推送
)在流程2(
推送
)开始之前完成。在我所有的尝试中,第二个进程总是在我为进程1输入完密码之前运行并完成。进程2的密码存储在
osxkeychain

我尝试的第一种方法是使用Magit,包括同步和异步进程。我尝试的第二种方法是在搜索包含所述列表的缓冲区中的遥控器列表。下面列出了第三种尝试——它使用在函数开始时创建的远程列表,然后使用Git将列表向下推至
push

对于如何更好地控制1号过程(
推送
),从而在2号过程(
推送
)开始之前成功完成,我们将不胜感激

进程2开始和结束得太早并不是世界末日,而是学习如何控制Emacs进程,而不是控制我的进程


编辑(2014年4月23日):添加了文档字符串。修改了缓冲区的处理方法
*REMOTES*
——即
杀死局部变量'git remote list
擦除缓冲区
现在可以通过将
与当前缓冲区一起使用来正确工作…


(defvar git远程列表nil
“远程位置列表——例如,lawlist_remote或github_remote。”)
(将变量缓冲区设为本地“git远程列表”)
(defvar git提交消息(格式为“已提交--%s”(当前时间字符串))
“预定的Git提交消息。”)
(将变量缓冲区设为本地“git提交消息”)
(取消我的进程筛选器(进程字符串)
(当(字符串与“密码”字符串匹配时)
(处理发送字符串)
过程
(concat(读取passwd“Password:”)“\n”))
(取消我的进程sentinel(进程字符串)
(当(=0(进程退出状态proc))
(消息“进程“%s”已完成..proc)))
(取消阶段提交推送全部()
“此功能执行以下操作:
*保存当前工作缓冲区(如果已修改)。
*收集与工作目录Git项目关联的所有远程设备的列表。
*Stage all--`/usr/local/git/bin/git add`
*全部提交--`/usr/local/git/bin/git Commit-m[git Commit message]`
*推送到所有远程设备:`/usr/local/git/bin/git Push-v[remote][current branch]`
要获得当前分支,目前需要安装Magit。”
(互动)
(当(缓冲区修改-p)
(保存缓冲区)
(当(获取缓冲区“*REMOTES*”)时)
(使用当前缓冲区(获取缓冲区“*REMOTES*”)
(kill局部变量'git remote list)
(擦除缓冲区)))
(设置进程哨兵)
(启动流程)
“列出遥控器”
“*遥控器*”
“/usr/local/git/bin/git”
“远程”
“-v”)
(λ(pe)(当(=0(过程退出状态p))时)
(让我们*(
乞求
结束
git(远程名称)
(使用当前缓冲区(获取缓冲区“*REMOTES*”)
(转到字符(最大点))
(同时(向后搜索“\(按)\”无)
(第1行的开头)
(setq beg(点))
(向前搜索“\t”无)
(设定值结束(-(点)1))
(setq git远程名称(缓冲区子字符串无属性结束))
(setq git远程列表)
(附加(cons git remote name git remote list)))
(设置进程哨兵)
(启动流程)
“全部登台”
“*输出*”
“/usr/local/git/bin/git”
“添加”
".")
(λ(pe)(当(=0(过程退出状态p))时)
(设置进程哨兵)
(启动流程)
“全部提交”
“*输出*”
“/usr/local/git/bin/git”
“提交”
“-m”
git提交消息)
(λ(pe)(当(=0(过程退出状态p))时)
(地图车(lambda(x)
(让
(启动流程)
“推送过程”
“*输出*”
“/usr/local/git/bin/git”
“推”
“-v”
(格式为“%s”x)
(magit获取当前分支)))
(设置进程筛选器进程“我的进程筛选器”)
(设置进程sentinel进程“我的进程sentinel”))
(使用当前缓冲区(获取缓冲区“*REMOTES*”)git远程列表)
)))))))))))

<>代码>设置过程标识符>代码> >代码>设置过程过滤器代码>开始过程< /代码>,在进程未决时,可以考虑结合<代码>递归编辑<代码>暂停<代码> ELISP 函数,或者使用<代码>退出递归编辑< /C>或<代码> >(抛出'exit nil)
将控制权返回到暂停的
elisp
功能


编辑(2014年4月23日):编辑以创建包含
递归编辑
的最小示例。将在相关线程中维护和更新工作示例:


(取消我的git密码过程过滤器(过程字符串)
(当(字符串与“密码”字符串匹配时)
(处理发送字符串)
过程
(concat(读取passwd“Password:”)“\n”))
(取消我的进程sentinel(进程字符串)
(当(=0(进程退出状态proc))
(消息“进程“%s”已完成推送到“%s”proc git remote name)
(扔