5

В Emacs есть режим эмулятора Vim, который называется Evil. Этот режим имеет функцию поиска-замены, которая делает то же самое, что подсвечивает регион и запускает в нем sed. Отличительной особенностью этой функции является то, что она показывает предварительный просмотр изменений, которые вы вносите в реальном времени, перед тем, как выполнить команду, что отлично подходит для создания команд поиска-замены, использующих регулярные выражения.

Я слаб и не хочу переучивать свою мышечную память, чтобы использовать клавиши Vim. Есть ли способ получить эту седь-подобную функцию поиска и замены с предварительным просмотром в обычных Emacs?

3 ответа3

1

Взгляните на Анзу, которая вышла через несколько месяцев после того, как был задан этот вопрос. Он может выполнять интерактивное выделение и замену текста в формах query-replace и query-replace-regexp.

В моем .emacs я переопределяю функции замены по умолчанию их эквивалентами anzu как бывший злой пользователь:

(global-set-key (kbd "M-%") 'anzu-query-replace)
(global-set-key (kbd "C-M-%") 'anzu-query-replace-regexp)
0

В Emacs есть replace-regexp который позволяет вам выполнять поиск и замену регулярными выражениями. Я не знаю ни одного инструмента, который интерактивно просматривает замены, но есть несколько инструментов, которые позволяют вам интерактивно создавать регулярные выражения, используемые для поиска и замены:

Emacs поставляется с re-builder . M-x re-builder откроет небольшой буфер, в котором можно построить ваше регулярное выражение. Он будет подсвечивать все совпадения в вашем текущем буфере с каждой группой уникальным цветом. Вот хорошее резюме об этом.

Затем есть re-builder+, который позволяет вам вызывать команду replace с регулярным выражением, которое вы строите. Но замена не является интерактивной.

Последний инструмент, который я знаю, это regex-tool, который дает вам представление с тремя буферами с вашим текстом, вашим регулярным выражением и соответствующими группами.

Эти инструменты не предоставляют всего того, что делает Зло, согласно вашему описанию, но они охватывают то, что я считаю самой сложной частью поиска и замены регулярным выражением.

Если вы хотите запустить его только в области буфера, вы можете использовать C-x n n для сужения выбранной области (между отметкой и точкой) или C-x n p для сужения до текущей страницы. А затем C-x n w снова расширить на весь буфер.

0

Это не совсем то же самое, что и sed, но CM-% для query-replace-regexp позволяет вам ввести регулярное выражение для поиска и текст замены. Интерфейс такой же, как и для более известного M-% или query-replace , который ищет строку в виде простого текста.

Вы не можете ограничить поиск и замену строками, соответствующими определенному шаблону, но вы можете обойти это. Например, выражение sed /foo/s/bar/baz/ можно было бы эмулировать, выполнив поиск \(foo.*\)bar и заменив его на \1baz (при условии, что bar всегда будет появляться после foo в любой из интересных строк),

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .