Документация по ОС FreeBSD Четверг, 06.02.2025, 20:05
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Мои статьи [0]
Установка и настройка [281]
X Window [25]
Man pages [30]
Ports & Packages [26]
cvs [18]
Multimedia [20]
Нововсти в мире Unix [0]
RFC [4]
RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Безопасность [52]
Работа с железом [58]
Книги по FreeBSD [17]
Сеть [505]
Программирование [40]
FireWall [58]
Темы экзамена BSDA [14]
Официальные темы экзамена BSDA, включая подробноые описания и советы по обучению.

Главная » Статьи » Установка и настройка

10 команд vi, позволяющих произвести впечатление на друзей [2010]
Пост про 10 самых нужных команд vi оказался очень популярным и легко выбился на первое место самых читаемых постов, опережая по количеству прочтений ближайших соседей минимум в два раза. Поэтому сегодня тоже будет пост про vi, но в этот раз про малоизвестные, но часто очень полезные команды. Перевод статьи «vi tips and tricks: Ten cool commands sure to impress your friends», автор Martin Wicks. Буквальный перевод названия: «Советы и хитрости vi: 10 крутых команд которые обязательно впечатлят ваших друзей».

Осваивая возможности редактора vi, большинство людей (как новичков, так и опытных пользователей) стараются выделить базовый набор команд, позволяющий им решать задачи, выполняемые чаще всего: навигация или сохранение файла; вставка, изменение, удаление или поиск данных; выход без сохранения изменений.

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

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

Включение и выключение нумерации строк

Редактор vi имеет набор опций, которые определяют, как будет выглядеть сессия редактирования. Для изменения любых настроек сессии vi используется команда :set. Чтобы увидеть список всех доступных опций, используйте команду :set all.

Одна из опций, которую можно установить – number, она включает или выключает нумерацию строк (см. Листинг 1).

Листинг 1. До включения нумерации строк

#
# Internet host table
#
::1     localhost
127.0.0.1       localhost       loghost
192.168.0.6     centos5
192.168.0.10    appserv
192.168.0.11    webserv
192.168.0.12    test
192.168.0.5     solaris10       # Added by DHCP
~
~
~
:set number

Эта команда говорит vi, что надо печатать номер перед каждой строкой файла, который вы редактируете. После перевода vi в командный режим, вы можете написать :set number и нажать Enter, чтобы включить нумерацию строк (см. Листинг 2).

Листинг 2. Нумерация строк включена

     1  #
     2  # Internet host table
     3  #
     4  ::1     localhost
     5  127.0.0.1       localhost       loghost
     6  192.168.0.6     centos5
     7  192.168.0.10    appserv
     8  192.168.0.11    webserv
     9  192.168.0.12    test
    10  192.168.0.5     solaris10       # Added by DHCP
~
~
~
:set number

Отключить нумерацию строк можно с помощью команды :set nonumber. Вы также можете использовать сокращенные версии этой команды и :set number, а именно :set nu и :set nonu.

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

Если вы хотите, чтобы номера строк показывались каждый раз при запуске vi, включите строку set number в файл .exrc в вашем домашнем каталоге.

Авто-отступы

При написании кода на некотором языке программирования одной из важнейших составляющих стиля является использование отступов, которые делают код более читабельным. Вы можете настроить vi так, чтобы он автоматически вставлял отступы для выравнивания в соответствии со стилем языка. Для включения и отключения авто-отступов используется опция autoindent (см. Листинг 3).

Листинг 3. Включение авто-отступов

