Форум, знакомства, фото, чат, общение

Здравствуйте, гость ( Вход | Регистрация )

Приглашаем Информационных Партнеров!
> Случайные изображения












> Использование редактора vi

Ribca
сообщение 29.10.2007, 9:22
Сообщение #1


Administrator - тоже человек!
********

Группа: Super Admins
Сообщений: 4178
Регистрация: 28.12.2005
Из: Москва
Пользователь №: 1



Использование редактора vi

Оригинал: http://amsand.narod.ru/articles/vi.html

С Юниксом на vi
Опубликована в журнале "Системный администратор", март 2004

Так уж исторически сложилось, что операционные системы Unix считаются
очень сложными и недружественными по отношению к пользователям. И
одним из олицетворений этого часто называют редактор vi. По мере того,
как набирает обороты Linux, позиционируемый как система более
дружественная, среди его пользователей все большую популярность
приобретают более привычные редакторы, особенно тот, который встроен в
Midnight Commander (поскольку всегда под рукой), и старый добрый vi
начинает забываться. Тем не менее, этот редактор обладает
непревзойденной на сегодняшний день мощью, функциональностью,
универсальностью и удобством работы, а кроме того, разработан в полном
соответствии с идеологией Unix. Чтобы не быть голословным, приведу
несколько примеров (синтаксис команд редактора, которые в них
встретятся, будет подробнее рассмотрен ниже):

1. Задача: в середину некоторой статьи нужно вставить вывод команды
"ipfw show" (или любой другой). Попробуйте сделать это, используя Ваш
любимый редактор, а затем посмотрите, как это делается в vi.

Конечно же, будучи квалифицированным пользователем, Вы не стали
вбивать результат вручную, а перенаправили вывод в файл, который
объединили с файлом статьи:

# ipfw show > buffer
# cat article buffer > temp
# mv temp article


После чего, воспользовавшись функциями редактирования блоков (Ваш же
редактор позволяет это?), перенесли блок в нужное место. Конечно, с
помощью Midnight Commander можно сделать то же самое проще:

# ipfw show > buffer
# mcedit article


Идем в точку в которую нужно вставить блок, затем жмем F9 и выбираем в
меню "Файл" пункт "Вставить файл:", указываем путь к файлу buffer.

Ну а с помощью vi это выполняется одной командой:

!lipfw show


2. Предположим, что у Вас есть пронумерованный список из 12 пунктов.
Вам нужно вставить два пункта, начиная с третьей позиции, и
соответственно поправить номера всех нижележащих пунктов. Наверняка
решать эту задачу Вам придется руками. Vi позволяет сократить число
операций до минимума. Для первого пункта списка, номер которого нужно
поменять, ставим курсор на его номер и даем команду "2#+", после чего
на номере каждого последующего пункта просто давим символ ".".

3. Двадцать четыре строки в тексте нужно сдвинуть вправо символом
табуляции. Конечно, не проблема минутку пощелкать "Tab - Стрелка вниз
- Home", но vi предлагает более элегантный способ: "23>j" над первой
строкой. И все.

Надеюсь, мне удалось убедить Вас в том, что vi - один из лучших
текстовых редакторов для систем Unix. Ниже мы более подробно
рассмотрим его особенности, синтаксис некоторых команд, коротко
коснемся режимов ex и view. Чтобы учесть интересы читателей с разным
уровнем подготовки, данная статья будет разбита на следующие
подразделы:

* основы редактора vi,
* команды перемещения и поиска,
* команды редактирования и форматирования,
* работа с блоками и буфером,
* команды режима редактирования;
* прочие команды режима visual,
* команды режима ex,
* установки редактора,
* заключение.


Мне не хочется захламлять статью снимками экранов, поэтому, если Вы не
очень хорошо знакомы с vi, настоятельно рекомендую Вам читать ее перед
монитором и сразу пробовать те примеры, которые будут описаны ниже,
чтобы "почувствовать" этот редактор.


Основы редактора vi.

Итак, vi - текстовый редактор, входящий в поставку практически всех
операционных систем семейства Unix. Запуск его осуществляется
командой:

# vi [filename]


Помимо основного (visual) режима, он может быть запущен в командном
режиме, называемом ex (от англ. execute) ориентированном на работу со
строками, и в режиме view (только для чтения). Запуск этих режимов
осуществляется с ключами -e и -R, или командами ex и view
соответственно:

# {vi -e | ex} [filename]
# {vi -R | view} [filename]


Если файл с таким именем существует в текущей директории, то он будет
открыт для редактирования. Ну а если его нет, то будет создан новый
файл. Если команда vi дана без параметров, будет запущено
редактирование нового файла, создаваемого во временном каталоге,
заданном переменной окружения TMPDIR (обычно это папка /tmp) с именем
типа vi.L14259 (часть после точки создается случайным образом, чтобы
обеспечить уникальность создаваемого файла). В дальнейшем Вы сможете
сохранить набранный файл под любым именем.

