Có thể không sử dụng undo-tree trong chế độ ác?


12

Mỗi lần tôi gặp phải các lỗi trong undo-tree, nơi tôi không thể làm lại, với lỗi đã biết sau đây , một báo cáo khác & luồng reddit .

primitive-undo: Unrecognized entry in undo list undo-tree-canary

Điều này thực sự tồi tệ và có thể gây mất việc nếu bạn không lưu phiên bản mới nhất của tệp.


Vì tôi không bao giờ sử dụng chức năng hoàn tác cây phân nhánh, nên có thể sử dụng emacs tuyến tính hoàn tác với chế độ ác không?


Lưu ý: Tôi đã thử cài đặt (global-undo-tree-mode -1)trực tiếp sau (evil-mode 1)đó vô hiệu hóa hoàn tác cây, nhưng làm lại (Ctrl-R) không hoạt động sau khi thực hiện việc này.


2
Emacs không có lệnh 'làm lại' (thay vào đó bạn làm gián đoạn chuỗi hoàn tác và sau đó hoàn tác chuỗi trước đó của các lệnh hoàn tác). Có vẻ như những gì bạn đã làm đã hoạt động chính xác.
phils

1
Nếu mục tiêu của bạn là sửa chữa hoàn tác cây, vui lòng liên hệ với tác giả của nó và viết email cho họ. Khiếu nại về emacs-devel sẽ không sửa chữa mọi thứ. Tương tự như vậy, nếu mục tiêu của bạn là cho phép Evil sử dụng vanilla hoàn tác, hãy mở một vé trên trình theo dõi lỗi của nó. Hãy nhớ rằng mặc dù vanilla hoàn tác là hoàn tác duy nhất, hoàn toàn không có làm lại, chỉ hoàn tác hoàn tác, do đó tại sao cây hoàn tác được sử dụng ở nơi đầu tiên.
wasamasa

1
Mục tiêu của tôi là làm việc hoàn tác / làm lại. Tôi không quan tâm chính xác như thế nào. Vì tôi không sử dụng chức năng cây của undo-tree, tôi nghĩ rằng có thể đơn giản nhất là sử dụng emacs tích hợp sẵn. Mặc dù vậy, tôi đã báo cáo lỗi cho tác giả hoàn tác cây.
ideaman42

Tôi có cùng một vấn đề, nó xảy ra khoảng một lần mỗi ngày và rất bực bội
cjohansson

Câu trả lời:


7

Tác giả của undo-tree.el, Toby Cubitt, hiện đang quá bận rộn để sửa lỗi đặc biệt này. Nếu anh ấy có thời gian trong tương lai, anh ấy có thể xem xét vấn đề hơn nữa. Tác giả đã chỉ ra rằng anh ta gặp khó khăn trong việc tái tạo lỗi một cách đáng tin cậy và gần đây không thể tái tạo nó bằng cách sử dụng nhánh chính. Nó chỉ xảy ra khi sử dụng hoàn tác / làm lại trong khu vực. Trong khi đó, tác giả đề nghị chỉ tắt tính năng hoàn tác / làm lại trong khu vực.

Tôi đặc biệt khuyến khích bất cứ ai có động lực đưa ra một cách đáng tin cậy để tái tạo vấn đề bắt đầu từ emacs -qviệc sử dụng cả bản phát hành ổn định hiện tại của Emacs (ví dụ: 25.2.1) và cả phiên bản mới nhất của nhánh chính, và sau đó gửi những người nhận đến số theo dõi lỗi 16377 bằng các bản sao cho những người tham gia (Stefan, Toby, Barry và Keith).

Số theo dõi chính là 16377 và có số theo dõi liên quan 16523:

https://debbugs.gnu.org/cgi/ormsreport.cgi?orms=16377

https://debbugs.gnu.org/cgi/orpreport.cgi?orms=16523

Đây là cách giải quyết tắt undo/redo-in-regiontính năng:

(setq undo-tree-enable-undo-in-region nil)

1
Cách giải quyết này không hiệu quả - tôi đã thử và thỉnh thoảng vẫn bị hỏng.
ideaman42