#!/bin/ksh
#
#
for file in /etc/*
do
        if [[ -f ${file}  ]] ; then
                 echo "${file} is a file"

~
~
~
~
~
:set autoindent

С этого момента, если вы используете в начале строки отступы табуляцией или пробелами, в следующие строки автоматически будет вставлен такой же отступ. В командном режиме vi напишите :set autoindent и нажмите клавишу Enter для включения авто-отступов.

Уровень отступов задается с помощью опции shiftwidth. Например, чтобы установить отступ в 4 пробела, используйте :set shiftwidth=4 (см. Листинг 4).

Листинг 4. Устанавливаем уровень отступов

#!/bin/ksh
#
#
for file in /etc/*
do
    if [[ -f ${file}  ]] ; then
        echo "${file} is a file"
    elif [[ -d ${file} ]] ; then
        echo "${file} is a directory"
    fi
done
~
~
:set shiftwidth=4

В режиме команд вы можете использовать команду >>, чтобы добавить уровень отступа в текущей строке, или <<, чтобы удалить уровень. Чтобы добавить или удалить уровень отступа для нескольких строк, напишите их количество перед командой. Например, если в Листинге 4 курсор находится в строке 6, добавить уровень отступа для 5 строк можно командой 5>>. Результат показан на Листинге 5.

Листинг 5. Отступ для блока строк

#!/bin/ksh
#
#
for file in /etc/*
do
        if [[ -f ${file}  ]] ; then
            echo "${file} is a file"
        elif [[ -d ${file} ]] ; then
            echo "${file} is a directory"
        fi
done
~
~

Выключить авто-отступ можно с помощью команды :set noautoindent. Также доступны сокращенные версии команд – :set ai и :set noai. Также можно включить авто-отступы и задать уровень отступа одной командой – :set ai sw=4.
Если вы хотите, чтобы авто-отступы включались автоматически с заданным уровнем при каждом запуске vi, включите команду set ai sw=4 в файл .exrc в вашем домашнем каталоге.

Игнорирование регистра символов при поиске

Как вы знаете, поиск в Unix регистрозависимый. Однако, если вы хотите, чтобы vi игнорировал регистр при поиске, то можете использовать команду :set ignorecase. Включить регистрозависимость можно командой :set noignorecase. Также вы можете использовать сокращенные версии команд (:set ic and :set noic).

Если вы хотите, чтобы vi всегда игнорировал регистр символов при поиске, включите команду set ignorecase в файл .exrc в вашем домашнем каталоге.

Составной поиск

Вы можете искать строки в vi с помощью команды /, указывая шаблон поиска в виде строки или регулярного выражения. Например, чтобы найти слово echo в файле, перейдите в режим команд, введите /echo и нажмите Enter. Это команда найдет первое слово в строке 3 в файле, показанном на Листинге 6.

Листинг 6. Составной поиск

     1  #!/bin/ksh
     2  #
     3  echo "Starting"
     4  file=${1}
     5
     6  echo ${file}
     7
     8  if [[ ${file} = 1 ]] ; then
     9          ((file=${file}+1))
    10          echo "Adding one gives " \
    11                  ${file}
    12  fi
    13  echo "Ending"
    14  exit
~
~

Вы можете использовать простое регулярное выражение, чтобы указать, что ищете строку, содержащую одно слово, следующее за другим. Например, чтобы найти первую строку, содержащую строку echo, за которой после нуля или нескольких символов идет строка file, вы используете команду /echo.*file. В файле на Листинге 6, команда найдет первое слово в строке 6.

Однако, эта команда сработает только, если оба шаблона находятся в одной строке. Если вы хотите искать не зависимо от того, в одной строке или нет находятся шаблоны, то можете использовать составной поиск, указывая обе команды поиска через точку с запятой (;). Например, чтобы найти первую строку echo, следующую за строкой {file}+1, воспользуйтесь командой /{file}+1/;/echo/. В файле на Листинге 6 эта команда найдет первое слово в строке 10.

Составной поиск особенно полезен, когда вы ищите в коде команду, которая следует за другой, например, когда вызывается функция после задания значения некоторой переменной.

Повторное использование шаблонов

Когда вы ищите шаблон в файле для замены, вы можете дать команду vi запоминать совпадающие шаблоны в буфере, который затем может быть повторно использован при замене с указанием номера буфера. Вы делаете это, заключая шаблон в \ и \, что говорит vi записать шаблон в нумерованный буфер (от 1 до 9). Затем вы можете ссылаться на этот буфер при замене, используя его номер от \1 до \9.

Например, чтобы найти в файле на Листинге 7 строки, начинающиеся со слова Martin, и для каждого вхождения добавить префикс Mr и суффикс Wicks, войдите в режим команд, введите команду :%s/^\(Martin\)/Mr \1 Wicks/g и нажмите Enter.

Листинг 7. Повторное использование шаблонов (до замены)

Martin is an IT consultant. Martin likes
snowboarding and mountain biking. Martin has
worked on UNIX systems for over 15 years. Martin also
worked for many years before that on mainframes.
Martin lives in London.
~
~
~
~
:%s/^\(Martin\)/Mr \1 Wicks/g

Команда состоит из следующих частей:
  • :%s – говорит vi, что надо проводить замену
  • / – разделитель шаблонов
  • ^\(Martin\) – поиск строк, начинающихся с Martin и запись в буфер с номером 1.
  • / – разделитель шаблонов
  • Mr \1 Wicks – замена найденной строки на строку, начинающуюся с Mr, затем идет содержимое буфера с номером 1, а затем Wicks.
  • / – разделитель шаблонов
  • g – глобальная замена (замена каждой строки, соответствующей шаблону)
Использовать ссылки на буфер можно как в шаблоне строки поиска, так и в шаблоне замены.

Результаты замены показаны на Листинге 8.

Листинг 8. Повторное использование шаблонов (после замены)

Mr Martin Wicks is an IT consultant. Martin likes
snowboarding and mountain biking. Martin has
worked on UNIX systems for over 15 years. Martin also
worked for many years before that on mainframes.
Mr Martin Wicks lives in London.
~
~
~
~
:%s/^\(Martin\)/Mr \1 Wicks/g

Закладки

Вы можете указать vi поставить закладку в файле, нажав в нужном месте клавишу M и за ней другую буквенную клавишу, которая будет служить ссылкой на закладку. Таким образом, у вас есть 26 закладок с названиями от a до z. Для перехода к закладке нажмите обратный апостроф (`) и символ ссылки на закладку.

Например, после нажатия клавиш MA (Прим. переводчика. Нажимать нужно в нижнем регистре, т.е. ma), vi запишет текущую позицию курсора в закладку с именем a. Если вы захотите вернутся к этой позиции позже во время редактирования, просто нажмите `A (Прим. переводчика. И снова нужен нижний регистр, т.е. `a). Чтобы перейти от текущей закладки к предыдущей, используйте двойной обратный апостроф («).

Найти, заменить, найти следующий, повторить

Одна из самых полезных особенностей Поиска/Замены в редакторе vi – возможность найти строку, соответствующую шаблону, изменить ее, а затем повторить поиск для следующих совпадающих строк, с повторением изменений при необходимости, очень похоже на функцию Найти далее/Заменить в Microsoft Word.

Наверняка вы уже знаете, что можете искать шаблон строки в vi перейдя в режим команд, набрав /шаблон (где шаблон – строка или регулярное выражение) и затем нажав Enter. Эта команда найдет первую строку, соответствующую шаблону. С найденным текстом вы можете выполнить любые операции. Например, нажать клавиши C и W, а за ними текст, который заменит слово в найденной строке.

Чтобы быстро найти следующую строку, соответствующую шаблону, нажмите клавишу N (Прим. переводчика. N – поиск назад, n – поиск вперед). Когда найдено следующее совпадение, вы при необходимости можете использовать клавишу точка (.), чтобы повторить выполненные ранее изменения во вновь найденной строке, например функцию замены слова (cw) из предыдущего примера. Затем вы можете повторять поиск (n) и опциональную замену (.) используя эти клавиши, также как вы используете команды Найти Далее и Заменить в Microsoft Word.

Изменение регистра

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

Использование фильтров

Наверняка вы знаете, что можете запускать команды интерпретатора в vi, набрав :!cmd (где cmd - команда UNIX, которую вы хотите выполнить) и нажав Enter. Например, команда :!pwd покажет текущий каталог, в котором выполняется редактирование.

Однако, вы также можете отправить секцию вашего файла на стандартный ввод выбранной вами команде UNIX, а изменения будут внесены в эту же секцию в буфере vi. Например, если вы хотите отсортировать весь файл, приведенный на Листинге 9, оставаясь в vi, вам надо набрать :1,$!sort, чтобы дать vi инструкции направить строки с 1 до конца файла ($) на ввод команды sort, и заменить указанную секцию выводом этой команды, после чего нажать Enter.

Листинг 9. Сортировка файла внутри vi (до сортировки)

5
4
3
2
7
6
5
4
8
9
6
3
1
3
4
~
~
:1,$!sort

На Листинге 10 показаны результаты сортировки.

Листинг 10. Сортировка файла внутри vi (после сортировки)

1
2
3
3
3
4
4
4
5
5
6
6
7
8
9
~
~
:1,$!sort

В качестве альтернативы вы можете указать количество строк, которые нужно обработать, начинаю с текущей позиции курсора. Чтобы сделать это, введите число строк, которые нужно обработать, двойной знак восклицания (!!) и команду UNIX.

Например, если курсор находится в строке 4 файла на Листинге 9, вы можете набрать:

4!!awk '{print "New text",$0}'

и нажать Enter чтобы добавить в начало строк с 4 по 7 включительно текст «New text», как показано на Листинге 11.

Листинг 11. Добавление текста в начало блока строк

5
4
3
New text 2
New text 7
New text 6
New text 5
4
8
9
6
3
1
3
4
~
~
!awk '{print "New text",$0}'

Вы можете соединять команды UNIX вместе, чтобы создавать мощные фильтры в сессии vi, используя разделитель каналов (|) . Например, чтобы заменить содержимое файла в буфере редактирования текущей сессии vi на значения первых полей строк, отделенных пробелами, отсортированными в порядке возрастания и переведенными в верхний регистр, вы можете использовать команду:

:1,$!awk '{print $1}' | sort | tr [:lower:] [:upper:]

Запись секции файла

Вы можете записать секцию файла, который сейчас редактируете, набрав :начало,конецw файл, где начало - номер первой строки, которую вы хотите записать, конец - номер последней строки, которую нужно записать, w говорит о том, что вы хотите записать в другой файл, а файл - имя файла, в который вы хотите записать секцию. Вы можете использовать символ $, чтобы указать, что хотите записать файл до конца, и двойной символ >> после w, чтобы указать, что хотите добавить в файл, а не переписать его. Например, на Листинге 12 показано, как строки с номерами с 6 по 9 включительно добавляются в файл с именем /tmp/newfile.

Листинг 12. Запись секции в файл, добавление вместо перезаписи.

     1  #
     2  # Internet host table
     3  #
     4  ::1     localhost
     5  127.0.0.1       localhost       loghost
     6  192.168.0.6     centos5
     7  192.168.0.10    appserv
     8  192.168.0.11    webserv
     9  192.168.0.12    test
    10  192.168.0.5     solaris10       # Added by DHCP
~
~
~
:6,9w >> /tmp/newfile

Выводы

Редактор vi очень мощный инструмент, и я надеюсь что приемы приемы, описанные в этой статье, позволят вам повысить эффективность редактирования файлов. Помните, у vi всегда останутся возможности, которые не попались к вам на глаза. Счастливого редактирования!


Источник: http://solarisblog.ru/commands/10-komand-vi-pozvolyayushhie-proizvesti-vpechatlenie-na-druzej
Категория: Установка и настройка | Добавил: oleg (10.11.2010)
Просмотров: 760 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2025