Если Вы последовали моей рекомендации и сразу проверяете все на
практике, то первое, чему Вы должны научиться, это выходить из
редактора. Дело в том, что в vi Вам не помогут ни <escape>, ни
<Alt+X>, ни даже <Ctrl+C>. Нет в нем и так любимой народом верхней
строчки, именуемой "Главное меню". Так же он не будет отображать то,
что Вы попытаетесь набрать (хотя, если в панике начать беспорядочно
стучать по клавиатуре, то может случиться "чудо" и Ваш набор станет
появляться на экране, однако выйти из редактора это Вам все равно не
поможет). Так что абсолютно черный экран с одинокими тильдами по
левому краю, никак не реагирующий на нажатия клавиш и не позволяющий
вернуться в оболочку иначе, как "килянием" процесса из соседнего
терминала (если Вы, конечно, умеете пользоваться командой kill - иначе
только Reset), может надолго отбить охоту запустить этот редактор еще
раз. Поэтому сначала ознакомьтесь со следующей таблицей, которая
поможет Вам поверить в то, что vi - это действительно редактор:

Команда Описание
:q! Выход без сохранения
:w Сохранение изменений
:w <filename> Сохранение как <filename>
:wq Выход с сохранением
:q Выход, если файл не изменялся
i Переход в режим вставки символов в позиции курсора.
a Переход в режим вставки символов в позиции после курсора.
o Вставка строки после текущей
O Вставка строки над текущей
x Удаление символа в позиции курсора
dd Удаление текущей строки
u Отмена последнего действия
<escape> Возврат в режим команд

Команды, начинающиеся с символа ":", будут отображаться в нижней
строке. Остальные выполняются "молча". Редактор vi имеет два режима
работы - режим команд и режим редактирования.

Запускается он в командном режиме, так что все нажатия на клавиши
трактуются как команды. Нажатие клавиш "i", "a", "o", "O" и ряд других
переводят vi в режим вставки, когда набираемые символы трактуются как
текст и отображаются на экране.

Возврат к режиму команд выполняется клавишей <escape> или в некоторых
случаях автоматически, например, при попытке передвинуть курсор левее
первого символа в строке (в редакторе vim, являющемся
модернизированным вариантом vi и часто заменяющем его в Linux, в этом
случае редактор остается в режиме вставки). Автоматический переход в
командный режим обычно сопровождается звуковым сигналом, как и
ошибочная команда.

Чтобы почувствовать все это, выполним небольшое практическое
упражнение. Находясь в своем домашнем каталоге, запустите редактор
командой:

# vi test.txt


Далее нажмите "i", чтобы перейти в режим вставки. Теперь все нажатия
на клавиши будут трактоваться как ввод текста, и символы будут
отображаться на экране с позиции курсора. Наберите "Hello, world!".
Постарайтесь не ошибаться, поскольку исправление ошибок, как и все
остальное, имеет здесь свои особенности, о которых мы поговорим ниже.
Нажмите <escape> для возврата в командный режим. Наберите ":wq" и
нажмите <enter>. Убедитесь, что файл test.txt действительно создался.
После этого небольшого задания Вам будет проще представлять то, о чем
пойдет речь далее.

Аналогично команде "i", в режим вставки можно перейти, нажав клавишу
"a". Единственное отличие - текст будет вставляться не перед символом,
на котором находится курсор, а после него. Кроме того, режим вставки
может быть вызван командами "o" и "O". Первая из них добавляет пустую
строку после, а вторая - перед текущей строкой, и дальнейший ввод
символов трактуется как ввод текста.

Чтобы удалить символ, нужно перейти в режим команд и над удаляемым
символом нажать клавишу "x". В режиме вставки удалить только что
введенный ошибочно символ можно клавишей , однако в vi таким образом
может быть удалена только последняя непрерывно введенная
последовательность символов. То есть если Вы откроете для
редактирования наш тестовый файл со строкой "Hello, world", и добавите
между словами слово "my": "Hello, my world", то используя клавишу
<backspace>, Вы сможете удалить только что введенные символы " my", а
вот запятую и последующие символы удалить таким образом уже не
удастся. В этом случае придется использовать команду "x".

Удалить целиком строку, на которой находится курсор, можно командой
"dd" (просто нажмите два раза клавишу ). Помните, что в vi строкой
считается не экранная строка, а последовательность символов до
перевода строки (\n). Если строка больше 80 символов (значение по
умолчанию), то она переносится на новую линию (строку экрана).
Используя "dd", Вы удалите всю строку вне зависимости от того, на
скольких экранных линиях она размещается.

Чтобы определить, где находится конец строки, нажмите клавишу "$" (вы,
должно быть, уже заметили, что клавиши <Home>, <End> и т.п. тут не
работают). При навигации по экрану ( можно пользоваться стрелками,
хотя есть и более "правильный" способ) курсор перемещается не по
экранным линиям, а по строкам текста.

Если Вы что-то сделали не так, то отменить последнюю операцию можно
командой "u". Эта команда отменяет только последнее действие, то есть
ее повторное применение отменит только что сделанную отмену. Конечно,
отсутствие истории операций - один из серьезных недостатков vi, однако
если работать вдумчиво и внимательно, то он почти незаметен.
Собственно, идеология Unix-систем такова, что они не особо балуют
пользователя подсказками и возможностью отката выполненных операций,
так что сразу настраивайтесь на ответственную работу.

Учтите, что по команде "u" отменяется вся команда целиком. Например,
если Вы дали команду "i", набили 3-й том "Войны и мира" и вернулись в
режим команд, то "u" отменит весь этот ввод. Если ошибок получилось
слишком много, можно выйти из редактора без сохранения сделанных
изменений (команда ":q!").

