Операционная система Linux

Изменение текста


В командном режиме нельзя вводить символы в текст с клавиатуры, но изменить текст при этом можно, например, удаляя символы. Чтобы удалить отдельный символ (тот, на котором стоит курсор), достаточно нажать "x" в командном режиме, а чтобы удалить сразу целую строку (естественно, текущую, то есть ту, в которой находится курсор) – "dd". "d" – это сокращение от "delete", удалить, а "dd" – характерный прием Vi: удвоение команды означает, что ее нужно применить к текущей строке.

Из командной строки Vi можно выполнить операцию поиска и замены: для простой строки или для регулярного выражения. Причем синтаксис команды поиска и замены полностью воспроизводит синтаксис потокового редактора sed, о котором уже шла речь в лекции 7:

Это файл для примеров. Пример 1. Моя первая строка в vi... ~ ~ ~ :s/.$/.../

Пример 9.5. Замена по шаблону в Vi (html, txt)

Мефодий хотел заменить в своем файле точки в концах строки многоточиями. Для этого в командном режиме он нажал ":" (вызов командной строки Vi), где набрал команду "s" (сокращение от "substitute", заменить), за которой следует уже знакомое по "sed" выражение "/что_заменить/на_что_заменить/". Только результат получился совсем не тот, какого ожидал Мефодий: заменился на многоточие восклицательный знак последней строки. Не учел он следующего: по умолчанию шаблоны для поиска и замены – это регулярные выражения, то есть "." означает вовсе не точку, а "любой символ". Имея в виду точку, следовало написать "\.". "$", как и ожидал Мефодий, это конец строки. В момент выполнения команды поиска курсор находился в последней строке, в первом совпадении после курсора и была произведена замена.

Форматирование текста – это расстановка символов конца строки, пробелов и табуляций таким образом, чтобы текст хорошо смотрелся на экране терминала. Форматирование вручную крайне неэффективно. В Vim автоматическое форматирование текста (если редактируется программа на каком-либо языке программирования, то с учетом правил этого языка) может происходить прямо в режиме вставки, в режиме вставки же можно изменять отступ текущей строки (по командам "^D" и "^T"). Для выравнивания текста по центру, правому или левому краю команды ":center", ":left" и ":right" соответственно. Эти команды, как и большинство команд командной строки, можно применять к диапазону строк способом, описанным ниже.

Режим ввода не богат специальными командами изменения текста, что и понятно: он предназначен для ввода. Однако в Vim (но не в Vi!) есть некоторые удобства, упрощающие и сам процесс набора. Если слово, которое нужно ввести, уже встречалось в тексте, можно набрать только первые буквы и нажать "^P" ("previous") – Vim попробует сам завершить его. Если Vim не угадал и предложил не то слово, можно продолжить перебирать варианты. Команда "^N" ("next") подставляет слова, которые встречаются ниже по тексту. Подробнее об этой функции можно узнать из руководства по команде ":help ins-completion".

Иногда пользователь, изменив текст, тут же хочет вернуть все обратно. Для этого в Vi предусмотрена команда отмены последнего изменения: "u" в командном режиме (от "undo", отменить). Каким бы сложным, масштабным (и разрушительным) ни было изменение, совершенное последней командой, "u" вернет текст в исходное состояние. Впрочем, саму отмену тоже можно отменить. В классическом Vi доступна отмена только последней выполненной команды, а в Vim отменить можно сколько угодно последних команд, а также повторить их командой "^R".


В командном режиме нельзя вводить символы в текст с клавиатуры, но изменить текст при этом можно, например, удаляя символы. Чтобы удалить отдельный символ (тот, на котором стоит курсор), достаточно нажать "x" в командном режиме, а чтобы удалить сразу целую строку (естественно, текущую, то есть ту, в которой находится курсор) – "dd". "d" – это сокращение от "delete", удалить, а "dd" – характерный прием Vi: удвоение команды означает, что ее нужно применить к текущей строке.

Из командной строки Vi можно выполнить операцию поиска и замены: для простой строки или для регулярного выражения. Причем синтаксис команды поиска и замены полностью воспроизводит синтаксис потокового редактора sed, о котором уже шла речь в лекции 7:

Это файл для примеров. Пример 1. Моя первая строка в vi... ~ ~ ~ :s/.$/.../

Пример 9.5. Замена по шаблону в Vi

