Bài viết này nói rằng "Emacs đã làm lại bởi vì bạn có thể đảo ngược hướng trong khi hoàn tác, do đó hoàn tác hoàn tác".
Điều đó có nghĩa là gì? Làm thế nào một người dùng có thể 'làm lại' với Emacs?
Bài viết này nói rằng "Emacs đã làm lại bởi vì bạn có thể đảo ngược hướng trong khi hoàn tác, do đó hoàn tác hoàn tác".
Điều đó có nghĩa là gì? Làm thế nào một người dùng có thể 'làm lại' với Emacs?
Câu trả lời:
Phiên bản ngắn: bằng cách hoàn tác hoàn tác. Nếu bạn hoàn tác và sau đó thực hiện một lệnh không chỉnh sửa C-f, thì lần hoàn tác tiếp theo sẽ hoàn tác hoàn tác, dẫn đến làm lại.
Phiên bản dài hơn:
Bạn có thể nghĩ về việc hoàn tác như một hoạt động trên một chồng các hoạt động. Nếu bạn thực hiện một số lệnh (thậm chí là một lệnh điều hướng, chẳng hạn như C-f) sau một chuỗi các thao tác hoàn tác, tất cả các hoàn tác được đẩy vào ngăn xếp thao tác. Vì vậy, lần hoàn tác tiếp theo hoàn tác lệnh cuối cùng. Giả sử bạn có một chuỗi hoạt động trông như thế này:
Bây giờ, bạn hoàn tác. Nó hoàn tác hành động cuối cùng, dẫn đến danh sách sau:
Nếu bạn làm một cái gì đó khác hơn là hoàn tác tại thời điểm này - giả sử, C-fngăn xếp hoạt động trông như thế này:
Bây giờ, khi bạn hoàn tác, điều đầu tiên được hoàn tác là hoàn tác. Kết quả trong ngăn xếp ban đầu của bạn (và trạng thái tài liệu):
Nếu bạn thực hiện một lệnh sửa đổi để phá vỡ chuỗi hoàn tác, lệnh đó sẽ được thêm vào sau khi hoàn tác và do đó là điều đầu tiên được hoàn tác sau đó. Giả sử bạn lùi lại trên "thanh" thay vì nhấn C-f. Sau đó, bạn sẽ có
Điều này thêm / thêm lại xảy ra quảng cáo infinitum. Phải mất một chút để làm quen, nhưng nó thực sự mang lại cho Emacs một cơ chế hoàn tác / làm lại rất linh hoạt và mạnh mẽ.
Trở lại: C-_
Để làm lại sau khi hoàn tác: C-g C-_
Nhập nhiều lần C-_ để làm lại những gì đã được hoàn tác bằng cách C-_ làm lại lệnh emacs nhiều lần, thực hiện lệnh của bạn sau đó nhập C-xzvà sau đó nhập nhiều lần vào zphím để lặp lại lệnh (thú vị khi bạn muốn thực thi nhiều lần một macro)
C-u
, ví dụ C-u 8 *
(chèn tám * nơi dấu mũ). Vì vậy, bạn có thể sử dụng C-u x C-_
để hoàn tác x bước.
C-x e
), bạn có thể chỉ cần nhấn e
thường xuyên khi bạn cần thực hiện lại.
C-/
và C-x u
là các ràng buộc hoàn tác thay thế, tương đương với C-_
. Tôi thích C-/
vì nó dễ đánh hơn.
C-g C-_
sẽ "làm lại sau khi hoàn tác", điều đó chỉ áp dụng cho lần đầu tiên bạn nhấn tổ hợp. Sau đó, lặp lại phím hoàn tác của bạn mà không có C-g
. Vì vậy, để làm lại ba lần ngay sau khi hoàn tác, gõ C-g C-_ C-_ C-_
. Nếu bạn nhập C-g C-_ C-g C-_ C-g C-_
, bạn sẽ chỉ đi xung quanh theo vòng tròn, hoàn tác việc làm lại bản hoàn tác của mình ...
C-/
C-/
C-/
C-g
C-/
C-g
C-/
C-/
. Lưu ý rằng C-g
không được lặp lại.C-g
C-/
C-g
C-/
C-/
Nếu bạn đã nhấn bất kỳ phím nào (cho dù gõ ký tự hoặc chỉ di chuyển con trỏ) kể từ lệnh hoàn tác cuối cùng của bạn, không cần phải nhập C-g
trước khi hoàn tác / làm lại tiếp theo. C-g
chỉ là một khóa an toàn để tự đánh mà không làm gì cả, nhưng được tính là một phím không hoàn tác để báo hiệu kết thúc chuỗi hoàn tác của bạn. Nhấn một lệnh khác như C-f
sẽ làm việc quá; chỉ là nó sẽ di chuyển con trỏ từ nơi bạn có nó.
Nếu bạn nhấn C-g
hoặc một lệnh khác khi bạn không có ý định và bây giờ bạn đang hoàn tác sai hướng, chỉ cần nhấn C-g
để đảo ngược hướng của bạn một lần nữa. Bạn sẽ phải hoàn tác tất cả các cách thông qua các bản làm lại ngẫu nhiên và hoàn tác trước khi bạn đến bản hoàn tác bạn muốn, nhưng nếu bạn tiếp tục nhấn C-/
, cuối cùng bạn sẽ đạt đến trạng thái bạn muốn. Trong thực tế, mọi trạng thái mà bộ đệm đã từng có thể truy cập được, nếu bạn nhấn C-g
một lần và sau đó nhấn C-/
đủ số lần.
Phím tắt thay thế cho undo
, trừ C-/
, là C-_
, C-x u
, và M-x
undo
.
Xem Hoàn tác trong Hướng dẫn sử dụng Emacs để biết thêm chi tiết về hệ thống hoàn tác của Emacs.
Đối với những người muốn có chức năng hoàn tác / làm lại phổ biến hơn, ai đó đã viết undo-tree.el
. Nó cung cấp giao diện của non-Emacs hoàn tác, nhưng cung cấp quyền truy cập vào toàn bộ 'cây' của lịch sử hoàn tác.
Tôi thích hệ thống hoàn tác tích hợp của Emacs, nhưng thấy gói này rất trực quan.
Đây là lời bình luận từ chính tập tin:
Emacs có một hệ thống hoàn tác mạnh mẽ. Không giống như hệ thống hoàn tác / làm lại tiêu chuẩn trong hầu hết các phần mềm, nó cho phép bạn khôi phục bất kỳ trạng thái quá khứ nào của bộ đệm (trong khi hệ thống hoàn tác / làm lại tiêu chuẩn có thể mất các trạng thái trong quá khứ ngay khi bạn làm lại). Tuy nhiên, sức mạnh này có giá: nhiều người thấy hệ thống hoàn tác của Emacs khó hiểu và khó sử dụng, tạo ra một số gói thay thế nó bằng hệ thống hoàn tác / làm lại trực quan ít mạnh mẽ hơn.
Cả việc mất dữ liệu với hoàn tác / làm lại tiêu chuẩn và sự nhầm lẫn của việc hoàn tác của Emacs, xuất phát từ việc cố gắng coi lịch sử hoàn tác như một chuỗi thay đổi tuyến tính. Nó không thể. 'Chế độ hoàn tác cây' được cung cấp bởi gói này thay thế hệ thống hoàn tác của Emacs bằng một hệ thống xử lý hoàn tác lịch sử như chính nó: một nhánh thay đổi. Ý tưởng đơn giản này cho phép hành vi trực quan hơn của hệ thống hoàn tác / làm lại tiêu chuẩn được kết hợp với sức mạnh không bao giờ mất bất kỳ lịch sử nào. Một phần thưởng phụ được thêm vào là trong một số trường hợp, lịch sử hoàn tác có thể được lưu trữ hiệu quả hơn, cho phép tích lũy nhiều thay đổi hơn trước khi Emacs bắt đầu loại bỏ lịch sử.
Cẩn thận với một trò chơi hoàn tác cây để làm lại !
Nhiều bộ dụng cụ khởi động phổ biến của người nổi tiếng thế giới (prelude, purcell, spacemacs) đi kèm với cây hoàn tác. Hầu hết (tất cả?) Thậm chí tự động kích hoạt nó. Như đã đề cập, undo-tree là một cách tiện dụng để trực quan hóa và duyệt qua cây hoàn tác / làm lại. Prelude thậm chí còn cung cấp cho nó một hợp âm phím ( uu
) và cả C-x u
.
Vấn đề là: cây hoàn tác dường như phá hỏng ràng buộc mặc định và nổi tiếng của Emacs để làm lại :C-g C-/
.
Thay vào đó, bạn có thể sử dụng các phím đối xứng này để hoàn tác / làm lại :
C-/ undo
C-S-/ redo
Đây là hữu ích vì đôi khi bạn muốn làm lại nhanh chóng mà không cần mở trình hiển thị.
Tôi thấy redo.el
cực kỳ tiện lợi khi thực hiện "bình thường" hoàn tác / làm lại và tôi thường liên kết nó với CSz và hoàn tác với Cz, như thế này:
(when (require 'redo nil 'noerror)
(global-set-key (kbd "C-S-z") 'redo))
(global-set-key (kbd "C-z") 'undo)
Chỉ cần tải tập tin, đặt nó vào đường dẫn của bạn và dán phần trên vào trong của bạn .emacs
.