Vim. Первая установка

Немного рекламы

Так уж исторически сложилось, что для написания скриптов на Python я пользовался в основном SciTe. Пробовал когда-то Notepad++ и тому подобные Programmer's Notepad, но особо ими не проникся и в итоге остался на все том же SciTe. Тем более, что особо многого я от редактора и не требую, мне достаточно подсветки кода да возможности запуска скриптов прямо из редактора, а остальные возможности будут - хорошо, нет - обойдусь.

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

В дальнейшем я буду приводить скриншоты не Vim, а gVim - Vim в графическом интерфейсе, а не в консольном. Когда настраивал Vim активно пользовался гуглом, поэтому часть настроек подсмотрена на разных сайтах, но обычно даже в найденных участках кода файла настроек что-то подправлял под себя.

Будем считать, что вы уже знаете, что такое Vim, что у него есть несколько режимов работы и умеете между ними переключаться. Потому что в этой статье хотелось бы обратить внимание именно на настройки, а не на работу с самим редактором.

Настраиваем кодировки

Если в только что установленном Vim открыть скрипт в кодировке UTF-8, то, по крайней мере в Windows, мы увидим крокозяблы вместо русских букв:

Чтобы переключить кодировку на правильную UTF-8, вводим команду в командной строке редактора:

:e ++enc=utf8

В результате получаем читаемые комментарии на русском языке:

Каждый раз вводить эту команду не интересно, поэтому добавим новый пункт меню, с помощью которого можно будет переключать кодировки

Для этого идем в папку, где установлен Vim и ищем файл _vimrc в Windows или .vimrc в linux. В Windows он расположен по адресу X:\Program Files\Vim. Заметьте, что сам (g)Vim расположен по адресу X:\Program Files\Vim\vim72

" Меню выбора кодировки текста (utf8, cp1251, koi8-r, cp866)
menu Кодировка.utf-8 :e ++enc=utf8 <CR>
menu Кодировка.windows-1251 :e ++enc=cp1251<CR>
menu Кодировка.koi8-r :e ++enc=koi8-r<CR>
menu Кодировка.cp866 :e ++enc=cp866<CR>

Как видите, свое меню создавать очень легко. Строка <CR> обозначает нажатие Enter, а комментарии начинаются с двойной кавычки.

Теперь мы можем вручную переключать кодировки:

Но вручную переключать кодировки не интересно, поэтому сделаем так, чтобы Vim сам пытался определять нужную кодировку. Для этого достаточно добавить всего одну строку в _vimrc:

" Список используемых кодировок для автоматического их определения
set fileencodings=utf-8,cp1251

Параметру fileencodings присваиваем список используемых в повседневной жизни кодировок. Теперь при открытии файла все сразу будет выводиться в правильной кодировке.

Теперь нам осталось исправить одно маленькое недоразумение, которое состоит в том, что Vim может не признавать русские буквы за буквы, из-за чего не будут корректно работать команды, связанные с выделением слов (например, перемещение к следующему или предыдущему слову). Исправить это легко. Достаточно в файл _vimrc добавить строку:

set iskeyword=@,a-z,A-Z,48-57,_,128-175,192-255

Здесь мы перечисляем какие символы и их коды Vim должен считать за буквы. Диапазон 48-57 соответствует цифрам, 128-175 - части русских букв в кодировке DOS (866), а 192-255 охватывает оставшиеся русские буквы в кодировке DOS и все русские буквы в кодировке Windows-1251.

Настраиваем внешний вид редактора

Во-первых, включаем нумерацию строк (как же без нумерации жить то?)

" Включаем нумерацию строк
set nu

Теперь надо сказать несколько слов про установку значений параметров. До этого мы использовали знак '=' вместе с командой set. Но некоторые параметры являются булевыми. Для их установки в значение true нужно написать

set param

Если нужно отключить опцию (значение false), то нужно написать

set noparam

То есть в нашем случае, если бы мы хотели отключить нумерацию строк, то нужно было бы написать

set nonu

Обратите внимание, что после 'no' нет пробела.

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

" Включить автоотступы
set autoindent

И подсветку синтаксиса.

" Влючить подстветку синтаксиса
syntax on

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

Устанавливаем размеры отступов для отступов и табуляций:

" Размер отступов
set shiftwidth=4

" Размеры табуляций
set tabstop=4
set softtabstop=4

" Более "умные" отступы при вставке их с помощью tab.
" На самом деле заметить влияние этой опции тяжело, но хуже из-за нее не будет :)
set smarttab