В принципе, этих сведений достаточно, чтобы отредактировать файл.
Однако вряд ли Вы поверили, что vi - удобный редактор. Понимаю, как
Вам хочется крикнуть "Аццтой!" и нажать <F4> в своем любимом mc, но
все же найдите в себе силы дочитать статью до конца и попрактиковаться
с vi хотя бы пару недель. Думаю, Ваше мнение изменится.

В дальнейшей части статьи некоторые команды и их применение будут
рассмотрены более подробно. За описанием всех остальных команд отсылаю
читателя к с траницам справочного руководства "man vi", в полном
соответствии с идеологией Unix.


Команды перемещения и поиска.

Эта часть статьи посвящена командам навигации, которые позволят Вам
быстро и эффективно перемещаться по редактируемому тексту. Как и все в
vi, эти команды так же имеют свою специфику, и их удобство и
продуманность начинают осознаваться только через несколько месяцев
работы. Хотя и новичок найдет среди них полезные и интересные.

В общем случае по тексту можно перемещаться, используя клавиши со
стрелками. Но vi разработан таким образом, чтобы в процессе работы
руки не покидали основной рабочей зоны клавиатуры. Те, кто владеет
методом "слепой" печати, по достоинству оценят эту особенность. Кроме
того, это позволяет не заботиться о совместимости клавиатур и
терминалов - vi будет полностью функционален даже на самых тупых
терминалах.

Команды навигации и поиска представлены ниже. Запись "No." означает
число, которое набирается перед вводом команды (при этом на экране оно
не отображается) и задает число повторений команды или в некоторых
случаях номер строки, к которой команда должна быть применена. Если
число не задано, команда выполняется один раз.

Команды перемещения курсора:

* [No.]h - перемещает курсор влево на No. символов;


* [No.]k - перемещает курсор на No. символов вверх;


* [No.]j - перемещает курсор вниз на No. символов;


* [No.]l, [No.] - перемещает курсор на No. символов вправо.


* [No.]$ - переход на последний символ строки, No.-ой после текущей;


* 0 (ноль) - переход на первый символ текущей строки;


* ^ - перемещает курсор на первый символ текущей строки, отличный от
пробельного;


* [No.]- - переход на первый непробельный символ No.-ой перед
текущей строки;


* [No.]+ - переход на первый непробельный символ No.-ой после
текущей строки;


* [No.]_ - переход на первый непробельный символ (No.-1)-ой после
текущей строки;


Так же существует масса команд для перемещения по словам, группам
символов, предложениям, параграфам. При этом под "словом" будет
пониматься последовательность символов, разделенных пробельными
символами. Термином "группа символов" будем именовать
последовательность символов, не разделенных специальными символами
(такими как дефис, точка, запятая и т.д.). В терминах vi эти две
единицы именуются "большим словом" (bigword) и "словом" (word)
соответственно. Предложение - последовательность слов, ограниченная
точкой или пустой строкой. Параграф - часть текста, обрамленная
пустыми строками.

Чтобы Вы знали, что искать, просто перечислю эти команды: B, W, E, b,
w, e, (, ), {, }, <Ctrl-F>, <Ctrl-B>, <Ctrl-D>, <Ctrl-U>, <Ctrl-E>,
<Ctrl-Y>. Познакомиться с ними можно на страницах "man vi" или методом
"научного тыка". Например, команда "5<Ctrl-Y>" прокрутит экран на 5
строк вниз, не перемещая курсор (очень полезна, если Вам нужно увидеть
несколько строк выше и затем продолжить редактирование текущей
строки).

Еще несколько полезных команд навигации:

* z. - прокручивает текст так, что текущая строка становится в
центре экрана;


* [No.]G - перемещает курсор на No.-ю строку от начала файла, если
No. не задано - на конец файла;


* [No.]H - перемещает курсор на No.-ю сверху строку, видимую на
экране;


* [No.]L - перемещает курсор на No.-ю снизу строку, видимую на
экране;


* M - перемещает курсор на строку, расположенную в центре экрана;


С помощью следующих двух команд Вы сможете расставлять "маркеры" в
тексте, и затем быстро переходить на эти метки:

* m<симв.> - запоминает текущую позицию курсора как символ <симв.>;


* `<симв.> - возвращает курсор на позицию, запомненную как <симв.>;


Например, запомнив начало второго параграфа как "m2", Вы в дальнейшем
сможете возвращаться к нему командой "`2".


Команды поиска:

С поиском вроде все понятно, ничего пояснять не буду:

* /<образец поиска> - поиск в тексте по образцу;


* / - повторный поиск по предыдущему образцу (найти далее);


* ?<образец поиска> - поиск по образцу в обратном направлении;


* ? - повтор поиска по предыдущему образцу в обратном направлении;


Предыдущие четыре команды должны обязательно завершаться нажатием
клавиши <Enter>.

* [No.]<Ctrl-A> - поиск No.-го слова, совпадающего с тем, на котором
стоит курсор, начиная с позиции курсора в сторону конца документа;


* [No.]f<char> - перемещает курсор на No.-й после курсора символ
<char> в строке;


* [No.]t<char> - перемещает курсор на символ, стоящий перед No.-м
после курсора символом <char> в строке;


* [No.]F<char> - перемещает курсор на No.-й перед курсором символ
<char> в строке;


