Khởi chạy emacs với tập tin ediff (của ediff-thư mục) từ dòng lệnh


8

Tôi muốn khởi chạy emacs để chỉnh sửa các tập tin hoặc thư mục. Ví dụ: tôi muốn một cái gì đó như:

emacs -f ediff-files file1 file2

Nhưng khi tôi làm điều này, nó không lấy file1 và file2 làm hai tệp thành diff. Thay vào đó, emacs nhắc tôi cho các tập tin khác nhau.

Có ai biết làm thế nào để làm điều này trong một dòng lệnh?

Câu trả lời:


10

Tôi khá chắc chắn có các giải pháp khác, nhưng bạn có thể thực hiện việc này bằng cách sử dụng --evalthay vì -f( --funcall):

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

Trên thực tế, hướng dẫn sử dụng Emacs về "Đối số dòng lệnh cho việc gọi Emacs" nói rằng -f function--funcall function

Gọi Lisp chức năng chức năng . Nếu nó là một hàm tương tác (một lệnh), nó sẽ đọc các đối số tương tác giống như bạn đã gọi hàm tương tự với một chuỗi khóa. Mặt khác, nó gọi hàm không có đối số.

Điều này giải thích tại sao bạn không thể có được hành vi bạn muốn với -f/ --funcall.


ediff-directories nhận ba đối số, vì vậy lệnh hiển thị ở trên thay đổi thành

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

Như đã giải thích ở đây , ediff-directorieskhiến Emacs xâm nhập ediff-meta-mode, vì vậy trước tiên bạn sẽ được đưa vào "Bảng điều khiển nhóm phiên Ediff". Từ hướng dẫn Ediff về Nhóm phiên :

Một số mục chính của Ediff thực hiện so sánh và hợp nhất trên các thư mục. Khi nhập ediff-directories, ediff-directories3[...] người dùng được cung cấp bộ đệm giống như Dired liệt kê các tệp chung cho các thư mục liên quan cùng với kích thước của chúng. [...] Chúng tôi gọi bộ đệm này là Bảng nhóm vì tất cả các phiên Ediff được liên kết với các tệp được liệt kê sẽ có bộ đệm này làm đầu mối chung. [...]

Trong so sánh hoặc hợp nhất thư mục, bảng nhóm phiên chỉ hiển thị các tệp chung cho tất cả các thư mục liên quan. Sự khác biệt được giữ trong một bộ đệm khác biệt thư mục riêng biệt và được hiển thị thuận tiện bằng cách nhập Dvào bảng nhóm phiên tương ứng. [...]

Vì vậy, để hiển thị khác biệt thực tế, chỉ cần nhấn D( ediff-show-dir-diffs).


hoạt động tuyệt vời cho các tập tin ediff. Cảm ơn! Tôi vẫn không thể ediff-thư mục để làm việc. Có ý kiến ​​gì không?
Madeleine P. Vincent

@ MadeleineP.Vincent Bạn có thể nói rõ hơn một chút về những gì không hoạt động? Đối với tôi, emacs --eval '(ediff-directories "dir1" "dir2" "regexp")'hoạt động tốt.
itjeyd

Khi tôi sử dụng cuộc gọi đó như bạn đã viết, emacs nói với tôi, "Nhóm phiên này không có thành viên"
Madeleine P. Vincent

@ MadeleineP.Vincent Có, nhưng đây không phải là thông báo lỗi; nó được hiển thị trong những gì dường như là một bộ đệm tổng quan. Để có được sự khác biệt thực tế, tất cả những gì bạn cần làm là nhấn D( ediff-show-dir-diffs).
itjeyd

Tôi gần, nhưng không hoàn toàn ở đó. Khi tôi nhấn D, nó hiển thị dir1 và dir2, và *** No differences ***mặc dù nếu tôi gọi ediff từ bên trong emacs với Mx, mọi thứ đều hoạt động như mong đợi (nghĩa là, sự khác biệt được hiển thị). Có lẽ tôi có một cái gì đó được đặt khác trong .emacs của tôi.
Madeleine P. Vincent

3

Tôi sử dụng tập lệnh sau: nó kiểm tra trước nếu có sự khác biệt và trong trường hợp có, nó sẽ mở Emacs với chức năng phù hợp được đánh giá. Với -dtùy chọn, nó giả sử các mục được cung cấp là các thư mục và ediff-directoriesthay vì ediff-filesđược sử dụng; mặt khác, nó kiểm tra xem chúng là thư mục hay tập tin và thiết lập chức năng để sử dụng tương ứng.

#! / thùng / sh

EMACS = $ (mà emacs)

nếu [$ # -lt 2]; sau đó
    echo "Cách sử dụng ::" `tên cơ sở $ 0`" [-d] item1 item2 "
    thoát 1
fi

dir = "không"
if ["$ 1" = "-d"]; sau đó
    dir = "có"
    mục1 = "$ 2"
    mục2 = "$ 3"
khác
    nếu [-d "$ 1" -a -d "$ 2"]; sau đó
        dir = "có"
    fi
    mục1 = "$ 1"
    mục2 = "$ 2"
fi

if ["$ dir" = "không"]; sau đó

    # Kiểm tra xem các tập tin có tồn tại không
    nếu [ ! -f "$ item1"]; sau đó
        printf "Không tìm thấy tệp% s. \ n" "$ item1"
        lối ra 2
    fi
    nếu [ ! -f "$ item2"]; sau đó
        printf "Không tìm thấy tệp% s. \ n" "$ item2"
        lối ra 2
    fi

    # Kiểm tra xem các tập tin có giống hệt nhau hay không
    diffdata = `diff" $ item1 "" $ item2 "`
    if ["_" = "_ $ diffdata"]; sau đó
        printf "% s và% s giống hệt nhau. \ n" "$ item1" "$ item2"
        lối ra 3
    fi

fi

diff_fn = "tập tin ediff"
if ["$ dir" = "có"]; sau đó
    diff_fn = "ediff-thư mục"
    opt = "\" \ ""
fi

# Chạy Emacs với chức năng ediff-files
printf "So sánh các tệp% s và% s .." "$ item1" "$ item2"
$ EMACS -q -nw -eval "($ diff_fn \" $ item1 \ "\" $ item2 \ "$ opt)" && echo được thực hiện.

thoát 0

Vì nó kiểm tra xem có sự khác biệt nào trước không, tôi thấy nó rất tiện lợi khi so sánh nhiều tệp trong các thư mục khác nhau, từ dòng lệnh, thay vì chạy một phiên khác biệt trong các thư mục mẹ. Ví dụ: để so sánh các thư mục A và B và sao chép các tệp không tồn tại từ tệp đầu tiên sang tệp khác ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.