LINUX.ORG.RU

[Emacs] продолжить поиск по слову

 


0

0

Чтобы пройти по вхождениям подстроки в буфере, нажимаем C-s, вводим подстроку и дальше жмём C-s до позеленения.

Внимание, вопрос!
Как сделать то же самое, но искать не просто подстроку, а целое слово?
Я знаю, как найти одно слово.
Знаю, как заменить слово.

А вот похоже, что пройти по всем вхождениям слова нельзя.

Вообще, вопрос такой. Опять же, извините, но пример снова будет из офтопика. В Дельфи есть окошко поиска, в котором можно ввести строку и проставить галочки, изображающие опции поиска. Далее, независимо от того, какой поиск был сделан (или даже поиск с заменой), его можно повторить/продолжить с помощью Ctrl-l

По сравнению с этим интерфейс Emacs просто абсолютно уё... уё... в общем, некрасивый. Нужно помнить примерно 6 или 8 сочетаний клавиш или имён команд. Имена команд не имеют никакой стройной системы, которая позволяла бы их запомнить с лёгкостью. Сочетания клавиш - длинные и разные.

Да, в Emacs тоже есть такое окошко. Но... во всяком случае, в XEmacs им нельзя воспользоваться без применения мыши. А это - плохо. И в нём нет галочки "искать целое слово". А это - совсем плохо. Замечу в скобках, что в Дельфи, несмотря на его "попсовость", всё можно было сделать с помощью клавиатуры.

Короче, всё очень плохо (так же, как было с выбором буферов). Но для выбора буферов вы мне подсказали почти идеальное решение. Наверняка подобное решение существует и для поиска?

★★★★★

1) C-s C-w
2) describe-function word-search-[forward|backward]
3) галочки-хуялочки, блин: risearch-[forward|backward]-regexp

anonymous
()

А http://www.gnu.org/software/emacs/manual/html_node/emacs/Search.html#Search уже полностью прочитан?

все прекрасно делается с клавиатуры, через M-x имя_функции и/или более короткие сочетания. Для не инкрементального поиска, аргументы запоминаются и при следующем вызове их можно использовать сразу или пройтись по истории ввода

ott ★★★★★
()
Ответ на: комментарий от ott

Ещё раз объясняю: первое вхождение слова находится без проблем. Проблемы начинаются на втором вхождении. В случае word-search-forward, мне нужно повторить команду целиком. Да, безусловно, руководство я в части поиска читал и команды через M-x вводить умею :)

Кстати, я нашёл более-менее подходящую repeat-matching-complex-command

Но "из коробки" пользоваться ей ещё дольше, чем M-x M-p Ret M-p Ret Можно, конечно, что-то запрограммировать поверх неё. Но не хватало ещё в XXI веке программировать элементарные операции поиска в популярном редакторе!

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

Анонимус, насчёт risearch поисковики вообще молчат. С помощью регекспа поиск слова выразить не получается, во всяком случае, \Wit\W не найдёт слово it, как минимум в начале файла. Да и это неудобно. Мне нужно вводить целых 4 символа, а по уму здесь должен быть только один.

Функция word-search-forward принимают 5 аргументов. Как мне ввести больше одного аргумента с помощью M-x? Но в любом случае, что мне делать после того, как я найду первое слово? Должна быть клавиша "продолжить поиск". А вместо этого нужно подавать команду заново.

Я думаю, должен существовать какой-нибудь пакет simple-search или damned-microsoft-search что-нибудь в этом роде, который делает поиск более простым и похожим на то, как это выглядит в современных редакторах или хотя бы в том же firefox.

Короче, пока что никто на мой вопрос не ответил. Ждём-пождём :)

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

А, и кстати, C-s C-w тоже в моём случае не решает задачу (и в руководстве про него не написано). Вообще что-то не то делает. Есть C-s Ret C-w - находит только одно слово.

den73 ★★★★★
() автор топика
Ответ на: комментарий от one_more_hokum

В принципе позволяет, но неудобно. Кроме того, не совсем надёжно. Например, \WbeginningOfFile\W не покажет слово в начале (а может быть, и в конце) файла. Слишком много нажатий клавиш. Поиск - это основная операция. Поэтому поиск должен быть гибким, удобным и не затрудняющим мозг процессом. И ещё, он должен требовать минимального числа нажатий клавиш.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Emacs и "минимального числа нажатий клавиш" -- несовместимые вещи.

one_more_hokum ★★★
()
Ответ на: комментарий от den73

> Но не хватало ещё в XXI веке программировать элементарные операции поиска в популярном редакторе!

