2012-04-30 28 views
5

Tôi thường thấy mình cần phải thực hiện một số truy vấn và thay thế các hoạt động liên tiếp bởi vì, ví dụ tôi muốn thay đổi tất cả các lần xuất hiện từ 23 đến 24 trong một dòng, sau đó là 24 đến 25 trong dòng tiếp theo, v.v. tôi viết một biểu thức trong một dòng mà tôi yank nhiều lần trong các dòng tiếp theo và cần phải sửa đổi một chút) ...Cách thêm một liên lạc động vào macro emacs và truy vấn sẽ thay thế?

Một macro với Cx q hoặc một thay thế truy vấn thường xuyên thực hiện dường như không đủ mạnh trong các tình huống như thế này .. có một cái gì đó tổng quát hơn/linh hoạt để xử lý thay thế biến hoặc biến vĩ mô biến như thế này mà tôi có thể nhìn vào? Tôi tin rằng tôi đã từng xem qua một ví dụ trên web, nơi các biểu thức lisp được giới thiệu vào các lệnh nhất định để mạnh mẽ hơn nhưng tôi không thể nhớ điều này hoặc nơi tôi đọc về nó ..

+5

Bạn có thể nghĩ đến trang web này, mô tả một số chức năng tìm kiếm/thay thế rất mạnh mẽ: http://steve-yegge.blogspot.com/2006/06/shiny-and-new-emacs-22.html – Tyler

+0

Yeah , có vẻ như bạn đang tìm kiếm biểu hiện nổi bật trong tìm kiếm/thay thế được hiển thị trên bài đăng trên blog đó. Một điều rất hữu ích để thử là một sự kết hợp của các macro bàn phím và elisp: tạo một macro viết một biểu thức và sau đó đánh giá nó - rất hữu ích cho các bộ đếm và như vậy. –

+0

Ah vâng đó là blog tôi đã xem, tuyệt vời! Cảm ơn. –

Trả lời

6

Tôi không chắc chắn điều này hoàn toàn trả lời câu hỏi của bạn, nhưng tôi đã tìm thấy sổ đăng ký là một công cụ hữu ích để xây dựng các macro mạnh mẽ. Các chức năng quan trọng nhất là:

  • Cx rnnumber-to-register sao chép số lượng tại thời điểm vào một thanh ghi
  • Cx r +increment-register gia số giá trị được lưu trữ trong một thanh ghi
  • Cx riinsert-register chèn giá trị của thanh ghi vào bộ đệm

Sử dụng các chức năng này, bạn có thể giải quyết vấn đề thay thế số incrementing trên mỗi dòng với:

  • hạt giống số đầu tiên vào một thanh ghi với number-to-register
  • bắt đầu định nghĩa vĩ mô
  • chọn một dòng
  • replace-string , insert-register, increment-register, insert-register
  • chuyển đến đầu dòng tiếp theo
  • cuối định nghĩa vĩ mô

Có thêm thông tin về đăng ký trong cuốn hướng dẫn emacs: https://www.gnu.org/software/emacs/manual/html_node/emacs/Registers.html

3

Cũng như sử dụng gọn gàng các lệnh hiện có, chẳng hạn như một thể hiện bởi ataylor, macro bàn phím có thể được sử dụng để thực hiện gần như hành vi tùy tiện và phức tạp.

Đáng chú ý đặc biệt, CủM: sẽ chèn vào dòng đệm kết quả của bất kỳ hình thức elisp bạn nhập - một hình thức mà có thể, tất nhiên, được xây dựng như một phần của vĩ mô - vì vậy ngay cả khi không có lệnh nào tồn tại cho một hoạt động cụ thể, bạn sẽ không bị ngăn cản sử dụng các macro để đạt được mục tiêu của mình.