Мефодий хотел заменить в своем файле точки в концах строки многоточиями. Для этого в командном режиме он нажал ":" (вызов командной строки Vi), где набрал команду "s" (сокращение от "substitute", заменить), за которой следует уже знакомое по "sed" выражение "/что_заменить/на_что_заменить/". Только результат получился совсем не тот, какого ожидал Мефодий: заменился на многоточие восклицательный знак последней строки. Не учел он следующего: по умолчанию шаблоны для поиска и замены – это регулярные выражения, то есть "." означает вовсе не точку, а "любой символ". Имея в виду точку, следовало написать "\.". "$", как и ожидал Мефодий, это конец строки. В момент выполнения команды поиска курсор находился в последней строке, в первом совпадении после курсора и была произведена замена.

Форматирование текста – это расстановка символов конца строки, пробелов и табуляций таким образом, чтобы текст хорошо смотрелся на экране терминала. Форматирование вручную крайне неэффективно. В Vim автоматическое форматирование текста (если редактируется программа на каком-либо языке программирования, то с учетом правил этого языка) может происходить прямо в режиме вставки, в режиме вставки же можно изменять отступ текущей строки (по командам "^D" и "^T"). Для выравнивания текста по центру, правому или левому краю команды ":center", ":left" и ":right" соответственно. Эти команды, как и большинство команд командной строки, можно применять к диапазону строк способом, описанным ниже.

Режим ввода не богат специальными командами изменения текста, что и понятно: он предназначен для ввода. Однако в Vim (но не в Vi!) есть некоторые удобства, упрощающие и сам процесс набора. Если слово, которое нужно ввести, уже встречалось в тексте, можно набрать только первые буквы и нажать "^P" ("previous") – Vim попробует сам завершить его. Если Vim не угадал и предложил не то слово, можно продолжить перебирать варианты. Команда "^N" ("next") подставляет слова, которые встречаются ниже по тексту. Подробнее об этой функции можно узнать из руководства по команде ":help ins-completion".

Иногда пользователь, изменив текст, тут же хочет вернуть все обратно. Для этого в Vi предусмотрена команда отмены последнего изменения: "u" в командном режиме (от "undo", отменить). Каким бы сложным, масштабным (и разрушительным) ни было изменение, совершенное последней командой, "u" вернет текст в исходное состояние. Впрочем, саму отмену тоже можно отменить. В классическом Vi доступна отмена только последней выполненной команды, а в Vim отменить можно сколько угодно последних команд, а также повторить их командой "^R".




В Emacs есть множество команд, позволяющих пользователю выполнять меньше действий при редактировании текста. Если пользователь осознает, что набрал что-то неправильно, он может разом удалить последнее слово (M-Del) или предложение (C-x Del). Можно уничтожать и вперед: до конца слова (M-d) и предложения (M-k). Emacs хранит не только последний удаленный фрагмент, но и все предыдущие, формируя список удалений. Только что уничтоженный текст можно вставить командой C-y. После этого его можно заменить предыдущим уничтоженным фрагментом – M-y. Можно двигаться и далее назад по списку удалений, повторяя M-y.

Хорошо продуманы команды для перестановки частей текста вокруг точки: двух знаков (C-t), слов (M-t), строк (C-x C-t). Команда M-t не перемещает знаки препинания между словами, поэтому "потеха, дело" превратится в "дело, потеха".

Прямо из Emacs можно вызвать программу проверки орфографии ("M-x ispell-buffer") или даже включить проверку "на лету", когда неправильно написанные слова выделяются другим цветом ("M-x flyspell-mode"). Можно проверить написание отдельного слова, в котором находится точка ("M-x $") или завершить недописанное слово, основываясь на орфографическом словаре ("M-x Tab").

В Emacs так много специальных команд для изменения текста, что команды поиска и замены бывают нужны не так часто. Произвести замену строки всюду в буфере можно по команде "M-x replace-string что заменить Enter на_что_заменить Enter", а для замены регулярного выражения существует аналогичная команда "M-x replace-regexp".

Если нужно заменить строку только в некоторых случаях, пригодится команда M-%, запрашивающая подтверждение о замене при каждой найденной строке. Аналогичная команда для регулярных выражений – C-M-%.

Любые изменения в тексте можно отменить командой C-_ (нужно нажать Ctrl, Shift и "-").



Содержание раздела