VIM и Python – Союз, заключенный на небесах

Оглавление

Считаю своим долгом рассказать вам о единственной настоящей среде разработки на Python, которая вам когда-либо понадобится: VIM.

Это верно. VIM вездесущ и быстр, и он никогда не выходит из строя. Он также может делать практически все, что угодно!

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

 

Установка

Поскольку VIM поставляется предустановленным в ряде *nix систем, давайте сначала проверим, установлен ли он:

$ vim --version

Если он установлен, вы должны увидеть что-то вроде:

VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Nov  5 2014 21:00:28)
Compiled by root@apple.com
Normal version without GUI.  Features included (+) or not (-):
-arabic +autocmd -balloon_eval -browse +builtin_terms +byte_offset +cindent
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
-conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con +diff +digraphs
-dnd -ebcdic -emacs_tags +eval +ex_extra +extra_search -farsi +file_in_path
+find_in_path +float +folding -footer +fork() -gettext -hangul_input +iconv
+insert_expand +jumplist -keymap -langmap +libcall +linebreak +lispindent
+listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape
-mouse_dec -mouse_gpm -mouse_jsbterm -mouse_netterm -mouse_sysmouse
+mouse_xterm +multi_byte +multi_lang -mzscheme +netbeans_intg -osfiletype
+path_extra -perl +persistent_undo +postscript +printer -profile +python/dyn
-python3 +quickfix +reltime -rightleft +ruby/dyn +scrollbind +signs
+smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary
+tag_old_static -tag_any_white -tcl +terminfo +termresponse +textobjects +title
 -toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo
+vreplace +wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp
 -xterm_clipboard -xterm_save
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -D_FORTIFY_SOURCE=0 -Iproto -DHAVE_CONFIG_H -arch i386 -arch x86_64 -g -Os -pipe
Linking: gcc -arch i386 -arch x86_64 -o vim -lncurses

На этом этапе вы хотите проверить две вещи:

  1. Версия VIM должна быть выше 7.3.
  2. +python должно появиться в списке функций, чтобы вы знали, что поддерживается Python.

Если обе эти проверки пройдены, перейдите прямо к Расширениям VIM. Если нет, то пришло время установить/обновить.

macOS / OS X

Возьмите Homebrew, если у вас его еще нет, и запустите:

$ brew update
$ brew install vim

*NIX / Linux

Для Debian или Ubuntu вы можете попробовать:

$ sudo apt-get remove vim-tiny
$ sudo apt-get update
$ sudo apt-get install vim

Что касается других версий Linux, ознакомьтесь с документацией в вашем менеджере пакетов. Вот ссылка, которая поможет вам начать: Установите Vim..

Windows

Существует множество различных способов установки VIM в Windows. Начните с официальных документов.

Проверка установки VIM

Убедитесь, что вы установили VIM > 7.3 с поддержкой Python. Снова запустите vim --version, чтобы убедиться в этом. Если вы хотите проверить конкретную версию Python, используемую в VIM, запустите :python import sys; print(sys.version) из VIM:

2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)]

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

Установив VIM, давайте посмотрим, как настроить VIM для разработки на Python.

Расширения VIM

VIM может делать многое из того, что нужно разработчикам, прямо из коробки. Однако он также обладает широкой расширяемостью, и есть несколько довольно интересных расширений, которые делают его более похожим на “современную” среду IDE. Самое первое, что вам нужно, - это хороший менеджер расширений.

Примечание: Расширения в VIM часто называют пакетами или плагинами.

Vundle

В VIM есть несколько менеджеров расширений, но я настоятельно рекомендую один из них - Vundle. Думайте об этом как о pip для VIM. Это упрощает установку и обновление пакетов.

Давайте установим Vundle:

$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

Эта команда загружает менеджер плагинов Vundle и помещает его в ваш каталог VIM bundles. Теперь вы можете управлять всеми расширениями от .vimrc файл конфигурации.

Добавьте файл в домашнюю директорию вашего пользователя:

$ touch ~/.vimrc

Теперь настройте Vundle в вашем .vimrc, добавив в начало файла следующее:

set nocompatible              " required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim'