* [No.]T<char> - перемещает курсор на символ, стоящий после No.-го
перед курсором символа <char> в строке.



Команды редактирования и форматирования.

Помимо рассмотренных выше команд "i" и "a", полезны будут и следующие:

* [No.]I - включает режим вставки текста. Текст будет вводиться с
начала строки;


* [No.]A - включает режим вставки текста. Текст будет вводиться
после последнего символа в текущей строке;


* [No.]o - вставка новой строки после текущей. Текст будет вводиться
с начала новой строки;


* [No.]O - вставка новой строки выше текущей. Текст будет вводиться
с начала новой строки;


Рассматривая две предыдущие команды, необходимо указать на одну
особенность. Использование оных со счетчиком No. не добавляет No.
пустых строк, как следовало бы ожидать. Добавляется одна, редактор
переходит в режим ввода, а затем, после возврата в командный режим,
введенный блок текста будет повторен No. раз. Кстати, и команды
вставки ведут себя аналогичным образом - сначала Вы получаете
возможность вставить или добавить текст, начиная с соответствующей
позиции курсора, после чего, в момент возврата в режим команд,
введенный Вами текст будет продублирован No. раз. Выполните команду
"5i", введите текст "echo ", вернитесь в режим команд (<escape>) и
посмотрите, что из этого получится. Данный комментарий относится и к
ряду команд, перечисленных ниже.

* [No.]r<char> - заменяет символ в точке нахождения курсора (и No.-1
последующих символов) символом <char>;


* [No.]~ - заменяет текущий и следующие No.-1 символов этими же
символами в другом регистре;


* [No.]s - заменяет No. символов в строке, начиная с текущего,
вводимым далее текстом. Вводимые символы после No.-го добавляются
после замененных. Граница области замены отмечается символом "$".


Поясним эту команду. Пусть у нас есть строка с текстом "This is a big
string". Мы хотим слово "big" заменить более справедливым "small".
Поставим курсор на букву "b" (естественно, используя команду "fb" - мы
же уже не маленькие, чтобы стрелочками по тексту скакать). Заменить
нам нужно три символа, поэтому: "3s". Теперь просто вводим наше
"small" - первые три символа введутся в режиме замены, последующие
добавятся, не затирая то, что нам нужно. Теперь <escape>, и любуемся
на дело наших рук, не забывая при этом громко восхищаться редактором.

* [No.]R - включает режим замены (вводимые символы будут замещать
текущие до конца строки, затем символы будут добавляться);


* [No.]S - очищает строку и переходит в режим вставки текста
(аналогичный результат достигается последовательным выполнением
команд "[No.]dd" и "O"). Обратите внимание, что No. в данном
случае относится к удалению, то есть No. строк будут удалены, и
вместо них можно будет ввести один блок текста.


* [No.]C - удаляет символы от текущей позиции курсора до конца
строки и переходит в режим вставки текста. No. так же относится к
удалению.


* [No.]c - удаляет символы в указанном направлении, которое задается
командами перемещения курсора (No. отдельных символов для
направлений "влево" и "вправо" и No. строк для "вверх" и "вниз") и
переводит редактор в режим вставки текста.


Все вышеприведенные команды переводят vi в режим вставки текста, то
есть весь последующий ввод будет отображаться на экране начиная с
указанной позиции. Для возврата в командный режим используется
комбинация <Ctrl-C> или клавиша <escape>.

* [No.]x - удаляет No. символов после курсора (начиная с позиции
курсора);


* [No.]X - удаляет No. символов перед курсором;


* [No.]d - удаляет No. символов/строк относительно курсора в
указанном направлении. Направление задается командами управления
курсором "h", "j", "k", "l" или стрелками. Если выбрано "влево"
или "вправо", то удаляются No. символов соответственно перед или
после курсора. Направление, заданное как "вверх" или "вниз",
позволяет удалить No. строк соответственно выше или ниже текущей
строки (включая текущую).


* [No.]D - удаляет символы, начиная с позиции курсора до конца
строки.


* [No.]J - объединяет текущую строку с No. следующими в одну;


* [No.]> <направление> - сдвигает No. строк вправо на символ
табуляции;


* [No.]< <направление> - сдвигает No. строк влево на символ
табуляции;


В предыдущих двух командах (впрочем, как и в остальных) направление
задается командами управления курсором "h", "j", "k", "l" или
стрелками. Так, если выбрано "вправо" или "влево", то команда сдвига
действует только на текущую строку, No. игнорируется. Если "вверх" или
"вниз", то сдвигается данная строка и No. предыдущих или последующих
соответственно.

* [No.]#{#|+|-} - инкремент/декремент числа. Если дать эту команду,
когда курсор стоит под числом, то это число будет увеличено на No.
(если задан параметр "#" или "+") или уменьшено на No. (если задан
параметр "-"). Например, чтобы увеличить число 52 на 7, ставим
курсор на символ "5" или "2" (он может быть установлен на любую
цифру числа), после чего набираем последовательно "7#+". В
результате "52" изменится на "59". В vim эта функция не
поддерживается.


* [No.]!<направление><команда shell> - заменяет в документе, начиная
с позиции курсора, в заданном направлении No. строк выводом
команды оболочки. Если Вам нужно вставить вывод, можно сначала
создать две пустые строки, а затем выполнить данную команду,
например: "2o", <escape>, "!kwho".



