gpt4 book ai didi

emacs - 在elisp中,如何将一个 "var=value\n..."的字符串求值成同名的lisp变量?

转载 作者:行者123 更新时间:2023-12-01 08:17:12 24 4
gpt4 key购买 nike

mplayer 工具( midentify )输出旨在由 bash/sh/任何解释器评估的“shell-ready”行。

如何在 emacs 中将这些 var-name 分配给它们相应的值作为 elisp var-names?
数据在一个字符串中(通过 shell-command-to-string )

这是数据

ID_AUDIO_ID=0
ID_FILENAME=/home/axiom/abc.wav
ID_DEMUXER=audio
ID_AUDIO_FORMAT=1
ID_AUDIO_BITRATE=512000
ID_AUDIO_RATE=0
ID_AUDIO_NCH=1
ID_LENGTH=3207.00
ID_SEEKABLE=1
ID_CHAPTERS=0
ID_AUDIO_BITRATE=512000
ID_AUDIO_RATE=32000
ID_AUDIO_NCH=1
ID_AUDIO_CODEC=pcm
ID_EXIT=EOF

最佳答案

这是一个接受包含 midentify 的字符串的例程输出,并返回键值对的关联列表(这比随意设置 Emacs 变量更安全)。它还具有将数值解析为实际数字的优点:

(require 'cl)  ; for "loop"
(defun midentify-output-to-alist (str)
(setq str (replace-regexp-in-string "\n+" "\n" str))
(setq str (replace-regexp-in-string "\n+\\'" "" str))
(loop for index = 0 then (match-end 0)
while (string-match "^\\(?:\\([A-Z_]+\\)=\\(?:\\([0-9]+\\(?:\\.[0-9]+\\)?\\)\\|\\(.*\\)\\)\\|\\(.*\\)\\)\n?" str index)
if (match-string 4 str)
do (error "Invalid line: %s" (match-string 4 str))
collect (cons (match-string 1 str)
(if (match-string 2 str)
(string-to-number (match-string 2 str))
(match-string 3 str)))))

你会像这样使用这个函数:
(setq alist (midentify-output-to-alist my-output))
(if (assoc "ID_LENGTH" alist)
(setq id-length (cdr (assoc "ID_LENGTH" alist)))
(error "Didn't find an ID_LENGTH!"))

编辑:修改函数以正确处理空行和尾随换行符。

正则表达式确实是一头野兽; Emacs 正则表达式并不以其易于使用而闻名。稍微分解一下:
  • 最外面的图案是^(?:valid-line)|(.*) .它尝试匹配有效行,否则匹配匹配组 4 中的整行( .* )。如果 (match-group 4 str)不是 nil , 表示遇到无效行,并引发错误。
  • valid-line(word)=(?:(number)|(.*)) .如果匹配,则名称-值对的名称部分在匹配字符串 1 中,如果该行的其余部分与数字匹配,则该数字在匹配字符串 2 中,否则整个行的其余部分为在匹配字符串 3 中。
  • 关于emacs - 在elisp中,如何将一个 "var=value\n..."的字符串求值成同名的lisp变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8280478/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com