" add all your plugins here (note older versions of Vundle
" used Bundle instead of Plugin)

" ...

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required

Вот и все. Теперь вы настроены на использование Vundle. После этого вы можете добавить плагины, которые хотите установить, затем запустить VIM и выполнить:

:PluginInstall

Эта команда заставляет Vundle творить чудеса — загружать все плагины и устанавливать/обновлять их за вас.

Vim plugin installation

Примечание: Если вы являетесь пользователем Windows, ознакомьтесь с Инструкциями по установке Windows.

Давайте создадим IDE

Мы не смогли бы перечислить все возможности VIM, но давайте рассмотрим краткий список некоторых мощных готовых функций, которые идеально подходят для разработки на Python.

Выбросьте мышь

Вероятно, самой важной особенностью VIM является то, что для этого не требуется мышь (за исключением графических вариантов VIM). Поначалу это может показаться ужасной идеей, но после того, как вы потратите время — а это действительно займет некоторое время — на изучение комбинаций клавиш , вы ускорите весь рабочий процесс!

Разделенные макеты

Если вы открываете файл с помощью :sp <filename>, вы разделяете макет по вертикали (открывая новый файл под текущим файлом). Если вы поменяете местами клавиши на :vs <filename>, вы получите горизонтальное разделение (открытие нового файла справа от вашего текущего файла).

Split layouts in VIM

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

Совет профессионала #1: Обязательно используйте функцию завершения ввода с помощью табуляции, чтобы находить файлы после ввода :sp.

Совет профессионала #2: Вы также можете указать различные области экрана, в которых должны происходить разбиения, добавив в файл .vimrc следующие строки:

set splitbelow
set splitright

Совет профессионала #3: Хотите перемещаться между разделителями без использования мыши? Если вы просто добавите к .vimrc следующее, вы сможете переключаться между разделениями всего одной комбинацией клавиш:

"split navigations
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>

Комбинации клавиш:

  • Ctrl+J перейти к разделу ниже
  • Ctrl+K перейти к разделу, указанному выше
  • Ctrl+L переместиться к разделителю вправо
  • Ctrl+H переместиться к разделителю влево

Другими словами, нажмите Ctrl плюс стандартную клавишу перемещения VIM, чтобы перейти к определенной панели.

Но подождите — в чем же суть nnoremap? В двух словах, nnoremap преобразует одну комбинацию клавиш в другую. Часть no означает переназначение клавиши в обычном режиме, а не в визуальном. По сути, в nnoremap <C-J> <C-W><C-j> говорится, что в обычном режиме, когда я нажимаю <C-J>, вместо этого делайте <C-W><C-j>. Более подробную информацию можно найти здесь.

Буферы

В то время как VIM может создавать вкладки, многие пользователи предпочитают буферы и разделители. Вы можете представить буфер как недавно открытый файл. VIM обеспечивает простой доступ к последним буферам. Просто введите :b <buffer name or number>, чтобы переключиться на открытый буфер. (Автозаполнение и здесь работает.) Вы также можете использовать :ls для отображения списка всех буферов.

Совет профессионала #4: В конце вывода :ls VIM выдаст запрос с Hit enter to continue. Вместо этого вы можете ввести :b <buffer number> и выбрать буфер немедленно, пока список еще отображается. Это сэкономит вам время нажатия клавиши, и вам не придется запоминать номер буфера.

Сворачивание кода

Большинство “современных” IDE предоставляют возможность сворачивать (или сворачивать) методы и классы, показывая вам только строки определения класса /метода вместо всего кода.

Вы можете включить это в .vimrc с помощью следующих строк:

" Enable folding
set foldmethod=indent
set foldlevel=99

Это работает нормально, но вам нужно набрать za, чтобы сложить (и развернуть). Клавиша пробела была бы намного лучше. Поэтому добавьте также эту строку в свой файл .vimrc:

" Enable folding with the spacebar
nnoremap <space> za

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

Начальная команда, set foldmethod=indent, создает сгибы на основе отступов от строки. Однако это часто приводит к созданию большего количества сгибов, чем вы действительно хотите. Но не бойтесь! Существует несколько расширений, которые пытаются это исправить. Мы рекомендуем SimpylFold. Установите его с помощью Vundle, добавив следующую строку в .vimrc:

Plugin 'tmhedberg/SimpylFold'

Примечание: Не забудьте установить плагин - :PluginInstall.

Совет профессионала #5: Попробуйте это, если хотите увидеть строки документации для свернутого кода:

let g:SimpylFold_docstring_preview=1

Отступы в Python

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

  1. Установите отступы в соответствии со стандартами PEP 8.
  2. Улучшите обработку автоматического отступа.

PEP 8

Чтобы добавить соответствующий отступ для PEP 8, добавьте в свой .vimrc:

au BufNewFile,BufRead *.py
    \ set tabstop=4
    \ set softtabstop=4
    \ set shiftwidth=4
    \ set textwidth=79
    \ set expandtab
    \ set autoindent
    \ set fileformat=unix

Это позволит вам использовать стандартные четыре пробела при нажатии клавиши tab, убедиться, что длина строки не превышает 80 символов, и сохранить файл в формате Unix, чтобы у вас не возникло проблем с конвертацией при загрузке на GitHub. и/или делиться ими с другими пользователями.

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

au BufNewFile,BufRead *.js, *.html, *.css
    \ set tabstop=2
    \ set softtabstop=2
    \ set shiftwidth=2

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

Автоматическое создание отступов

autoindent это поможет, но в некоторых случаях (например, когда сигнатура функции занимает несколько строк) она не всегда работает так, как вы хотите, особенно когда речь идет о соответствии стандартам PEP 8. Чтобы исправить это, вы можете использовать расширение indentpython.vim:

Plugin 'vim-scripts/indentpython.vim'

Помечаем ненужные пробелы

Вы также хотите избежать лишних пробелов. Вы можете пометить это в VIM, чтобы это было легко обнаружить, а затем удалить:

au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/

Это пометит лишние пробелы как недопустимые и, вероятно, окрасит их в красный цвет.

Поддержка UTF-8

По большей части вам следует использовать UTF-8 при работе с Python, особенно если вы работаете с Python 3. Убедитесь, что VIM знает об этом с помощью следующей строки:

set encoding=utf-8

Автоматическое завершение

Лучшим плагином для автозаполнения Python является YouCompleteMe. Опять же, используйте Vundle для установки:

Bundle 'Valloric/YouCompleteMe'

По сути, YouCompleteMe использует несколько различных средств автозавершения (в том числе Jedi для Python), и для корректной работы необходимо установить некоторые библиотеки C. В документации есть очень хорошие инструкции по установке, поэтому я не буду их здесь повторять, но обязательно следуйте им.

Это работает довольно хорошо, но давайте добавим несколько настроек:

let g:ycm_autoclose_preview_window_after_completion=1
map <leader>g  :YcmCompleter GoToDefinitionElseDeclaration<CR>

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

Примечание: Мой ведущий ключ привязан к пробелу, поэтому space-g приведет к определению того, на чем я сейчас нахожусь. Это полезно, когда я изучаю новый код.

Поддержка Virtualenv

Одна из проблем, связанных с приведенным выше определением goto, заключается в том, что VIM по умолчанию ничего не знает о virtualenv, поэтому вы должны сообщить VIM и YouCompleteMe о вашем virtualenv, добавив следующие строки кода в .vimrc:

"python with virtualenv support
py << EOF
import os
import sys
if 'VIRTUAL_ENV' in os.environ:
  project_base_dir = os.environ['VIRTUAL_ENV']
  activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')
  execfile(activate_this, dict(__file__=activate_this))
EOF

Это определяет, работаете ли вы внутри virtualenv, переключается на этот конкретный virtualenv, а затем настраивает ваш системный путь таким образом, чтобы YouCompleteMe находил соответствующие пакеты сайта.

Проверка/выделение синтаксиса

Вы можете попросить VIM проверять ваш синтаксис при каждом сохранении с помощью расширения syntastic:

Plugin 'vim-syntastic/syntastic'

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

Plugin 'nvie/vim-flake8'

Наконец, приведите свой код в порядок:

let python_highlight_all=1
syntax on

Цветовые схемы