Теперь открытый исходник выглядит так

Включим использование фолдинга (folding), т.е. сворачивание участков кода

" Включаем фолдинг (сворачивание участков кода)
set foldenable

" Сворачивание по отступам
set fdm=indent

При открытии файла все участки сразу сворачиваются

На самом деле у fdm (или, полный вариант - foldmethod) есть несколько значений:

  • indent, когда сворачивание происходит по отступам (так как у Python отступы определяют вложение, то для него больше ничего и не надо);
  • syntax, когда сворачивание определяется файлом подсветки синтаксиса;
  • manual, когда сворачивание определяется вручную;
  • marker, для сворачивания используются специальные маркеры
  • diff, когда сворачивается текст, который не изменился

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

" Сворачивание по синтаксису
set fdm=syntax

Но кроме этого, возможно, придется установить дополнительные плагины для нужных языков. Для Python, например, понадобится плагин python_fold. Чтобы его установить, достаточно скопировать файл python_fold.vim в папку ftplugin.

Теперь свернутый код будет выглядеть примерно следующим образом:

Но в то же время для сворачивание кода на Fortran дополнительные плагины не нужны, достаточно в _vimrc добавить следующую переменную:

" Включить сворачивание кода для Fortran
:let fortran_fold=1

Для удобства добавим еще один параметр, который будет заставлять Vim разворачивать свертки, когда в них попадает курсор в нормальном режиме:

" Автоматическое открытие сверток при заходе в них
set foldopen=all

Следующая опция делает так, чтобы рабочей папкой становилась директория, в которой расположен открытый файл. Это практически обязательная опция для отладки скриптов на Python.

"Автоматическое переключение рабочей папки
set autochdir

По умолчанию Vim делает файлы бекапа рядом с открытым файлом и свапа в рабочей директории. Не думаю, что они нам понадобятся, поэтому отключим их создание.

" Отключить создание файлов бекапа и свапа
set nobackup
set nowritebackup
set noswapfile

Теперь облегчим создание нового файла со скриптами на языке Python.

" При создании нового файла *.py и *.pyw будут сразу добавлены два заголовка с
" путем до интерпретатора python и с указанием кодировки utf-8
function! BufNewFile_PY()
0put = '#!/usr/bin/env python'
1put = '#-*- coding: utf-8 -*-'
$put =
$put =

normal G
endfunction

autocmd BufNewFile *.py call BufNewFile_PY()
autocmd BufNewFile *.pyw call BufNewFile_PY()

Ну а теперь сделаем автоматическое закрытие скобок (круглых, квадратных и фигурных). Для этого добавим следующие три строки:

" Автоматическое закрытие скобок
imap [ []<LEFT>
imap ( ()<LEFT>
imap { {}<LEFT>

Суть их очень простая. Команда imap работает в режиме вставки (первая буква i - от слова Insert) и позволяет назначать выполнение команд при нажатии определенных клавиш.

Первая строка обозначает, что при нажатии клавиши "[" нужно написать два символа [] и сымитировать нажатие клавиши "влево". То есть при нажатии на клавишу [ вместо открывающейся скобки будет вставлена также и закрывающаяся, а курсор затем переместится на один символ влево, то есть окажется внутри скобок. Аналогично работают и следующие две строки, только для круглых и фигурных скобок соответственно.

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

" размеры окна
set lines=100
set columns=150

Это практически на весь экран при разрешении 1280x1024

Если вам не нравится раскраска кода по умолчанию, то ее можно переключать. Шаблоны с раскрасками лежат в папке X:\Program Files\Vim\vim72\colors и (или) X:\Program Files\Vim\vimfiles\colors

Самое главное, что вы можете переключать раскраску во время работы, а затем установить ее по умолчанию. Для этого в команднйо строке vim вводим команду, например,

:color blue

blue - это имя одного из файлов (без расширения) в папке colors. В итоге получим

Я для себя подправил одну из прилагающихся цветовых схем, и раскраска питона у меня выглядит следующим образом:

Чтобы установить ту же цветовую схему blue по умолчанию, в файл _vimrc добавляем строку:

color blue

или color _имя_понравившейся_вам_цветовой_схемы

К данному моменту сразу будет работать и автодополнение (в Vim они называются Omni Completion). Чтобы появились подсказки, нужно в режиме вставки поочередно нажать Ctrl-X, Ctrl-O. Выглядят они следующим образом:

Но чтобы было более привычно, как в других IDE, мы можем сделать так, чтобы Omni Completion появлялся при нажатии комбинации клавиш Ctrl-пробел. Для этого в _vimrc добавим всего одну строчку:

" Ctrl-пробел для автодополнения
inoremap <C-space> <C-x><C-o>

С помощью этой команды мы перенаправляем сочетание клавиш Ctrl-пробел на последовательное нажатие комбинаций клавиш Ctrl-x, Ctrl-o. В принципе, можно было бы воспользоваться уже знакомой нам командой imap, но отличие команды inoremap состоит в том, что при ее использовании, в отличие, от imap, отключается дальнейшие перенаправления клавиш, которые указываются во втором параметре.

Теперь можно сделать так, чтобы текущий буфер закрывался с помощью клавиши Ctrl-W.

"Ctrl-w - удаление текущего буфера
nmap <C-w> :bd<cr>
imap <C-w> <esc>:bd<cr>

Первая строка изменяет поведение Ctrl-w в нормальном режиме и при нажатии этой комбинации вызывает команду закрытия буфера (:bd)

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

Vim + Python

Для того, чтобы можно было бы запускать открытый в данный момент скрипт на языке Python, установим плагин runscript. Для этого скачиваем файл с плагином и просто копируем его в папку plugins.

Затем открываем плагин в текстовом редакторе и изменяем значение переменной s:PathToExecutable таким образом, чтобы он указывал на путь до интерпретатора Python. У меня, например, это выглядит следующим образом:

let s:PathToExecutable = 'c:\python25\python.exe'

Теперь для того, чтобы запустить открытый скрипт, нажимаем F12. Если ничего не произошло, нажимаем F9, тогда откроется еще один буфер, куда выводится результат работы скрипта. Перед запуском скрипта нужно не забыть выйти из режима вставки в нормальный режим с помощью клавиши Esc.

На следующем скриншоте пример запуска простенького скрипта:

У плагина runscript есть и дополнительные возможности для запуска скриптов, про них вы можете узнать или на странице плагина или в комментариях в самом плагине.

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

После этого будет полезно обновить файл, описывающий синтаксис Python для редактора. Обновленный файл синтаксиса расположен здесь, причем, там же есть и синтаксис для Python 3.0. Скачанный файл нужно скопировать в папку syntax.

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

syn match pythonError

и добавляем после этих строк следующие:

syn match pythonError "^\s*def\s\+\w\+(.*)\s*$" display
syn match pythonError "^\s*class\s\+\w\+(.*)\s*$" display
syn match pythonError "^\s*for\s.*[^:]$" display
syn match pythonError "^\s*except\s*$" display
syn match pythonError "^\s*finally\s*$" display
syn match pythonError "^\s*try\s*$" display
syn match pythonError "^\s*else\s*$" display
syn match pythonError "^\s*else\s*[^:].*" display
syn match pythonError "^\s*if\s.*[^\:]$" display
syn match pythonError "^\s*except\s.*[^\:]$" display
syn match pythonError "^\s*while\s.*[^\:]$" display
syn match pythonError "^\s*return\s.*:$" display
syn match pythonError "&&" display
syn match pythonError "||" display
syn match pythonError "[;]$" display
syn keyword pythonError do

Правда, себе я все-таки закомментарил строку

syn match pythonError "^\s*if\s.*[^\:]$" display

Потому что из-за нее Vim начинает считать ошибками многострочные логические выражения у оператора if.

На следующем скриншоте показан код с забытым символом двоеточия после оператора try:

Учим Vim понимать структуру кода

Теперь научим Vim строить список классов и методов классов в отдельном буфере, чтобы мы могли быстро перемещаться на нужный участок кода.

Для этого, во-первых, нам понадобится маленькая программа под названием ctags. Скачать ctags под вашу операционку можно с официального сайта. Скачиваем нужный архив и устанавливаем ее куда нам удобно. Я, например, установил ее в c:\Program Files\ctags

Затем скачиваем плагин для Vim под названием taglist

Установка этого плагина состоит из нескольких этапов.

  • Распаковываем плагин таким образом, чтобы файл из папки plugin оказался в папке plugin у Vim, а, соответственно, файл из папки doc - в папке doc.
  • Вы можете добавить путь до ctags в переменную окружения PATH, а можете добавить в файл _vimrc следующую строку:

let Tlist_Ctags_Cmd='"C:\Program Files\Ctags\ctags.exe"'

Естественно, путь до ctags у васдолжен быть свой. Обратите внимание на вложенные двойные кавычки. Это нужно для того, чтобы Windows понял строку C:\Program Files\Ctags\ctags.exe как путь до программы ctags.exe, а не остановился на пробеле в имени папки.

  • Затем мы должны сделать так, чтобы при открытии Vim в качестве рабочей директории была бы папка doc. Так как мы уже сделали так, чтобы vim изменял рабочую директорию при открытии файла, то достаточно с помощью vim открыть любой файл в папке doc.
  • Теперь вводим команду ":helptags ." Не забудьте про точку в конце. Немного подумав, плагин дополнит файл tags в папке doc.

Перезапускаем Vim и теперь можем открыть какой-нибудь исходник. Теперь вводим команду ":TlistToggle". И слева у нас открывается структура нашего исходника:

При двойном щелчке по строке из левого списка мы перескакиваем на соответствующий элемент исходника.

Если вам не хочется каждый раз набирать команду ":TlistToggle", то можно повесить выполнение ее какую-нибудь горячую клавишу, например, Ctrl-t. Для этого достаточно добавить следующие строки в файл _vimrc:

" Ctrl-T - открыть окно ctags
nmap <C-t> :TlistToggle<cr>
imap <C-t> <esc>:TlistToggle<cr>i<right>

Теперь в нормальном режиме и режиме вставки вы можете открывать или прятать буфер со структурой исходника с помощью клавиши Ctrl-t.

Устанавливаем дополнительные плагины

Теперь для большего удобства установим некоторые дополнительные плагины

Дерево каталогов в окне Vim

Для построение дерева каталогов есть очень удобный плагин NERD Tree. Скачиваем архив с плагином и распаковываем его в папку с Vim (в архиве расположены две папки doc и plugin).

После этого строим теги для справки. Для этого делаем так, чтобы рабочей папкой стала папка doc и выполняем команду

:helptags.

Или можно проще независимо от текущей папки выполнить команду

:helptags $VIMRUNTIME/doc

Теперь вы можете смотреть справку по плагину, выполнив команду

:help nerd_tree.txt

А если вам не охота ее читать, то скажу, что дерево каталогов открывается с помощью команды

:NERDTree

Внешний вид дерева показан на следующем скриншоте:

Плагин для удобного закомментаривания кода

  • Качаем плагин tComment.
  • Распаковываем куда-нибудь файл tComment.vba
  • Открываем этот файл в самом Vim
  • Вводим команду

:so %

После этого Vim что-то делает пару секунд, и плагин установлен. У tComment очень много возможностей, чтобы их посмотреть введите команду

:help tComment

С помощью этого плагина можно как комментарить строки кода, так и быстро их раскомментаривать.

Думаю, что для начала этих настроек должно хватить, но не исключено, что со временем эту статью я еще буду дополнять.

В качестве продолжения можно рассматривать статью Полезные плагины для Vim.
Возможно, вас также заинтересует статья Программирование скриптов для Vim.

Немного рекламы

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 4.9/5. Всего 66 голос(а, ов)



JIP 25.03.2009 - 14:45

vimperator пробовали?

Jenyay 25.03.2009 - 14:49

JIP, нет, не пробовал. Сейчас посмотрю, что это такое.

SvetlanaVK 28.03.2009 - 14:20

Когда-то тоже подумывала о vim, но мне для любимого perl нужен был дебаггер.. Поэтому остановилась на Eclipse+Epic, как бесплатном ПО. Ну и Komodo стоит только ради RX Toolkit :)

PS изначально статью на хабре углядела, поздравляю! ;)

Jenyay 28.03.2009 - 14:31

SvetlanaVK, привет :)

Я сначала эклипсом пользовался, но потом он быстро надоел со своими тормозами.

Al Markov 31.03.2009 - 12:49

Спасибо, оказалось полезно.
Пользуюсь Vim уже более пяти лет, но про дополнение taglist не знал.

Jenyay 31.03.2009 - 12:54

Al Markov, рад, что статья пригодилась :)