Ну, это для тебя именно они "элементарные". Я, например, пока не сталкивался с такой необходимостью. И вообще, чё за подход? Раз XXI век, так и программировать не нужно? Нафеячь свою функцию, отошли её в ветку разработки. Примут -- хорошо. Не примут -- будет оправдание: "я хотя-бы пытался, а ты?".

one_more_hokum ★★★
()

>И в нём нет галочки "искать целое слово"

есть же регэксп "начало слова"-"конец слова". вот им слово окружить и искать

anonymous
()
Ответ на: комментарий от anonymous

\<beginningOfFile\> - спасибо, я невнимательно почитал руководство. Похоже, что на твёрдую тройку проблема решена... И даже похоже, что можно подкрутить syntax-table, чтобы он воспринимал "-" как часть слова, что радуает... Только непонятно, как найти syntax-table, соответствующий нужной мне моде, чтобы залить всё это в файл инициализации, но это можно и потом.

Всё, спасибо, будем считать, что вопрос решён.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

emacs и твердая тройка?
а help кто будет читать перед таким заявлением?
C-h k C-s вызовет описание функции, которая
была назначена на сочетание клавиш C-s
у меня(emacs-cvs-23) это isearch-forward
ВНИМАТЕЛЬНО читаем ВСЮ справку
и находим строчку:
Type M-s w to toggle word mode.

т.е нужный режим в emacs есть. Осталось
только найти как его вызвать более
простой комбинацией.
После небольшого ислдедования
натыкаемся на это:
isearch-forward-word
которая вызывается по
M-s w

Работает так: наводишь курсор на нужное
слово. Жмешь эту комбинацию и дальше
как обычно: C-s или C-r

anonymous
()
Ответ на: комментарий от den73

> И даже похоже, что можно подкрутить syntax-table, чтобы он воспринимал "-" как часть слова, что радуает... Только непонятно, как найти syntax-table, соответствующий нужной мне моде, чтобы залить всё это в файл инициализации, но это можно и потом.

http://www.emacswiki.org/cgi-bin/wiki/EmacsSyntaxTable
первой ссылкой про Emacs+search+Regexp наткнулся на это, но посомневался и решил поначалу не постить.

anonymous
()
Ответ на: комментарий от den73

да, еще забыл сказать про
редактирование искомого слова комбинацией
M-e

Вот forward поиск слова emacs с произвольной
позиции в буфере:
M-s w M-e emacs RET

anonymous
()
Ответ на: комментарий от anonymous

В общем, в моём xemacs 21.4.19 таких функций нет. Похоже, есть повод для обновления (хотя я уже его недавно вроде обновлял). И ещё, когда я говорил, что "окошком нельзя воспользоваться без мыши", я имел в виду то окошко, которое открывается через графическое меню. А ещё тут я где-то читал, что якобы XEmacs не моден в наше время...

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Э, опять, чтобы меня правильно поняли, конечно, функция isearch-forward есть, нет в ней только toggle word mode.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

>Э, опять, чтобы меня правильно поняли, конечно, функция isearch-forward есть, нет в ней только toggle word mode.

В 21.* нет этих подфункций. Поставь себе isearch+.el. Если 
влом, то пропиши у себя в ~/.emacs вот это: 

;; Это должно toggle word search сделать по M-w в старом XEmacs
;; Кусочек нежно выдран из isearch+.
;; А чего ты такой визгливый-то? Не нравится Emacs -- уходи с него 
;; Переходи на Delphi. :)

(add-hook 'isearch-mode-hook
          (lambda ()
            (define-key isearch-mode-map "\M-w" 'isearch-toggle-word)))

(unless (fboundp 'isearch-toggle-word)
  (defun isearch-toggle-word ()
    (interactive)
    (setq isearch-word (not isearch-word))
    (when isearch-word (setq isearch-regexp nil))
    (setq isearch-success t)
    (setq isearch-adjusted t)
    (isearch-update)))

На isearch-mode-map можно и всякие разный свой custom search повесить.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

В общем, я добавил в init.el

(modify-syntax-entry ?- "w" lisp-mode-syntax-table)

чтобы идентификатор через - считался словом. Конечно, это только один частный случай символа, но он покрывает 99% всех символов, которые я встречал.

isearch+ я вчера уже и сам нашёл, но я думаю, лучше поставить более новую версию emacs-a целиком.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

в продолжение темы "Re: lisp как препроцессор для C" (извиняюсь, что не про Емакс, но не могу запостить туда, так что приходится постить сюда)

две интересные ссылки: http://www.idiom.com/free-compilers/TOOL/Scheme-8.html http://www.idiom.com/free-compilers/TOOL/CommonLi-12.html (по второй ссылке даже что-то более-менее живое)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.