Làm thế nào để bạn 'làm lại' thay đổi sau khi 'hoàn tác' với Emacs?


268

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?


3
Câu trả lời bên dưới câu trả lời được chấp nhận cho bạn biết làm thế nào , nếu đó là lý do tại sao bạn nhìn vào câu trả lời này, với cách viết, tôi hy vọng hầu hết mọi người sẽ thực sự tìm kiếm nó.
Aaron Hall

Tôi chỉ nhấn vào thanh không gian, và sau đó hoàn tác sau đó hoàn tác khoảng trống và làm lại các lần hoàn tác bạn đã làm cho đến khi kết thúc và sau đó bắt đầu quay lại ... Tôi biết có nhiều cách phức tạp hơn, nhưng cách này nhanh và dễ dàng, và đó là cách tôi lăn.
nroose

Câu trả lời:


294

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:

  1. Chèn "foo"
  2. Chèn "thanh"
  3. Chèn "Tôi thích thư rác"

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:

  1. Chèn "foo"
  2. Chèn "thanh"

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:

  1. Chèn "foo"
  2. Chèn "thanh"
  3. Chèn "Tôi thích thư rác"
  4. Hoàn tác chèn "Tôi thích thư rác"

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):

  1. Chèn "foo"
  2. Chèn "thanh"
  3. Chèn "Tôi thích thư rác"

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ó

  1. Chèn "foo"
  2. Chèn "thanh"
  3. Chèn "Tôi thích thư rác"
  4. Hoàn tác chèn "Tôi thích thư rác"
  5. Xóa "thanh"

Đ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ẽ.


117
Chỉ trong trường hợp điều này nghe có vẻ khó chịu, lợi thế lớn là bạn luôn có thể lấy lại trạng thái trước đó. Trong hầu hết các biên tập viên, hoàn tác một số thay đổi và sau đó vô tình nhập một ký tự sẽ khiến bạn bị "mắc kẹt" mà không có cách nào để làm lại những gì bạn đã hoàn tác. Emacs làm điều này tầm thường.
phils

3
Tôi cho rằng trong công trình của bạn, nếu một người muốn làm điều đó trên giấy, bạn sẽ cần hai ngăn xếp. Bởi vì, ví dụ, tại thời điểm bạn viết "Bây giờ, bạn hoàn tác. Nó hoàn tác hành động cuối cùng, dẫn đến việc sau liệt kê: "bạn (có thể hiểu được) đã không hiển thị hoàn tác và nếu anh ta đã thực hiện nhiều lần hoàn tác, bạn sẽ không hiển thị chúng cho đến khi có gì đó được thực hiện để phá vỡ chuỗi hoàn tác, sau đó bạn sẽ thêm chúng. Một cách khác để hiển thị nó là có một danh sách và thêm hoàn tác vào danh sách ngay cả trước khi chúng bị hỏng nhưng để lưu ý con trỏ nằm trong danh sách, vì vậy chúng tôi biết các undos đang hoạt động ngược từ đâu
barlop

25
Nghe có vẻ khó chịu.
Felipe

13
Tôi không biết tại sao câu trả lời này được chấp nhận khi nó thậm chí không cho bạn biết CÁCH NÀO .
Aaron Hall

8
Đáng buồn thay, câu trả lời này không nói gì về lệnh làm lại là Cg C- /.
vishnuprasanth

211

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)


4
Để lặp lại nội dung, bạn cũng có thể sử dụng 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.
Patrick

10
Điều này không liên quan gì đến câu hỏi ban đầu, nhưng ngay sau khi thực hiện macro bàn phím (với C-x e), bạn có thể chỉ cần nhấn ethường xuyên khi bạn cần thực hiện lại.
Christian Berg

7
Ngoài ra, C-/C-x ulà 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.
Rory O'Kane

8
Cảnh báo: khi câu trả lời này cho biết 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 ...
Rory O'Kane

@ RoryO'Kane Tôi không biết nhiều về emacs, vì vậy hãy sửa cho tôi biết tôi đã sai ở đâu, nhưng cho rằng Cg C-_ không có tác dụng gì sau khi làm lại, có thể đó là vì nó chỉ hoạt động sau một hoàn tác (như giải thích của bạn "làm lại sau khi hoàn tác" gợi ý. Vì vậy, sẽ không có quá nhiều việc trong vòng tròn làm lại một lần hoàn tác hoặc làm lại, v.v. Nó không làm gì cả vì việc hoàn tác không được thực hiện trước đó. Vì vậy, Cg C- _ Cg C-_ sẽ không đi theo vòng tròn sau vòng đầu tiên, nghĩa đen là không làm gì cả
barlop