@ ideasman42 - Theo như tôi biết, Toby Cubitt là hiện nay không biết rằng các lỗi có thể xảy ra khi undo-tree-enable-undo-in-regionnil; và, tôi cũng chưa bao giờ thấy nó xảy ra bên ngoài việc sử dụng hoàn tác trong khu vực. Nếu bạn có thể đưa ra một công thức để tái tạo lỗi, vui lòng báo cáo cho nhóm Emacs - một bản sao cho Tiến sĩ Cubitt cũng sẽ hữu ích, và nếu nó không quá rắc rối, tôi chắc chắn sẽ đánh giá cao công thức nếu bạn có thể đưa ra một công thức đáng tin cậy Xin lỗi vì bạn đang gặp vấn đề ...
luật

Tôi đã gửi một báo cáo lỗi mà không có phản hồi (vài tháng trước). Các dự án như thế này mà nhiều người phụ thuộc vào nên thực sự có một trình theo dõi lỗi công khai.
ideaman42

16377 và 16523 thực sự là số theo dõi lỗi Emacs công khai và undo-treechính thức là một phần của elpakho lưu trữ. Bạn có thể sử dụng báo cáo tiêu chuẩn lỗi Emacs; tuy nhiên, kết quả cuối cùng có thể giống nhau - tức là, chờ đợi Tiến sĩ Cubitt tìm chút thời gian rảnh trong lịch trình bận rộn của mình ... Đến một lúc nào đó, một đạo sư hoàn tác khác có thể đi cùng và hỗ trợ duy trì gói hàng. Tôi đã dành rất nhiều thời gian để tạo ra một ngã ba tùy chỉnh của cây hoàn tác có thể hoàn tác / làm lại theo kiểu bán tuyến tính và tôi vẫn chỉ có một sự hiểu biết cơ bản về cách tất cả hoạt động ...
luật

1

Rõ ràng bạn có thể chỉnh sửa evil-pkg.el trong ~ / .emacs.d / elpa / evil-xxxxxxx / dir và xóa undo-tree theo yêu cầu:

(define-package "evil" "20140109.605" "Extensible Vi layer for Emacs." '((goto-chg "1.6")))

nguồn


Điều đó sẽ phá vỡ hoàn tác / làm lại không phải là điều OP muốn.
wasamasa

1
Tác giả của blog mà tôi liên kết nói rằng nó cho phép anh ta sử dụng vanilla của emacs, đó dường như là điều OP muốn khi anh ta nói "vô hiệu hóa cây hoàn tác".
DaftWooly

1
Đây thực sự là một điều cuối cùng, bởi vì lần sau khi bạn cập nhật các gói, tùy chỉnh này sẽ bị ghi đè. Sẽ tốt hơn nếu tìm cách để có được hành vi bạn muốn bằng cách định cấu hình tệp init của bạn.
zck

Tôi đồng ý, thật không may, nó dường như là cách duy nhất để vô hiệu hóa cây hoàn tác trong cái ác.
DaftWooly

Không làm việc cho tôi. Tôi đã nhận xét yêu cầu và chuyển undo-treegói ra khỏi đường để nó không tải. Bây giờ sử dụng "làm lại" không thành công với Wrong type argument: commandp, redo.
Hi-Angel

1

Chỉnh sửa, đây là một gói có thể được sử dụng để hoàn tác / làm lại với chế độ ác - hoàn tác .


Thêm câu trả lời cho câu hỏi của riêng tôi vì tôi đã sử dụng cái ác không hoàn tác trong một thời gian.

Điều này hoạt động tốt đáng ngạc nhiên để hoàn tác / làm lại mà kết thúc emacs hoàn tác mà không có bất cứ điều gì nặng nề như undo-treehoặc redo+.

(global-undo-tree-mode -1)

(defun simple-redo ()
  (interactive)
  (let
    (
      (last-command
        (cond
          ;; Break undo chain, avoid having to press Ctrl-G.
          ((string= last-command 'simple-undo) 'ignore)
          ;; Emacs undo uses this to detect successive undo calls.
          ((string= last-command 'simple-redo) 'undo)
          (t last-command))))
    (condition-case err
      (progn
        (undo) t)
      (user-error
        (message "%s" (error-message-string err)))))
  (setq this-command 'simple-redo))

(defun simple-undo ()
  (interactive)
  (let
    (
      (last-command
        (cond
          ;; Emacs undo uses this to detect successive undo calls.
          ((string= last-command 'simple-undo) 'undo)
          ((string= last-command 'simple-redo) 'undo)
          (t last-command))))
    (condition-case err
      (progn
        (undo-only) t)
      (user-error
        (message "%s" (error-message-string err)))))
  (setq this-command 'simple-undo))
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.