Текстовый редактор — это основной инструмент для любого программиста, вот почему вопрос его выбора становится причиной яростных дебатов. Unix традиционно тесно связан с двумя своими многолетними фаворитами, Emacs и Vi, и их современными версиями GNU Emacs и Vim. Эти редакторы имеют очень разный подход к редактированию текста, но при этом сравнимы по мощи.
Поскольку я отношусь к секте Vim, далее мы обсудим неисчерпаемые возможности этого редактора, а также инструменты командной строки, вызываемые прямо из Vim для расширения встроенной функциональности. Некоторые из обсуждаемых дальше принципов могут быть применимы и для Emacs, но не для простых редакторов, вроде Nano.
Это будет очень поверхностный обзор, поскольку возможности Vim в деле программирования поистине неисчислимы, и при этом все равно он получится довольно длинным. Команда Vim :help известна среди новичков как качественный и полезный источник информации, поэтому не пренебрегайте ей.
Vim имеет множество настроек, влияющих на его поведение. Например, легко настроить подсветку кода в зависимости от типа загружаемого файла. Таким образом, в частности, можно установить стиль отступов, соответствующий нормам используемого языка программирования. Эту настройку лучше поместить одной из первых в вашем .vimrc файле.
Даже если вы работаете с 16-цветным терминалом, смело включайте подсветку в вашем .vimrc файле:
Цветовые схемы стандартного 16-цветного терминала внешне не слишком хороши, но решают поставленные перед ними задачи, если подцепить правильные синтаксические файлы. Есть огромное множество цветовых схем, поэтому не составит труда настроить их под себя, а 256-цветный терминал или gVim дадут еще более широкие возможности. Хорошие синтаксические файлы подсветят ошибки ярким красным цветом фона.
Если вы привыкли к нумерации строк в традиционных IDE, то включить ее можно, набрав:
Можно попробовать такой трюк, если у вас Vim не старее 7.3, и вы хотите нумеровать строки не абсолютно, а по отношению к текущей:
Vim очень хорошо работает с данными, генерируемыми утилитой ctags. Это позволяет быстро найти все вхождения нужного идентификатора в пределах проекта, или перейти прямо к объявлению переменной с места ее использования в коде, даже если она находится в другом файле. Для больших проектов на C, содержащих множество файлов, можно сэкономить огромное количество впустую потраченного времени, и это, возможно, теснее всего сближает Vim с мейнстримными IDE.
Вы можете запустить :!ctags -R в корневой директории проекта на одном их поддерживаемых языков, и в результате получите тег-файл с определениями и ссылками на расположение идентификаторов в вашем проекте. По готовности тег-файла искать использование тега в проекте можно так:
Команды :tn и :tp позволяют перемещаться между вхождениями тега по всему проекту. Встроенный механизм тегов покрывает большую часть наиболее используемых возможностей, но если хочется более навороченных фишек, вроде окна со списком тегов, можно установить очень популярный плагин Taglist. Плагин Unimpaired за авторством Tim Pope тоже содержит несколько важных командных переназначений.
Есть 2 основных метода вызова внешних команд из сессии Vim:
Третий способ, здесь подробно не обсуждаемый, подразумевает использование плагинов вроде Conque для эмуляции shell прямо в буфере Vim. Сам я пробовал его в действии, но плагин показался мне непригодным к использованию. Возможно, дело просто в неверном авторском замысле (см. :help design-not).
Vim — это не консоль и не операционная система. У вас вряд ли получится запустить консоль внутри Vim или использовать его для управления отладчиком. У него другая модель использования: применяйте его в качестве компонента командной строки или как составную часть IDE.
Проверка синтаксиса или компиляция через вызов внешней программы (например,
Символ "%" — это знак подстановки файла, загруженного в текущий буфер. Результатом является текстовый вывод команды, если таковой имеется, под введенной командной строкой. Если нужно вызывать внешнюю программу постоянно, то лучше замапить ее как команду, или даже как комбинацию клавиш в файле .vimrc. Ниже мы определим команду :PerlLint, вызываемую из нормального режима при помощи \l:
Для многих языков есть еще один способ сделать то же самое, прибегнув к помощи встроенного в Vim окна quicklist. Установить настройку makeprg для типа файла, включив туда вызов модуля, формирующего читабельный для Vim вывод:
Предварительно нужно установить нужный модуль через CPAN. По завершении можно вводить команду :make и проверять синтаксис файла. Если найдены ошибки, можно открыть окно quicklist (:copen), проверять их описание и перемещаться между ними при помощи :cn и :cp.
Подобные трюки аналогично работают с выводом gcc, да и вообще с любой программой проверки синтаксиса, которая оперирует в результатах своей работы именами файлов, номерами строк и сообщениями об ошибках. Точно так же можно работать и с веб-ориентироваными языками вроде PHP, и с JSLint для Javascript. Существует также отличный плагин Syntastic, предназначенный для так же целей.
Чтобы вызвать команду и направить ее вывод прямо в текущий буфер, используется :r!. Для примера, чтобы получить быстрый список содержимого директории, можно напечатать:
Командами, конечно, дело не ограничивается; при помощи :r можно считывать считывать любые файлы, например, открытые ключи или шаблонные тексты:
Если смотреть на заговолок шире, то речь пойдет вообще о фильтрации текста в буфере через внешние команды. Поскольку визуальный режим Vim отлично подходит для работы с данными, разбитыми на столбцы, нередко имеет смысл применить команды column, cut, sort или awk.
Для примера можно отсортировать весь файл по второму столбцу следующей командой:
Можно выводить только третью колонку выбранного текста, где строка совпадает с шаблоном "/vim/":
Можно расположить ключевые слова в строках с 1 по 10 по колонкам:
Любой текстовый фильтр или команда могут быть применены таким образом в Vim, и это на порядок увеличивает размах возможностей текстового редактора. При этом буфер Vim рассматривается как текстовый поток, а уж на этом языке легко общаются все классические утилиты.
Стоит отметить, что для самых распространенных операций, таких как сортировка и поиск, Vim имеет встроенные методы :sort и :grep. Они полезны, если Vim используется под Windows, однако даже близко не сравнимы с адаптивностью консольных вызовов.
Vim имеет инструмент сравнения vimdiff, позволяющий не только смотреть различия в разных версиях файла, но и разрешать конфликты через трехстороннее слияние, заменять разницу между кусками текста командами :diffput и :diffget. Vimdiff вызывается из командной строки для по крайней мере двух файлов вот так:
Запускать методы контроля версий можно прямо из Vim, и этого чаще всего достаточно. При этом нужно помнить, что "%" — всегда место подстановки файла из текущего буфера:
Действующий чемпион по Git-функциональности — это плагин Fugitive за авторством Tim Pope, который я настоятельно рекомендую всем, кто использует Git совместно с Vim. Более подробное освещение истории и основ систем контроля версий в Unix ищите в 7 части данной серии статей.
Программисты, привыкшие к графическим IDE, нередко считают Vim игрушкой или пережитком. Отчасти причиной служит тот факт, что Vim привыкли видеть в качестве средства редактирования конфигурационных файлов на сервере, а вовсе не как удобный текстовый редактор командной строки. Его встроенные инструменты так хорошо совмещаются с внешними Unix-командами, что нередко способны удивить даже опытных пользователей.
Продолжение следует...
Unix как IDE: Введение
Unix как IDE: Файлы
Unix как IDE: Работа с текстом
Unix как IDE: Компиляция
Поскольку я отношусь к секте Vim, далее мы обсудим неисчерпаемые возможности этого редактора, а также инструменты командной строки, вызываемые прямо из Vim для расширения встроенной функциональности. Некоторые из обсуждаемых дальше принципов могут быть применимы и для Emacs, но не для простых редакторов, вроде Nano.
Это будет очень поверхностный обзор, поскольку возможности Vim в деле программирования поистине неисчислимы, и при этом все равно он получится довольно длинным. Команда Vim :help известна среди новичков как качественный и полезный источник информации, поэтому не пренебрегайте ей.
Определение типа файла
Vim имеет множество настроек, влияющих на его поведение. Например, легко настроить подсветку кода в зависимости от типа загружаемого файла. Таким образом, в частности, можно установить стиль отступов, соответствующий нормам используемого языка программирования. Эту настройку лучше поместить одной из первых в вашем .vimrc файле.
if has("autocmd")
filetype on
filetype indent on
filetype plugin on
endif
Подсветка синтаксиса
Даже если вы работаете с 16-цветным терминалом, смело включайте подсветку в вашем .vimrc файле:
syntax on
Цветовые схемы стандартного 16-цветного терминала внешне не слишком хороши, но решают поставленные перед ними задачи, если подцепить правильные синтаксические файлы. Есть огромное множество цветовых схем, поэтому не составит труда настроить их под себя, а 256-цветный терминал или gVim дадут еще более широкие возможности. Хорошие синтаксические файлы подсветят ошибки ярким красным цветом фона.
Нумерация строк
Если вы привыкли к нумерации строк в традиционных IDE, то включить ее можно, набрав:
set number
Можно попробовать такой трюк, если у вас Vim не старее 7.3, и вы хотите нумеровать строки не абсолютно, а по отношению к текущей:
set relativenumber
Тег-файлы
Vim очень хорошо работает с данными, генерируемыми утилитой ctags. Это позволяет быстро найти все вхождения нужного идентификатора в пределах проекта, или перейти прямо к объявлению переменной с места ее использования в коде, даже если она находится в другом файле. Для больших проектов на C, содержащих множество файлов, можно сэкономить огромное количество впустую потраченного времени, и это, возможно, теснее всего сближает Vim с мейнстримными IDE.
Вы можете запустить :!ctags -R в корневой директории проекта на одном их поддерживаемых языков, и в результате получите тег-файл с определениями и ссылками на расположение идентификаторов в вашем проекте. По готовности тег-файла искать использование тега в проекте можно так:
:tag someClass
Команды :tn и :tp позволяют перемещаться между вхождениями тега по всему проекту. Встроенный механизм тегов покрывает большую часть наиболее используемых возможностей, но если хочется более навороченных фишек, вроде окна со списком тегов, можно установить очень популярный плагин Taglist. Плагин Unimpaired за авторством Tim Pope тоже содержит несколько важных командных переназначений.
Вызов внешних программ
Есть 2 основных метода вызова внешних команд из сессии Vim:
- :!<command>! — используется в случаях, когда нужно сохранить вывод программы в буфер
- :shell — Запустить shell как дочерний процесс Vim. Подходит для интерактивного выполнения команд.
Третий способ, здесь подробно не обсуждаемый, подразумевает использование плагинов вроде Conque для эмуляции shell прямо в буфере Vim. Сам я пробовал его в действии, но плагин показался мне непригодным к использованию. Возможно, дело просто в неверном авторском замысле (см. :help design-not).
Vim — это не консоль и не операционная система. У вас вряд ли получится запустить консоль внутри Vim или использовать его для управления отладчиком. У него другая модель использования: применяйте его в качестве компонента командной строки или как составную часть IDE.
Lint-подобные программы и проверка синтаксиса
Проверка синтаксиса или компиляция через вызов внешней программы (например,
perl -c
, gcc
) может быть запущена из редактора при помощи !: commands. Если редактируется файл Perl, то можно выполнить следую команду::!perl -c %
/home/tom/project/test.pl syntax OK
Press Enter or type command to continue
Символ "%" — это знак подстановки файла, загруженного в текущий буфер. Результатом является текстовый вывод команды, если таковой имеется, под введенной командной строкой. Если нужно вызывать внешнюю программу постоянно, то лучше замапить ее как команду, или даже как комбинацию клавиш в файле .vimrc. Ниже мы определим команду :PerlLint, вызываемую из нормального режима при помощи \l:
command PerlLint !perl -c %
nnoremap <leader>l :PerlLint<CR>
Для многих языков есть еще один способ сделать то же самое, прибегнув к помощи встроенного в Vim окна quicklist. Установить настройку makeprg для типа файла, включив туда вызов модуля, формирующего читабельный для Vim вывод:
:set makeprg=perl\ -c\ -MVi::QuickFix\ %
:set errorformat+=%m\ at\ %f\ line\ %l\.
:set errorformat+=%m\ at\ %f\ line\ %l
Предварительно нужно установить нужный модуль через CPAN. По завершении можно вводить команду :make и проверять синтаксис файла. Если найдены ошибки, можно открыть окно quicklist (:copen), проверять их описание и перемещаться между ними при помощи :cn и :cp.
Подобные трюки аналогично работают с выводом gcc, да и вообще с любой программой проверки синтаксиса, которая оперирует в результатах своей работы именами файлов, номерами строк и сообщениями об ошибках. Точно так же можно работать и с веб-ориентироваными языками вроде PHP, и с JSLint для Javascript. Существует также отличный плагин Syntastic, предназначенный для так же целей.
Чтение вывода других команд
Чтобы вызвать команду и направить ее вывод прямо в текущий буфер, используется :r!. Для примера, чтобы получить быстрый список содержимого директории, можно напечатать:
:r!ls
Командами, конечно, дело не ограничивается; при помощи :r можно считывать считывать любые файлы, например, открытые ключи или шаблонные тексты:
:r ~/.ssh/id_rsa.pub
:r ~/dev/perl/boilerplate/copyright.pl
Фильтрация вывода через другие команды
Если смотреть на заговолок шире, то речь пойдет вообще о фильтрации текста в буфере через внешние команды. Поскольку визуальный режим Vim отлично подходит для работы с данными, разбитыми на столбцы, нередко имеет смысл применить команды column, cut, sort или awk.
Для примера можно отсортировать весь файл по второму столбцу следующей командой:
:%!sort -k2 -r
Можно выводить только третью колонку выбранного текста, где строка совпадает с шаблоном "/vim/":
:'<,'>!awk '/vim/ {print $3}'
Можно расположить ключевые слова в строках с 1 по 10 по колонкам:
:1,10!column -t
Любой текстовый фильтр или команда могут быть применены таким образом в Vim, и это на порядок увеличивает размах возможностей текстового редактора. При этом буфер Vim рассматривается как текстовый поток, а уж на этом языке легко общаются все классические утилиты.
Встроенные альтернативы
Стоит отметить, что для самых распространенных операций, таких как сортировка и поиск, Vim имеет встроенные методы :sort и :grep. Они полезны, если Vim используется под Windows, однако даже близко не сравнимы с адаптивностью консольных вызовов.
Сравнение файлов
Vim имеет инструмент сравнения vimdiff, позволяющий не только смотреть различия в разных версиях файла, но и разрешать конфликты через трехстороннее слияние, заменять разницу между кусками текста командами :diffput и :diffget. Vimdiff вызывается из командной строки для по крайней мере двух файлов вот так:
$ vimdiff file-v1.c file-v2.c
Контроль версий
Запускать методы контроля версий можно прямо из Vim, и этого чаще всего достаточно. При этом нужно помнить, что "%" — всегда место подстановки файла из текущего буфера:
:!svn status
:!svn add %
:!git commit -a
Действующий чемпион по Git-функциональности — это плагин Fugitive за авторством Tim Pope, который я настоятельно рекомендую всем, кто использует Git совместно с Vim. Более подробное освещение истории и основ систем контроля версий в Unix ищите в 7 части данной серии статей.
Большая разница
Программисты, привыкшие к графическим IDE, нередко считают Vim игрушкой или пережитком. Отчасти причиной служит тот факт, что Vim привыкли видеть в качестве средства редактирования конфигурационных файлов на сервере, а вовсе не как удобный текстовый редактор командной строки. Его встроенные инструменты так хорошо совмещаются с внешними Unix-командами, что нередко способны удивить даже опытных пользователей.
Продолжение следует...
Unix как IDE: Введение
Unix как IDE: Файлы
Unix как IDE: Работа с текстом
Unix как IDE: Компиляция