2011-07-30 4 views
2

私はemacsでopenwithパッケージを使用しています。私は、例えば、いくつかの追加オプションを持つのxfigでファイルを.fig開きたい:emacs/openwithプログラムに引数を渡す方法は?

xfig -specialtext -latexfont -startlatexFont default file.fig 

openwithは、私は追加のオプションを渡す必要はありません、他のファイルの関連付けを私のために働いています。私は働く

(setq 
openwith-associations 
'(("\\.fig\\'" "xfig" (file)))) 

ファイルの私の.emacsに以下を試してみましたが、ここで私はしませんが

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

は、また

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

が動作しない、(error: Wrong type argument: arrayp, nil)は動作しません。エラーが発生します。 「外部プログラムでfile.figを開いた」と表示されますが、何も起こりません。この場合、これらのオプションをすべて使用してxfigプロセスが実行されていることがわかります。

誰かが私にこれを修正する方法を教えてもらえますか?

ありがとうございました。

答えて

2

私はこれがどのように動作するか見当もつかないので、私はちょうど1コードを読み取ることによって、それを把握することができますどのように文書化:

openwith.elで重要なコードはインプロセスを開始するための呼び出しです:

(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 

これは、開始プロセスの定義、およびドキュメントです:

機能:起動プロセス名のバッファまたは名プログラム&残りの引数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でバッファを傷つけるとC-M-Xでそれらを実行します。

(car args)は、openwith-associationに与えたパラメータを参照しています。「ファイルin(nth 2 oa)」がどのように置き換えられているかに注意してください。私はここでそれを "ここに置き換えます。今のTXT」:

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

さて、今私たちは、引数を構築する方法を参照してください。あなたがシングルとして各単語を供給する必要が

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

(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") 

はこれを試してみてくださいパラメータのリストの文字列。

+0

Noufal Ibrahimは編集しました(正しくは、openwith.elの文字列には常に2つのバックスラッシュがあります)。あなたの質問にはスラッシュ。私の答えの最後の例は正しいはずです。 – whoplisp

+0

ありがとう、それは動作しますが、私はゆっくりと方法を理解します。 – anonymous