Vim — уникальный по своей гибкости редактор, который при должной настройке может едва ли не идеально удовлетворять все пожелания работающего с ним. Правда эта настройка может продолжаться месяцы, а то и годы, что является и достоинством, и недостатком vim’а. Существует множество статей и туториалов по использованию Vim для разработки на Python и Django, надеюсь мне удастся рассказать что-то новое. В своей статье я постараюсь по минимуму упоминать плагины общего назначения, вроде NERDTree или surround.vim и опишу несколько более специализированных расширений и настроек, которые существенно упростили процесс работы на Python.



Настроить Vim под Django оказалось делом довольно непростым, в отличие от использования с тем же Rails, для которого rails.vim решает 80% всех проблем. Но к сожалению Tim Pope ничего подобного для питона не написал, поэтому пришлось собирать все по частям. Вкратце, о чем пойдет речь:


  • python-mode

  • tagbar

  • pydiction

  • neocomplcache

Все ниженаписанное было опробовано в gVim для Linux.



Python-mode


Просто низкий поклон Кириллу Клёнову, разработчику данного расширения. Отлично устанавливается и с помощью vundle, и через pathogen и так же отлично работает.



Python-mode устанавливает свои настройки для питон-файлов. Если вас это не устраивает (мне например не нужен set number, который он добавляет), допишите необходимые настройки в .vimrc. Вот пример моих настроек:



let g:pymode_options = 0
let g:pymode_lint_write = 0 “не проверять при каждом сохранении
let g:pymode_folding = 0 “мне не нужен авто-фолдинг
let g:pymode_rope_vim_completion = 0 “не использовать автодополнение rope


Как можно увидеть, я не использую автоматический фолдинг кода, также мне не нужна проверка pylint'ом при каждом сохранении файла(let g:pymode_lint_write = 0), вместо чего можно использовать команду :PyLint, повесив на нее какой-нибудь хоткей. К автодополнению вернемся позже.



Плагин предоставляет несколько удобных хоткеев для перемещения по объектам в питон-коде:

Сочетание клавиш Команда
K Показать документацию
<C-c>g Перейти к определению
\r Запустить код
[[ Перейти к предыдущему классу или функции
]] Перейти к следующему классу или функции
aC C Выполнить действие для класса. (vaC, daC, dC, yaC, yC, caC, cC)
iC То же, находясь внутри класса. (viC, diC, yiC, ciC)
aM M Выполнить действие для функции. (vaM, daM, dM, yaM, yM, caM, cM)
iM То же, находясь внутри функции. (viM, diM, yiM, ciM)
Отдельно хотелось бы отметить возможность использовать Rope, в частности команды :RopeGoToDefinition, :RopeFindOccurrences и другие возможности по поиску кода и рефакторингу. просмотреть полный список команд Rope и сокращения к ним можно с помощью :help RopeKeys. Кроме того по умолчанию включена поддержка virtualenv, что значит, что с помощью того же :RopeGoToDefinition вы можете спокойно перейти к определнию функции любой библиотеки, установленной в site-packages вашего virtualenv’а.



Просмотр кода


Хотя самым популярным плагином для этого является Taglist, мне больше нравится Tagbar, также основанный на ctags(которые нужно установить перед использованием плагина). Вешаем :TagbarToggle на какой-нибудь хоткей, например:
nnoremap <F8> :TagbarToggle<CR>
Выглядит это примерно так:







Пара дополнительных настроек:



let g:tagbar_autofocus = 1
let g:tagbar_sort = 0 "tagbar shows tags in order of they created in file
let g:tagbar_foldlevel = 0 "close tagbar folds by default


Кроме того можно настроить, с какой стороны будет появляться окно тагбара, какими будут отступы, иконки и т.д. Обо всем этом можно узнать через :help tagbar.



Автодополнение


Один из плагинов, который я мог бы посоветовать — Pydiction, дополняющий ключевые слова на основе большого файла словаря. У данного плагина очень много плюсов:


  • автодополнение происходит по клавише Tab, не нужно запоминать всякие комбинации с Ctrl

  • абсолютно никаких конфликтов, можно одновременно использовать Pydiction с omnicomplete

  • автодополнение не затрагивает другие типы файлов

  • умеет дополнять импортированные объекты

  • довольно легко можно добавить в словарь собственные модули: python pydiction.py module_name

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



Другой способ — использовать neocomplcache. Кроме установки плагина, нужно задать omnifunc для питоновских файлов:

autocmd FileType python setlocal omnifunc=pythoncomplete#Complete


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

let g:neocomplcache_enable_at_startup = 1


Шаблоны Django


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



fun! DetectTemplate()
  let n = 1
  while n < line("$")
    if getline(n) =~ '{%' || getline(n) =~ '{{'
      set ft=htmldjango
      return
    endif
    let n = n + 1
  endwhile
  set ft=html "default html
endfun


которую нужно запускать при открытии файла с раширением .html:

autocmd BufNewFile,BufRead *.html call DetectTemplate()


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



Случайные настройки




  • Питоновские отступы:
    autocmd FileType python setlocal ts=4 sts=4 sw=4
    




  • Если вы пользуетесь NERDTree, стоит добавить .pyc в список игнорируемых файлов:
    let NERDTreeIgnore=['\.pyc$']
    




  • простое сокращение для вставки дебаггера ipdb в код
    iab ipdb import ipdb; ipdb.set_trace()
    




  • сокращение для задания кодировки в начале файла:
    iab utf! # -*- coding: utf-8 -*-
    




  • убрать раздражающие всплывающие окна с документацией для omnicompletion:
    set completeopt-=preview
    




  • пара цветовых схем:darkspectrum, gruvbox, Lucius



Дополнительные ссылки


1. python-mode

github.com/klen/python-mode

2. Tagbar

github.com/majutsushi/tagbar

3. Pydiction

github.com/rkulla/pydiction

4. Neocomplcache

github.com/Shougo/neocomplcache





















































https://habrahabr.ru/post/173473/

Profile

uzverss: (Default)
uzverss

May 2017

S M T W T F S
 123456
7 8910111213
14151617 181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 21st, 2017 02:41 pm
Powered by Dreamwidth Studios