truy vấn thay thế trong macro bàn phím


7

Hãy để tôi xác định một macro bàn phím: Tôi nhập C-x (, sau đó bắt đầu bằng M-<, sau đó nhập M-%vào truy vấn-thay thế một số lần xuất hiện của foo bằng thanh . Trong số 3 lần xuất hiện được tìm thấy, tôi chỉ thay thế 2 lần cuối, sau đó lưu lại C-x C-svà hoàn thành macro kbd với C-x ). Làm tốt!!

Nếu bây giờ tôi chạy macro kbd trên một bộ đệm khác, nó sẽ không hỏi tôi có muốn thay thế foo bằng thanh không , nó sẽ sao chép chính xác các câu trả lời không-có-có trước đó của tôi và thay thế lần xuất hiện thứ 2 và thứ 3! Nó sẽ không yêu cầu lần xuất hiện thứ 4 hoặc thứ 5 (bộ đệm thứ 2 này chứa nhiều foo hơn ) !! Đây không phải là những gì tôi mong đợi khi tôi xác định macro. Tôi muốn nó gọi query-replacevà để tôi trả lời các câu hỏi của nó ...

Bên cạnh câu hỏi: Bạn không thấy điều này sai? [Tôi có thể M-x edit-last-kbd-macrovà xem những gì được ghi lại và hiểu logic của tất cả nhưng tôi vẫn thấy điều này sai.]

Câu hỏi thực tế: Tôi có thể sử dụng cái gì thay vì query-replacelàm cho kbd-macro của tôi hoạt động như mong đợi?


1
Cá nhân, tôi không thấy nó sai. Macro bàn phím ghi lại tất cả các tổ hợp phím của bạn, bao gồm cả các phím để chỉ định đầu vào cho M-%chính xác và phát lại chính xác. Tôi chưa bao giờ thấy, và sẽ không mong đợi, một macro có các phần tương tác. Có lẽ bạn nên viết một hàm elisp tương tác bình thường vào thời điểm này.
Tikhon Jelvis

Đơn giản. Kết thúc macro bàn phím của bạn trước khi bạn trả lời bất kỳ truy vấn nào. EDIT: Tôi vừa thử nó, có lẽ nó không đơn giản. Tôi đoán ai đó có thể viết một lệnh mới start-kbd-macro-dwim.
nispio

Câu trả lời:


6

Các macro Emacs phát lại mọi thứ mà người dùng nhập vào trong quá trình macro, trừ khi chúng thoát khỏi macro. Cách để thoát khỏi một macro trong tiến trình là với C-x q kbd-macro-query.

Cụ thể tôi tin rằng bạn cần nhập chỉnh sửa đệ quy, có thể nhắc lệnh trong bộ thu nhỏ trước khi tiếp tục macro.

Tôi nghĩ bạn muốn xác định query-replacekhi gọi macro.

  • F3 bắt đầu vĩ mô
  • M-< nhảy đến bắt đầu
  • C-u C-x q để nhập một chỉnh sửa đệ quy
  • C-M-c để thoát chỉnh sửa đệ quy
  • ... phần còn lại của các hành động vĩ mô
  • F4 để lưu và lặp lại

Tiếp theo kmacro-end-or-call-macro, nó sẽ nhảy đến phần đầu của bộ đệm và nhập một chỉnh sửa đệ quy, nơi bạn có thể gọi query-replace. Sau đó, khi bạn thoát chỉnh sửa đệ quy, C-M-cnó sẽ tiếp tục macro từ thời điểm đó.

Nếu bạn muốn nhắc một đối số thay thế query-replace, có thể có ý nghĩa khi viết một hàm bao bọc tương tác đơn giản xung quanh query-replacethay vì sử dụng một chỉnh sửa đệ quy.


1
Trừ khi tôi hiểu lầm, đây là ghi âm mọi thứ trừ cuộc gọi đến query-replace. Nó thậm chí không có vẻ như điều này sẽ tiết kiệm FROM-STRINGhoặc TO-STRING.
nispio

1
Vâng, đó chính xác là những gì tôi đã nói. Nếu cần thay thế truy vấn cần được sử dụng một cách tương tác bên trong macro, mà không thực hiện thay thế tất cả, tôi không nghĩ rằng macro là phù hợp
phân loại vào

3

Điều này có vẻ không phù hợp lắm với macro bàn phím, vì bạn muốn hỏi người dùng nhập liệu. Có lẽ bạn đang muốn ghi lại một macro vì đây là query-replaceviệc bạn định làm thường xuyên. Nếu bạn không thể làm cho macro bàn phím thực hiện những gì bạn đang theo đuổi, bạn có thể tạo một liên kết phím cho cuộc gọi cụ thể của mình query-replacenhư sau:

(global-set-key (kbd "C-c q")   ;; Create a key binding for "Ctrl+c, q"
  (lambda () (interactive)      ;; Define an anonymous interactive funcion
  (query-replace "foo" "bar"    ;; Query-replace "foo" with "bar"
   nil                          ;; Don't require matching whole words
   1 (buffer-end 1))))          ;; Run from beginning to end of buffer

Bạn có thể thêm nó vào tệp init của mình và nó sẽ có sẵn cho bạn vào lần tới khi bạn bắt đầu emacs, hoặc bạn có thể mang nó đi lái thử bằng cách dán nó vào *scratch*bộ đệm và chạy M-x eval-buffer. Nó bị ràng buộc C-c q, nhưng điều đó có thể dễ dàng được sửa đổi thành bất cứ điều gì bạn muốn.

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.