Vim. Первая установка
- Настраиваем кодировки
- Настраиваем внешний вид редактора
- Vim + Python
- Учим 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.