Работа с блоками и буфером

Vi предоставляет пользователю весьма мощные функции по работе с
блоками.

* [No.]yy - копирует в буфер No. строк, начиная с текущей;


* [No.]Y - копирует No. строк в буфер (аналогична "yy");


* [No.]y - копирует текст в буфер в указанном направлении. No.
трактуется в зависимости от направления (впрочем, как и в
остальных подобных командах): количество копируемых символов для
"вправо" и "влево" и число строк (дополнительно к текущей) для
"вверх" и "вниз". Например, "2yk" скопирует в буфер текущую строку
и еще две, расположенные выше (итого - три). Если Вам нужно
скопировать только текущую строку, следует использовать команду
"yy" или "Y".


* [No.]p - вставляет текст из буфера No. раз после курсора;


* [No.]P - вставляет текст из буфера No. раз перед курсором.


Используя команды расширенного (ex) режима, можно работать с
несколькими блоками. Где изучить эти возможности, Вы, думаю, уже
знаете. Конечно же, в "man vi".


Команды режима редактирования

Находясь в режиме редактирования, редактор все вводимые символы будет
отображать на экране как часть текста. Однако существует несколько
последовательностей, которые трактуются как специальные команды и для
которых выполняется автоматическая замена введенных символов
последовательности результатом выполнения команды. Наиболее полезные
из них следующие:

* <escape> - завершает режим ввода текста и переводит редактор в
командный режим;


* <Ctrl-C> - также возвращает редактор в режим команд (при "слепой"
печати эта команда более удобна);


* <backspace> - удаление только что введенного символа;


* <Ctrl-W> - удаление только что введенного слова;


* <Ctrl-X>[0-9A-Fa-f] - вставка символа, имеющего код, выраженный
шестнадцатеричным числом (например, "<Ctrl-X>30" отобразится на
экране как "^X30" и автоматически заменится символом "0",
ASCII-код которого - 30h).



Прочие команды режима visual

Осталось рассмотреть еще несколько команд, которые трудно выделить в
ту или иную категорию, но которые весьма полезны при работе.

* [No.]. - повтор последней команды для текущей позиции курсора No.
раз;


* u - отменяет последнее действие;


* U - восстанавливает текущую строку, отменяя все изменения,
сделанные в ней;


* Q - переключение в интерфейс ex (см. далее);


* <Ctrl-G> - выводит информацию о редактируемом файле (состояние -
modified/unmodified, отражающее, есть ли в файле несохраненные
изменения; номер текущей строки и общее количество строк в файле);


* <Ctrl-R> - перерисовывает экран (может пригодиться на плохом
канале связи или для восстановления экрана после вывода на него
системных сообщений, если Вы работаете с физической консоли);


* <Ctrl-Z> - временное прерывание сессии редактирования и выход в
командную оболочку. Чтобы вернуться назад в редактор, нужно
воспользоваться системной командой "fg", которая переводит фоновый
процесс в активный. Номер задачи (job), соответствующий
отложенному процессу редактирования, который потребуется ввести
как параметр команды "fg", можно уточнить командой "jobs". При
попытке выйти из оболочки командой "exit" Вы получите
предупреждение, что у Вас остались незавершенные задачи:


$ exit
You have stopped jobs.
$ jobs
[1] 34336 Suspended vi test
$ fg 34336


Здесь test - имя редактируемого файла. Нужно заметить, что если Вы
вызываете vi из Midnight Commander, то в списке приостановленных
заданий вместо "vi test" будет отображаться "midc" ("mc" для Linux).

После этих действий Вы вернетесь назад в vi и сможете завершить
редактирование. Если отложенное задание только одно, можно вернуться к
нему командой fg без параметров.

* ZZ - выход из редактора с сохранением изменений (аналог команды
":wq")



Команды режима ex

Редактор vi имеет, помимо рассмотренного, еще один интерфейс, или
режим, - ex. Запустить редактор в этом режиме можно одной из следующих
команд:

# vi -e
# ex


Кроме того, Вы можете перейти в него из режима visual по команде "Q".
Данный интерфейс предоставляет ряд расширенных возможностей для
обработки текста, таких как работа с несколькими буферами, открытие
других файлов в текущем сеансе, изменение настроек редактора и т.д. В
данном разделе будут рассмотрены лишь наиболее полезные из них.

В отличие от интерфейса vi, ex ориентирован на командную работу со
строками. Редактирование идет как бы вслепую. Редактируемый текст на
экране по умолчанию не отображается, Вам придется специально вызывать
на экран требуемые строки.

Почти все ex-команды можно исполнить из vi-интерфейса, предварив
команду двоеточием. Наиболее характерный пример - команда выход из
редактора: ":q". Ниже приведено лишь несколько полезных команд:

* :!<команда> - выполняет команду оболочки (результат просто
выводится на экран);


* :[<start>] # [No.] - выводит на экран No. строк начиная со <start>
(в режиме ex).


* :s/<текст1>/<текст2> - замена в текущей строке <текст1> на
<текст2>;


* :s - повтор предыдущей замены для текущей строки;


* :%s/<текст1>/<текст2> - замена во всем файле <текст1> на <текст2>;


* :next - переход к редактированию следующего файла из списка
параметров, с которым был вызван редактор.


