Luncurkan emacs dengan ediff-file (dari ediff-directories) dari baris perintah

8

Saya ingin meluncurkan emacs untuk mengubah file atau direktori. Sebagai contoh, saya ingin sesuatu seperti:

emacs -f ediff-files file1 file2

Tetapi ketika saya melakukan ini, tidak perlu file1 dan file2 sebagai dua file berbeda. Sebaliknya, emacs meminta saya untuk perbedaan file.

Adakah yang tahu cara melakukan ini dalam satu baris perintah?

Madeleine P. Vincent
sumber

Jawaban:

10

Saya cukup yakin ada solusi lain, tetapi Anda bisa melakukan ini menggunakan --evalalih-alih -f( --funcall):

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

Bahkan, manual Emacs tentang "Argumen Baris Perintah untuk Doa Emacs" mengatakan itu -f functiondan--funcall function

Panggil fungsi fungsi Lisp . Jika itu adalah fungsi interaktif (perintah), ia membaca argumen secara interaktif seperti jika Anda telah memanggil fungsi yang sama dengan urutan tombol. Kalau tidak, ia memanggil fungsi tanpa argumen.

Ini menjelaskan mengapa Anda tidak bisa mendapatkan perilaku yang Anda inginkan dengan -f/ --funcall.


ediff-directories membutuhkan tiga argumen, jadi perintah yang ditunjukkan di atas berubah menjadi

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

Seperti yang dijelaskan di sini , ediff-directoriesmenyebabkan Emacs masuk ediff-meta-mode, jadi Anda akan masuk ke "Panel Kelompok Ediff" terlebih dahulu. Dari manual Ediff di Session Groups :

Beberapa entri utama Ediff melakukan perbandingan dan penggabungan pada direktori. Saat memasukkan ediff-directories,, ediff-directories3[...] pengguna disajikan dengan buffer Dired-like yang mencantumkan file-file umum ke direktori yang terlibat beserta ukurannya. [...] Kami menyebutnya buffer Session Group Panel ini karena semua sesi Ediff yang terkait dengan file yang terdaftar akan memiliki buffer ini sebagai titik fokus umum. [...]

Dalam perbandingan direktori atau penggabungan, panel grup sesi hanya menampilkan file yang umum untuk semua direktori yang terlibat. Perbedaan disimpan dalam buffer perbedaan direktori terpisah dan mudah ditampilkan dengan mengetik Dke panel grup sesi yang sesuai. [...]

Jadi untuk menampilkan diff yang sebenarnya, tekan saja D( ediff-show-dir-diffs).

itu hanya
sumber
yang berfungsi bagus untuk file-file ediff. Terima kasih! Saya masih tidak bisa mengubah direktori-direktori agar berfungsi. Ada ide?
Madeleine P. Vincent
@ MadeleineP.Vincent Bisakah Anda lebih spesifik tentang apa yang tidak berfungsi? Bagi saya, emacs --eval '(ediff-directories "dir1" "dir2" "regexp")'berfungsi dengan baik.
itsjeyd
Ketika saya menggunakan panggilan itu seperti yang Anda tulis, emacs memberi tahu saya, "Grup sesi ini tidak memiliki anggota"
Madeleine P. Vincent
@ MadeleineP.Vincent Ya, tapi ini bukan pesan kesalahan; itu ditampilkan dalam apa yang tampaknya semacam buffer ikhtisar. Untuk mendapatkan perbedaan aktual, yang perlu Anda lakukan adalah menekan D( ediff-show-dir-diffs).
itsjeyd
Saya dekat, tetapi tidak cukup di sana. Ketika saya menekan D, itu menunjukkan dir1 dan dir2, dan *** No differences ***, meskipun saya meminta ediff dari dalam emacs dengan Mx, semuanya berfungsi seperti yang diharapkan (yaitu, perbedaan ditampilkan). Mungkin saya memiliki sesuatu yang diatur secara berbeda di .emacs saya.
Madeleine P. Vincent
3

Saya menggunakan skrip berikut: ia memeriksa terlebih dahulu jika ada perbedaan, dan jika ada, itu membuka Emacs dengan fungsi yang sesuai dievaluasi. Dengan -dopsi ini, diasumsikan item yang disediakan adalah direktori, dan ediff-directoriesbukannya ediff-filesdigunakan; selain itu memeriksa apakah mereka adalah direktori atau file, dan mengatur fungsi untuk digunakan sesuai.

#! / bin / sh

EMACS = $ (yang emacs)

if [$ # -lt 2]; kemudian
    echo "Usage ::" `basename $ 0`" [-d] item1 item2 "
    keluar 1
fi

dir = "tidak"
jika ["$ 1" = "-d"]; kemudian
    dir = "yes"
    item1 = "$ 2"
    item2 = "$ 3"
lain
    jika [-d ​​"$ 1" -a -d "$ 2"]; kemudian
        dir = "yes"
    fi
    item1 = "$ 1"
    item2 = "$ 2"
fi

if ["$ dir" = "no"]; kemudian

    # Periksa apakah ada file
    jika [! -f "$ item1"]; kemudian
        printf "File% s tidak ditemukan. \ n" "$ item1"
        keluar 2
    fi
    jika [! -f "$ item2"]; kemudian
        printf "File% s tidak ditemukan. \ n" "$ item2"
        keluar 2
    fi

    # Periksa apakah file identik atau tidak
    diffdata = `diff" $ item1 "" $ item2 "`
    if ["_" = "_ $ diffdata"]; kemudian
        printf "% s dan% s identik. \ n" "$ item1" "$ item2"
        keluar 3
    fi

fi

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

# Jalankan Emacs dengan fungsi file-ediff
printf "Membandingkan file% s dan% s ..." "$ item1" "$ item2"
$ EMACS -q -nw -eval "($ diff_fn \" $ item1 \ "\" $ item2 \ "$ opt)" && echo selesai.

keluar 0

Karena memeriksa apakah ada perbedaan di muka, saya merasa sangat berguna ketika membandingkan banyak file di folder yang berbeda, dari baris perintah, daripada menjalankan satu sesi diff tunggal di folder induk. Misalnya untuk membandingkan folder A dan B, dan menyalin file yang tidak ada dari yang pertama ke yang lain ...

JC Gonzalez
sumber