在Emacs Lisp中将命令行参数转换为列表

在Emacs Lisp中将命令行参数转换为列表,emacs,command-line,elisp,command-line-arguments,Emacs,Command Line,Elisp,Command Line Arguments,在自动化的Emacs Lisp--batch/--script脚本中,我需要处理给定给脚本的命令行参数 我已经把这些参数放到了一个表单列表中: (“--aaa=bbb”“--ccc=ddd=eee”“--blah”) 现在,我需要将它们转换为表单列表: (“aaa”“bbb”)(“ccc”“ddd=eee”)(“blah”)) 在Python中,我会编写如下内容: output=[] 对于输入中的v: output.append(v[2:][.split(“=”,1)) 但我们无法将该代码

在自动化的Emacs Lisp
--batch/--script
脚本中,我需要处理给定给脚本的命令行参数

我已经把这些参数放到了一个表单列表中:

(“--aaa=bbb”“--ccc=ddd=eee”“--blah”)
现在,我需要将它们转换为表单列表:

(“aaa”“bbb”)(“ccc”“ddd=eee”)(“blah”))
在Python中,我会编写如下内容:

output=[]
对于输入中的v:
output.append(v[2:][.split(“=”,1))
但我们无法将该代码转换为Emacs Lisp。我找到了,但没能弄明白如何让它只在第一个相等的位置上分开


我正沿着使用
(子字符串“abcdefg”x x)
(搜索)
的路线从
cl
包开始,但感觉应该有更好的方法?我想还应该使用
(mapc'input)
函数在哪里执行
v[2:].split(“=”,1)
部分。

您可以使用
split string
。请参见下面的代码示例

(setq cmd行“(“--aaa=bbb”“--ccc=ddd=eee”“--blah”))
(setq命令行(mapcar)(lambda(argstr)
(当(字符串匹配“^--”argstr时)
(拆分字符串(子字符串argstr 2“=”))
命令行)
输出为
(“aaa”“bbb”)(“ccc”“ddd”“eee”)(“blah”)
。 这并不是您想要的,因为
“eee”
。也许你可以用它而忽略“eee”

如果
“eee”
确实是一个问题,则稍加修改即可:

(setq cmd行“(“--aaa=bbb”“--ccc=ddd=eee”“--blah”))
(setq命令行(mapcar)(lambda(arg)
(当(字符串匹配“^--”参数)
(setq arg(拆分字符串(子字符串arg 2)”=“”)
(如果(cdr参数)
(设置cdr(cdr参数)无)
精氨酸)
命令行)
输出为:

(("aaa" "bbb") ("ccc" "ddd=eee") ("blah"))
(“aaa”“bbb”)(“ccc”“ddd”)(“blah”))
问题中新要求的变体:

(setq cmd行“(“--aaa=bbb”“--ccc=ddd=eee”“--blah”))
(setq命令行(mapcar)(lambda(arg)
(当(字符串匹配“^--\\([^=]*\\)\(?:=\\(.*\\)\)\)?”参数时)
(let((opt(匹配字符串1参数))
(val(匹配字符串2 arg)))
(如果val
(列表选项val)
(列表选项(()))
命令行)
输出为:

(("aaa" "bbb") ("ccc" "ddd=eee") ("blah"))

谢谢你!我已经得到了你的第一个例子,但遇到了“eee”问题。我不太明白你的第二个例子是怎么工作的?你能进一步解释吗?嗨,托比亚斯,我终于测试了你的第二个示例,但它并没有解决“eee”问题。@tim mithro ansell这很有趣,因为它对我来说运行良好。我将得到的输出添加到了暂存缓冲区中。(你能在划痕缓冲区中准确地运行它吗?祝你好运,Tobias@tim-mithro ansell现在,我读了你问题的编辑。你添加了一个新的要求。在以前的版本中,你要求
(“ccc”“ddd”)
用于
——ccc=ddd=eee
。现在,你要求
(“ccc”“ddd=eee”)
。我会在有空闲时间的时候修改我的答案以满足这个需求。啊,对不起,我的示例错了。感谢固定版本,它工作得很好!注意,在最初的帖子中,期望的结果是
((“aaa”“bbb”)(“ccc”“ddd”)(“blah”)
。这是我的第一个解决方案。新需求的解决方案
((“测试”(“aaa”“bbb”)(“ccc”“ddd=eee”)
现在添加到我下面的答案中。