56
  • Để hoàn tác một lần:C-/
  • Hoàn tác hai lần: C-/ C-/
  • Để làm lại một lần, ngay sau khi hoàn tác:C-g C-/
  • Để làm lại hai lần, ngay sau khi hoàn tác : C-g C-/ C-/. Lưu ý rằng C-gkhông được lặp lại.
  • Để hoàn tác ngay lập tức một lần nữa , một lần:C-g C-/
  • Hoàn tác lại ngay lập tức, hai lần: C-g C-/ C-/
  • Để làm lại một lần nữa , cùng một nhóm

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-gtrước khi hoàn tác / làm lại tiếp theo. C-gchỉ 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-fsẽ 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-ghoặ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-gmộ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.


38

Đố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ử.


3
Tuyệt diệu! Ai nói emacs hoàn tác là không thể hiểu được? :-)
Peter.O

Kinh ngạc! khái niệm âm thanh và người dùng trực quan. Điều này nên có trong các gói mặc định. Một nhận xét: Tôi muốn một số thông điệp cảnh báo cũng được hiển thị khi làm lại từ một điểm nhánh, không chỉ khi quay lại nó. Ví dụ: khi người dùng gọi làm lại: 'Làm lại từ một điểm nhánh' hoặc 'Nhánh làm lại mặc định được sử dụng' - chỉ để cảnh báo người dùng rằng có nhiều hơn một nhánh.
Basel Shishani

1
Một cách tiếp cận khác cho vấn đề này đơn giản hơn nhiều để thực hiện và không yêu cầu trình hiển thị là CHỈ giữ điểm nhánh cuối cùng và cung cấp 3 lệnh: hoàn tác, làm lại, chuyển nhánh. Hoàn tác / làm lại sẽ cảnh báo khi nhánh bị nhấn và nhánh chuyển đổi sẽ chỉ chuyển nếu ở một nhánh khác chỉ phát ra thông báo 'không phải ở nhánh'. Nếu sự phân nhánh xảy ra bất cứ lúc nào, điểm nhánh trước đó sẽ bị mất. Điều này sẽ giải quyết vấn đề tổn thất nhà nước một cách hợp lý và ở mức độ phức tạp tối thiểu.
Basel Shishani

1
Coi chừng điều này có một lỗi lâu dài trong việc làm lại có thể ngẫu nhiên thất bại: github.com/syl20bnr/spacemacs/issues/9903 - được biết đến từ năm 2014
ideaman42

@ ideaman42 Rõ ràng đây là một "lỗi không": dr-qubit.org/Lost_undo-tree_history.html
Dalker

19

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ị.


Điều này. Tôi đang sử dụng Spacemacs và không thể hiểu tại sao nó không hoạt động với tôi. Cảm ơn!
mghaoui

11

Tôi thấy redo.elcự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.


Các ý kiến ​​trong tiêu đề của redo.el nói rằng nó được tạo ra cho XEmacs. Có vấn đề gì khi sử dụng nó trong GNU Emacs và các Emacsen khác có liên quan không?
A. Levy

Tôi chưa có vấn đề gì và tôi đã sử dụng nó ít nhất 6 tháng :)
monotux

4
Từ emacswiki.org/emacs/RedoMode : Tuy nhiên, redo.el đã lỗi thời và thường phá hủy nội dung của "bộ đệm vì hành vi của 'primitive-undo' đã hơi khác so với cũ vì Emacs 22. RedoPlus là một nhánh của redo.el và hoạt động chính xác trong phiên bản mới hơn của Emacs. Bạn có thể tải RedoPlus tại đây: emacswiki.org/emacs/redo+.el
rofrol

2

Emacs 28 thêm một lệnh làm lại (được gọi undo-redo).

Nếu bạn muốn có hoàn tác / làm lại điển hình hơn, các lệnh sau có thể được sử dụng.

(global-set-key (kbd "C-z") 'undo-only)
(global-set-key (kbd "C-S-z") 'undo-redo)

1

Nếu bạn muốn làm lại thao tác cuối cùng, hãy làm như sau.

  1. ESC
  2. Thực hiện một thao tác khác ( C + /)

0

Theo mặc định, làm lại trong Emacs yêu cầu nhấn Cg, sau đó hoàn tác.

Tuy nhiên, có thể sử dụng Emacs tích hợp hoàn tác để thực hiện lệnh làm lại.

Gói hoàn tác , sử dụng chức năng hoàn tác tích hợp Emacs để hiển thị cả hoàn tác và làm lại.

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.