Làm cách nào để khắc phục sự cố Emacs?


21

Trong tình huống Emacs không hành xử như tôi muốn, tôi có thể làm gì để khắc phục sự cố? Tôi có thể thực hiện những bước nào để tự tìm và khắc phục sự cố?

Hoặc, không thành công, làm thế nào tôi có thể thu thập thông tin hữu ích để mọi người ở đây (hoặc trong danh sách gửi thư hoặc các diễn đàn khác) có thể giúp tôi giải quyết vấn đề của mình?

Emacs của tôi bao gồm nhiều gói, một bộ sưu tập các đoạn sao chép và dán (hoặc bị giết và bị đánh cắp) từ khắp nơi trên internet, và elisp tùy chỉnh của riêng tôi, một số trong đó tôi không nhớ lại bằng văn bản, hoặc không còn hiểu. Có cách nào để hiểu được tất cả các biến chứng này không?


Không chắc đây có phải là nơi tốt nhất cho việc này không, nhưng có rất nhiều câu hỏi nhận được câu trả lời / nhận xét yêu cầu emacs -Qnhư bước đầu tiên. Tôi đã viết nó lên như một cái gì đó để liên kết những câu hỏi đó với tư cách là trợ giúp chung cho người dùng mới.
Tyler

Yup, đó là nơi tốt nhất cho việc này. Trên thực tế, một câu hỏi như vậy đã được đề xuất (gần như) 2 năm trước: meta.emacs.stackexchange.com/q/198/184 Cảm ơn!
T. Verron

Câu trả lời:


28

Bước 1: chạy emacs -Q

Điều đầu tiên bạn cần làm là chạy emacs mà không có bất kỳ tùy chỉnh nào của bạn. Nếu bạn có thể tái tạo vấn đề trong Emilla vanilla, nó thực sự có thể là một lỗi trong chính Emacs. Điều đó hiếm, nhưng chúng tôi loại trừ nó như một bước đầu tiên.

Nếu bạn bắt đầu Emacs từ dòng lệnh bằng -Qcờ, nghĩa là emacs -Q, bạn sẽ nhận được một emacs trần hoặc 'vanilla', không có tùy chỉnh cục bộ nào được tải. Vấn đề của bạn vẫn xảy ra? Nếu vậy, bỏ qua phần "Cung cấp công thức sửa lỗi".

Bước 1b: nếu vấn đề xảy ra với một gói thì sao?

Nếu vấn đề của bạn là cụ thể đối với một gói cụ thể, thì rõ ràng bạn không thể sao chép nó mà không tải gói đó. Nhưng bạn chỉ muốn tải gói liên quan chứ không phải tất cả cấu hình của bạn. Để làm điều đó, hãy chạy emacs -Qlại và chuẩn bị một đoạn script ngắn như sau:

(require 'package)
(setq package-load-list
      '((package1 t)))
(package-initialize)

Thay thế package1bằng tên của gói bạn muốn tải. Nếu bạn cần tải nhiều gói, hãy sửa đổi tập lệnh cho phù hợp:

(require 'package)
(setq package-load-list
      '((package1 t)
        (package2 t)
        (package3 t)))
(package-initialize)

Để tải mã này, bạn có thể dán mã vào *scratch*bộ đệm và gọi M-x eval-buffer. (hoặc bất kỳ bộ đệm nào, miễn là nó không có bất kỳ mã nào khác trong đó!).

Tại thời điểm này, bạn đã tải (các) gói và chỉ các gói bạn đang thử nghiệm. Nếu bạn có thể tái tạo vấn đề ngay bây giờ, hãy bỏ qua phần "Cung cấp công thức sửa lỗi".

Bước 2: Tìm lỗi trong .emacs

Bây giờ bạn đã xác nhận rằng vấn đề đến từ một cái gì đó trong cấu hình của bạn ("cuộc gọi đến từ trong nhà!"). Cấu hình của bạn có thể dài hàng nghìn dòng và có thể tải nhiều tệp khác nhau. Để tìm ra vấn đề, bạn sẽ thực hiện tìm kiếm nhị phân, nhận xét một nửa mã tại một thời điểm để thu hẹp mọi thứ. 1

  1. Mở emacs thường xuyên của bạn emacs, mà không có -Qtùy chọn.
  2. Mở tệp cấu hình của bạn (thường ~/.emacshoặc .emacs.d/init.el, nếu bạn không thể tìm thấy nó thử C-h v user-init-file)
  3. Chọn nửa đầu của tệp: C-spaceđể đặt dấu, cuộn xuống một nửa để mở rộng vùng
  4. Nhận xét khu vực đã chọn: M-;lưu tệp
  5. Mở một cái mới emacs ( emacs thử nghiệm của bạn ), để các emacs đầu tiên chạy. kiểm tra emacs sẽ đọc phiên bản rút gọn của cấu hình của bạn.
  6. Cố gắng tái tạo vấn đề trong thử nghiệm emacs
  7. Nếu bạn không thể sao chép nó, gần emacs thử nghiệm , và trong emacs ban đầu của bạn undonhận xét với C-/, và nhận xét ra một nửa số mã còn lại. Mở một emacs thử nghiệm mới và thử lại.
  8. Nếu bạn có thể tái tạo vấn đề, hãy nhận xét một nửa mã còn lại và xem vấn đề còn tồn tại không.
  9. Lặp lại quy trình này cho đến khi bạn tìm thấy một chút cấu hình nhỏ nhất cần thiết để tái tạo vấn đề.

Nếu vấn đề của bạn là với một gói cụ thể, tất nhiên bạn sẽ phải để lại mã tải gói đó không bị thiếu.

Nếu tệp cấu hình của bạn tải các tệp khác, cuối cùng bạn cũng có thể mở rộng tìm kiếm của mình vào các tệp đó.

Tại thời điểm này, bạn có thể thấy rằng vấn đề là do chỉ một hoặc hai dòng mã. Bạn thậm chí có thể tự sửa nó. Nếu vậy, xin chúc mừng, bạn đã học được điều gì đó! Nếu không, di chuyển đến bước ba.

Bước 3: Cung cấp công thức sửa lỗi

Tại thời điểm này, bạn sẽ có thể cung cấp một công thức lỗi chi tiết để đăng ở đây. Nó nên bao gồm:

  • Phiên bản Emacs của bạn (bạn có thể lấy bản này từ Emacs với M-x emacs-version
  • Hệ điều hành của bạn (phân phối Windows #, Mac, Linux)
  • Phiên bản của gói bạn đang vật lộn với, nếu có
  • Các bước cụ thể cần thiết để chứng minh vấn đề, bao gồm cả những gì bạn dự kiến ​​sẽ xảy ra và những gì thực sự xảy ra .

Ví dụ, tôi có thể đăng một câu hỏi như thế này:

Tôi đang gặp vấn đề với siêu chế độ. Khi tôi sử dụng M-x sm-compile-code, nó rút tiền từ tài khoản PayPal của tôi.

Các bước để tái sản xuất:

Tải siêu chế độ:

(require 'package)
(setq package-load-list
      '((super-mode t)))
(package-initialize)
  • mở một tập tin mới với C-x C-f my-code
  • nhập một dòng mã:
10 goto 10
  • gọi điện M-x sm-compile-code

Tôi hy vọng điều này sẽ gọi siêu biên dịch và biên dịch chương trình của tôi. Thay vào đó, tôi thấy một thông báo trong xe buýt nhỏ "$ 100 được chuyển từ paypal sang tác giả siêu chế độ"

GNU Emacs 25.1.50.3
Debian Linux
Phiên bản siêu chế độ 3.1415


1 Gói Bug Hunter có thể giúp bạn điều này, (bán) tự động chia đôi tệp init của bạn.


Có lẽ bạn có thể đề cập đến The Bug Hunter .
Omar
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.