* :prev - возврат в редактированию предыдущего файла.


Например, если Вы вызываете редактор командой "vi file1 file2", то в
процессе редактирования Вы сможете переходить между файлами указанными
выше командами. При этом содержимое буферов обмена будет сохраняться,
и Вы сможете вставлять в файл фрагменты, скопированные из другого
файла. Заметьте, что редактор не позволит Вам перейти к другому файлу,
пока изменения в текущем не будут сохранены или отменены (отменить все
изменения можно командой ":e!", которая перечитает редактируемый файл
с диска).

* :edit <file> - открыть для редактирования файл <file>.


* :w[ <filename>] - уже знакомая Вам команда сохранения
редактируемого файла. Опциональный параметр <filename> превращает
команду в команду "Сохранить как:" для записи изменений в файл с
другим именем.


Еще одно пояснение - очень часто бывает, что отредактировав тот или
иной файл (например, squid.conf), при попытке сохранить сделанные
изменения Вы получаете сообщение, что файл недоступен для записи.
Причина понятна - или Вы забыли войти как root, или файл имеет права
"r--r--r--". Выходить без сохранения, менять права и редактировать
снова - жалко: А вот сохранить файл под другим именем, а затем, обретя
требуемые права, заменить им оригинал - как раз то решение, которое
нас устраивает. Конечно можно с другого терминала поменять права на
сохраняемый файл и снова провести операцию записи. Но при удаленной
работе открыть новую ssh-сессию не всегда проще, чем поступить
описанным выше образом. Да и удаленный доступ к нескольким терминалам
иногда запрещают из соображений безопасности. Кроме того, если Вы
внесли изменения в системный файл (скажем, /etc/crontab), б удучи
зарегистрированным как простой пользователь, то вряд ли безопасно
менять к нему права доступа, пусть и кратковременно. Кроме того,
статья рассматривает редактор vi, а потому примеры призваны прежде
всего показать его пригодность для решения тех или иных задач, пусть и
не всегда оптимальным образом smile.gif.

* :g /<шаблон>/ <команда> - указанная команда, которой может быть
одна из ex-команд, применяется к строкам, которые соответствуют
шаблону. Например, команда ":g /qwerty/ delete" удалит все строки,
в которых присутствует последовательность символов "qwerty".


* :v /<шаблон>/ <команда> - работает аналогично предыдущей, но
команда применяется к тем строкам, которые не соответствуют
шаблону.


* :vi - переход в интерфейс visual.



Опции и параметры редактора

Было бы странно, если бы оказалось, что столь мощный редактор не
позволяет настраивать себя под требования и предпочтения конкретного
пользователя. Однако не следует думать, что настройкой можно
превратить vi в редактор ee или что-то подобное. Следующие опции
позволяют лишь добавить "удобства", не меняя общих принципов работы.
Все они устанавливаются с помощью ex-команды ":set". "no" перед именем
опции отключает ее.

* :set [no]list - включает режим отображения служебных символов
(таких как конец строки, который будет отображаться символом "$",
и т.д.);


* :set [no]nu - включает отображение номеров строк;


* :set [no]showmode - включает отображение режима (command, insert,
append, replace) в нижнем правом углу экрана, в котором редактор
находится в данный момент;


* :set [no]verbose - включает режим расширенных сообщений (на каждое
ошибочное действие будет выдаваться соответствующее пояснение);


За остальными настройками, как всегда, - "man vi", соответствующий
раздел.

Увековечить сделанные настройки можно в exrc-файлах. Данные файлы
применяются в следующей последовательности:
1. /etc/vi.exrc - глобальный файл настроек редактора;
2. $HOME/.exrc - пользовательский файл настроек;
3. .exrc - локальный файл настроек для текущей директории.

Действовать будут те настройки, которые применены последними. В эти
файлы следует занести те ex-команды, которые должны быть исполнены при
открытии редактора. Например, если Вы хотите, чтобы редактор всегда
работал с включенным отображением режима и расширенными сообщениями,
то создайте в своем домашнем каталоге файл .exrc следующего
содержания:

set showmode
set verbose


Теперь каждый раз при вызове редактора эти команды будут
отрабатываться автоматически.


Заключение

Итак, Вы в общих чертах познакомились с редактором vi. Приведу еще
несколько преимуществ редактора vi, помимо его функциональности:

* способность работать практически на любых терминалах;


* обязательное наличие в любой Unix-системе;


* надежная работа даже на самых плохих линиях;


* используется в некоторых системных командах (например, vipw),
следовательно, умение в нем работать потребуется в любом случае;


* а сможете ли Вы просмотреть файл, являющийся каталогом (в Unix
каталог - это специальный файл), с помощью 'ee' или 'mcedit'? Хотя
редактировать такой файл Вам и vi не позволит, но посмотреть для
интереса - можно (например, "view /etc").


Попытайтесь с ним подружиться!

P.S. Если Вы все же отважились сделать vi Вашим основным редактором,
для этого установите значение переменной $EDITOR=vi (например, для
оболочки sh нужно поправить файл .profile в Вашем домашнем каталоге,
для csh - это файл .cshrc). Также в настройках Midnight Commander
отмените использование встроенного редактора (пункт меню "Настройки" -
"Конфигурация:"), и по <F4> будет вызываться тот редактор, который
задан в переменной $EDITOR.