Иван 06.05.2009 - 09:37

Спасибо, отличный текст.

Jenyay 06.05.2009 - 09:48

Иван, и Вам спасибо :)

ХлаЫ 17.06.2009 - 05:28

Интересно

Как типа ? Ешки

crn 25.06.2009 - 19:29

Огромное спасибо за статью, мне она очень помогла!

Jenyay 25.06.2009 - 21:10

И Вам спасибо, очень приятно.

voltron 17.08.2009 - 16:58

Спасибо за статью, много полезного.
Но что-то у меня не получается добиться работы с юникодом, в конфиг прописал требуемые строчки, но файлы как открывались, так и открываются кракозябрами. Вим устанавливал из ZIP архива. Не подскажете, что еще можно подкрутить?

Jenyay 17.08.2009 - 17:01

voltron,
А вручную кодировки переключаются, если вводить команду наподобие ":e ++enc=utf8"?

voltron 18.08.2009 - 09:16

Да, вручную переключаются. Нашел еще один рецепт
set encoding=utf-8
set termencoding=utf-8
но тоже ничего не получилось, зато менюшки стали нечитаемыми, пришлось файл с сообщениями перекодировать в UTF.

Jenyay 18.08.2009 - 09:40

Строку "set fileencodings=utf-8,cp1251", как я понял, Вы добавили?

