2013-04-14 26 views
5

Câu hỏi của tôi được xây dựng trên this answer by Trey Jackson để this question from SyntaxT3rr0r.Để lại khu vực được lựa chọn sau khi hoạt động emacs

Trey đề xuất các chức năng sau đây cho incrementing mỗi số hai chữ số trong khu vực được lựa chọn của một bộ đệm Emacs.

(defun add-1-to-2-digits (b e) 
    "add 1 to every 2 digit number in the region" 
    (interactive "r") 
    (goto-char b) 
    (while (re-search-forward "\\b[0-9][0-9]\\b" e t) 
    (replace-match (number-to-string (+ 1 (string-to-int (match-string 0))))))) 

Tôi muốn sử dụng chức năng này cho mục đích của riêng mình. Tuy nhiên, tôi muốn tăng số lượng nhiều lần liên tiếp. Vấn đề với hàm, ở dạng hiện tại của nó, là trước mỗi lời gọi, tôi phải chọn lại vùng bằng chuột.

Câu hỏi của tôi là: Làm thế nào chức năng Trey có thể được sửa đổi để nó rời khỏi khu vực được lựa chọn sau khi gọi? (mục đích cuối cùng của tôi là để gán chức năng này để một phím tắt (giống như ctrl + ) vì vậy mà tôi nếu tôi giữ ctrl phím được nhấn xuống, tất cả các số có hai chữ số trong vùng tôi chọn sẽ liên tục tăng.)

Nhân tiện, tôi biết về this answer by Brian Campbell, đề xuất sử dụng exchange-point-and-mark để chọn lại khu vực đã chọn trước đó. Tuy nhiên, tôi đã thử điều đó, và nó dường như không giúp đỡ trong trường hợp này.

+1

1 nhưng lưu ý rằng những gì bạn dán ở đây không phải là một vĩ mô nhưng một hàm. * defun * trong elisp định nghĩa một hàm, không phải macro:) (Tôi đã chỉnh sửa câu hỏi của bạn và thay đổi "macro" thành "function"). Lưu ý rằng macro trong phương ngữ Lisp là một con thú hoàn toàn khác:) – TacticalCoder

+1

có thể là một gợi ý ngớ ngẩn nhưng ... Thậm chí nếu bạn không nhìn thấy các khu vực được lựa chọn sau khi cuộc gọi đầu tiên phím tắt của bạn, có thể bạn không chỉ cần gọi phương thức một lần nữa và lần nữa? Trên số hệ thống của tôi tiếp tục đi lên và lên và lên với chức năng được viết như là. – TacticalCoder

+0

Oh thật sao? Hm, điều đó không xảy ra với tôi. Tôi đánh dấu một vùng bằng chuột, sau đó tôi thực hiện 'Mx add-1-to-2-digit', tăng số lượng và sau đó tôi nhập' Mx add-1-to-2-digits' lần nữa và lần này chẳng có gì xảy ra. Chúng ta đang làm gì khác, tôi tự hỏi? –

Trả lời

5

Dưới đây là chức năng của bạn sửa đổi để sử dụng let (deactivate-mark) bọc bên save-excursion như đề xuất trong câu trả lời người dùng event_jr được liên kết đến:

https://stackoverflow.com/a/11080667/903943

(defun add-1-to-2-digits (b e) 
    "add 1 to every 2 digit number in the region" 
    (interactive "r") 
    (save-excursion 
    (let (deactivate-mark) 
     (goto-char b) 
     (while (re-search-forward "\\b[0-9][0-9]\\b" e t) 
     (replace-match (number-to-string (+ 1 (string-to-int (match-string 0))))))))) 
Các vấn đề liên quan