2008-08-13 30 views
6

Đối với ngữ cảnh, tôi là một cái gì đó của một newbie emacs. Tôi đã không sử dụng nó cho rất lâu, nhưng đã được sử dụng nó nhiều hơn và nhiều hơn nữa (tôi thích nó rất nhiều). Ngoài ra tôi cảm thấy thoải mái với lisp, nhưng không phải siêu quen thuộc với elisp.Làm cách nào để liên kết cụm từ thông dụng với tổ hợp phím trong các emacs?

Điều tôi cần làm là liên kết biểu thức chính quy với tổ hợp bàn phím vì tôi thường sử dụng regex cụ thể này.

Những gì tôi đã làm:

M-C-s ^.*Table\(\(.*\n\)*?GO\) 

Lưu ý, tôi đã sử dụng xuống dòng ở trên, nhưng tôi đã phát hiện ra rằng cho isearch-forward-regexp, bạn thực sự cần phải thay thế \n trong biểu thức chính quy với kết quả của Cq Qj. Điều này chèn một dòng mới (không kết thúc lệnh) cho phép tôi đặt một dòng mới vào biểu thức và kết hợp trên các dòng.

Làm cách nào để gắn kết kết hợp này với tổ hợp phím?

Tôi mơ hồ hiểu rằng tôi cần tạo một hàm elisp thực hiện isearch-forward-regexp với biểu thức, nhưng tôi mờ về chi tiết. Tôi đã tìm kiếm google và tìm thấy hầu hết các tài liệu được một chút khó hiểu.

Làm cách nào để liên kết biểu thức chính quy với tổ hợp phím trong biểu tượng cảm xúc?


Mike Stone đã có câu trả lời tốt nhất cho đến nay - không chính xác những gì tôi đang tìm kiếm nhưng nó làm việc cho những gì tôi cần

Edit - loại này làm việc, nhưng sau khi lưu trữ macro, khi tôi quay lại sử dụng sau này, tôi không thể sử dụng nó với Cx e. (Ví dụ, nếu tôi khởi động lại emacs và sau đó gõ Mx vĩ mô tên, và sau đó Cx e, tôi nhận được một tin nhắn trong minibuffer như 'không ngoái kbd vĩ mô' hoặc cái gì đó tương tự)


@ Mike Stone - Cảm ơn thông tin. Tôi đã cố gắng tạo ra một vĩ mô như vậy:

C-x(M-C-s ^.*Table\(\(.*C-q C-J\)*?GO\) C-x) 

này tạo vĩ mô của tôi, nhưng khi tôi thực hiện vĩ mô của tôi, tôi đã không nhận được làm nổi bật tương tự mà tôi thường nhận được khi tôi sử dụng isearch-forward-regexp. Thay vào đó, nó chỉ nhảy vào cuối trận đấu tiếp theo của biểu thức. Điều đó không thực sự hiệu quả với những gì tôi cần. Bất kỳ ý tưởng?

Chỉnh sửa: Có vẻ như tôi có thể sử dụng macro để thực hiện những gì tôi muốn, tôi chỉ cần suy nghĩ bên ngoài hộp isearch-forward-regexp. Tôi sẽ thử những gì bạn đề nghị.

Trả lời

5

Bạn có thể sử dụng các macro, chỉ cần làm C-x ( sau đó làm mọi thứ cho các macro, sau đó C-x) để kết thúc vĩ mô, sau đó C-x e sẽ thực hiện vĩ mô được xác định trước.Sau đó, bạn có thể đặt tên cho nó bằng cách sử dụng Tên mx-last-kbd-macro cho phép bạn gán tên cho nó, sau đó bạn có thể gọi với Mx TESTIT, sau đó lưu trữ định nghĩa bằng cách sử dụng Mx insert-kbd-macro sẽ đưa macro vào bộ đệm hiện tại của bạn và sau đó bạn có thể lưu nó trong tệp .emacs của mình.

Ví dụ:

C-x(abc *return* C-x) 

sẽ định nghĩa một macro để gõ "abc" và nhấn return.

C-xeee 

Thực hiện macro trên ngay lập tức, 3 lần (trước tiên thực hiện nó, sau đó thực hiện theo 2 lần nữa sẽ thực hiện thêm hai lần).

M-x name-last-kbd-macro testit 

Tên vĩ mô để "testit"

M-x testit 

thực thi vĩ mô chỉ tên (in "abc", sau đó quay trở lại).

M-x insert-kbd-macro 

Đặt sau trong bộ đệm hiện tại của bạn:

(fset 'testit 
    [?a ?b ?c return]) 

Mà sau đó có thể được lưu trong tập tin .emacs của bạn để sử dụng các macro có tên hơn và hơn nữa sau khi khởi động emacs.

1

@Justin:

Khi thực hiện một vĩ mô, đó là một chút khác nhau ... tìm kiếm gia tăng sẽ chỉ xảy ra một lần, và bạn sẽ phải thực hiện vĩ mô một lần nữa nếu bạn muốn tìm kiếm một lần nữa. Bạn có thể làm những thứ mạnh mẽ và phức tạp hơn, chẳng hạn như tìm kiếm từ khóa, nhảy tới đầu dòng, đánh dấu, đi đến cuối dòng, Mw (để sao chép), sau đó chuyển đến bộ đệm khác, sau đó chọn Cy (dán)), sau đó nhảy trở lại bộ đệm khác và kết thúc macro của bạn. Sau đó, mỗi lần bạn thực thi macro, bạn sẽ sao chép một dòng vào bộ đệm tiếp theo.

Điều thực sự thú vị về macro emacs là nó sẽ dừng khi thấy chuông ... điều này xảy ra khi bạn không khớp với tìm kiếm gia tăng (trong số những thứ khác). Vì vậy, trên vĩ mô, bạn có thể làm C-u 1000 C-x e mà sẽ thực hiện các vĩ mô 1000 lần ... nhưng kể từ khi bạn đã làm một tìm kiếm, nó sẽ chỉ sao chép 1000 dòng, hoặc UNTIL TÌM KIẾM FAILS! Có nghĩa là nếu có 100 trận đấu, nó sẽ chỉ thực thi macro 100 lần.

EDIT: Kiểm tra C-hf highlight-lines-matching-regexp sẽ hiển thị trợ giúp của lệnh làm nổi bật mọi thứ khớp với regex ... Tôi không biết cách hoàn tác đánh dấu mặc dù ... anyways bạn có thể sử dụng macro được lưu trữ để đánh dấu tất cả khớp với regex và sau đó một macro khác để tìm macro tiếp theo ...?

EDIT THÊM: Mx unhighlight-regexp sẽ khôi phục trở lại làm nổi bật, bạn phải nhập các regex cuối cùng mặc dù (nhưng nó mặc định là regex bạn sử dụng để làm nổi bật)

1

Nói chung, để xác định một keybinding tùy chỉnh trong Emacs , bạn muốn viết

(define-key global-map (kbd "C-c C-f") 'function-name) 

define-key, không có gì đáng ngạc nhiên, chức năng xác định khóa mới. global-map là sơ đồ bàn phím chung, trái với bản đồ riêng lẻ cho từng chế độ.(kbd "C-c C-f") trả về một chuỗi đại diện cho chuỗi khóa C-c C-f. Có nhiều cách khác để làm điều này, bao gồm nhập chuỗi trực tiếp, nhưng điều này thường là đơn giản nhất vì nó có biểu diễn bằng văn bản bình thường. 'function-name là một biểu tượng là tên của hàm.

Bây giờ, trừ khi chức năng của bạn đã được xác định, bạn sẽ muốn xác định nó trước khi sử dụng. Để làm điều đó, hãy viết

(defun function-name (args) 
    (interactive) 
    stuff 
    ...) 

defun định nghĩa một hàm - sử dụng C-h f defun để biết thông tin cụ thể hơn. (interactive) không thực sự có chức năng gọi; nó cho trình biên dịch biết rằng chức năng sẽ được gọi bởi người dùng bằng cách sử dụng M-x function-name và thông qua các khóa liên kết.

Bây giờ, để tìm kiếm tương tác cụ thể, điều này là khó khăn; mô-đun isearch dường như không được thiết lập cho những gì bạn đang cố gắng làm. Nhưng bạn có thể sử dụng điều này để làm một cái gì đó tương tự.

2

Tôi đã bắt đầu với việc giải quyết vấn đề của bạn theo nghĩa đen,

(defun search-maker (s) 
    `(lambda() 
    (interactive) 
    (let ((regexp-search-ring (cons ,s regexp-search-ring)) ;add regexp to history 
      (isearch-mode-map (copy-keymap isearch-mode-map))) 
     (define-key isearch-mode-map (vector last-command-event) 'isearch-repeat-forward) ;make last key repeat 
     (isearch-forward-regexp)))) ;` 

(global-set-key (kbd "C-. t") (search-maker "^.*Table\\(\\(.*\\n\\)*?GO\\)")) 
(global-set-key (kbd "<f6>") (search-maker "HELLO WORLD")) 

Trình tự bàn phím từ (kbd ...) bắt đầu một tìm kiếm mới trống. Để thực sự tìm kiếm chuỗi của bạn, bạn nhấn phím cuối cùng một lần nữa bao nhiêu lần tùy thích. Vì vậy, C-. t t t hoặc <f6> <f6> <f6>. Giải pháp cơ bản là một hack, nhưng tôi sẽ để nó ở đây nếu bạn muốn thử nghiệm nó.

Sau đây có lẽ là gần nhất với những gì bạn cần,

(defmacro define-isearch-yank (key string) 
    `(define-key isearch-mode-map ,key 
    (lambda() 
     (interactive) 
     (isearch-yank-string ,string)))) ;` 

(define-isearch-yank (kbd "C-. t") "^.*Table\\(\\(.*\\n\\)*?GO\\)") 
(define-isearch-yank (kbd "<f6>") "HELLO WORLD") 

Các combo key bây giờ chỉ làm việc trong chế độ isearch. Bạn bắt đầu tìm kiếm bình thường, và sau đó nhấn tổ hợp phím để chèn chuỗi được xác định trước của bạn.

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