В моем .emacs файл У меня есть следующие функции:Поиск лексема вперед
; Search for token forward and backward
(defun search-token-forward()
"Search forward for the ucode token at the point."
(interactive) ; Makes the function available as a command
(let (target-string)
(setq target-string (buffer-substring
(+ (re-search-backward "[^A-Za-z0-9/[email protected]#\$]") 1)
(- (re-search-forward "[^A-Za-z0-9/[email protected]#\$]" nil t 2) 1)))
; post a message saying what we're looking for
(message "Search for \`%s\`" target-string)
; (setq case-fold-search nil)
(search-forward target-string)))
(global-set-key [f5] 'search-token-forward)
(defun search-token-backward()
"Search backward for the ucode token at the point."
(interactive)
(point)
(let (target-string)
(setq target-string (buffer-substring
(+ (re-search-backward "[^A-Za-z0-9/[email protected]#\$]") 1)
(- (re-search-forward "[^A-Za-z0-9/[email protected]#\$]" nil t 2) 1)))
(message "backward search for \`%s\`" target-string)
; (setq case-fold-search nil)
;
; here the search for the target string is done twice. Once
; for the string that the cursor is on, and once more to go
; backwards for the next occurance.
;
(search-backward target-string nil nil 2)))
(global-set-key [C-f5] 'search-token-backward)
После первого поиска курсор перемещается до после последнего символа выражения, что хорошо, так как я все еще могу сделать «поиск -token-backward ", используя другую функцию, которая у меня есть. К сожалению, при поиске после последнего вхождения выражения курсор перемещается в конец строки, поэтому я не могу плавно попытаться выполнить поиск назад, так как курсор не находится в выражении «position». Что вызывает такое поведение и как его можно исправить?
В принципе, я бы хотел, чтобы курсор оставался в пространстве после последнего символа выражения, даже если его нет.
Ниже приведен пример: В следующем коде, пока курсор находится на функции foo_func, я нажимаю f5, привязанный к поисковым маркерам. Метки Х, где курсор находится после каждого щелчка:
int foo_func(int w, int y);
x cursor here to begin with.
some code...
foo_func(1, 2);
x After first click
some code...
foo_func(3,4);
x after second click
some code...
return foo_func(5,6);
x after third click
Есть в настоящее время нет более вхождений foo_func в файле, так ударяя f5 один больше времени перемещает курсор на один символ вправо, например, так:
return foo_func(5,6);
x after forth click, this is the same line above.
Поэтому я не могу просто нажать ctrl-f5 для поиска назад для foo_func, потому что курсор больше не смежна с функцией.
Дрю, я не владею elisp. Не могли бы вы сообщить мне, что нужно изменить вышеприведенный код для реализации вашей идеи? – SFbay007
Я обновил текст в ответ. У вас пока нет ответа. Не совсем понятно, что вы действительно ищете. Как только вы знаете, какую строку искать, '(search-forward target-string)', как вы думали, все, что вам нужно. – Drew
Спасибо за анализ. Я действительно взял этот кусок кода из файла .emacs коллеги. Поэтому я не уверен, как он построен, но он отлично справляется с поиском следующего «имени переменной/структуры/функции/макроса ... и т. Д.». Я использую его в основном в C и ассемблере. Я думаю, что шаблон, который вы видите, совпадает с возможными именами функций или переменных на этих двух языках. Например, в C вы вряд ли найдете «-», который используется в именах функций, например, в lisp, поэтому в шаблоне сопоставления нет такого символа. – SFbay007