(Và tất nhiên nếu elisp không phải là câu trả lời, C-uMC-uM |! cung cấp cho bạn dễ dàng truy cập để kết hợp đầu ra lệnh shell là tốt.Trong số các trường hợp có giải pháp được nhắm mục tiêu nhiều hơn và macro có nhiều rắc rối hơn giá trị (kỹ thuật "tìm kiếm và thay thế bằng đánh giá elisp" được liên kết trong các nhận xét cũng cực kỳ mạnh mẽ và thường là giải pháp lý tưởng); tuy nhiên các macro bàn phím cũng cung cấp một lượng năng lượng tuyệt vời cho nỗ lực cực kỳ ít, và có thể làm một số điều dễ dàng mà bạn có thể đấu tranh để thực hiện khác.

Một trong những ví dụ ưa thích của tôi là sử dụng dữ liệu bản đồ cũ - mới trong một bộ đệm (hầu như mọi định dạng có thể tưởng tượng được) và sử dụng nó để thực hiện tìm kiếm và thay thế trên các giá trị đó trong bộ đệm khác. Tốc độ mà bạn có thể thực hiện loại điều này trên cơ sở đặc biệt với không có gì hơn là chuyển động đơn giản và chỉnh sửa bàn phím là tuyệt vời.

Trình chỉnh sửa macro cũng giúp dễ dàng tinh chỉnh macro của bạn nếu macro không chính xác lần đầu tiên mà không cần phải ghi lại tất cả các bước.

Tôi đã đọc một số lời khuyên hữu ích một lần, chỉ đơn giản là cố gắng luôn nghĩ về việc bạn có thể đạt được một nhiệm vụ với macro bàn phím bất cứ khi nào bạn gặp phải điều gì đó không tầm thường. Bạn càng sử dụng chúng càng nhiều thì bạn càng nhận ra nhiều cách khác nhau, trong đó bạn có thể sử dụng chúng và bạn sẽ sớm có một công cụ không thể thiếu trong hộp công cụ của mình.

2

Tình huống cụ thể mà bạn hỏi về âm thanh như địa điểm hoàn hảo để sử dụng query-replace-regexp.

M-x query-replace-regexp 
Regexp: \([0-9]+\) 
Replace with: \,(+ 1 (string-to-number \1)) 

Đó sử dụng sẽ tìm thấy tất cả các bộ của một hoặc nhiều chữ số (Emacs regexes không hỗ trợ \d) và thay thế chúng với increment của họ, khiến mỗi lần.

Các takeaways chính là:

  • nhóm bị bắt là chuỗi mà bạn có thể gọi trong hoạt động thay thế
  • bạn có thể khâu mã tùy ý vào hoạt động thay thế với \,
  • bạn có thể sử dụng các nhóm bị bắt như đối số trong bất kỳ mã nào bạn khâu theo cách này
1

Đây là một giải pháp khả thi cho vấn đề đã nêu của bạn, bằng cách sử dụng thay thế dễ dàng và bộ đếm vĩ mô bàn phím mà bạn có thể gộp bằng đối số tiền tố số.

(Tôi sẽ không nói điều này là tốt hơn, nhưng nó thể hiện một lựa chọn có sẵn.)

Vì vậy, giả sử 23 được số bắt đầu, bạn có thể định nghĩa macro sau, bắt đầu với:

C-2C-3F3

C-SPC  ;; set-mark-command 
C-e   ;; move-end-of-line 
<<replace-regexp>> ;; replace-regexp 
<f3>  ;; kmacro-start-macro-or-insert-counter 
C--   ;; negative-argument 
[email protected]   ;; mark-word 
M-w   ;; kill-ring-save 
RET   ;; indent-new-comment-line 
\   ;; self-insert-command 
,(1+  ;; self-insert-command * 4 
SPC   ;; self-insert-command 
C-y   ;; yank 
)   ;; self-insert-command 
RET   ;; indent-new-comment-line 

F4 để dừng quay.

(n.b. macro này giả định rằng mỗi dòng trong khu vực chứa một giá trị trong chuỗi.)

Sau đó, làm nổi bật các đường còn lại và sử dụng C-xC-kr để cập nhật tất cả các dòng trong khu vực.

Bạn có thể tái thiết lập bộ đếm vĩ mô đối với bất kỳ giá trị mong muốn với C-xC-kC-c lại chơi vĩ mô đối với khu vực khác.

Và tùy thuộc vào dữ liệu của bạn trông như thế nào, bạn có thể đơn giản hóa điều đó một cách đáng kể bằng cách loại bỏ toàn bộ regexp thay thế, và thay vào đó chỉ di chuyển đến nơi bạn biết số đó, xóa số hiện tại và chèn giá trị bộ đếm ở vị trí của nó.

Các vấn đề liên quan