Emacs /openwith如何传递参数给程序



我正在使用emacs中的openwith包。我想用带有一些附加选项的xfig打开.fig文件,例如:

xfig -specialtext -latexfont -startlatexFont default file.fig

openwith是为我工作与其他文件关联,我不需要传递额外的选项。我在.emacs文件

中尝试了以下操作
(setq
 openwith-associations 
 '(("\.fig\'" "xfig" (file))))

可以,但是

(setq
 openwith-associations 
 '(("\.fig\'" "xfig -specialtext -latexfont -startlatexFont default" (file))))

不工作(error: Wrong type argument: arrayp, nil),也

(setq
 openwith-associations 
 '(("\.fig\'" "xfig" (" -specialtext -latexfont -startlatexFont default " file))))

不起作用,尽管在这里我没有得到任何错误。上面写着"已打开文件"。FIG在外部程序",但什么也没有发生。在本例中,我注意到有一个xfig进程运行着所有这些选项。

有人能告诉我如何解决这个问题吗?

谢谢你的帮助

我不知道这是如何工作的,所以我只是记录如何通过阅读代码来计算它:

openwith中的重要代码。El是在

中对start-process的调用
(dolist (oa openwith-associations)
  (let (match)
    (save-match-data
      (setq match (string-match (car oa) (car args))))
    (when match
      (let ((params (mapcar (lambda (x)
                  (if (eq x 'file)
                  (car args)
                  (format "%s" x))) (nth 2 oa))))
    (apply #'start-process "openwith-process" nil
           (cadr oa) params))
      (kill-buffer nil)
      (throw 'openwith-done t))))

在您的示例中,oa将具有以下结构,并且cadr为"xfig":

(cadr '(".fig'" "xfig" (file))) ;; expands to => xfig

这是start-process的定义和文档:

函数:start-process name buffer-or-name program & & rest参数http://www.gnu.org/software/emacs/elisp/html_node/Asynchronous-Processes.html

 args, are strings that specify command line arguments for the program.

一个例子:

(start-process "my-process" "foo" "ls" "-l" "/user/lewis/bin")

现在我们需要弄清楚params是如何构造的。在您的示例中,mapcar的参数为:

(nth 2 '(".fig'" "xfig" (file))) ;=> (file)
顺便说一下,您可以在emacs的scratch缓冲区中编写这些行,并使用C-M-x运行它们。

(car args)指的是你给openwith-association的参数,注意'file在(nth 2oa)中的出现是如何被替换的。我现在将它替换为"here。txt":

(mapcar (lambda (x)
      (if (eq x 'file)
          "here.txt"
          (format "%s" x))) (nth 2 '(".fig'" "xfig" (file)))) ;=> ("here.txt")

好了,现在我们来看看实参应该如何构造:

(mapcar (lambda (x)
      (if (eq x 'file)
          "here.txt"
          (format "%s" x))) 
    (nth 2 '(".fig'" "xfig" 
         ("-specialtext" "-latexfont" "-startlatexFont" "default" file))))
; => ("-specialtext" "-latexfont" "-startlatexFont" "default" "here.txt")

试试这个:

(setq openwith-associations 
 '(("\.fig\'" "xfig" ("-specialtext" "-latexfont" "-startlatexFont" "default" file))))

您必须在参数列表中提供每个单词作为单个字符串。

相关内容

  • 没有找到相关文章

最新更新