Emacs ищет специальные лигатуры

Я только что заметил целую кучу опечаток в скомпилированном документе LaTeX, набранном в emacs, из-за того, что я не заметил, что когда я вставлял какой-то текст из другого места, я набирал много лигатур, таких как f вместо fi. Я провел поиск и замену, чтобы исправить этот конкретный экземпляр, но было бы неплохо быть уверенным, что их не было больше. Могу ли я сделать что-нибудь еще в emacs оптом, чтобы найти все такие исправления?

2 ответа

Решение

Если ожидается, что весь документ будет в ASCII, то вы можете использовать регулярное выражение для поиска чего-либо за пределами этого диапазона:

CMs [^ Cj SPC -~]

Это поиск всего, что не является ни новой строкой (код символа 10), ни чем-либо между пробелом (32) или тильдой (126). Любые лигатуры будут вне этого диапазона.

Я не совсем уверен, что вы спрашиваете, но вы можете легко найти (или query-replace или же replace-string) любые символы Unicode, которые являются лигатурами, то есть имеют LIGATURE как часть их имени персонажа Unicode. Тем не менее, вы должны искать каждый из них в отдельности (ну, не совсем, но это проще всего сделать).

Для поиска данного лигатурного символа вы используете C-x 8 RET во время Isearch, затем введите некоторую часть имени персонажа и заполните его.

Для этого действительно полезно использовать Icicles или, по крайней мере, какое-то другое усовершенствование завершения, которое позволяет вам завершить подстроку или другое регулярное выражение.

С сосульками у вас также есть прогрессивное завершение, что означает, что вы можете предоставить несколько подстрок (в общем случае, регулярные выражения) для соответствия.

Например, чтобы найти лигатуру с именем Unicode LATIN SMALL LIGATURE FF Вы можете сделать следующее:

C-s C-x 8 RET

Это запрашивает у вас имя символа Unicode. Тип ligature S-SPC соответствовать всем, чьи имена содержат ligature (соответствие регистрозависимо). Затем введите latin S-SPC сузить до латинских лигатур. Затем введите small S-SPC сузить их только до строчных лигатур. Затем введите ffi чтобы получить только тот, который вы хотите.

C-s C-x 8 RET ligature S-SPC latin S-SPC small S-SPC ffi RET

Порядок, в котором вы предоставляете несколько шаблонов, не имеет значения. И, конечно, вам не нужно использовать несколько шаблонов. Вы можете так же легко сделать это с помощью одного регулярного выражения:

C-x C-x 8 RET latin.*small.*ligature.*ffi RET

Если вы используете C-s C-x 8 RET ligature S-TAB (или же S-SPC вместо S-TAB), вы видите все лигатурные символы (их 517). Если вы используете C-s C-x 8 RET small.*ligature S-TAB затем вы увидите все строчные лигатуры (их 22, включая арабский, армянский, кириллицу, иврит и латиницу).

Ох, а с помощью сосулек вы видите не только имена персонажей в буфере *Completions* - вы видите также самих персонажей (WYSIWYG) рядом с их именами.

(За query-replace и т. д. процедура такая же, как для Isearch.)

Другие вопросы по тегам