コマンドラインから(ediff-directoriesの)ediff-filesでemacsを起動します


8

emacsを起動して、ファイルまたはディレクトリを編集します。たとえば、次のようなものを希望します。

emacs -f ediff-files file1 file2

しかし、これを行うと、比較する2つのファイルとしてfile1とfile2が使用されません。むしろ、emacsはファイルを区別するように促します。

誰もがこれを1つのコマンドラインで行う方法を知っていますか?

回答:


10

他の解決策があると確信していますが--eval-f--funcall)の代わりにこれを使用できます:

emacs --eval '(ediff-files "file1" "file2")'

実際には、「Emacsの起動のためのコマンドライン引数」でEmacsのマニュアルは言うこと-f function--funcall function

Lisp関数functionを呼び出します。対話関数(コマンド)の場合は、キーシーケンスを使用して同じ関数を呼び出したかのように、対話的に引数を読み取ります。それ以外の場合は、引数なしで関数を呼び出します。

これは、-f/で希望する動作が得られない理由を説明しています--funcall


ediff-directories 3つの引数を取るため、上記のコマンドは次のように変更されます。

emacs --eval '(ediff-directories "dir1" "dir2" "regexp")'

ここで説明ediff-directoriesするようにediff-meta-mode、を押すとEmacsに入るので、最初に「Ediffセッショングループパネル」に移動します。セッショングループに関するEdiffマニュアルから:

Ediffのいくつかの主要なエントリは、ディレクトリの比較とマージを実行します。、、[...]を入力するediff-directoriesediff-directories3、関連するディレクトリに共通のファイルとそのサイズを一覧表示する、Diredのようなバッファが表示されます。[...] リストされたファイルに関連付けられているすべてのEdiffセッションがこのバッファーを共通の焦点として持つため、このバッファーをセッショングループパネルと呼びます。[...]

ディレクトリの比較またはマージでは、セッショングループパネルには、関連するすべてのディレクトリに共通のファイルのみが表示されます。違いは別のディレクトリ差分バッファーに保持されD、対応するセッショングループパネルに入力することで簡単に表示されます。[...]

実際の差分を表示するには、Dediff-show-dir-diffs)を押します。


これはediffファイルに最適です。ありがとう!それでも、ディレクトリをediffすることはできません。何か案は?
Madeleine P. Vincent

@ MadeleineP.Vincent機能していないものについてもう少し詳しく教えてください。私にとっては、emacs --eval '(ediff-directories "dir1" "dir2" "regexp")'うまくいきます。
itsjeyd 2014年

あなたが書いたようにその呼び出しを使用すると、emacsは「このセッショングループにはメンバーがいません」と言います
Madeleine P. Vincent 14年

@ MadeleineP.Vincentはい。ただし、これはエラーメッセージではありません。それはある種の概要バッファのように見えるものに表示されます。実際の差分を取得するには、Dediff-show-dir-diffs)を押すだけです。
itsjeyd 2014年

私は近くにいますが、そこまでは行きません。D *** No differences ***を押すと、dir1とdir2 が表示され、Mxを使用してemacs内からediffを呼び出しても、すべてが期待どおりに機能します(つまり、違いが表示されます)。たぶん私は私の.emacsで違う設定をしています。
Madeleine P. Vincent

3

私は次のスクリプトを使用します:違いがあるかどうかを事前にチェックし、違いがある場合は、適切な関数が評価された状態でEmacsを開きます。この-dオプションを使用すると、指定されたアイテムがディレクトリであり、ediff-directories代わりにediff-files使用されると想定されます。それ以外の場合は、それらがディレクトリまたはファイルであるかどうかを確認し、それに応じて使用する関数を設定します。

#!/ bin / sh

EMACS = $(emacs)

if [$#-lt 2]; その後
    echo "Usage ::" `basename $ 0`" [-d] item1 item2 "
    1番出口
fi

dir = "いいえ"
if ["$ 1" = "-d"]; その後
    dir = "はい"
    item1 = "$ 2"
    item2 = "$ 3"
そうしないと
    if [-d "$ 1" -a -d "$ 2"]; その後
        dir = "はい"
    fi
    item1 = "$ 1"
    item2 = "$ 2"
fi

if ["$ dir" = "no"]; その後

    #ファイルが存在することを確認
    もし[!-f "$ item1"]; その後
        printf "ファイル%sが見つかりません。\ n" "$ item1"
        2番出口
    fi
    もし[!-f "$ item2"]; その後
        printf "ファイル%sが見つかりません。\ n" "$ item2"
        2番出口
    fi

    #ファイルが同一かどうかを確認します
    diffdata = `diff" $ item1 "" $ item2 "`
    if ["_" = "_ $ diffdata"]; その後
        printf "%sと%sは同一です。\ n" "$ item1" "$ item2"
        3番出口
    fi

fi

diff_fn = "ediff-files"
if ["$ dir" = "yes"]; その後
    diff_fn = "ediff-directories"
    opt = "\" \ ""
fi

#ediff-files関数でEmacsを実行する
printf "ファイル%sと%sを比較しています..." "$ item1" "$ item2"
$ EMACS -q -nw -eval "($ diff_fn \" $ item1 \ "\" $ item2 \ "$ opt)" &&エコーが完了しました。

出口0

事前に違いがあるかどうかをチェックするので、親フォルダーで1つのdiffセッションを実行するのではなく、コマンドラインからさまざまなフォルダーの多くのファイルを比較するときに非常に便利です。たとえば、フォルダーAとBを比較し、存在しないファイルを最初のファイルから他のファイルにコピーする場合...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.