Lặp lại chèn văn bản cuối cùng


10

Trong Vim, bạn có thể nhấn .để lặp lại thay đổi mới nhất, bao gồm chèn văn bản.

Trong khi ở Emacs C-x zchỉ lặp lại lệnh cuối cùng. Tôi biết rằng macro có thể được sử dụng ở đây, nhưng thường xuyên hơn tôi nhận ra rằng tôi cần phải chèn lại cùng một văn bản quá muộn. Khi tôi cần chèn lại nó chỉ một lần nữa , việc xác định một macro sau đó là vô nghĩa.

Q: Có cách nào để lặp lại việc chèn văn bản bên trong Emacs không?


1
"Văn bản" bạn muốn lặp lại là gì? Về mặt kỹ thuật, phần chèn cuối cùng chỉ là ký tự cuối cùng, có lẽ không phải là thứ bạn đang theo đuổi. Vì vậy, làm thế nào bạn sẽ xác định một "chèn văn bản" cho mục đích của bạn? Làm rõ nó cũng có thể giúp bạn trong việc tìm cách để đạt được nó.
T. Verron

Hmm câu hỏi hay - làm thế nào để xác định sửa đổi bộ đệm liên tục cuối cùng . Có lẽ một sửa đổi bộ đệm giữa hai điểm di chuyển không phải là kết quả của một sửa đổi bộ đệm ( C-f, tìm kiếm, v.v.)? Nếu điều đó có ý nghĩa ...
ooi

Làm rõ những gì bạn muốn với một công thức. Có nhiều loại "chèn" (cách chèn văn bản). Bạn đang chèn tương tác? Nếu vậy thì thế nào?
vẽ

Tương tác. Nhưng lý tưởng là nó không quan trọng bằng cách nào hoặc cái gì. Như thể tôi quên bắt đầu xác định một macro . Trong trường hợp đó, vấn đề là khi nào. Có lẽ một số móc có thể được sử dụng.
ooi

2
Làm thế nào để bạn xác định 'lần chèn cuối cùng' trong Emacs? Vì không có chuyển đổi chế độ chỉnh sửa / lệnh như trong vi, chúng ta nên đi bao xa trong lịch sử? Tôi thường chỉ chọn "lần chèn cuối cùng" ( C-space, di chuyển con trỏ, M-wsao chép) và sau đó C-ydán bao nhiêu lần nếu cần.
Alain

Câu trả lời:


7

dot-modelà "chế độ nhỏ để lặp lại việc gõ hoặc lệnh" và có thể làm những gì bạn cần. Về cơ bản, nó chỉ lặp lại các lần chèn / xóa cuối cùng mà bạn làm. Nó khá giống với .Vi (m).


2
Có gì không nó làm gì?
Malabarba

1
Chào mừng đến với Emacs.SE. Ngay bây giờ, câu trả lời của bạn gần với một bình luận hơn là một câu trả lời. Bạn có thể vui lòng chỉnh sửa nó để giải thích những gì dot-modekhông và làm thế nào nó cung cấp chức năng mà OP đang cố gắng để có được?
Dan

7

Như thể tôi quên bắt đầu xác định một macro

Bạn có thể sử dụng kmacro-edit-lossage( C-x C-k l) cho điều đó: nó cho phép bạn xem 300 lần nhấn phím cuối cùng (bao gồm cả các lần chèn đơn giản) và chỉnh sửa chúng dưới dạng macro.

Để sử dụng đơn giản, bạn chỉ cần xác định vị trí bắt đầu chèn mà bạn muốn lặp lại, xóa tất cả văn bản từ "Macro:" đến điểm đó và nhấn C-c C-c. Bây giờ bạn có một macro bạn có thể sử dụng để thực hiện các hành động tương tự, như thể bạn không quên ghi lại nó ở vị trí đầu tiên.

Đáng buồn thay, điều này không thành công nếu 300 lần nhấn phím cuối cùng bao gồm nhấp chuột.

Chỉnh sửa: Đoạn mã sau thay đổi nó để chỉ các phím sau sự kiện chuột cuối cùng được giữ.