© Amsand <amsand@yandex.ru.>, 2004 (вер. от 05.11.2004)


--------------------
Счастье есть - его не может не быть.
Не бойся смерти - бойся непрожитой жизни.
Как бы не было плохо, нужно расслабиться и получать удовольствие, а если хорошо, то тем более.
Мозги надо менять а не конституцию.

Это мы то нубы?! Да я вас всех продам, куплю, а потом еще раз продам но уже дороже!!!

<> ужос...сегодня впервые за пару месяцев на ночь выключил комп.......
<> еле в этой долбаной тишине уснул.......
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 19)
AleksanderII
сообщение 14.11.2009, 18:24
Сообщение #2


Новичок
*

Группа: Икринка
Сообщений: 11
Регистрация: 6.11.2009
Пользователь №: 16902



О, спасибо Поля появились. Значит теперь если поле псевдоссылки заполнить, появиться моё название, а если нет - сгенерируется из названия поста? Так я понимаю?
Там кстати и в самом редакторе стоит лишняя кнопочка - добавление медиафайлов с Rusedu, я убрал.
А с проблемой при добавлении поста вроде всё исправилось после обновления. С момента обновления редактора ни разу не замечал. Правда последнее время я не так интесивно добавляю посты. Время покажет.
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:06
Сообщение #3


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Основные команды редактора vi

TERM=terminal_name
export TERM
- Установка конфигурации терминала

tput init Инициализировать терминал как terminal_name
vi filename Вызов редактора vi для редактирования файла filename
a Добавить текст после курсора
h Перемещает курсор на один символ влево
j Перемещает курсор вниз на одну строку
k Перемещает курсор вверх на одну строку
l Перемещает курсор на один символ вправо
x Удалить символ
<CR> Возврат каретки
<ESC> Перейти из режима ввода в командный режим
:w Записать в файл
:q Завершить работу с редактором
:wq Записать буфер в файл и завершить работу с редактором vi
ZZ Записать изменения в файл и завершить работу с vi
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:07
Сообщение #4


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды позиционирования курсора редактора vi - Позиционирование на символ

h Перемещает курсор на один символ влево
l Перемещает курсор на один символ вправо
BACKSPACE Перемещает курсор на один символ влево
SPACEBAR Перемещает курсор на один символ вправо
fx Осуществляет поиск указанного символа x справа от текущей позиции
курсора
Fx Осуществляет поиск указанного символа x слева от текущей позиции
курсора
tx Осуществляет перемещение курсора вправо на символ до указанного
символа x
Tx Осуществляет перемещение курсора влево на символ до указанного
символа x
; Повторяет предыдущий поиск символа. Команда ; запоминает символ
и ищет следующее появление символа в текущей строке
, Повторяет предыдущий поиск символа, но в обратном направлении
j Перемещает курсор вниз на одну строку
k Перемещает курсор вверх на одну строку
- Перемещает курсор на одну строку вверх, позиционируя его на первом
ненулевом символе
+ Перемещает курсор вниз на одну строку и позиционирует на первый
непустой символ
<CR> Перемещает курсор вниз на одну строку и позиционирует на первый
непустой символ
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:09
Сообщение #5


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды позиционирования курсора редактора vi - Позиционирование на строку

Позиционирование на строку
$ Переместить курсор на последний символ в строке
0(ноль) Переместить курсор на первый символ в строке
^ Переместить курсор на первый ненулевой символ в строке
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:10
Сообщение #6


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды позиционирования курсора редактора vi - Позиционирование на слово

w Перемещает курсор к началу следующего слова
W Игнорирует все знаки пунктуации и перемещает курсор на следующее
после пробела слово
e Перемещает курсор на последний символ в следующем слове
E Перемещает курсор на последний символ в слове. Игнорирует все символы
пунктуации за исключением пробела
b Перемещает курсор к первому символу предыдущего слова
B Используется подобно команде b, за исключением того, что слова
разделяются только символами пробел и новая строка
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:11
Сообщение #7


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды позиционирования курсора редактора vi - Позиционирование на предложение

( Перемещает курсор в начало текущего предложения
) Перемещает курсор в начало следующего предложения
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:11
Сообщение #8


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды позиционирования курсора редактора vi - Позиционирование на параграф

{ Переместить курсор в начало текущего параграфа, который ограничивается
пустой строкой
} Переместить курсор в начало следующего параграфа
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:12
Сообщение #9


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды позиционирования курсора редактора vi - Позиционирование в окне

H Переместить курсор к первой строке экрана
M Переместить курсор к средней строке экрана
L Переместить курсор к последней строке экрана
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:14
Сообщение #10


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Дополнительные команды перемещения курсора в редакторе vi - Прокрутка

^f Прокрутка экрана вперед на полное окно. Откры- вается новое окно
с текстом, расположенным ниже текущего окна
^d Прокрутка текста вниз на пол-окна. Открываются строки, расположенные
ниже текущего окна
^b Прокрутка экрана назад на полное окно. Откры- вается новое окно
с текстом, расположенным выше текущего окна
^d Прокрутка текста вверх на пол-окна. Открываются строки, расположенные
выше текущего окна
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:14
Сообщение #11


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Дополнительные команды перемещения курсора в редакторе vi - Позиционирование с помощью номера строки

