Краткое руководство по Emacs
ПРЕДИСЛОВИЕ
Emacs был одним из первых текстовых редакторов в мире и едва ли не первым полноэкранным, позволяющим пользователю видеть сразу большую часть текста. Он до сих пор пользуется огромной популярностью в мире UNIX и является одним из стандартных редакторов в операционных системах типа Linux. Однако русскому пользователю, выросшему под крылом Microsoft, он практически не знаком, хотя существует несколько разных вариантов Emacs’а для DOS и Windows.
Под названием Emacs в этом руководстве понимается некоторое количество редакторов, с похожим интерфейсом, происходящих прямо или косвенно от редактора ITS Emacs. В первую очередь имеется в виду GNU Emacs и XEmacs, а также различные варианты MicroEMACS’а.
Также следует иметь в виду, что данное руководство является кратким введением в мир Emacs’а и содержит описание базового подмножества команд и возможностей этого замечательного редактора. За более подробной информацией необходимо обращаться к соответствующему руководству конкретного редактора.
ВВЕДЕНИЕ
Emacs — текстовый редактор для программирования и обработки текстов. Является одним из стандартных текстовых редакторов в Linux и других UNIX-системах, также доступны клоны и версии практически для типов компьютеров и операционных систем. Основные возможности редактора обычно включают в себя:
- Несколько окон редактирования на экране.
- Несколько редактируемых файлов одновременно.
- В зависимости от версии поддержка функций форматирования текста, а также специальные режимы для различных языков программирования.
Для того, чтобы эффективно использовать Emacs, нужно понять его идеологию и освоить интерфейс.
С чего начать
Emacs обычно может быть запущен командой
emacs [filename ...]
где filename — имя файла (файлов) для редактирования. Если у вас в наличии версия MicroEMACS, то она может запускаться командами “me”, “mg” или “uemacs”.
Как получить помощь и как закрыть Emacs
Попробуйте нажать <F1>. Может также работать <Ctrl>-h или <ECS> h.
Для отмены любого действия в Emacs’е используется комбинация <Ctrl>-g, а чтобы завершить работу —
<Ctrl>-x <Ctrl>-c.
НЕМНОГО ИДЕОЛОГИИ
Интерфейс Emacs’а заметно отличается от привычного пользователю Windows интерфейса, что поначалу может отпугнуть вас. Однако, немного поработав и привыкнув к нему, вы найдете его логичным и удобным.
Изначально Emacs создавался программистами и для программистов, поэтому он наилучшим образом подходит для написания программ. Собственно говоря, GNU Emacs или XEmacs могут заменить собой несколько IDE для разных языков программирования, а также текстовый процессор, почтовый клиент, web-браузер и многое другое.
Редактор Emacs появился в те времена, когда о графических дисплеях нельзя было мечтать, а единственным устройством ввода была клавиатура. Поэтому он рассчитан в первую очередь на работу с клавиатурой, хотя современные версии имеют развитый графический интерфейс, систему меню, в полной мере поддерживают работу с мышью, однако главным инструментом пользователя все-равно остается клавиатура. Для текстового редактора это естественно.
Экран, окна и буферы
Практически любой вариант Emacs’а имеет схожий внешний вид и общие принципы работы.
В Emacs’е разделены понятия представления текста и его отображеня. Текст представляется в виде буферов, отображаемых в окнах. Каждое окно связано с буфером. Буфер может быть не связан с каким-либо окном (и тогда он невидим в текущий момент), буфер может быть связан с одним или несколькими окнами (в последнем случае вы можете видеть, например, два разных фрагмента одного и того же текста).
Экран редактора разделен на две части. Внизу экрана находится
командная строка (строка сообщений, echo-area), в которой отображаются сообщения и различные запросы. Там же вводятся команды (в полных версиях вроде GNU Emacs). Командная строка в Emacs’е заменяет разнообразные диалоговые окна и ока сообщений, привычные для пользователей графических систем. Остальная часть экрана отдана окнам, в которых производится собственно редактирование текстов.
Окно представляет собой (как и следовало ожидать) прямоугольную область экрана, отображающую часть редактируемого текста. В нижней части окна расположена строка статуса, показывающая важнейшую сводную информацию о редактируемом тексте. Как правило это флаг изменений ('*' в левой части строки статуса означает, что текст был изменен, но не записан в файл, '%' означает, что отображаемый текст не может быть изменен); также отображается имя буфера, связанного с окном, имя файла, положение курсора и наличие различных дополнительных режимов.
Собственно редактирование производится в буферах. Буфер может быть связан с каким-либо файлом или не связан (например, временный служебный буфер). Когда вы открываете файл для редактирования, обычно создается новый буфер, куда загружается содержимое файла и этот буфер связывается с текущим окном, становясь таким образом видимым.
Может быть, это сначала покажется сложным, но поработав некоторое время, вы поймете и оцените такое устройство редактора.
Точка и метка
Emacs имеет несколько непривычную схему выделения текста. В нем есть такие понятия как “точка” и “метка”.
Текущее положение курсора в тексте называется “точкой”. В любом месте текста вы можете поставить “метку” в позиции курсора (обычно это делается при помощи сочетания клавиш <Ctrl-@> или <Ctrl-Space>). Весь текст между точкой и меткой будет “выделен” и может использоваться в операциях с буфером обмена и другими. Также меткой удобно пометить позицию в тексте для того, чтобы впоследствии быстро вернуться к ней.
В одном буфере может быть только одна точка и одна метка.
Клавиатура
Emacs изначально создавался как переносимый продукт, который может одинаково хорошо работать на разных машинах с разными терминалами. Поэтому базовые команды подобраны таким образом, чтобы они гарантированно работали на любом терминале с любой клавиатурой. Более того, возможна работа с редактором через удаленный терминал. Однако Emacs обычно вполне нормально “общается” и с обычными клавиатурами персональных компьютеров.
Большинство команд редактора вызывается одним-двумя нажатиями клавиш. При этом самые часто используемые команды используют сочетания вида <Ctrl>-буква (обозначается как C-буква). Также используются клавиши-префиксы. Во-первых, это клавиша <Meta>. Сейчас трудно найти клавиатуру с такой клавишей. На современных клавиатурах ее заменят <Esc>. Обозначается как M-клавиша. Как набрать? Нажимаете клавишу <Esc> (обычно в строке статуса появляется обозначение “M-” или “ESC”), затем букву. Также может работать комбинация <Alt>-буква.
Большинство вариантов Emacs’а различают также строчные и заглавные буквы в командах, тогда C-f и C-F являются разными командами (последнюю для ясности часто обозначают как C-S-f, где “S” означает клавишу <Shift>).
Также существует по крайней мере еще один префикс — это комбинация C-x (например, для сохранения файла нужно последовательно нажать C-x C-s).
Универсальный аргумент
Большинство команд в Emacs’е могут быть выполнены подряд несколько раз. Чтобы повторить одну команду несколько раз нажмите C-u, потом наберите число повторений и саму команду. Например:
C-u 12 C-k
удалит 12 строк начиная с текущей строки. Иногда число повторений используется в качестве параметра команды, как в команде установки правой границы форматирования (C-u 65 C-x f установит правую границу в колонку 65).
В некоторых вариантах MicroEMACS вместо C-u можно использовать клавишу <Meta> или <Esc>. Но бывают ограничения (например, можно вводить только аргументы от 0 до 9 и от -1 до -9). Таким образом, M-12 C-k также удалит 12 строк.
Нажатие C-u без последующего числа задает количество повторений, равное четырем. Это может быть удобно при работе с исходными текстами. Например, C-u <Space> вставит отступ в 4 пробела, а C-u <Backspace> удалит отступ также в 4 пробела. Обратите внимание, что M-Space и M-Backspace имеют совершенно другое значение!
КОМАНДЫ РЕДАКТОРА
В этой главе описаны самые общие и распространенные команды текстовых редакторов типа Emacs. Для каждой указаны сочетания клавиш, обычно вызывающие эти команды. Они могут отличаться от тех, что используются в вашей версии редактора. Обратитесь к документации за дополнительной информацией.
Перемещение курсора
На страницу вверх M-v или PgUp
Перемещает курсор на одну экранную страницу к началу файла.
На страницу вниз C-v или PgDn
Перемещает курсор на одну экранную страницу к концу файла.
В начало файла M-< или M-Home
Перемещает курсор в начало файла.
В конец файла M-> или M-End
Перемещает курсор в конец файла.
На символ вперед C-f или Стрелка вправо
Перемещает курсор на один символ вправо. Перемещает курсор в начало следующей строки, если курсор находился в конце строки.
На символ назад C-b или Стрелка влево
Перемещает курсор на один символ влево. Если курсор находится в начале строки, команда перемещает его в конец предыдущей.
На слово вперед M-f
Перемещает курсор в начало следующего слова.
На слово назад M-b
Перемещает курсор в начало предыдущего слова.
В конец строки C-a или Home
Перемещает курсор в начало строки.
В конец строки C-e или End
Перемещает курсор в конец строки.
На следующую строку C-n или Стрелка вниз
Перемещает курсор на одну строку вниз.
На предыдущую строку C-p или Стрелка вверх
Перемещает курсор на одну стоку вверх.
Перейти к строке M-g или M-x goto-line (GNU Emacs)
Перейти к строке с указанным номером. Например,
M-65 M-gпереместит курсор на 65-ю строку текущего буфера.
Удаление и вставка
Удалить символ слева C-h или <- (Backspace)
Удаляет символ, стоящий слева от курсора. Если курсор находится в начале строки, эта команда удаляет разрыв, объединяя строку с предыдущей.
Удалить символ под курсором C-d или Delete
Удаляет символ, на котором стоит курсор. Если курсор находится в конце стоки, следующая строка будет присоединена в конец текущей.
Удалить предыдущее слово M-C-h или M-<-
Удаляет слово слева от курсора.
Удалить следующее слово M-d
Удаляет слово справа от курсора.
Удалить до конца строки C-k
При использовании без аргумента эта комманда удаляет весь текст от текущей позиции до конца строки. Если строка пуста, команда удаляет пустую строку. Если перед командой задан аргумент, она удаляет указанное количество строк. В любом случае она помещает удаленный текст в буфер обмена (как правило как единый кусок текста,который может быть вставлен позднее).
Новая строка C-m или Enter
Вставляет новую строку в текст, перемещая курсор вниз в начало следующе физической строки и перенося весь текст, бывший справа от курсора в новую строку. В режиме отступа (autoindent) экивалентна
C-j.
Новая строка с отступом C-j
Вставляет новую строку в текст и делает в ней отступ, равный отступу в предыдущей строке.
Выровнять строку C-i или Tab
Выравнивает левый край строки так, вставляя нужное число пробелов.
Вырезать блок C-w или Shift-Delete
Удаляет все символы между точкой (позицией курсора) и меткой, поставленной командой C-Space, помещая удаленный текст в буфер обмена.
Копировать блок M-w или Ctrl-Insert
Удаляет все символы между точкой (позицией курсора) и меткой, поставленной командой C-Space, помещая удаленный текст в буфер обмена.
Вставить строку C-o
Вставляет новую стоку в позиции курсора, но не перемещает курсор.
Поиск
Поиск вперед C-s Enter (GNU Emacs) или C-s (MicroEMACS)
Поиск строки начиная с текущей позиции курсора до конца файла. Строка для поиска вводится в командной строке внизу экрана и заканчивается нажатием
<Enter>. Специальные символы могут быть вставлены при помощиC-qс последующим нажатием нужной<Ctrl>-клавиши. После удачного поиска в следующий раз нажатие<Enter>в пустой строке запроса вызывает поиск по последнему введенному значению строки поиска.
Поиск назад C-r Enter (GNU Emacs) или C-r (MicroEMACS)
Эта команда осуществляет обратный поиск в файле (от позиции курсора к началу). Все остальное см. предыдущую команду.
Наращиваемый поиск C-s (C-s s в MicroEMACS)
Наращиваемый поиск. Эта команда похожа на обычный поиск, но она начинает поиск со ввода первого символа, находя первое вхождение после текущей позиции. Со вводом каждого последующего символа команда пытается найти ближайшее вхождение уже введенной строки. Для управления наращиваемым поиском существует несколько управляющих символов:
C-s Искать следующее вхождение строки
C-r Вернуться к предыдущему вхождению
C-h Удалить последний введенный символ строки и перейти к предыдущему вхождению
C-g Прервать поиск и вернуться к месту начала
Enter Завершить поиск, остаться на последнем найденном вхождении.
Всегда завершайте поиск нажатием
<Enter>илиC-g.
Наращиваемый поиск назад C-r (C-x r в MicroEMACS)
То же самое, что и предыдущая команда, но поиск производится в обратном направлении.
Замена
Замена строки M-r (MicroEMACS) или M-x replace-string <Enter> (GNU Emacs)
Данная команда позволяет заменять все вхождения одной строки на другую строку. Поиск и замена начинается с текущей позиции курсора и продолжается до конца текущего буфера. Числовой аргумент, заданный перед командой, ограничивает количество замен указанным числом.
Замена с подтверждением M-%
Подобно предыдущей, эта команда заменяет вхождения одной строки текста на другую. Однако, она позволяет вам отслеживать каждый шаг замены и спрашивает вас хотите ли вы заменить каждую найденную строку. Когда компьютер спрашивает вас, вы обычно можете ответить следующим образом:
y Заменить и продолжить поиск
n Не заменять и продолжить поиск
! Заменить все оставшиеся строки без вопросов
C-g Прервать поиск
. Вернуться назад, на позицию, откуда была вызвана команда
? Получить краткую подсказку
Поиск регулярных выражений
Искать рег. выражение M-x re-search-forward <Enter> (GNU Emacs)
Искать регулярное выражение от текущей позиции курсора до конца файла. Строка поиска набирается внизу экрана в командной строке и завершается нажатием
<Enter>. Спецсимволы могут быть вставлены в строку при помощиC-q. После успешного поиска при нажатии<Enter>для поиска будет использована последняя введенная строка.
Искать рег. выр. назад M-x re-search-backward <Enter> (GNU Emacs)
Эта команда ищет регулярное выражение в обратном направлении (к началу файла). В остальном она полностью аналогична предыдущей.
Замена регулярного выражения
Замена с подтверждением M-C-%
Подобно простой замене с подтверждением эта команда заменяет вхождения одной строки на другую. Однако, она позволяет использовать регулярные выражения для поиска. См. раздел о регулярных выражениях ниже. Когда компьютер спрашивает хотите ли вы заменить найденное выражение, вы можете ответить следующим образом:
y Заменить и продолжить поиск
n Не заменять (пропустить) и продолжить поиск
u Отменить последнюю замену
! Заменить все оставшиеся вхождения не запрашивая подтверждения
C-g Остановить выполнение команды
. Вернуться к месту запуска команды
? Получить краткую справку по использованию
Изменение регистра и перестановка символов
Слово заглавными буквами M-u
Меняет все буквы следующего слова на заглавные.
Слово с заглавной буквы M-c
Делает следующее слово написанным с заглавной буквы.
Слово строчными буквами M-l
Меняет все буквы следующего слова на строчные.
Поменять два символа C-t
Меняет местами два символа слева от курсора.
Непосредственная вставка C-q
Вставляет в текст следующий нажатый символ, игнорируя тот факт, что он может быть управляющим.
Выделение и буфер обмена
Поставить метку C-Space или C-@
Данная команда используется для того, чтобы отметить начало выделенного текста. Многие команда обрабатывают выделенные текст. Выделение определяется как текст между меткой и текущей позицией курсора (точкой). Например, чтобы удалить кусок текста можно поместить курсор на начало куска, поставить метку
C-Space, переместить курсор в конец удаляемого текста и затемудалить текст при помощи команды удаления (C-w). Только одна метка может быть в одном окне или буфере в один момент времени. Emacs помнит метки, поставленные во всех буферах.
Обменять точку и метку C-x C-x
Эта команда перемещает курсор в отмеченную позицию в текущем буфере и ставит метку туда, где только что находилсякурсор. Это очень полезно для поиска метки или для быстого возврата в отмеченную позицию.
Копиование и перемещение, kill ring
Удалить выделение C-w или Shift-Del
Команда используется для удаления выделенного (между меткой и позицией курсора) текста и помещение его в буфер обмена.
Эта команда полностью аналогична команде “Выезать” (Cut) в других программах.
Вставить C-y или Shift-Ins
Команда копирует содержимое буфера обмена в текущую позицию в тексте. Она на очищает буфер обмена, поэтому текст в нем может быть вставлен в текст несколько раз.
Совпадает с командой “Вставить” (Paste) в других программах.
Копировать выделение M-w или Ctrl-Ins
Команда копирует выделенный фрагмент текста в буфер обмена не удаляя его из буфера.
Аналогична команде “Копировать” (Copy) в других программах.
Вставить предыдущий фрагмент M-y
Во многих вариантах Emacs’а существует “множественный буфер обмена” — Kill Ring — представляющий собой кольцевой список из нескольких буферов обмена. При копировании текста в буфер обмена, старое его содержимое не теряется, а перемещается в следующий элемент этого списка и может быть использовано впоследствии.
Эта команда, вызванная непосредственно после команды вставки (
C-y), замещает только что вставленный текст содержимым предыдущего буфера из списка. Если сразу после этого еще раз нажатьM-y, то текст снова будет замещен на еще более раннее содержимое буфера обмена и так далее по кругу.
Данная команда может быть уподоблена поведению буфера обмена в M$ Office 2000, где тоже можно использовать несколько предыдущих значений буфера обмена.
Откат
Отменить C-x u (C-/ в GNU Emacs)
Отменить последнее сделанное изменение. Часто поддерживается многоуровневый откат — последовательными нажатиями
C-xu можно последовательно отменить несколько последних изменений.
Форматирование текста
Практически любой вариант Emacs’а поддерживает команды форматирования в большем или меньшем объеме.
Установить правую границу C-x f
Устанавливает новое значение правой границы текста, которое используется в других командах форматирования. Другими словами, эта команда устанавливает максимальную длину строки текста. Значение правой границы задается при помощи универсального аргумента перед вызовом:
C-u 72 C-x fустановит длину строки в 72 символа.
Выровнять строку C-i или Tab
Эта команда может присутствовать не во всех редакторах. Она выравнивает левую границу текущей строки, вставляя в начало отступ, равный отступу в предыдущей строке.
В некоторых вариантах (например, в GNU Emacs) эта команда имеет “повышенный интеллект”: в зависимости от включенных режимов редактирования исходных текстов она выравнивает текст исходя из синтаксических соглашений, принятых для конкретного языка программирования.
Форматирование абзаца M-q
Команда берет текст текущего абзаца (ограниченного пустыми строками или выделенного красной строкой) и форматирует абзац по левому краю и правой границе, переразбивая на строки и удаляя лишние пробелы.
Центрирование строки M-s
Команда выравнивает текущую строку по центру, удаляя пробелы по краям строки и вставляя нужное количество пробелов в начало.
Показать позицию в буфере C-x =
Данная команда выдает отчет о текущей позиции в тексте (номер символа, общее количество символов и/или строк). Также выдает код символа под курсором в восьмеричном, десятичном и шестнадцатиричном виде.
Множество окон
Разделить текущее окно C-x 2
Если это возможно, команда делит текущее окно на два окна, примерно одинакового размера. В каждом из них будет отображаться тот же буфер, что и в исходном окне.
Удалить окно C-x 0 (ноль)
Команда пытается переключиться в следующее окно, после чего закрывает то, что было текущим.
Закрыть все остальные окна C-x 1
Все остальные окна, кроме текущего, будут закрыты. Текущее окно станет единственным и займет весь экран.
Следующее окно C-x o (лат. буква "o")
Делает следующее окно текущим.
Прокрутить следующее вниз M-C-v
Прокручивает следующее окно на страницу вниз.
Прокрутить следующее вверх M-C-z
Прокручивает следующее окно на страницу вверх.
Увеличить окно C-x ^
Увеличивает размер текущего окна (по умолчанию на одну строку).
Обновить C-l
Очищает экран, перерисовывает все изображение и прокручивает текст так, чтобы текущая строка оказалась в центре экрана.
Множество буферов
Выбрать буфер C-x b
Пееключиться на другой буфер в текущем окне. Редактор попросит ввести имя буфера. Если нажать <Entar>, большинство редакторов переключатся на следующий из списка буферов (или последний использованный).
Следующий буфер C-x x (MicroEMACS)
Переключиться на следующий буфер из списка.
Удалить буфер C-x k
Уничтожить указанный буфер и освободить память. Эта команда не удаляет файл, из которого были считаны данные в буфер.
Список буферов C-x C-b
Команда открывает новое окно, в котором выводится список всех буферов, существующих в настоящий момент в редакторе. Для каждого буфера обычно отображается также дополнительная информация: имя файла, связанного с буфером, флаг изменений (”
*” обычно означает, что содержимое буфера было изменено, но не сохранено на диск, “%” означает буфер только для чтения). Значения других флагов узнайте в документации к вашему редактору.
Чтение с диска
Найти файл C-x C-f
Находит указанный файл. Если он уже связан с каким-либо буфером, делает этот буфер активным в текущем окне, иначе создает новый буфер и пытается прочитать указанный файл.
Если вы хотите создать новый файл, просто задайте имя несуществующего файла. Он будет создан на диске, когда вы сохраните содержимое этого буфера.
Прочитать файл C-x C-r
Читает указанный файл в текущий буфер (старое содержимое которого будет уничтожено. Если буфер содержит измененный и не сохраненный текст, команда запросит подтверждение уничтожения).
Вставить файл C-x C-i
Вставляет содержимое указанного фала в текущую позицию буфера.
Автоматическое дополнение имен файлов и буферов
Автодополнение может использоваться во всех командах, требующих ввода имени файла или названия буфера. Оно состоит в том, что программа пытается автоматически дополнить набираемое имя. Чтобы сделать это нужно набрать первые буквы названия и нажать <Tab>. Если существует несколько файлов или буферов, имена которых начинаются с набранных символов, то нужно несколько раз нажать <Tab>, пока в строке команд не окажется нужное имя.
Сохранение на диск
Сохранить файл C-x C-s
Если содержимое буфера изменено, но не сохранено, эта команда записывает текст в файл, связанный с буфером.
Записать файл C-x C-w
Записать содержимое буфера в указанный файл. Команда также меняет имя файла, связанного с текущим буфером на новое.
Команда аналогична команде “Сохранить как” (Save as) в других программах.
Сменить имя файла C-x n
Меняет имя файла, связанного с буфером, на указанное. Содержимое буфера при этом не сохраняется.
Быстрый выход M-z (MicroEMACS)
Сохраняет все измененные буферы и завершает работу редактора. Это нормальный выход из программы.
Выход C-x C-c
Завершает работу с Emacs’ом и выходит в операционную систему. Если есть несохраненные буферы, команда спросит, хотите ли вы потерять изменения.
Получение справки
В разных вариантах вызов справки может осуществляться различными командами. В GNU Emacs это обычно C-h. Некоторые варианты вообще могут не иметь встроенной справки. Наиболее мощная и полная система помощи в GNU Emacs и XEmacs.
Также часто бывает доступен самоучитель (Tutorial), который нужно читать, сидя за компьютером и выполняя все указания из него. Это наиболее простой способ освоить базовые функции.
РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
Регулярные выражения являются, наверно, самым мощным средством поиска и замены текста. Если обычные команды поиска ищут точное соответствие указанной строки, то регулярные выражения “умеют” искать такие, например, вещи, как “слово, начинающееся на ‘ре’” или “слово ‘редактор’, стоящее в начале предложения или строки”, можно заставить редактор найти все встречающиеся словоформы какого-либо слова. Более того, регулярные выражения позволяют использовать фрагменты найденных строк в составе строки замены (можно, например, найти все ошибочно повторенные при наборе слова и убрать повторения).
Регулярные выражения представляют собой простой, но очень гибкий язык. Знание и использование их заметно облегчают обработку текста.
В регулярных выражениях некоторые символы имеют специальное значение, а все остальные являются “обычными”. Обычный символ является простейшим регулярным выражением, которое совпадает с самим этим символом и ничем иным. Специальными символами являются: `$', `^', `.', ‘*’, `+', `?', `[', `]‘ и `\'. Все прочие символы, появляющиеся в регулярном выражении, являются обычными, за исключением случая, когда перед ними стоит `\'.
Например, ‘f’ не является специальным символом, это обычный символ и поэтому ‘f’ является регулярным выражением, которое совпадает только со строкой ‘f’ и ничем иным (оно не совпадает со строкой ‘ff’). Аналогично, ‘o’ является регулярным выражением, совпадающим только с ‘o’. (При игнорировании регистра символов эти регэкспы также совпадают с ‘F’ и ‘O’, но мы будем считать это обобщением “той же самой строки”, а не исключением)
Любые два регулярных выражения A и B могут быть соединены в одно. Результатом будет регулярное выражение, которое совпадает со строкой, если A совпадает с началом строки, а B — с оставшейся частью.
В качестве простейшего примера, мы соединим регулярные выражения ‘f’ и ‘o’ и получим регулярное выражение ‘fo’, которое совпадает только со строкой ‘fo’. Пока все было просто. Чтобы сделать что-то нетривиальное, вам нужно использовать один из следующих специальных символов. Вот их список.
`. (Точка)' специальный символ, совпадающий с любым одиночным символом, за исключением новой строки. Используя соединение,мы можем создавать регулярные выражения, подобные `a.b’, которое совпадает с любой строкой из трех символов, начинающейся с ‘a’ и заканчивающейся ‘b’.
‘*’ не используется сам по себе, это постфиксный оператор, означающий повторение предыдущего регулярного выражения столько раз, сколько возможно. Например, ‘o*’ совпадает с любым количеством символа ‘o’ (включая отсутствие ‘o’).
‘*’ всегда применяется к самому малому регулярному выражению. Так, ‘fo*’ содержит повторение ‘o’, а не ‘fo’. Оно совпадает с ‘f’, ‘fo’, ‘foo’ и так далее.
Механизм поиска обрабатывает конструкцию ‘*’, находя столько повторений, сколько возможно. Затем он продолжает обработку оставшейся части выражения. Если совпадений оставшейся части не находится, происходит откат, отменяющий несколько совпадений конструкции с ‘*’, пока не совпадет оставшаяся часть выражения. Например, при сопоставлении шаблона ‘ca*ar’ со строкой ‘caaar’, выражение ‘a*’ сначала пытается совпасть со всеми тремя символами ‘a’, но оставшаяся часть выражения содержит ‘ar’, а в стоке остался только символ ‘r’, таким образом, эта попытка не удается. Следующий вариант для ‘a*’ — совпасть только с двумя ‘a’. В этом случае остаток шаблона успешно совпадает с остатком строки.
`+' постфиксный оператор, похожий на ‘*’ за исключениемтого, что предыдущее выражение должно совпасть как минимум один раз. Например, `ca+r’ совпадает со строками ‘cr’, в то время как ‘ca*r’ совпадает со всеми тремя строками.
`?' постфиксный оператор, похожий на ‘*’, за исключением того, что предыдущее выражение должно совпасть ноль или один раз. Например, `ca?r’ совпадает с ‘car’ или ‘cr’, но ни с чем иным.
`[ … ]‘ задает “набор символов”, начинается с `[' и заканчивается `]‘. В простейшем случае, символы внутри квадратных скобок — это то, с чем набор может совпасть.
Таким образом, `[ad]‘ совпадает либо с ‘a’, либо с ‘d’, а выражение `[ad]*’ совпадает с любой строкой, составленной только из символов ‘a’ и ‘d’ (включая пустую строку), также `c[ad]*r’ совпадает с ‘cr’, ‘car’, ‘cdr’, ‘caddaar’ и т.д.
Также вы можете включать в наборы диапазоны символов, указывая начальный и конечный символы с ‘-’ между ними. Так, `[a-z]‘ совпадает с любой строчной буквой латинского алфавита. Диапазоны могут свободно перемешиваться с отдельными символами, как в выражении `[a-z$%.]‘, которое совпадает с любой строчной буквой латинского алфавита, символами `$’, `%’ или точкой.
Обратите внимание, что специальные символы регэкспов теряют свое значение и становятся обычными внутри наборов. Для наборов существует совершенно другой набор специальных символов: `]', ‘-’ и `^'.
Чтобы включить символ `]’ в набор вы должны указать его первым. Например, `[]a]’ совпадает с `]’ или ‘a’. Для включения дефиса укажите ‘-’ первым или последним символом набора, или поместите его после диапазона. Так, `[]-]’ совпадает и с `]’, и с ‘-’.
Чтобы включить в набор символ `^’, поместите его в любом месте набора за исключением начала (В начале он имеет специальное значение — см. ниже).
Когда вы используете диапазон при регистронезависимом поиске, вы должны указывать оба конца набора в нижнем регистре или оба конца в верхнем, или оба конца не должны быть буквами. Поведение набора с указанными символами в разных регистрах (такого как ‘A-z’) может быть непредсказуемо.
`[^ … ]‘ `[^' открывает "дополнительный набор символов", совпадающий с любым символом, кроме указанных. Так, набор `[^a-z0-9A-Z]‘ совпадает со всеми символами, за исключением букв латинского алфавита в обоих регистрах и цифр.
`^' не имеет специального значения в наборе символов, за исключением случая, когда он стоит вначале набора. Символ, следующий за `^’ трактуется как если бы он стоял на первом месте (иными словами, ‘-’ и `]’ не являются впециальными в этом случае.
Дополнительный набор символов может совпадать с новой строкой в случае, если символ новой строки не был указан в качестве одного из символов набора. Это отличается от поведения в этом случае других программ, таких как ‘grep’.
`^' специальный символ, совпадающий с началом строки, в которой найден текст. В противном случае не совпадает ни с чем. Так, `^foo’ совпадает с фрагментом ‘foo’, расположенном в начале строки.
`$' аналогично `^’, но совпадает только с концом строки. `x+$’ совпадает с фрагментом текста, состоящим из одних ‘x’ в конце строки.
`\' выполняет две функции: экранирует специальные символы (включая `\’), и вводит дополнительные специальные конструкции.
Т.к. `\’ экранирует специальные символы, `\$’ является регулярным выражением, совпадающим только с `[', и так далее.
Примечание: по историческим причинам специальные символы трактуются как обычные, если встречаются в контексте, где их специальное значение не имеет смысла. Например, в выражени ‘*foo’ символ ‘*’ трактуется как обычный символ, так как в выражении нет предыдущего для него символа, на который он мог бы действовать. Считается плохой практикой использовать регэкспы, зависящие от такого поведения, лучше всегда экранировать специальные символы, независимо от того, где они появляются.
По большей части `\' с последующим символом совпадает только с самим этим символом. Однако, существует несколько исключений: двухсимвольные последовательности, начинающиеся с `\', которые имеют специальное значение. Второй символ в последовательности всегда обычный символ, когда использцется сам по себе. Вот список некоторых таких последовательностей (более мощные варианты, вроде GNU Emacs предоставляют дополнительные команды для регулярных выражений — см. справку по используемому редактору).
`\|' задает альтернативу. Два регулярных выражения A и B, соединенные `\|', образуют выражение, совпадающее с текстом если A совпадает с ним или B совпадает с ним. Это работает так: сначала проверяется A и если оно не совпадает, тогда проверяется B.
Таким образом, `foo\|bar' совпадает или с ‘foo’ или с ‘bar’, но ни с чем иным.
`\|' применяется к наибольшим возможным регулярным выражениям. Только группирующие скобки `\( … \)' могут ограничить "ширину захвата" `\|'.
`\( … \)' группирующая конструкция, используемая в трех случаях:
a) Для ограничения набора из нескольких
`\|'альтернатив. Так,`\(foo\|bar\)x'совпадает либо с‘foox’, либо с‘barx’.
b) Для указания сложного выражения для постфиксных операторов
‘*’,`+'и`?'. Так,`ba\(na\)*'совпадает с‘bananana’, и т.д., с любым (в т.ч. нулевым) количеством слогов‘na’.
c) Для сохранения совпавших подстрок для дальнейшего использования.
Последнее применение не является следствием идеи группирования, это отдельное применение, которое может быть определено как второе значение конструкции `\( … \)'. На практике обычно не возникает конфликта между этими двумя значениями.
`\`' совпадает с пустой стокой, но только в начале буфера или строки, с которой совпало все выражение.
`\'' совпадает с пустой стокой, но только в конце буфера или строки, с которой совпало все выражение.
`\b' совпадает с пустой строкой, но только в начале или конце слова. Таким образом, `\bfoo\b' совпадает с любым вхождением ‘foo’ как отдельного слова. `\bballs?\b' совпадает с ‘ball’ или ‘balls’ как отдельными словами.
`\b' совпадает в начале или конце буфера в зависимости от того, какой текст идет за или перед ним.
`\B' совпадает с пустой строкой не в начале или конце слова.
`\<' совпадает с пустой строкой в начале слова. `\<' совпадает в начале буфера только если следом идет буква.
`\>' совпадает с пустой строкой в конце слова. `\>' совпадает в конце буфератолько если содержимое буфера заканчивается буквой.
`\w' совпадает с любой буквой. Какие символы считаются буквами определяется синтаксической таблицей.
`\W' совпадает с любой не-буквой.
Конструкции, относящиеся к словам и синтаксису управляются настройками в синтаксической таблице.
Ниже приведен составное регулярное выражение, которое может быть использовано для поиска конца предложения вместе с последующими пробелами.
"[.?!][]“‘)]*\($\| $\|^I\| \)[ ^I^J]*”
Выражение состоит из четырех частей в следующей последовательности: набора символов, совпадающий с точкой, восклицательным или вопросительным знаками; набора символов, совпадающего с закрывающими скобками, кавычкой или апострофом, повторяющимися ноль или более раз; набора альтернатив в группирующих скобках, которые совпадают либо с концом строки, либо с пробелом в конце строки, символом табуляции или пробелом; набором символов, совпадающим с пробельными символами (пробел, табуляция, символ новой строки), повторяющимися ноль или более раз.
Для ввода этого регэкспа вам нужно нажимать <TAB> для ввода символа табуляции и ‘C-j’ для ввода символа новой строки (<TAB> и ‘C-j’ должны быть предварены нажатием ‘C-q’, чтобы были введены именно символы, а не команды Emacs, связанные с этими клавишами).
RSS