【问题标题】:Convert command line arguments to list in Emacs Lisp将命令行参数转换为 Emacs Lisp 中的列表
【发布时间】:2014-08-31 09:43:30
【问题描述】:

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

我已经将参数放入表单列表中:

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

现在,我需要将它们转换为表单列表:

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

在 Python 中我会写类似的东西;

   output = []
   for v in input:
     output.append(v[2:].split("=", 1))

但无法将该代码转换为 Emacs Lisp。我找到了Elisp split-string function to split a string by . character,但不知道如何让它只在第一个等号上拆分。

我正在使用cl 包中的(substring "abcdefg" x x)(search),但感觉应该有更好的方法?我想也想使用(mapc '<function> input) where 函数执行v[2:].split("=",1) 部分。

【问题讨论】:

  • 请注意,在原始帖子中,所需的结果是(("aaa" "bbb") ("ccc" "ddd") ("blah"))。这就是我的第一个解决方案所提供的。新需求(("test") ("aaa" "bbb") ("ccc" "ddd=eee"))的解决方案现在添加到我下面的答案中。

标签: emacs command-line elisp command-line-arguments


【解决方案1】:

您可以使用split-string。请参阅以下代码示例。

(setq cmd-line '("--aaa=bbb" "--ccc=ddd=eee" "--blah"))
(setq cmd-line (mapcar (lambda (argstr)
             (when (string-match "^--" argstr)
               (split-string (substring argstr 2) "=")))
               cmd-line))

输出为(("aaa" "bbb") ("ccc" "ddd" "eee") ("blah"))。 由于"eee",这并不是您想要的。也许你可以使用它而忽略"eee"

如果"eee" 确实是个问题,那么小的修改会有所帮助:

(setq cmd-line '("--aaa=bbb" "--ccc=ddd=eee" "--blah"))

(setq cmd-line (mapcar (lambda (arg)
             (when (string-match "^--" arg)
               (setq arg (split-string (substring arg 2) "="))
               (if (cdr arg)
                   (setcdr (cdr arg) nil))
               arg))
               cmd-line))

输出是:

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

问题中新要求的变体:

(setq cmd-line '("--aaa=bbb" "--ccc=ddd=eee" "--blah"))

(setq cmd-line (mapcar (lambda (arg)
             (when (string-match "^--\\([^=]*\\)\\(?:=\\(.*\\)\\)?" arg)
               (let ((opt (match-string 1 arg))
                 (val (match-string 2 arg)))
                 (if val
                 (list opt val)
                   (list opt)))))
            cmd-line))

输出是:

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

【讨论】:

  • 谢谢!我已经达到了您的第一个示例,但遇到了“eee”问题。我不太明白你的第二个例子是如何工作的?你能进一步解释一下吗?
  • 嗨 Tobias,我终于测试了你的第二个示例,但它没有解决“eee”问题。
  • @tim-mithro-ansell 这很有趣,因为它对我来说运行良好。我添加了我在暂存缓冲区中得到的输出。 (你能在暂存缓冲区中完全按原样运行它吗?最好的问候,Tobias
  • @tim-mithro-ansell 现在,我阅读了您的问题的编辑。您添加了一个新要求。在以前的版本中,您要求("ccc" "ddd") 换取--ccc=ddd=eee。现在,您要求("ccc" "ddd=eee")。有空的时候我会修改我的答案来满足这个需求。
  • 啊抱歉,我的例子错了。感谢修复版,完美运行!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2012-09-24
  • 2013-07-23
  • 2012-07-13
  • 2020-06-27
相关资源
最近更新 更多