Цветовые схемы работают в сочетании с базовой цветовой схемой, которую вы используете. Проверьте solarized для режима GUI и Zenburn для режима терминала:

Plugin 'jnurmine/Zenburn'
Plugin 'altercation/vim-colors-solarized'

Затем просто добавьте немного логики, чтобы определить, какую схему использовать в зависимости от режима VIM:

if has('gui_running')
  set background=dark
  colorscheme solarized
else
  colorscheme zenburn
endif

Solarized также поставляется с темной и светлой тематикой. Чтобы упростить переключение между ними (нажав F5), добавьте:

call togglebg#map("<F5>")

Просмотр файлов

Если вам нужно правильное файловое дерево, то NERDTree - это то, что вам нужно:

Plugin 'scrooloose/nerdtree'

Если вы хотите использовать вкладки, используйте vim-nerdtree-tabs:

Plugin 'jistr/vim-nerdtree-tabs'

Хотите скрыть .pyc файлов? Затем добавьте следующую строку:

let NERDTreeIgnore=['\.pyc$', '\~$'] "ignore files in NERDTree

Супер поиск

Хотите найти что-нибудь в основном из VIM? Проверьте CtrlP:

Plugin 'kien/ctrlp.vim'

Как и следовало ожидать, нажатие Ctrl+P активирует поиск, так что вы можете просто начать вводить текст. Если в результате поиска будет найдено что-либо, близкое к искомому файлу, программа найдет его. И это касается не только файлов: программа также найдет теги! Чтобы узнать больше, посмотрите это видео на YouTube .

Нумерация строк

Включите отображение номеров строк в боковой части экрана с помощью:

set nu

Интеграция с Git

Хотите выполнять базовые команды git, не выходя из VIM? Тогда vim-fugitive - это то, что вам нужно:

Plugin 'tpope/vim-fugitive'

VIM fugitive plugin screenshot

Смотрите это в действии на VIMcasts.

Линия электропередачи

Powerline - это строка состояния, в которой отображаются такие параметры, как текущий virtualenv, ветка git, редактируемые файлы и многое другое.

The Powerline plugin for VIM (screenshot)

Он написан на Python и поддерживает ряд других сред, таких как zsh, bash, tmux и IPython:

Plugin 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}

Ознакомьтесь со всеми параметрами конфигурации в официальной документации.

Системный буфер обмена

Vim обычно имеет свой собственный буфер обмена и игнорирует системные клавиатуры, но иногда вам может потребоваться вырезать, копировать и/или вставлять в /из других приложений, не связанных с VIM. В OS X вы можете получить доступ к системному буферу обмена с помощью этой строки:

set clipboard=unnamed

VIM в оболочке

Наконец, как только вы освоитесь с VIM и его сочетаниями клавиш, вас часто будет раздражать отсутствие таких же сочетаний в командной оболочке. Не бойтесь: большинство командных оболочек поддерживают режим VI. Чтобы включить его для вашей оболочки, добавьте следующую строку в ~/.inputrc:

set editing-mode vi

Теперь вы сможете использовать комбинации клавиш VIM не только в оболочке, но и в интерпретаторе Python и любом другом инструменте, использующем GNU Readline (большинство оболочек баз данных). Теперь VIM есть везде!

Заключение

На этом более или менее все (по крайней мере, для разработки на Python). Существует множество других расширений, которые вы можете использовать, а также альтернативы всему, что описано в этом посте. Какие расширения вам больше всего нравятся? Как вы настроили VIM, чтобы он соответствовал вашей индивидуальности?

Вот ссылка на мою текущую конфигурацию VIM. У вас есть такая же? Поделитесь, пожалуйста!

Спасибо за чтение!

Ресурсы

  1. VIM Tutor поставляется вместе с VIM, поэтому, как только VIM будет установлен, просто введите vimtutor в командной строке, и программа научит вас, как использовать VIM, а, используя VIM.
  2. VIMcasts - это обучающие видеоролики, описывающие, как использовать многие функции VIM.
  3. Официальные документы VIM
  4. Откройте Vim
  5. Приложение Learn Vimscript the Hard Way идеально подходит для изучения vimscript.
Back to Top