Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
951
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1725
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4398
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как привязать регулярное выражение к комбинации клавиш в emacs?
Для контекста я что-то вроде Новичка emacs. Я не использовал его очень долго, но использую его все больше и больше (мне это очень нравится). Также мне комфортно с lisp, но не очень хорошо знаком с elisp.
То, что мне нужно сделать, это привязать регулярное выражение к комбинации клавиш, потому что я использую этот конкретный regex так часто.
То, что я делал:
M-C-s ^.*Table\(\(.*\n\)*?GO\)
Обратите внимание, что я использовал новую строку выше , но я обнаружил, что для isearch-forward-regexp вам действительно нужно заменить \n в регулярном выражении на результат C-q Q-j . Это вставляет литеральную новую строку (без завершения команды), позволяя мне поместить новую строку в выражение и сопоставить строки.
Как я могу привязать это к комбинации клавиш?
Я смутно понимаю, что мне нужно создать функцию elisp, которая выполняет isearch-forward-regexp с выражением, но я нечетко разбираюсь в деталях. Я поискал в гугле и нашел большинство документов, которые должны быть немного запутанным.
Как я могу привязать регулярное выражение к комбинации клавиш в emacs?
У Майка Стоуна был лучший ответ на данный момент-не совсем то, что я искал, но он работал для того, что мне нужно
Edit-этот вид работал, но после сохранения макроса, когда я вернулся, чтобы использовать его позже, я не мог использовать его с C-x e . (т. е., если я перезагружаю emacs, а затем набираю M-x macro-name, а затем C-x e , я получаю сообщение в минибуфере, например "нет последнего макроса kbd" или что-то подобное)
@Mike камень-Спасибо за информацию. Я попытался создать макрос вот так:
C-x( M-C-s ^.*Table\(\(.*C-q C-J\)*?GO\) C-x)
Это создало мой макрос, но когда я выполнил свой макрос, я не получил того же выделения, которое я обычно получаю, когда использую isearch-forward-regexp . Вместо этого он просто перескочил к концу следующего матча выражения. Так что это действительно не работает для того, что мне нужно. Есть идеи?
Edit: похоже, я могу использовать macros, чтобы делать то, что я хочу, мне просто нужно думать вне коробки isearch-forward-regexp . Я попробую то, что вы предложили.
Вы можете использовать macros, просто сделайте C-x ( , затем сделайте все для макроса, затем C-x ) , чтобы закончить макрос, затем C-x e выполнит последний определенный макрос. Затем вы можете назвать его с помощью M-x name-last-kbd-macro , что позволяет назначить ему имя , которое затем можно вызвать с помощью M-x TESTIT, затем сохранить определение с помощью M-x insert-kbd-macro , которое поместит макрос в ваш текущий буфер, а затем вы можете сохранить его в файле .emacs .
Пример:
C-x( abc *return* C-x)
Определит макрос для ввода "abc" и нажмите клавишу return.
C-xeee
Выполняет указанный выше макрос немедленно, 3 раза (сначала e выполняет его, затем следующие 2 e будут выполнять его еще дважды).
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.
Я начал с решения вашей проблемы буквально,
(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. Вы начинаете поиск в обычном режиме, а затем нажимаете комбинацию клавиш, чтобы вставить предопределенную строку.
В общем случае, чтобы определить пользовательскую привязку ключей в 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 на самом деле не кажется настроенным для того, что вы пытаетесь сделать. Но вы можете использовать это, чтобы сделать что-то подобное.
@Justin:
При выполнении макроса все немного по-другому... инкрементный поиск будет выполняться только один раз, и вам придется снова выполнить макрос, если вы хотите выполнить поиск снова. Однако вы можете выполнять более мощные и сложные действия, такие как поиск ключевого слова, переход к началу строки, отметка, переход к концу строки, M-w (копирование), затем переход к другому буферу, затем C-y (вставка), затем переход обратно к другому буферу и завершение макроса. Затем каждый раз при выполнении макроса вы будете копировать строку в следующий буфер.
Самое классное в emacs macros-это то, что он остановится, когда увидит колокол... что происходит, когда вы не можете соответствовать инкрементальному поиску (среди прочего). Таким образом, выше макрос, вы можете сделать C-u 1000 C-x e, который будет выполнять макрос 1000 раз... но так как вы сделали поиск, он будет копировать только 1000 строк, или пока поиск не завершится неудачей! Это означает, что если есть 100 совпадений, он будет выполнять макрос только 100 раз.
EDIT: Проверьте C-hf highlight-lines-matching-regexp, который покажет помощь команды, которая выделяет все, что соответствует regex... Хотя я не знаю, как отменить подсветку... в любом случае вы можете использовать сохраненный макрос, чтобы выделить все соответствующие regex, а затем другой макрос, чтобы найти следующий...?
Дальнейшее редактирование: M-x unhighlight-regexp отменит выделение, вы должны ввести последний regex, хотя (но по умолчанию используется regex, который вы использовали для выделения)