1G Перейти к первой строке в файле
G Перейти к последней строке в файле
^g Выдать номер строки и состояние файла
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:15
Сообщение #12


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Дополнительные команды перемещения курсора в редакторе vi - Поиск по шаблону

/pattern Поиск вперед в буфере до первого появления шаблона. Курсор помещается
на первом символе шаблона
?pattern Поиск назад в буфере до первого появления шаблона. Курсор помещается
на первом символе шаблона
n Повторить последнюю команду поиска
N Повторить последнюю команду поиска в обратном направлении
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:16
Сообщение #13


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды создания текста в редакторе vi

a Создать текст после курсора
A Создать текст в конце текущей строки
i Создать текст перед курсором
I Создать текст перед первым ненулевым символом в текущей строке
o Создать текст с начала новой строки, расположенной под текущей
строкой
O Создать текст с начала новой строки, расположенной над текущей
строкой
<ESC> Возвратить vi в командный режим из режима ввода текста
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:17
Сообщение #14


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды удаления текста в редакторе vi

Режим ввода
BACKSPACE Удалить текущий символ
1w Удалить текущее слово
@ Удалить текущую строку нового текста или удалить весь новый текст
в текущей строке Командный режим
u Отменить последнюю команду
U Восстановить текущую строку в прежнем состоянии
x Удалить текущий символ
ndx Удалить n-ый объект текста x
dw Удалить слово над курсором и следующий за ним пробел, или знак
пунктуации
dW Удалить слово и пунктуацию над курсором с последующим за ним пробелом
dd Удалить текущую строку
D Удалить часть строки справа от курсора
d) Удалить текущее предложение от текущей позиции курсора до конца
d} Удалить текущий параграф от текущей позиции до конца
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:21
Сообщение #15


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды изменения текста в редакторе vi

Команды изменения текста
r Заменить текущий символ
R Заменить те символы, которые введены в режиме ESCAPE
s Удалить символ, под которым расположен курсор и добавить текст.
Для окончания режима ввода нажмите клавишу ESCAPE
S Заменить все символы в строке
cc Заменить все символы в строке
ncx Заменить n объектов текста типа x (предложение, параграф)
cw Заменить слово или оставшиеся символы в слове на новый текст
C Заменить оставшиеся символы в строке от курсора до конца строки
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:22
Сообщение #16


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды y - копирование - в редакторе vi

nyx Копирование n-го объекта текста типа x (предложение или параграф)
yw Создание копии слова
yy Создание копии текущей строки
nyy Копирование n строк
y) Создание копии всего текста до конца предложения
y} Создание копии всего текста до конца параграфа
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:23
Сообщение #17


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды извлечения и присоединения текста в редакторе vi

p Помещает содержимое временного буфера, полученное с помощью команды
y и команд удаления, в текст после курсора
yy Создает копию строки текста и помещает во временный буфер
nyx Создает копию n-го объекта текста типа x и помещает ее во временный
буфер
«xyn Помещает копию объекта текста типа n в в регистр с именем x
«xp Помещает содержимое регистра x после курсора
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:24
Сообщение #18


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Специальные команды в редакторе vi

. Повторить последнюю команду
j Соединить текущую строку со строкой, расположенной ниже
^l Очистить и восстановить текущее окно
~ Заменить нижний регистр на верхний
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:24
Сообщение #19


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды построчного редактора в редакторе vi

: Обозначает, что следующая за ней команда является командой построчного
редактора
:sh<CR> Временный возврат к shell для выполнения команд shell
^d Возврат из временного shell в текущее окно vi для продолжения редактирования
:n<CR> Переход к n-ой строке буфера
:x,yw data<CR> Записать строки от номера x до номера y в новый файл data
:$<CR> Переход к последней строке буфера
:.,$d<CR> Удалить все строки в буфере, начиная с текущей и до послед- ней
строки
:r shell.file<CR> Вставить содержимое shell.file после текущей строки в буфере
:s/text/new_words/<CR> Заменить первое появление символов text в текущей строке на new_words
:s/text/new_words/g<CR> Заменить каждое появление символов text в текущей строке на new_words
:g/text/s//new_words/g<CR> Заменить каждое появление символов text в файле на new_words
Go to the top of the page
 
+Quote Post
шпунтик
сообщение 13.9.2013, 9:25
Сообщение #20


Опытный Пользователь
****

Группа: Малёк
Сообщений: 241
Регистрация: 20.1.2009
Пользователь №: 14435



Команды завершения в редакторе vi

ZZ Записать буфер в файл, если после последней записи в буфере были
сделаны изменения, и завершить работу с vi
:wq<CR> Записать буфер в файл и завершить работу с vi
:w filename<CR> Записать буфер в новый файл filename
:q<CR> и завершить работу с vi
:w! filename<CR> Перезаписать содержимое буфера в уже
:q<CR> существующий файл filename и завершить работу с vi
:q!<CR> Завершить работу с vi без записи буфера в файл, даже если содержимое
буфера изменялось
:q<CR> Завершить работу с vi без записи буфера в файл, если буфер не изменялся
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic

 


Текстовая версия Сейчас: 20.4.2024, 6:03

Использование редактора vi - Форум




Рейтинг@Mail.ru Rambler's Top100

forum.ribca.net | Web Дизайн: WonderWorker | http://Ribca.Net