2008-08-13 2 views
6

Для контекста я являюсь чем-то вроде новичков emacs. Я не использовал его очень долго, но использовал его все больше и больше (мне это очень нравится). Также мне нравится lisp, но не супер знакомы с elisp.Как связать регулярное выражение с комбинацией клавиш в emacs?

Что мне нужно сделать, это связать регулярное выражение с комбинацией клавиш, потому что я часто использую это конкретное регулярное выражение.

Что я делал:

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

Примечание, я использовал строку выше, но я обнаружил, что для isearch-forward-regexp, вам действительно нужно заменить \n в регулярном выражении с результатом Cq Qj. Это вставляет литеральную новую строку (без завершения команды), позволяющую мне помещать новую строку в выражение и сопоставлять строки.

Как я могу привязать это к комбинации клавиш?

Я смутно понимаю, что мне нужно создать функцию elisp, которая исполняет isearch-forward-regexp с выражением, но я неясен в деталях. Я искал google и нашел большую часть документации, немного запутанной.

Как связать регулярное выражение с комбинацией клавиш в emacs?


Майк Стоун был лучший ответ до сих пор - не точно то, что я искал, но он работал на то, что мне нужно было

Edit - это своего рода работала, но после хранения макрос, когда я вернулся, чтобы использовать его позже, я не мог использовать его с Cx e. (То есть, если я перезагрузки Emacs, а затем введите Mx макро-имя, а затем Сх е, я получаю сообщение в минибуфере как «не последний KBD макро» или что-то подобное)


@ Майк Стоун - Спасибо за информацию. Я попытался создать макрос так:

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

Это создало мой макрос, но когда я выполнил мой макрос я не получил ту же подсветку, что я обычно получаю, когда я использовать isearch-forward-regexp. Вместо этого он просто подпрыгнул до конца следующего матча выражения. Так что это действительно не работает для того, что мне нужно. Есть идеи?

Редактировать: Похоже, я использую макросы, чтобы делать то, Я попробую то, что вы предложили.

ответ

5

Вы можете использовать макросы, просто сделать C-х ( затем сделать все для макроса, то C-х) до конца макроса, то C-х е выполнит последний определенный макрос.Затем, вы можете назвать его с помощью Mx имя-последней-KBD-макрос, который позволяет присвоить ей имя, которое вы можете вызывать с Mx TestIt, а затем сохранить определение с помощью Mx вставка-KBD-макро который поместит макрос в ваш текущий буфер, а затем вы сможете сохранить его в файле .emacs.

Пример:

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

будет определять макрос типа "ABC" и нажмите кнопку возврата.

C-xeee 

Выполняет выше макроса немедленно, 3 раза (первый е выполняет его, а затем следующие 2 е х будет выполнить его в два раза больше).

M-x name-last-kbd-macro testit 

имена макрокоманды "TestIt"

M-x testit 

Выполняет только с именем макроса (печатает "ABC", а затем вернуться).

M-x insert-kbd-macro 

Ставит следующие в текущем буфере:

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

, которые затем могут быть сохранены в файле .emacs использовать макрос с именем снова и снова после перезагрузки Emacs.

1

@Justin:

При выполнении макроса, это немного разные ... дополнительные поиски просто случаются один раз, и вы должны будете выполнить макрос еще раз, если вы хотите, чтобы поиск снова. Вы можете делать более мощные и сложные вещи, такие как поиск ключевого слова, переход к началу строки, пометка, переход к концу строки, Mw (для копирования), затем переход в другой буфер, затем Cy (вставка), затем вернитесь к другому буферу и завершите свой макрос. Затем каждый раз, когда вы выполняете макрос, вы будете копировать строку в следующий буфер.

Действительно крутая вещь о макросах emacs - это остановится, когда она увидит звонок ... что происходит, когда вы не можете выполнить дополнительный поиск (между прочим). Таким образом, вышеупомянутый макрос, вы можете сделать C-u 1000 C-x e, который будет выполнять макрос 1000 раз ... но так как вы выполнили поиск, он будет копировать только 1000 строк, ИЛИ НЕ ПОСЛЕ ПОИСКА! Это означает, что если 100 матчей, он будет выполнять макрос только 100 раз.

EDIT: Отметьте C-hf highlight-lines-matching-regexp, который покажет помощь команды, которая выделяет все, что соответствует регулярному выражению ... Я не знаю, как отменить выделение, хотя ... в любом случае вы можете использовать сохраненный макрос, чтобы выделить все соответствия регулярному выражению, а затем еще один макрос, чтобы найти следующий ...?

ДАЛЕЕ EDIT: Mx снятия выделения-регулярное выражение будет отменить выделение, вы должны войти в последнее регулярное выражение, хотя (но по умолчанию регулярное выражение вы использовали, чтобы выделить)

1

В общем, чтобы определить пользовательский данное сочетание клавиш в Emacs , вы бы написать

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

define-key, что не удивительно, функция, чтобы определить новый ключ. global-map - это глобальная раскладка клавиатуры, в отличие от отдельных карт для каждого режима.(kbd "C-c C-f") возвращает строку, представляющую последовательность клавиш C-c C-f. Существуют и другие способы сделать это, включая ввод строки напрямую, но это, как правило, наиболее прямолинейно, поскольку оно принимает нормальное письменное представление. 'function-name - это символ, который является именем функции.

Теперь, если ваша функция уже не определена, вы хотите определить ее, прежде чем использовать ее. Чтобы сделать это, написать

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

defun определяет функцию - использовать C-h f defun для получения более подробной информации. (interactive) на самом деле нет вызова функции; он сообщает компилятору, что это нормально для функции, вызываемой пользователем с использованием M-x function-name и с помощью клавиш.

Теперь, для интерактивного поиска, в частности, это сложно; модуль isearch действительно не настроен для того, что вы пытаетесь сделать. Но вы можете использовать это, чтобы сделать что-то подобное.

2

Я начал с решения вашей проблемы буквально,

(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")) 

Последовательность клавиатуры от (kbd ...) начинается новый пустой поиск. Чтобы на самом деле искать строку, вы нажимаете последний ключ снова столько раз, сколько вам нужно. Таким образом, C-. t t t или <f6> <f6> <f6>. Решение в основном является взломом, но я оставлю его здесь, если вы хотите поэкспериментировать с ним.

Следующая, вероятно, ближе всего к тому, что вам нужно,

(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") 

Ключевые комбо теперь работают только в режиме ISearch. Вы обычно начинаете поиск, а затем нажимаете клавиши, чтобы вставить вашу предопределенную строку.

Смежные вопросы