А меню создается с выбором кодировки, как написано в самом начале?

voltron 18.08.2009 - 11:49

Да, меню создается и строка "set fileencodings" присутствует.

Удалил старый конфиг, сделал новый только с менюшкой и set fileencodings - заработало. Может что-то конфликтовало. Спасибо за помощь

Jenyay 18.08.2009 - 14:48

Ну хорошо, что все заработало.

Павел 01.07.2010 - 07:49

Спасибо Вам, Евгений, что не пожалели времени и написали прекрасное руководство. Написано очень хорошо и, главное, по делу. Жаль, что я эту статью увидел только сейчас.

Jenyay 01.07.2010 - 10:37

Спасибо, Павел, очень приятно. :)

Сергей 25.07.2010 - 01:48

"У tComment очень много возможностей, чтобы их посмотреть введите команду"
:help vimball
Вы наверное имели в виду
:help tComment

Jenyay 25.07.2010 - 10:01

Сергей, да, это и имел ввиду. Спасибо.

Newbie 16.12.2010 - 04:34

Прошу прощения за наглость, но не могли бы Вы выложить готовый .vimrc файл? Просто у меня основные вкусности не работают =(

Jenyay 16.12.2010 - 08:54

Newbie, закачал файл настроек из винды сюда - Attach:_vimrc, но там много лишнего по сравнению с тем, что описано в статье.

Newbie 16.12.2010 - 14:30

Большое спасибо, Евгений.

Andrey 03.02.2011 - 22:13

Jenyay, не подскажешь как левый скроллбар убрать?

Jenyay 03.02.2011 - 22:33

Andrey, а что за левый скроллбар?

Andrey 03.02.2011 - 22:53

Jenyay, этот:)
(правый убирается set guioptions-=r, ибо он там и не нужен, ведь в статусной строке написано ск-ко всего строк, на какой строке щас курсор, ск-ко % )

Jenyay 03.02.2011 - 23:12

Аа, этот, тогда set guioptions-=L.

Andrey 05.02.2011 - 22:25

Jenyay
> Аа, этот, тогда set guioptions-=L
спасибо:)
еще вопрос - как в (г)виме удалить стандартное меню (файл, редактирование, хелп, etc), но при этом, чтобы мои собственные меню остались?

 05.02.2011 - 22:34

А вот это так сразу не скажу. Если в справке найду, то напишу.

Andrey 05.02.2011 - 23:28

Кстати, что используешь для фолдинга в питон коде?
Я щас посмотрел стандартный фолдинг - он какой-то глюкаватый (для питона точно), нагуглил http://habamax.ru/blog/2009/05/python-folding-in-vim/ вот это уже лучше, намного :)

Jenyay 06.02.2011 - 23:30

А я как-то фолдинг вообще не использую.

Andrey 12.02.2011 - 14:12

Jenyay, я тоже их не использовал пока не попробовал, мне показалось весьма удобно использовать фолдинги.

Andrey 25.02.2011 - 12:36

У меня через неопределенное время отключается автоотступ. Лечится только рестартом вима. Такое проявляется и в Linux, и в Mac OS X, и в Windows. Происходит такое внезапно. Очень напрягает. Никакой периодичности не замечено.
В чем может быть проблема?

Артур 23.08.2016 - 22:49

Помогла статья.

Установил vim. Я обычный пользователь не программист. Сидел 4 часа понять не мог. Нигде нет ответа внятного как менять кодировку. Только хотел забросить всю эту непонятку, через некоторое время вышел на вашу статью. Спасибо.


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 515