Vim Color Editor HOW-TO (Vi Улучшенный с цветной подсветкой синтаксиса) <!-- chapt change Vim Color Editor HOW-TO Vi Improved with syntax color highlighting --> <author>Al Dev (Alavoor Vasudevan) <htmlurl url="mailto:alavoor@yahoo.com" name="alavoor@yahoo.com"><newline> <htmlurl url="www.linux.ru.net/~RLDP" name="Russian Linux Documentation Project"> <date>v4.0, 31 Декабря 1999 <abstract> Этот документ является руководством по быстрой настройке редактора vim в Linux или другом Unix. Информация, приведенная здесь ориентирована на программистов, так как vim поддерживает синтаксическую подсветку и утолщение шрифтов для повышения "читаемости" текстов программ. Информация в этом документе справедлива для всех операционных систем, в которых работает vim - Windows 95/NT и все разновидности Unix, типа Linux, Solaris, HPUX, AIX, SCO, Sinix, BSD, SCO, итд.. </abstract> <!-- Table of contents --> <toc> <!-- Begin the document --> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt>Introduction --> <sect>Введение <sect1>О "Russian Linux Documentation Project" (<bf>RLDP</bf>) <p> Данный документ был переведен в рамках проекта - Russian Linux Documentation Project. <newline> Цель данного проекта - перевод документации, посвященной различным аспектам настройки и использования ОС Линукс, на русский язык. Более подробно узнать о проекте вы можете на нашем Веб Сайте: <newline> <htmlurl url="www.linux.ru.net/~RLDP" name="www.linux.ru.net/~RLDP"> <p> В переводе данного документа участвовали: <itemize> <item>Александр Михайлов <htmlurl url="mailto:alemikh@linux.ru.net" name="alexmikh@linux.ru.net"> </itemize> <sect1>Что такое Vim ? <p> Vim это сокращение от 'Vi Improved'(улучшеный Vi).Vi - это один из самых популярных и мощных редакторов в мире Unix. <bf>Vi</bf> в свою очередь это сокращение от "<it><bf>Vi</bf></it>sual" editor (Визуальный редактор). В старые дни,первым редактором на планеты был line editor (линейный редактор), называемый 'ed' (и 'ex'). <it><bf>Ви</bf></it>зуальный редактор такой как Vi был большим шагом вперед по сравнению с ним. Кстати 'ed' и 'ex' все еще доступны в Линукс.(см. 'man ed' и 'man ex') <p> Хороший редактор должен повышать производительность труда программиста. Vim поддерживает цветную подсветку синтаксиса программного кода и различные шрифты такие как normal,bold или italics. Редактор с цветной подсветкой (как Vim) повысит <bf>производительность</bf> труда программиста <bf>в 2-3 раза</bf>!!! Программист сможет читать код быстрее, т.к. синтаксис языка выделяется специальными средствами. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Установка Vim для RedHat Linux <p> Для использования Vim, вам нужно установить следующие RPM пакеты - <code> rpm -i vim*.rpm Или так - rpm -i vim-enhanced*.rpm rpm -i vim-X11*.rpm rpm -i vim-common*.rpm rpm -i vim-minimal*.rpm </code> Вы можете вывести на экран список файлов, которые вы установили такой командой: <code> rpm -qa | grep ^vim | awk '{print "rpm -ql " $1 }' | /bin/sh | less </code> и просматривать его используя j,k, CTRL+f,CTRL+D,CTRL+B,CTRL+U или клавиши со стрелками + клавиши page up/down. (см. 'man less'). <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Установка Vim для GNU Debian Linux <p> Чтобы установить Vim для Debian Linux (GNU Linux),войдите в систему как root и (соединившись с интернет) введите - <code> apt-get install vim vim-rt </code> Эта команда загрузит последнюю версию vim,установит её,сконфигурирует,и удалит файл .deb который был загружен.Первый пакет в списке - это vim,стандартный редактор,собранный с поддержкой X11,а vim-rt это vim runtime,который содержит файлы синтаксиса и файлы помощи. <p> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1>Установка Vim для Unix'ов <p> Для других Unix'ов, таких как Solaris, HPUX, AIX,Sinix,SCO,загрузите пакет с исходным кодом. <code> zcat vim.tar.gz | tar -xvf - cd vim-5.5/src ./configure --enable-gui=motif make make install </code> <p> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Установка Vim для Microsoft Windows 95/NT <p> Для Windows 95/NT, загрузите zip архив, и начните установку, щелкнув на setup. Взять этот zip файл можно на - <itemize> <item> Домашней страничке vim <url url="http://www.vim.org"> <item> На её зеркале в США <url url="http://www.us.vim.org"> </itemize> <p> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Setup vim init files --> <sect> Настройка файлов инициализации gvim <p> Чтобы разрешить подсветку синтаксиса, вы должны скопировать файл vimrc в ваш домашний каталог. Это сделает возможным вызов меню "Syntax" внутри gvim. В этом меню вы cможете выбрать языки типа C++, Perl, Java, SQL, ESQL и т.д. <CODE> cd $HOME cp /usr/doc/vim-common-5.3/gvimrc_example ~/.gvimrc </CODE> Комментарии в .gvimrc начинаются с двойных кавычек ("). Вы можете настроить vim по своему вкусу отредактировав файл $HOME/.gvimrc и вставив следующие строки - <CODE> "Эта строка является комментарием ,который начинается с двойных кавычек " Лучший шрифт это bold, но если он вам не понравиться вы можете выбрать другой по своему вкусу set guifont=8x13bold "set guifont=9x15bold "set guifont=7x14bold "set guifont=7x13bold " " Рекомендуется устанавливать количество пробелов в TAB равное четырем set tabstop=4 set shiftwidth=4 " " Противоположная опция - это 'set wrapscan', полезна при поиске строк set nowrapscan " " Противоположная опция - noignorecase set ignorecase </CODE> <bf>Очень</bf> рекомендуется устанавливать <it>tabstop</it> равный 4 и <it>shiftwidth</it> равный 4. <it>tabstop</it> - это количество пробелов,которое будет вставлено в текст при нажатии TAB. <it>shiftwidth</it> - то количество пробелов на которое будет сдвинута строка командами ">>" или "<<" (Нажмите соответствующий символ на клавиатуре два раза). Более подробно об этих и других командах можно почитать в пособии <ref id="Vim Tutorial">. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Пример конфигурационного файла gvimrc <p> Вы можете изменить такие параметры как цвет и тип шрифта в вашем $HOME/.gvimrc файле. Рекомендуется устанавливать <it>ярко-желтый</it>или<it>белый </it> цвет фона, и черный цвет для шрифтов. Т.к. доказано,что именно такая гамма наиболее удобна для глаз. Поэтому измените переменную 'guibg' в вашем $HOME/.gvimrc файле следующим образом: <code> highlight Normal guibg=lightyellow </code> А это пример конфигурационного файла взятый из /usr/doc/vim-common-5.3/gvimrc_example: <CODE> " Vim " Пример файла gvimrc. " Эти команды исполняются при запуске GUI. " " Чтобы использовать, скопируйте этот файл " для Unix и OS/2: ~/.gvimrc " для Amiga: s:.gvimrc " для MS-DOS и Win32: $VIM\_gvimrc " Заставит внешние команды работать через pipe вместо pseudo-tty "set noguipty " Устанавливает используемый X11 шрифт " set guifont=-misc-fixed-medium-r-normal--14-130-75-75-c-70-iso8859-1 " Делает командную строку двойной в высоту set ch=2 " Заставляет комбинацию shift-insert работать как в Xterm map <S-Insert> <MiddleMouse> map! <S-Insert> <MiddleMouse> " следующие команды исполняются только с vim версии 5.00 и старше. if version >= 500 " Я люблю когда строки внутри C комментариев подсвечены let c_comment_strings=1 " Включает подсветку синтаксиса. syntax on " Включает подсветку выражения которое вы ищете в тексте. set hlsearch "Для Win32 версии по нажатию "K" начинается поиск в help файле "if has("win32") " let winhelpfile='windows.hlp' " map K :execute "!start winhlp32 -k <cword> " . winhelpfile <CR> "endif "Прячет курсор мыши во время набора текста set mousehide " Устанавливает приятные цвета " Фон для обычного текста ярко серый " Текст ниже последней строки темно серый " Курсор зеленый " Константы не подчеркиваются но имеют чуть более яркий фон highlight Normal guibg=grey90 highlight Cursor guibg=Green guifg=NONE highlight NonText guibg=grey80 highlight Constant gui=NONE guibg=grey95 highlight Special gui=NONE guibg=grey95 endif </CODE> Смотрите также vimrc используемый для консольного режима vim : /usr/doc/vim-common-5.3/vimrc_example. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Xdefaults параметры <p> Вы можете установить некоторые параметры Vim в файле Xdefaults. <bf> Внимание!! </bf><it>Не используйте <bf>Vim*geometry</bf> это испортит меню gvim, вместо этого используйте <bf>Vim.geometry</bf>.</it> Отредактируйте $HOME/.Xdefaults и поместите туда следующие строки: <CODE> ! Эргономичные цвета для GVim. Vim*useSchemes: all Vim*sgiMode: true Vim*useEnhancedFSB: true Vim.foreground: Black !Vim.background: lightyellow2 Vim*background: white ! Не используйте Vim*geometry , это испортит меню вместо этого используйте ! Vim.geometry. Астерик между Vim и geometry использовать нельзя. ! Vim.geometry: widthxheight Vim.geometry: 88x40 !Vim*font: -cronyx-fixed-medium-r-normal-*-20-200-75-75-c-100-koi8-* Vim*menuBackground: yellow Vim*menuForeground: black </CODE> Чтобы изменения вошли в силу выполните следующие команды - <code> xrdb -merge $HOME/.Xdefaults man xrdb </code> Вы также можете отредактировать файл &tilde/.gvimrc, чтобы изменить цвета <CODE> gvim $HOME/.gvimrc Лучший цвет для фона ярко-желтый (lightyellow) или белый (white) с черным шрифтом. highlight Normal guibg=lightyellow </CODE> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Color Syntax init files --> <sect> Инициализационные файлы световой подсветки <p> Вместо использования меню "Syntax", вы можете отредактировать файл с настройками вручную. При редактировании файла в gvim примените команду : (двоеточие) so. Например: <CODE> gvim foo.pc :so $VIM/syntax/esqlc.vim </CODE> Файлы синтаксиса находятся в /usr/share/vim/syntax/*.vim. Vim поддерживает более 120 различных файлов синтаксиса для различных языков программирования, таких как C++,PERL,VHDL,Javascript,... и так далее!! Каждый файл синтаксиса поддерживает стандартное расширение имени файла, например файл синтаксиса для JavaScript поддерживает расширение *.js. Если вы используете другие расширения, конфликтующие с файлом синтаксиса по умолчанию (например помещаете Javascript в html файл). То вы должны использовать команду подобную этой: so $VIM/syntax/javascript.vim. Лучше всего создать символическую ссылку - <code> ln -s $VIM/syntax/javascript.vim js gvim foo.html (... этот файл содержит javascript функции и HTML) :so js </code> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> VIM Usage --> <sect> Использование VIM <p> Вы можете использовать VIM в двух режимах - один с GUI и другой без GUI. Чтобы использовать GUI,используйте команду - <CODE> gvim foo.cpp </CODE> Чтобы использовать не-gui режим - <CODE> vim foo.cpp или более ортодоксальную форму vi foo.cpp </CODE> Если у вас есть такая возможность, всегда используйте GUI режим, т.к. он поддерживает множество цветов и сильно повысит вашу производительность. GUI режим позволяет делать следующее - <itemize> <item> Вы можете выделять текст с помощью мышки, чтобы копировать, вырезать и вставлять его. <item> Вы можете использовать полосу меню с следующими разделами - File, Edit, Window, Tools, Syntax и Help. <item> Также, в ближайшем будущем, Vim будет включать вторую полосу меню с перечислением открытых файлов, и вы сможете переключаться между файлами щелкая на их именах,а пока вы можете использовать команды vi - :e#, :e#1, :e#2, :e#3, :e#4, ....и так далее, чтобы выбирать файлы. </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Компаньоны Vi --> <sect> Компаньоны Vi <p> Обычно Vim используется совместно с другими мощными инструментами такими как <bf>ctags</bf> и <bf>gdb</bf>. <bf>Ctags</bf> для быстрой навигации сквозь миллионы строк "C/C++" кода и <bf>gdb</bf> для отладки "C/C++" кода. Эта глава посвящена именно этим двум незаменимым инструментам. <p> <bf>Ctags</bf> - это самая мощная и нужная команда для написания программ на C, C++, Java, Perl, Korn/Bourne shell scripts или Fortran. Разработчики широко используют <bf>ctags</bf> для навигации в тысячах функций программ на C/C++. (Смотрите 'man ctags'). Очень <bf>важно</bf>, чтобы вы научились использовать ctags. Это позволит вам эффективно писать программы на C/C++,Java и т.д. Навигации в море кода - одна из самых важных задач во время разработки программ на C/C++. Использование ctags позволит вам решать эту задачу быстро и эффективно. Ctags - позволяет очень быстро читать код, просматривать функции, перескакивая от одной функции к другой. Без такой навигации, вы скорее всего заблудитесь в коде ! <bf>Ctags</bf> - компас для программиста. Использование <bf>ctags</bf> : <code> ctags *.cpp gvim -t foo_function gvim -t main </code> Эти команда откроет программу на C++, которая содержит функцию foo_function() и разместит курсор на первой строке функции foo_function(). Вторая команда, отправит вас на строку в которой определена функция main(). Внутри Vim вы можете перейти к функции введя : (двоеточие) tag < имя функции > как показано ниже: <code> :tag sample_function </code> Эта команда разместит курсор на первой строке функции sample_function() Если вы захотите перейти прямо к функции от строки в файле, которая содержит имя этой функции, поместите курсор перед именем функции и нажмите <bf>CTRL+]</bf>, это отправит вас прямо на строку где начинается искомая функция. <code> // example code switch(id_number) { Case 1: if ( foo_function( 22, "abcef") == 3 ) ^ | | | Разместите курсор здесь (перед foo_function) и нажмите CTRL+] Это отправит вас на начало "foo_function". Чтобы вернуться назад нажмите CTRL+t </code> Чтобы отправиться назад, на исходную строку, нажмите <bf>CTRL+t</bf>. Вы можете нажимать <bf>CTRL+t</bf> несколько раз чтобы вернуться в точку где вы начали навигацию. Таким образом можно "пройти" скозь все функции C/C++ кода. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Ctags для ESQL <p> Т.к. ctags не поддерживают языка Embedded SQL/C (ESQL), то ,для создания тэгов для этого языка, необходим приведенный ниже shell script. ESQL/C - это команды SQL, для управления базой данных,встроенные в C программу. Oracle ESQL/C называется Pro*C и Sybase;для Infomix есть ESQL/C;для PostgreSQL есть "ecpg". <p> Сохраните этот файл как "sqltags.sh" и выполните chmod a+rx tags_gen.sh. <code> #!/bin/sh # Программа для создания ctags для ESQL, C++ и C файлов ESQL_EXTN=pc tag_file1=tags_file.1 tag_file2=tags_file.2 which_tag=ctags rm -f $tag_file1 $tag_file2 tags aa=`ls *.$ESQL_EXTN` #echo $aa for ii in $aa do #echo $ii jj=`echo $ii | cut -d'.' -f1` #echo $jj if [ ! -f $jj.cpp ]; then echo " " echo " " echo "***********************************************" echo "ESQL *.cpp не существуют.. " echo "Вы должны сгенерировать *.cpp из файла *.pc " echo "используя Oracle Pro*C пре-компилятор или Sybase" echo "либо Informix esql/c пре-компилятор." echo "А затем перезапустить эту программу" echo "***********************************************" echo " " exit fi rm -f tags $which_tag $jj.cpp kk=s/$jj\.cpp/$jj\.pc/g #echo $kk > sed.tmp #sed -f sed.tmp tags >> $tag_file1 #sed -e's/sample\.cpp/sample\.pc/g' tags >> $tag_file1 sed -e $kk tags >> $tag_file1 done # Теперь обработаем все C++/C файлы, исключая ESQL *.cpp файлы rm -f tags $tag_file2 bb=`ls *.cpp *.c` aa=`ls *.$ESQL_EXTN` for mm in $bb do ee=`echo $mm | cut -d'.' -f1` file_type="NOT_ESQL" # Exclude the ESQL *.cpp and *.c files for nn in $aa do dd=`echo $nn | cut -d'.' -f1` if [ "$dd" = "$ee" ]; then file_type="ESQL" break fi done if [ "$file_type" = "ESQL" ]; then continue fi rm -f tags $which_tag $mm cat tags >> $tag_file2 done mv -f $tag_file2 tags cat $tag_file1 >> tags rm -f $tag_file1 # Чтобы все работало правильно необходимо отсортировать файл с тэгами .... sort tags > $tag_file1 mv $tag_file1 tags </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Ctags для Javascript программ, оболочек Korn и Bourne <p> Этот shell скрипт может быть использован для генерации тэгов для очень большого количества программ написанных на JavaScript,PHP/FI скрипты,Korn shell,C shell,Bourne shell и многих других. Это очень "стандартный" модуль. Сохраните этот файл как tags_gen.sh и выполните chmod a+rx tags_gen.sh. <code> #!/bin/sh tmp_tag=tags_file tmp_tag2=tags_file2 echo " " echo " " echo " " echo " " echo " " echo "Генерируем тэги для ...." while : do echo " Введите расширение файлов, для которых вы хотите сгенерировать тэги." echo -n " Расширения файлов должны быть заданы как sh, js, ksh, etc... : " read ans if [ "$ans" == "" ]; then echo " " echo "Неверный ввод. Попробуйте еще раз!" else break fi done \rm -f $tmp_tag aa=`ls *.$ans` for ii in $aa do jj=`echo $ii | cut -d'.' -f1` #echo $jj cp $ii $jj.c ctags $jj.c echo "s/$jj.c/$ii/g" > $tmp_tag2 sed -f $tmp_tag2 tags >> $tmp_tag \rm -f tags $jj.c done sort $tmp_tag > tags \rm -f $tmp_tag $tmp_tag2 </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Дебаггер gdb <p> Вы почти наверняка захотите использовать gdb (смотрите 'man gdb') вместе с Vim. Отладка - один из наиболее сложных и трудоемких процессов в программировании. <p> Чтобы использовать gdb, вы должны компилировать программу с опцией -g3. Например: <tscreen><verb> gcc -g3 foo.c foo_another.c sample.c </verb></tscreen> Чтобы легко настроить псевдонимы, сделайте следующее - <tscreen><verb> Настройте псевдоним в вашем: ~/.bash_profile alias gdb='gdb -directory=/home/src -directory=/usr/myname/src ' Выполните - gdb foo.cpp gdb> dir /hom2/another_src Это добавит некоторые файлы к пути поиска gdb> break 'some_class::func<TAB><TAB> Это позволит дополнять имена функции - gdb> break 'some_class::function_foo_some_where(int aa, float bb)' </verb></tscreen> Двойное нажатие TAB приведет к автоматическому завершению командной строки, что сохранит вам массу времени. Чтобы получить помощь во время работы - <tscreen><verb> gdb> help Выдает на экран помощь gdb> help breakpoints Выдает более детальную помощь о breakpoints. </verb></tscreen> Для установки breakpoints и входа в отладку <tscreen><verb> unixprompt> gdb exe_filename gdb> b main Это поместит breakpoint на функции main() gdb> b 123 Это поместит breakpoint на 123й строке текущего файла </verb></tscreen> Чтобы проанализовать core используйте - <tscreen><verb> unixprompt> gdb exe_filename core gdb> bt Начинает трассировку тех строк программы где произошла ошибка gdb> help backtrace Выдает более детальную помощь о режиме backtrace. </verb></tscreen> <p> Вы также можете использовать GUI версию gdb называемую xxgdb. <p> Инструменты для отслеживания "утечек" памяти - <itemize> <item> Бесплатный Electric Fence доступный почти в любом дистрибутиве, <item> Коммерческий Purify <url url="http://www.rational.com"> <item> Insure++ <url url="http://www.insure.com"> </itemize> <p> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Online VIM help --> <sect> Как получить помощь по vim <p> Просмотрите man страницы по vim. Для этого введите <bf>'man vim'</bf> и <bf>'man gvim'</bf> Или внутри gvim дайте команду :help, чтобы просмотреть страницу помощи. Смотрите также <ref id="Vim Tutorial"> <tscreen><verb> VIM - главный файл помощи Перемещение: Используйте клавиши со стрелками, или "h" чтобы переместиться влево, "j" вниз, "k" вверх, "l" вправо. ":1" переход на первую строку страницы ":n" переход на строку номер n "<SHIFT>g" переход на край страницы ":/someword/ найдет "someword" в документе Закрыть это окно: Используйте ":q<Enter>". Перейти к секции: Разместите курсор на тэге между | | и нажмите CTRL-]. С помощью мышки: ":set mouse=a" чтобы включить мышку (в xterm или GUI). Двойной щелчок на тэге между ||. Вернуться назад: Введите CTRL-T или CTRL-O. Специфичная помощь: Можно отправиться прямо к секции,которая вас интересует, указав в команде ":help" аргумент. Также возможно более конкретно задать что вам необходимо: Что База Пример ~ Команды нормального режима (нет) :help x Команды визуального режима v_ :help v_u Команды режима вставки i_ :help i_<Esc> Команда командной строки : :help :quit Редактирование командной строки c_ :help c_<Del> Аргументы команд vi - :help -r опции ' :help 'textwidth' Список файлов документации: |howto.txt| как делать большинство простых вещей |intro.txt| введение в Vim |index.txt| алфавитный индекс для каждого режима |autocmd.txt| автоматическое выполнение команд при каких либо событиях |change.txt| удаление и замещение текста </verb></tscreen> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Домашняя страница Vim и полезные ссылки --> <sect> Домашняя страница Vim и полезные ссылки <p> Домашняя страница Vim <url url="http://www.vim.org"> <newline> Зеркало в США <url url="http://www.us.vim.org"> Vim FAQ <url url="http://www.grafnetix.com/~laurent/vim/faq.html"> и на <url url="http://www.vim.org/faq"> Страница "Eli's Vim Page" <url url="http://www.netusa.net/~eli/src/vim.html"> Cтраница "Vi Lovers Home Page" <url url="http://www.cs.vu.nl/~tmgil/vi.html"> Справочное пособие по Vim <url url="http://scisun.sci.ccny.cuny.edu/~olrcc/vim/"> Список рассылки Vim <url url="http://www.findmail.com/listsaver/vimannounce.html"> и <url url="http://www.vim.org/mail.html"> Архивы списков рассылки: <itemize> <item> <url url="http://www.egroups.com/group/vim"> <item> <url url="http://www.egroups.com/group/vimdev"> <item> <url url="http://www.egroups.com/group/vimannounce"> </itemize> Макросы Vim <url url="http://www.grafnetix.com/~laurent/vim/macros.html"> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Vim Tutorial <label id="Vim Tutorial"> --> <sect> Пособие по Vim <label id="Vim Tutorial"> <p> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Vim Hands-on Пособие <label id="vimhandson"> --> <sect1> Vim Пособие <label id="vimhandson"> <p> На Линукс системе просмотрите пособие /usr/doc/vim-common-5.*/tutor,на других unix системах отправьтесь в директорию где установлен vim и поищите директорию doc. <code> cd /usr/doc/vim-common*/tutor less README.txt cp tutor $HOME cd $HOME less tutor </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Vi Пособия в Internet<label id="vimurls"> <p> <itemize> <item> Purdue University <url url="http://ecn.www.ecn.purdue.edu/ECN/Documents/VI/"> <p> <item> Quick Vi tutorial <url url="http://linuxwww.db.erau.edu/LUG/node165.html"> <p> <item> Advanced Vi tutorial <url url="http://www.yggdrasil.com/bible/bible-src/user-alpha-4/guide/node171.html"> <p> <item> Tutorials <url url="http://www.cfm.brown.edu/Unixhelp/vi_.html"> <p> <item> Tutorials <url url="http://www.linuxbox.com/~taylor/4ltrwrd/section3_4.html"> <p> <item> Unix world online vi tutorial <url url="http://www.networkcomputing.com/unixworld/unixhome.html"> <p> <item> Univ of Hawaii tutorial <url url="http://www.eng.hawaii.edu/Tutor/vi.html"> <p> <item> InfoBound <url url="http://www.infobound.com/vi.html"> <p> <item> Cornell Univ <url url="http://www.tc.cornell.edu/Edu/Tutor/Basics/vi/"> <p> <item> Vi Lovers home page: <url url="http://www.cs.vu.nl/~tmgil/vi.html"> <item> Ater Sept 2000, will moveto <url url="http://www.thomer.com/thomer/vi/vi.html"> <p> <item> Beginner's Guide to vi <url url="http://www.cs.umr.edu/unixinfo/general/packages/viguide.html"> <p> <item> vi Help file <url url="http://www.vmunix.com/~gabor/vi.html"> <p> <item> vim FAQ <url url="http://www.math.fu-berlin.de/~guckes/vim/faq/"> </itemize> В интернет существует огромное число пособий по Vi. Поищите их, используя какую нибудь из поисковых машин. <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Руководство по Vi <label id="vimtut"> --> <sect> Руководство по Vi <label id="vimtut"> <p> В этом пособии,описываются некоторые "продвинутые" команды и концепции <bf>vi</bf>, так, чтобы вы могли оценить всю мощь <bf>vi</bf> и продумать какие команды вам необходимо изучить в первую очередь. Почти все руководства по <bf>vi</bf> перечисляют доступные команды, но не показывают их взаимосвязи;это и есть основное предназначение данного руководства. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Команды перемещения курсора <p> Команды <bf>vi</bf> для перемещения курсора,позволяют позиционировать курсор в файле и/или на экране эффективно,с минимальным количеством нажатий клавиш. Существует огромное количество команд перемещения курсора - не пытайтесь запомнить их все сразу ! Позже вы увидите,что мощь <bf>vi</bf> заключается в комбинации команд передвижения курсора с командами для удаления,изменения,копирования и фильтрования текста. Пожалуйста выберите какой нибудь большой текст,чтобы вы смогли проэкспериментировать с каждой из описанных команд. Также помните,что эти команды будут работать только в командном режиме,не в режиме вставки;если вы начали вводить эти команды прямо в текст - нажмите ESC чтобы вернуться в командный режим. <itemize> <item> <bf>Клавиши-стрелки</bf> : Клавиши со стрелками перемещают курсор на одну позицию влево,вправо,вверх или вниз. Перемещение выше начала файла,ниже его последней линии или перемещение влево или вправо (автоматический перенос) за край строки не разрешены. <p> <item> <bf>hjkl</bf> : Когда <bf>vi</bf> был написан (примерно в 1978), многие терминалы на UNIX системах не имели клавиш-стрелок! <bf>h, j, k,</bf> и <bf>l</bf> были выбраны как команды для перемещения влево,вниз,вверх и вправо соотвественно. Попробуйте их! Большинство <bf>vi</bf> профессионалов предпочитают их, курсорным клавишам потому-что <itemize> <item><bf>(а)</bf> они располагаются одинаково на всех типах клавиатуры, и <item><bf>(б)</bf> они приятней для пальцев, чем большинство курсорных клавиш, которые расположены ввиде "T" или другой нелинейной форме. </itemize> Почему h, j, k, и l? Хорошо, в наборе символов ASCII , CTRL-H это backspace (перемещение влево), CTRL-J это linefeed (перемещение вниз), и, конечно, k и l расположены за h и j,поэтому их легко запомнить. <p> <item> <bf>0</bf> : ("ноль", не "о") Перемещает курсор к началу текущей линии. (Чтобы попробывать эту и несколько последующих команд,используйте <bf>h j k l</bf> или клавиши со стрелками,чтобы перейти к строке с отступом,которая содержит несколько "е". Если вы не найдете такой строки - создайте её сами, вставив несколько пробелов в начало строки. <p> <item> <bf> ^ </bf> : Передвигает курсор на первый символ,не являющийся пробелом,в текущей строке.(Для строки с отступом, команды 0 и ^ действуют по разному). <p> <item> <bf> $ </bf> : Перемещает курсор на последний символ текущей строки. <p> <item> <bf> tC </bf> : Передвигает к (не "на") следующий символ "c" в текущей строке. (Нажмите 0, а затем te. Это переместит вас к первой "e" в текущей строке.) <p> <item> <bf> fC </bf> : Находит (перемещает "на") первый символ "c" в текущей строке. (Нажмите fe, и курсор найдет (переместиться на позицию) следующего символа "e" в текущей строке.) <p> <item> <bf> TC </bf> : Передвигает к (но не "на") преведущий символ "c" в текущей строке. (Нажмите $, затем Te.) <p> <item> <bf> FC </bf> : Находит (передвигает "на") преведущий "c" в текущей строке. (Нажмите Fe.) <p> <item> <bf> n| </bf> : Передвигает к колонке к колонке n в текущей строке. (Попробуйте 20 |. Цифры 2 и 0 не будут отображаться во время ввода, но когда вы нажмете | курсор переместиться к колонке 20.) Попробуйте поэксперементировать с t f T F |. Когда вы сделаете что нибудь неправильное,<bf> vi</bf> сообщит вам о этом звуковым сигналом. <p> <item> <bf> w </bf> : Перемещает курсор вперед к началу следующего "маленького" слово ("маленькое" слово - состоит из символов алфавита и цифр не "разорванных" пробелом или знаков пунктуации, но не их смеси). Попробуйте нажать w несколько раз,чтобы понять как работает эта команда. <p> <item> <bf> W </bf> : Перемещает курсор вперед к началу следующего "большого слова"(смесь алфавитно-цифровых символов и пунктуации). Попробуйте применить эту команду несколько раз. <p> <item> <bf> b </bf> : Назад к началу "маленького" слова. <p> <item> <bf> B </bf> : Назад к началу "большого" слова. <p> <item> <bf> e </bf> : Вперед к концу "маленького" слова. <p> <item> <bf> E </bf> : Вперед к концу "большого" слова. <p> <item> <bf> + Enter </bf> : Передвигает курсор к первому символу (не пробелу) на следующий строке. (+ и Enter имеют одинаковый эффект) <p> <item> <bf> - </bf> : Передвигает курсор к первому символу (не пробелу) на преведущей строке. <p> <item> <bf> ) </bf> : Перемещает курсор к концу предложения. (Предложение кончается либо на пустой строке либо точкой или вопросительным/восклицательным знаком после которых идут два пробела,или на конце строки. Точка или восклицательный знак с пробелом после них,не заканчивают предложение;это корректное поведение,основанное на классических правилах составления печатных документов,хотя оно часто кажеться неправильным людям, которые не когда не изучали правила набора.) <p> <item> <bf> ( </bf> : Перемещает курсор к началу предложения. <p> <item> <bf> } </bf> : Перемещает курсор к концу параграфа. (Параграфы разделяются пустыми строками по определению,используемому <bf>vi</bf>) <p> <item> <bf> { </bf> : Перемещает курсор к началу параграфа. <p> <item> <bf> H </bf> : Отправляет курсор на первую строку видимую на экране. <p> <item> <bf> M </bf> : Отправляет курсор на среднюю строку видимую на экране. <p> <item> <bf> L </bf> : Передвигает курсор к последней строке видимой на экране. <p> <item> <bf> nG </bf> : Перемещает курсор на строку n. Если n не задано, передвигает на последнюю строку файла. (Например: попробуйте 15G чтобы перейти к 15й линии. Комбинация CTRL-G отображает имя файла, некоторую информацию о нем, и номер текущей строки. Чтобы перейти к началу файла нажмите: 1G) <p> <item> <bf> CTRL-d </bf> : Скроллирует вниз половину экрана (смотрите примечание). <item> <bf> CTRL-u </bf> : Скроллирует вверх половину экрана (смотрите примечание). <item> <bf> CTRL-f </bf> : Перемещает курсор вперед на один экран (смотрите примечание). <item> <bf> CTRL-b </bf> : Перемещает курсор на один экран назад (смотрите примечание). <item> <bf> Примечание </bf> : Эти четыре команды для скроллинга не могут быть использованы совместно с командами удаления,изменения,копирования или фильтрования. <p> <item> <bf> /регулярное_выражение </bf> : Перемещает курсор к следующему регулярному выражению. Когда вы нажимаете /,курсор перемещается на командную строку и <bf>vi</bf> ждет ввода выражения Нажмите Enter чтобы завершить ввод;<bf>vi</bf> начнет поиск регулярного выражения вперед по тексту. Например введите /ро и нажмите Enter. Это передвинет курсор к первому "ро" встреченному при поиске вперед по тексту. Если вы просто введете / и нажмете Enter - <bf>vi</bf> начнет поиск выражение которые вы искали в последний раз. <p> <item> <bf> n </bf> : Имеет тот же эффект что и нажатие / и Enter; т.е., ищет то выражение которое было аргументом для команды поиска в последний раз. <p> <item> <bf> ?регулярное_выражение </bf> : Ищет в обратном направлении. Если регулярное выражение не указано то производиться поиск аргумента последней операции поиска. Обе операции поддерживают автоматический перенос,т.е. поиск за "границами" файла разрешен. <p> <item> <bf> N </bf> :Тоже самое что ? и Enter. </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Коэффициент повторения <p> Многие из приведенных выше команд перемещения курсора могут быть предварены коэффициентом повторения;в таком случае команда просто повторяется несколько раз. <itemize> <item> <bf> 3w </bf> : Передвигает курсор вперед на три слова <item> <bf> 5k </bf> : Переходит вверх на пять символов <item> <bf> 3fa </bf> : Находит третье "а" в текущей строке <item> <bf> 6+ </bf> : Переходит вниз на шесть линий </itemize> Для некоторых комманд коэффициент повторения имеет особое значение. <itemize> <item> <bf> 4H </bf> : Переходит на четвертую строку видимую на экране <item> <bf> 8L </bf> : Переходит к восьмой строке от края(низа) экрана <item> <bf> 3$ </bf> : Переходит к концу третьей строки (вниз) </itemize> Для некоторых комманд (например, ^) коэффициент повторения игнорируется; для других (например., / и ? ) он применяться не может. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Удаление текста <p> Мы уже видели,что <bf>dd</bf> удаляет текущую строку. Эту команду можно использовать совместно с коэффициентом повторения: 3dd удаляет три строки, текущую и две следующих. Команда d может быть использована совместно с практически любой командой перемещения по тексту, что позволяет удалять произвольные фрагменты текста. При использование совместно с d команды перемещения называются спецификаторами цели. (во время экспериментов со следующими примерами, не забывайте нажимать u чтобы восстанавливать то-что вы удалили). <itemize> <item> <bf> dw </bf> : Удаляет следующее "маленькое" слово <item> <bf> d3w </bf> : Удаляет три следующих "маленьких" слова <item> <bf> 3dw </bf> : Три раза удаляет следующее "маленькое" слово <item> <bf> 3d3w </bf> : Три раза удаляет три следующих "маленьких" слова (т.е. удаляет девять "маленьких" слов) <item> <bf> d+ </bf> : Удаляет текущую строку и следующую за ней <item> <bf> d/the </bf>: Удаляет текст начиная с текущего положения курсора вплоть до первого встреченного "the", не включая его . <item> <bf> d$ </bf> : Удаляет до конца строки <item> <bf> d0 </bf> : Удаляет до начала строки <item> <bf> d30G </bf> : Удаляет от текущей строки до 30 строки (включая её) <item> <bf> dG </bf> : Удаляет от текущей строки до последней (включая её) <item> <bf> d1G </bf> : Удаляет от текущей строки до строки номер 1 (включая её) </itemize> Для удаления одного символа используйте x. x можно использовать совместно с коэффициентом повторения. <itemize> <item> <bf> 15x </bf> : Удаляет текущий и 14 последующих символов </itemize> x на самом деле - макрос для d1; удаление одного символа. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Изменение текста <p> Команда c в основном идентична d, исключая то,что она переключает <bf>vi</bf> в режим вставки,позволяя изменить изначальный текст на что то другое. Например : разместите курсор на начале какого-либо слова (нажмите w чтобы перейти к началу следующего слова). Затем нажмите cw , чтобы изменить это слово.На экране последний символ заменяемого слова будет изменен на <bf>$</bf>, индицирующий границы производимых изменений; попробуйте ввести новое слово и нажмите ESC когда закончите.Новый фрагмент текста может быть длинее/короче чем тот который был удален. Поместите курсор на начале строки содержащей как минимум три слова, и попробуйте c3w для изменения этих слов. Попробуйте $ чтобы изменить текст до конца текущей строки. Во всех случаях когда изменение касается только текущей строки конец изменяемого текста помечается символом $. Когда изменение касается не только текущей строки,<bf>vi</bf> удаляет оригинальный текст и переходит в режим вставки. Например попробуйте c3+ для изменения текущей и трех последующих строк;<bf>vi</bf> удалит четыре оригинальных строки на экране и перейдет в режим вставки на новой пустой строке. Как и обычно нажмите ESC чтобы вернуться в командный режим. Некоторые примеры команд изменения: <itemize> <item> <bf> cc </bf> : Изменяет текущую строку <item> <bf> 5cc </bf> : Изменяет пять строк (текущую и четыре следующие) <item> <bf> c/the </bf> : Изменяет текст с текущего символа вплоть до (но не включая) следующего встреченного в тексте the <item> <bf> c$ </bf> : Изменяет до конца строки <item> <bf> c30G </bf> : Изменяет от текущей до строки номер 30, включая её <item> <bf> cG </bf> : Изменяет от текущей до последней строки, включая её <item> <bf> c1G </bf> : Изменяет от текущей строки до строки номер 1, включая её </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Копирование текста <p> Команда y копирует фрагмент текста в буфер;из буфера скопированный текст может быть вставлен в любую часть файла используя команду p или P. Самая простая форма копирования - скопировать текущую строку;введя yy, попробуйте p, чтобы вставить копию скопированной строки после курсора. Вы можете вставить эту строку в файл столько раз, сколько это необходимо, перемещаясь по файлу и нажимая p. Чтобы скопировать множество строк, попробуйте, например, 5yyy (копирует текущую строку и следующие четыре строки). p вставляет скопированные линии после курсора; команда 5yyp "работает" но вероятно не делает того, что вам необходимо. Команда P делает тоже что и p, но помещает копию скопированного текста перед курсором; попробуйте эту последовательность - 5yyP. Другие команды для вставки: <itemize> <item> <bf> y3w </bf> : Копирует три слова <item> <bf> y$ </bf> : Копирует до конца текущей строки <item> <bf> y1G </bf> : Копирует от текущей и до строки номер 1 (включая её) </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Фильтрование текста <p> Команда фильтрования <bf>vi</bf>, запрашивает у пользователя имя команды UNIX (которая должна быть фильтром), затем пропускает выбранные строки сквозь фильтр,заменяя эти строки на строки обработанные фильтром. Возможность <bf>vi</bf> по фильтрованию произвольных фрагментов текста, через любой UNIX фильтр, добавляет гибкость и значительно расширяет ваши возможности по редактированию текста, без "дополнительной платы" в виде размера или производительности самого <bf>vi</bf>. Несколько примеров помогут это проиллюстрировать. Создайте строку в вашем файле, содержащую слово who и ничего более. Поместите курсор на эту строку и нажмите <bf>!!</bf>. Эта команда похожа на dd,cc или yy но вместо удаления,изменения или копирования текущей строки,она фильтрует её. Когда вы нажимаете ! второй раз,курсор переходит на командную строку и в ней высвечивается подсказка !,приглашающая вас ввести название фильтра. В качестве имя фильтра введите sh и нажмите Enter. <bf>sh</bf> (Bourne shell) это фильтр! Он считывает команды со стандартного ввода, исполняет их и выдает результат исполнения на стандартный вывод. Команда who будет выполнена и в качестве результата выдаст список пользователей подключенных в данный момент к системе. В итоге вы получите этот список прямо в вашем файле, вместо слова who. Попробуйте проделать то же самое с <bf>date</bf>. Создайте строку содержащую только слово <bf>date</bf>, затем поместите курсор на этой строке, введите <bf>!!sh</bf> и нажмите Enter. Строка будет заменена на вывод команды <bf>date</bf> Поместите ваш курсор на какую-нибудь строку. Отсчитайте несколько строк, скажем 6. Введите <bf>6!!sort</bf> и нажмите Enter. Оригинальные 6 строк будут заменены на вывод команды <bf>sort</bf>. Команду фильтрования можно применять только на всей строке сразу, но не на отдельных словах или символах. Некоторые другие команды фильтрования (здесь, < CR > означает - нажмите Enter): <itemize> <item> <bf>!/the < CR > sort < CR ></bf> : Сортирует текст от текущей строки до следующей строки содержащей the. <item><bf> !1Ggrep the < CR ></bf> :Уничтожает все строки от текущей до 1й (включая её), если они не содержат the. <item><bf> !Gawk '{print $1}' < CR > </bf>: Оставляет от всех строк (начиная с текущей и до конца файла) только первое слово. </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Установка пометок <p> Вы можете выделить фрагмент текста, чтобы переместить,удалить,изменить,скопировать или отфильтровать его используя команду mc. Например разместите курсор в центре какого-либо слова и нажмите ma. Это пометит символ под курсором меткой a. Теперь переместите курсор с помеченного символа в другое место (используйте клавиши со стрелками или CTRL-u). Чтобы вернуться к помеченной строке нажмите 'a (одинарная скобка и a). Это переместит курсор на первый символ (не пробел) на помеченной строке. Вновь уберите курсор с этой строки. Чтобы вернуться к помеченному символу нажмите `a (обратная одинарная скобка и a). Это поместит курсор поверх символа помеченного как a. Установка меток обычно используется для его удаления,изменения,копирования или фильтрования. Например : переместите курсор на строку без метки и нажмите d'a (d,одинарная скобка,a). Эта команда удалит все начиная от текущей строки и заканчивая строкой с меткой. Поместите курсор в центре какого-либо слова и нажмите mb чтобы установить метку b. Отодвиньте курсор на несколько строк и нажмите d`b (d,обратная одинарная скобка,b). Эта команда удалит все начиная от текущего положения курсора и заканчивая помеченным символом (включая его). Другой пример : для сортировки вывода команды who, поставьте метку на первой строке вывода (ma), затем передвиньте курсор на последнюю строку и введите !'asort и нажмите Enter. Если после того как вы перешли к метке вы захотите вернуться назад,нажмите '' чтобы вернуться к строке или '' чтобы вернуться к символу. <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Назначение имени буферам <p> Когда вы удаляете,изменяете или копируете текст, оригинальный текст сохраняется (до следующей операции удаления, изменения или копирования) в безымянном буфере, из которого его можно извлечь с помощью p или P. Таким образом, в восстановить из безымянного буфера можно лишь недавно помещенный туда текст. Если вы хотите удалить,изменить или скопировать несколько секций текста и при этом сохранить их все (вплоть до максимально возможных 26), вы можете задать имя буфера перед командой удаления или копирования.Имя буфера имеет следующий синтаксис "c (двойные кавычки и c). Например введите "ayy чтобы скопировать текущую строку в буфер с именем a,затем перейдите на другую строку и нажмите "byy чтобы скопировать её в буфер b. Теперь перейдите в другое место в файле и нажмите "ap и "bp чтобы вставить содержимое буферов a и b. Несколько других команд использующих буфер: <itemize> <item> <bf> "a6yy </bf> : Копирует шесть строк (текущую и пять следующих) в буфер a <item> <bf> "bd1G </bf> : Удаляет все строки от текущей до первой (включая её),и размещает их в буфере b. <item> <bf> "cy'c </bf> : Копирует текст начиная с текущей строки вплоть до строки отмеченной c и помещает скопиррованый фрагмент в буфер c. (отметки и буферы не связаны друг с другом и могут иметь одинаковые имена). </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Замещение текста <p> Чтобы заместить один фрагмент текста другим используйте команду :s. Несколько примеров: <itemize> <item> <bf> :1,$s/the/THE/g </bf> Начиная с первой строки до последней (строки $), заместить все встреченные the на THE (g - означает глобальную замену) <item> <bf> :'a,.s/.*/ha ha/ </bf> От строки помеченной как a до текущей (строки .), заменить любой текст на строку "ha ha". </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Команды начинающиеся с двоеточия <p> Когда вы вводите двоеточие в командном режиме,курсор автоматически перемещается на командную строку и ждет ввода команды. Некоторые примеры таких команд: <itemize> <item><bf>:w </bf> Записывает содержимое буфера в файл без выхода из <bf>vi</bf> <item><bf>:w abc </bf> Записывает содержимое буфера в файл abc (если его нет он будет создан,иначе - перезаписан.) не выходя из <bf>vi</bf> <item><bf>:1,10w abc </bf>Записывает строки с 1 по 10 в файл abc <item><bf>:'a,$w abc </bf>Записывает строки от строки, помеченной как "a", до последней строки abc <item><bf>:e abc </bf> Загружает для редактирования файл abc, вместо текущего файла. Выдает ошибку если изменения в текущем файле не были сохранены. <item><bf>:e! abc </bf>Загружает для редактирования файл abc, не обращая внимание на несохраненные изменения в текущем файле. <item><bf>:e # </bf> Загружает для редактирования предшествующий файл (команда :e# следующий) <item><bf>:f abc </bf>Изменяет имя текущего буфера <bf>vi</bf> на abc <item><bf>:q </bf>Выходит из редактора, если нет несохраненных изменений <item><bf>:q! </bf>Выходит и уничтожает при этом все несохраненные изменения <item><bf>:r abc </bf>Считывает файл abc в текущий буфер <bf>vi</bf>, и размещает его за курсором. <item><bf>:!cmd </bf>Выполняет команду (who, sort, ls, etc.) </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Установка опций <p> Существует множество опций которые влияют на работу <bf>vi</bf>. Вы можете отобразить все доступные опции с помощью команды :set all. Вы также можете использовать команду set для установки различных опций. Например если вы хотите чтобы для строк в файле отображались их порядковые номера, используйте команду ":set number". Чтобы отключить отображение номеров строк введите ":set nonumber". Для указания большинства опций можно использовать аббревиатуры, например ":set nu" - включит нумерацию строк, а ":set nonu" отключит её. Если вы установите ":set nomagic", то символы регулярных выражений имеющие специальное значение (период,астерик,квадратные скобки и т.д.) будут восприниматься как обычные. Используйте ":set magic" чтобы вернуть все назад. Некоторые опции могут иметь параметры. Например ":set tabstop=4" заставит символ табуляции отображаться как четыре пробела, вместо обычных восьми. Если вы хотите чтобы ваши опции сохранились и при следующем сеансе работы,вы можете поместить их в файл ".exrc",или установить переменную окружения EXINIT соответствующим образом. Например если в качестве shell вы используете Bourne shell,вы можете разместить в вашем .profile такую строчку. <code> EXINIT='set nomagic nu tabstop=4'; export EXINIT </code> Если вы используете C shell, необходимо разместить следующую строку в вашем .login файле. <code> setenv EXINIT 'set nomagic nu tabstop=4' </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Настройка клавиатурных комбинаций <p> Если вам приходиться выполнять серию простых команд опять и опять, то вы можете назначить этим командам определенную клавиатурую комбинацию (из неиспользуемых) с помощью команды :map. Например следующая команда настраивает CTRL-А для передвижения курсора на 55 строк вперед, затем назад на самую последнюю пустую строку,на изменение этой командной строки на formfeed (CTRL-L) и три пустых строки. Т.е. CTRL-A отформатирует следующую страницу, без разделения параграфов между страницами. Примечание: В этой строке каждый символ, который нужно нажимать совместно с CTRL показан как ^С, где С это большая буква. Например, СTRL-M показано как ^M. Также во время ввода вы не увидете ^V, т.к. СTRL-v нужно для того, чтобы подавить управляющее значение следующей за ним комбинации клавиш. Т.е. при вводе ^V^M вы увидете на экране лишь ^M(соотвествует Enter). ^[ соотвествует ESC. <code> :map ^A 55+?^$^V^Mcc^V^L^V^M^V^M^V^M^V^[ </code> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Редактирование нескольких файлов <p> Вы можете редактировать несколько файлов, задав их имена как аргументы при запуске <bf>vi</bf>. <code> vi croc fatherw wknight </code> Для перемещения между файлами используются две команды: <itemize> <item><bf> :n </bf>Перейти к следующему файлу в списке аргументов (вы должны сохранить изменения при помощи :w или <bf>vi</bf> выдаст сообщение о ошибке) <item><bf> :rew </bf>Перейти к редактированию первого файла в списке аргументов. </itemize> Команды :n и :rew, в каком то смысле неповоротливы, но они предоставляют несколько весьма полезных возможностей: содержимое поименованных буферов ("a,"b и т.д.) запоминается глобально, и вы сможете использовать :n и :rew команды совместно с p или P, чтобы копировать текст из одного файла в другой. Более того, запрос поиска, также запоминается глобально, и вы сможете искать одну строку в нескольких файлах. Попробуйте провести следующий эксперимент: Выйдете из <bf>vi</bf>, запустите <bf>vi</bf> с croc и wknight в качестве аргументов: <code> $ vi croc wknight </code> В файле croc, найдите <bf> /the < CR > </bf> Скопируйте это в буфер a: <bf> "ayy </bf> Перейдите к следующему файлу (мы не сделали никаких изменений в croc,поэтому это сработает): <bf> :n < CR > </bf> Проведем поиск еще раз, использовав в качестве аргумента поиска преведущий образец. <bf> n </bf> Поместите копию буфера a после текущей строки в wknight: <bf> "ap </bf> Перейдите на две строки вниз, и скопируйте текущую строку в буфер b: <bf> jj"byy </bf> Сохраним изменения в wknight <bf> :w < CR > </bf> Теперь вернемся к croc <bf> :rew < CR > </bf> Произведем поиск еще раз и разместит копию буфера b после найденной линии: <bf> n"bp </bf> Сохраним изменения и выйдем из <bf>vi</bf> <bf> ZZ </bf> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Финальные замечания <p> Это пособии представляет некоторые возможности <bf>vi</bf> которые вы могли пропустить или не понять читая пособие по <bf>vi</bf> установленное в вашей системе.(на различных системах встречаются разные пособия). Вы не станете экспертом по <bf>vi</bf> после чтения этого пособия,но вы ,по крайней мере, сможете оценить его возможности. Только время и тренировка могут сделать вас экспертом. Но универсальность и эффективность <bf>vi</bf> стоят этих усилий. Вы можете решить что вы ненавидите <bf>vi</bf>. Но не забывайте что это единственный редактор доступный практически на любой UNIX системе, поэтому необходимо знать хотя бы самый минимум его команд. <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt> Vim Reference Card <label id="vimref"> --> <sect> Справочник по командам vi <label id="vimref"> <p> <sect1> Режимы Vi <p> Vi имеет 3 режима: <enum> <item> <bf><it>командный режим</it></bf> - Включается при запуске vi; для перехода в командный режим из других режимов (используйте <bf>ESC</bf>) <item> <bf><it>режим ввода</it></bf> - активируется специальными командами <bf>a i A I o O c C s S R </bf> и выключается при помощи <bf>ESC</bf> или в случае ошибки. <item> <bf><it>линейный режим</it></bf> - т.е. ожидание ввода команд после нажатия <bf>: </bf>, <bf>/ </bf>, <bf>? </bf>или <bf>! </bf> (выключается с <bf>CR</bf>, обрывается с помощью <bf>CTRL-c</bf>). <bf>CTRL</bf> это клавиша control: <bf>CTRL-c</bf> означает "control c" </enum> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Команды Shell <p> <enum> <item> <bf>TERM=</bf> <it>code</it> Помещает имя вашего терминала в переменную <bf>TERM</bf> <item> <bf>export TERM</bf> Передаёт значение переменной <bf>TERM</bf> (код терминала) любой программе в UNIX системе. <item> <bf>tput init</bf> Инициализирует терминал таким образом, чтобы он функционировал правильно с различными UNIX программами. <item> <bf>vi </bf> <it>filename</it> Запускает <bf>vi</bf> и загружает на редактирование указанный файл. <item> <bf>vi </bf> <it>file1 file2 file3</it> Записывает в буфер <bf>vi</bf> три файла для последующего их редактирования. Эти файлы <it>file1, file2,</it> и <it>file3</it>. <item> <bf>view </bf> <it>file</it> Загружает файл <it>file</it> в режиме только-для-чтения. <item> <bf>vi -R </bf> <it>file</it> Аналогично преведущей команде. <item> <bf>vi -r </bf> <it>file</it> Восстанавливает <it>file</it> и последние изменения после краха системы. </enum> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Установка параметров <p> <enum> <item> <bf>:set</bf> <it>опция</it> Активизирует <it>опцию</it> <item> <bf>:set</bf> <it>опция=значение</it> Назначает <it>значение</it> для <it>опции</it> <item> <bf>:set no</bf> <it>опция</it> Деактивирует <it>опцию</it> <item> <bf>:set </bf> Показывает опции установленные пользователем. <item> <bf>:set all</bf> Показывает все опции, как установленные пользователем, так и опции "по умолчанию". <item> <bf>:set </bf> <it>опцию</it>? Показывает значение <it>опции</it> </enum> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Используемые обозначения <p> <enum> <item> <bf>CTRL-c</bf> <bf>CTRL</bf> Это клавиша control: <bf>CTRL-c</bf> означает "control c" <item> <bf>CR</bf> символ возврата каретки (клавиша ENTER) </enum> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Обрывание и отмена <p> <itemize> <item> <bf>ESC</bf> Обрывает ввод неправильно или неполностью введенной команды <item> <bf>CTRL-?</bf> <bf>CTRL</bf> это клавиша control : <bf>CTRL-?</bf> означает "control ?" удаляет или стирает прерывание. <item> <bf>CTRL-l</bf> обновляет экран если CTRL-? замусорила его. </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Манипуляции с файлами <p> <itemize> <item> <bf>ZZ</bf> Сохраняет файл и выходит из vi <item> <bf>:wq</bf> Сохраняет файл и выходит из vi <item> <bf>:w</bf> Записывает файл <item> <bf>:w!</bf> Записывает файл даже если он защищен от записи <item> <bf>:w<it>имя</it></bf> Записывает файл по именем <it>имя</it> <item> <bf>:q</bf> Выходит из vi <item> <bf>:q!</bf> Выходит из vi (независимо от того были ли внесены изменения) <item> <bf>:e имя</bf> Загружает для редактирования файл под именем <it>имя</it> <item> <bf>:e!</bf> Перезагрузить файл,стирая любые изменения которые были внесены <item> <bf>:e + name</bf> Загружает для редактирования файл под именем <it>имя</it>, начиная с конца. <item> <bf>:e + n</bf> Начинает редактирование со строки номер <it>n</it> <item> <bf>:e #</bf> Редактирует альтернативный файл <item> <bf>:n</bf> Редактирует следующий файл в списке файлов <item> <bf>:args</bf> Показывает файлы в текущем списке файлов <item> <bf>:rew</bf> Обновить текущий список файлов и начать редактировать первый файл. <item> <bf>:n args</bf> Указать новый список файлов <item> <bf>:f </bf> Показывает имя текущего файла и номер строки <item> <bf>CTRL-G</bf> Синоним для :f <item> <bf>:ta tag </bf> to tag file entry <it>tag</it> <item> <bf>CTRL-] </bf> :ta, следующее слово - тэг </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Перемещение <p> <itemize> <item> <bf>Arrows</bf> Перемещают курсор <item> <bf>CTRL-d</bf> Скроллирует полстраницы вниз <item> <bf>CTRL-u</bf> Скроллирует полстраницы вверх <item> <bf>CTRL-f</bf> Скроллирует целую страницу вниз <item> <bf>CTRL-b</bf> Скроллирует целую страницу вверх <item> <bf>:0</bf> Переходит к началу файла <item> <bf>:n</bf> Переходит к строке номер n <item> <bf>:$</bf> Переходит к концу файла <item> <bf>0</bf> Переходит к началу строки <item> <bf>^</bf> Переходит к первому символу, не пробелу <item> <bf>$</bf> Переходит к концу строки <item> <bf>CR</bf> Переходит к началу следующей строки <item> <bf>-</bf> Переходит к началу преведущей строки <item> <bf>%</bf> Находит соответствующую скобку <item> <bf>G </bf> Переходит к строке (по умолчанию - к последней строке) <item> <bf>&rsqb&rsqb </bf> Следующая секция/функция <item> <bf>&lsqb&lsqb </bf> Преведущая секция/функция </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Позиционирование по строкам <p> <itemize> <item> <bf>H </bf> Первая строка экрана <item> <bf>L </bf> Последняя строка экрана <item> <bf>M </bf> Средняя строка экрана <item> <bf>+ </bf> Следующая строка, первый символ не являющийся пробелом <item> <bf>- </bf> Предшествующая строка, первый символ не являющийся пробелом <item> <bf>CR </bf> возврат, тоже что и + <item> <bf>j </bf> Следующая строка, таже колонка <item> <bf>k </bf> Преведущая строка, таже колонка </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Позиционирование по символам <p> <itemize> <item> <bf>0 </bf> Начало строки <item> <bf>$ </bf> Конец строки <item> <bf>h </bf> Вперед <item> <bf>l </bf> Назад <item> <bf>SPACE </bf> Тоже что и l <item> <bf>fx </bf> Найти x вперед по тексту <item> <bf>Fx </bf> Найти x назад по тексту <item> <bf>; </bf> Повторить последнюю операцию f F <item> <bf>, </bf> Инверсно ; <item> <bf>| </bf> К специфицированной колонке <item> <bf>% </bf> Найти соответствующий символ { или } </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Слова, предложения параграфы <p> <itemize> <item> <bf>w </bf> Слово вперед <item> <bf>b </bf> Слово назад <item> <bf>e </bf> Конец слова <item> <bf>) </bf> К следующему предложению <item> <bf>( </bf> К преведущему предложению <item> <bf>} </bf> К следующему параграфу <item> <bf>{ </bf> К преведущему параграфу <item> <bf>W </bf> К концу большого слова, включая пробел на его конце <item> <bf>B </bf> Назад на большое слово W <item> <bf>E </bf> К концу большого слова W </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Установка отметок и возврат к ним <p> <itemize> <item> <bf>``</bf> (дважды нажмите клавишу `) К преведущей отметки <item> <bf>''</bf> (press twice the single-quote ` key) Последняя отметка, первый не пробел в строке <item> <bf>mx</bf> Установка отметки с именем x <item> <bf>`x</bf> (обратная кавычка и x) перейти к отметке x <item> <bf>'x</bf> Перейти к отметке x, на первый не пробел в строке </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Коррекция во время ввода текста <p> <itemize> <item> <bf>CTRL-h</bf> Удаляет последний символ <item> <bf>CTRL-w</bf> Удаляет последнее слово <item> <bf>erase </bf> Нажмите DELETE, тоже что и CTRL-h <item> <bf>kill </bf> Ваша клавиша kill, стирает ввод сделанный на этой строке <item> <bf>\ </bf> Экранирует CTRL-h, DELETE и kill <item> <bf>ESC </bf> Окончить ввод, назад в командный режим <item> <bf>CTRL-? </bf> Прервать, терминирует ввод <item> <bf>CTRL-d </bf> Обратная табуляции на <it>autoindent</it> пробелов <item> <bf>CTRL-v </bf> Экранирует непечатный символ </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Обновления экрана <p> <itemize> <item> <bf>CTRL-l</bf> Очистить и перерисовать <item> <bf>CTRL-r</bf> перенабор, убирает @строки <item> <bf>z-CR</bf> перерисовать, текущую строку на вершине окна <item> <bf>z-</bf> перерисовать, текущую строку на краю окна <item> <bf>z.</bf> перерисовать, текущую строку в центре экрана <item> <bf>/pat/z-</bf> <it>сгладить</it> край строки <item> <bf>tn</bf> Использовать экран с строкой n <item> <bf>CTRL-e</bf> Скроллировать окно вниз на 1 строку <item> <bf>CTRL-y</bf> Скроллировать окно вверх на 1 строку </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Удаление <p> <itemize> <item> <bf>x</bf> Удаляет символ под курсором <item> <bf>X</bf> Удаляет символ перед курсором <item> <bf>D</bf> Удаляет до конца строки <item> <bf>d^</bf> Удаляет до начала строки <item> <bf>dd</bf> Удаляет текущую строку <item> <bf>ndd</bf> Удаляет <it>n</it> строк начиная с текущей <item> <bf>dnw</bf> Удаляет <it>n</it> слов начиная с положения курсора </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Вставка, замена <p> <itemize> <item> <bf>i</bf> Входит в режим вставки (с вставкой перед курсором) <item> <bf>I</bf> Входит в режим вставки (перед первым не пробелом) <item> <bf>a</bf> Входит в режим вставки (вставка после курсора) <item> <bf>A</bf> Входит режим вставки (вставка после конца текущей строки) <item> <bf>o</bf> Создать новую строку после текущей и перейти в режим вставки <item> <bf>O</bf> Создает новую строку перед текущей и входит в режим вставки <item> <bf>r</bf> Заменить символ под курсором не переходя в режим вставки <item> <bf>R</bf> Войти в режим замены <item> <bf>C</bf> shift-c. Изменить остаток строки <item> <bf>D</bf> shift-d. Удалить остаток строки <item> <bf>s</bf> Заменить символы <item> <bf>S</bf> Заменить строки <item> <bf>J</bf> Объединить строки </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Копирование и вставка <p> "Буфер копирования" заполняется <it>КАЖДОЙ</it> командой удаления,или с помощью <bf>Y</bf> и <bf>yy</bf>. <itemize> <item> <bf>Y</bf> Копирует текущую строку в буфер <item> <bf><it>n</it>yy</bf> Копирует <it>n</it> строк начиная с текущей в буфер копирования <item> <bf>p</bf> Вставляет содержимое буфера копирования после курсора (или перед текущей строкой) <item> <bf>P</bf> Вставляет содержимое буфера обмена перед курсором (или перед текущей строкой) <item> <bf>"<it>x</it>p </bf> Вставить из буфера x <item> <bf>"<it>x</it>y </bf> Скопировать в буфер x <item> <bf>"<it>x</it>d </bf> Удалить в буфер x </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Операции (для применения к строкам вводятся дважды) <p> <itemize> <item> <bf>d </bf> удалить <item> <bf>c </bf> изменить <item> <bf>< </bf> сдвинуть влево <item> <bf>> </bf> сдвинуть вправо <item> <bf>! </bf> отфильтровать через команду <item> <bf>= </bf> отдать для LISP <item> <bf>y </bf> скопировать текст в буфер </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Поиск и замена <p> <itemize> <item> <bf>/<it>text</it></bf> Искать вперед образец <it>text</it> <item> <bf>?<it>text</it></bf> Искать назад образец <it>text</it> <item> <bf>n</bf> Повторить последний поиск в том же направлении <item> <bf>N</bf> Повторить последний поиск в обратном направлении <item> <bf>/</bf> Повторить последний поиск вперед <item> <bf>?</bf> Повторить последний поиск назад <item> <bf>&lsqb addr &rsqb s/from/to/ &lsqb g &rsqb </bf> Искать <it>from</it> и заменить его на <bf><it>to</it></bf> в текущей строке, или в указанном диапазоне <bf><it>addr</it></bf> (два номера строки разделенные командой; 1,$ весь файл). Заменить одно совпадение на строку либо все совпадения если <bf><it>g</it></bf> указано. Например, :3,20s/someword/anotherword/g. Заменит "someword" на "anotherword" начиная от строки номер 3 до строки 20. 'g' - означает замену всех совпадений. </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Общие <p> <itemize> <item> <bf>:sh</bf> Вызывает shell (выход по CTRL-d) <item> <bf>:!<it>команда</it></bf> Вызывает shell для исполнения <it>команды</it> <item> <bf>:set number</bf> Включает нумерацию строк <item> <bf>:set nonumber</bf> Выключает нумерацию строк </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Команды линейного редактора <p> <itemize> <item> <bf>:</bf> Говорит <bf>vi</bf> что следующая введенная команда является командой линейного редактора. <item> <bf>:sh</bf> Временный выход в shell чтобы исполнить какие либо команды не покидая <bf>vi</bf>. <item> <bf>CTRL-d</bf> Выходит из shell запущенного преведущей командой в <bf>vi</bf>. <item> <bf>:</bf><it>n</it> Переходит к строке номер <it>n</it>th текущего буфера. <item> <bf>:</bf><it>x,z</it><bf>w</bf> <it>filename</it> Записывает строки от <it>x</it> до <it>z</it> в новый файл называемый <it>filename</it>. <item> <bf>:$</bf> Передвигает курсор к началу последней строки буфера. <item> <bf>:.,$d</bf> Удаляет все строки от текущей до последней. <item> <bf>:r</bf> <it>filename</it> Вставляет содержимое файла <it>filename</it> после текущей строки буфера. <item> <bf>:s</bf><it>/text/new_text/</it> Заменяет первый встреченный образец <it>text</it> на текущей строке на <it>new_text</it> <item> <bf>:s</bf><it>/text/new_text/g</it> Заменяет все образцы <it>text</it> на текущей строке на <it>new_text</it> <item> <bf>:g</bf><it>/text/s//new_text/g</it> Заменяет все встреченный в буфере образцы <it>text</it> на <it>new_text</it>. </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* --> <sect1> Другие команды <p> <itemize> <item> <bf>u</bf> Отменить последнее изменение <item> <bf>U</bf> Восстановить текущую строку <item> <bf>&tilde</bf> Изменить регистр <item> <bf>J</bf> Соединить текущую строку со следующей <item> <bf>.</bf> Повторить последнюю команду изменения текста <item> <bf>CTRL-g</bf> Показать имя файла и номер строки </itemize> <!-- ******************************************* ************ End of Section *************** ******************************************* <chapt change> Other Formats of this Document --> <sect> Другие форматы данного документа <p> Этот документ (его английский оригинал) доступен в 10 различных форматах - DVI, Postscript, Latex, LyX, GNU-info, HTML, RTF(Rich Text Format), Plain-text, Unix man pages и SGML. <itemize> <item> Вы можете забрать этот HOWTO в виде одного тар-болла в HTML,DVI,Postscript или SGML форматах с - <url url="ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/other-formats/"> or <url url="ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/other-formats/"> <item>Текстовый вариант доступен по адресу: <url url="ftp://metalab.unc.edu/pub/Linux/docs/HOWTO"> или <url url="ftp://metalab.unc.edu/pub/Linux/docs/HOWTO"> <item>Переводы на другие языки такие как French, German, Spanish, Chinese, Japanese находятся на <url url="ftp://metalab.unc.edu/pub/Linux/docs/HOWTO"> или <url url="ftp://metalab.unc.edu/pub/Linux/docs/HOWTO"> Любая помощь по переводу на другие языки приветствуется ;) . </itemize> Этот документ написан с использованием "SGML tool" ,который вы можете найти по адресу:<newline> <url url="http://www.xs4all.nl/~cg/sgmltools/"><newline> Компилирование в различные формы производиться с помощью команд: <itemize> <item>sgml2html vim-howto.sgml (для генерации html файла) <item>sgml2rtf vim-howto.sgml (для генерации RTF файла) <item>sgml2latex vim-howto.sgml (для генерации latex файла) </itemize> Этот документ можно найти по адресу - <itemize> <item> <url url="http://metalab.unc.edu/LDP/HOWTO/VIM-HOWTO.html"> </itemize> Также вы можете найти этот документ на следующих зеркалах - <itemize> <item> <url url="http://www.caldera.com/LDP/HOWTO/VIM-HOWTO.html"> <item> <url url="http://www.WGS.com/LDP/HOWTO/VIM-HOWTO.html"> <item> <url url="http://www.cc.gatech.edu/linux/LDP/HOWTO/VIM-HOWTO.html"> <item> <url url="http://www.redhat.com/linux-info/ldp/HOWTO/VIM-HOWTO.html"> <item> Список зеркал можно найти по адресу <url url="http://metalab.unc.edu/LDP/hmirrors.html"> выберете сайт и идите в директорию /LDP/HOWTO/VIM-HOWTO.html </itemize> Чтобы просмотреть этот документ в dvi формате, используйте программу xdvi. (пакет tetex-xdvi*.rpm в дистрибьюции RedHat) <tscreen><verb> Чтобы читать dvi документы задайте команду. xdvi -geometry 80x90 howto.dvi И изменяйте размер окна мышкой. Также смотрите соответствующую man страницу. Для навигации используйте стрелки, Page Up, Page Down, или 'f', 'd', 'u', 'c', 'l', 'r', 'p', 'n' чтобы перемещаться по тексту. Чтобы выключить режим эксперта нажмите 'x'. </verb></tscreen> Вы можете прочитать postscript файл используя программу gv. (пакет gv*.rpm) <tscreen><verb> Чтобы читать postscript документы дайте команду gv howto.ps или ghostscript howto.ps </verb></tscreen> Вы можете читать HTML документы используя Netscape Navigator, Microsoft Internet Explorer, или любой другой web браузер. Вы также можете читать latex файлы используя LyX. <!-- ******************************************* ************ End of Section *************** ******************************************* --> </article>