(defadvice recent-keys (after tv/recent-keys-no-mouse first ())
  "Return only the keys since the last mouse event"
  (let* ((vec ad-return-value)
         (lst (append vec nil))
         (nmax (length vec))
         (i (- nmax 1)))
    (while
        (and
         (>= i 0)
         (not
          (let ((mod (event-modifiers (elt vec i))))
            (or (memq 'click mod)
                (memq 'double mod)
                (memq 'triple mod)
                (memq 'drag mod)
                (memq 'down mod)))))
      (setq i (- i 1)))
    (setq ad-return-value (vconcat (nthcdr (+ i 1) lst) nil))))

(defun tv/kmacro-edit-lossage-no-mouse ()
  "Same as `kmacro-edit-lossage', but fallback if the keys contain mouse events.

Source: http://emacs.stackexchange.com/a/4071/184"
  (interactive)
  (ad-activate-regexp "tv/recent-keys-no-mouse")
  (call-interactively #'kmacro-edit-lossage)
  (ad-deactivate-regexp "tv/recent-keys-no-mouse"))

;; If you want this function to replace the default one, uncomment this line:
; (global-set-key (kbd "C-x C-k l") 'tv/kmacro-edit-lossage-no-mouse)

Tôi thường di chuyển bằng chuột, sẽ rất tuyệt để xem cách loại bỏ chúng khỏi macro.
ooi

Ồ, lệnh này sẽ hữu ích nếu nó không hoàn toàn thất bại nếu 300 lần nhấp chuột cuối cùng. Có thể chỉ không bao gồm các nhấp chuột và cho người dùng biết thay vì chỉ từ chối làm việc.
mẫu

@nanny Tôi đã thêm một số elisp để bật dự phòng (imo) tốt hơn so với việc không thông báo lỗi: với chức năng này, chỉ các phím sau sự kiện chuột cuối cùng sẽ được giữ. Việc bỏ hoàn toàn các sự kiện chuột cũng có thể xảy ra, nhưng kết quả của macro sẽ hơi khó đoán.
T. Verron

@ooi Không biết bạn có tự động ping bởi bình luận trước đó không, vì vậy đây cũng là ping của bạn.
T. Verron

Cảm ơn, tôi đã làm việc trên cùng một điều. Tôi nghĩ rằng nó có thể có thể lọc các đối số của edmacro-fix-menu-commands. Nó nhận một đối số tùy chọn có thể bỏ qua các sự kiện chuột. Nhưng tôi không biết đủ về hệ thống tư vấn để làm cho nó hoạt động.
mẫu

4

Tôi nghĩ rằng dabbrev-expandchức năng có thể làm các mẹo. Giả sử bạn đã gõ một số từ: emacs, cảm xúc, biểu tượng cảm xúc, ... Lần sau, bạn sẽ gõ một từ bắt đầu bằng 'em', bạn có thể nhấn M-/và emacs sẽ đề nghị bạn chèn một trong những từ đã chèn bắt đầu bởi 'em'. Tiếp tục nhấn M-/và emacs sẽ hiển thị cho bạn 'biểu tượng cảm xúc', rồi 'cảm xúc, sau đó ...

Bạn cũng có thể có một cái nhìn để lặp lại lệnh phức tạp . Ví dụ phổ biến là: bạn muốn lặp lại lệnh query-replacetrong nhiều bộ đệm khác nhau luôn sử dụng cùng một đối số, thay thế pitt pitt bằng bởi

Bạn chạy nó một lần, đi đến một cửa sổ khác và gõ C-x ESC ESCđể chạy lại.

Và để kết thúc, tôi có thể đề nghị chèn lại không? Tập tin el này sẽ giúp bạn thực hiện chèn, sử dụng một số loại logic. Nó giống như, "gặt lại lần chèn cuối cùng, nhưng với mỗi lần lặp lại, các đối số sẽ thay đổi.

Ví dụ này có thể được tìm thấy trong tập tin el :

;; You can also iterate over lists:
;;   My desk is cluttered
;;   My desk is a real mess
;;   My desk is very hard to see
;;   My desk is buried
;;
;; from m-x insert-patterned
;;    ";;   My desk is %s"
;;    (cluttered "a real mess" "very hard to see" buried)

Tôi hy vọng điều đó sẽ giúp.


1
Có lẽ bạn có thể mở rộng một chút ...
T. Verron

@ T.Verron Xong :)
Nsukami _

1
Lặp lại lệnh phức tạp giống như repeat(mà OP đề cập), không thực sự hữu ích cho việc chèn văn bản. Repeat-insertcần phải suy nghĩ trước khi chèn văn bản, giống như một macro. Nhưng dabbrev-expandlà một ý tưởng tốt đẹp!
T. Verron
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.