Время на прочтение10 мин
Количество просмотров162K
Данная статья будет посвящена настройке vim, в которой я поделюсь своим «скромным» пониманием того, каким должен быть текстовый редактор, чтобы в нем было удобно/приятно/легко (нужное подчеркнуть) писать код также, как это сейчас возможно во всевозможных IDE типа PyCharm, SublimeText и т.п.
Весь процесс постараюсь описать как можно более подробно, чтобы вопросов по мере чтения для начинающих осваивать vim возникало как можно меньше.
Предыстория
Сам я знаком с vim не очень продолжительное время, однако, к его изучению и желанию использовать привело:
- достаточное количество на хабре статей по vim
- большое количество существующих плагинов
- преимущественно, разработчики на Python занимаются написанием кода под Linux (хотя vim — кроссплатформенный)
- собственное любопытство
В настоящее время я использую весьма часто vim как основной инструмент для разработки на Python и нисколько об этом не жалею. Если чего-либо нехватает, то проблема решается гуглением в течении пару минут. Поверьте, vim действительно стоит тех затраченных сил на его изучения. Это достаточно быстро себя «окупает». Было бы только желание и немножечко терпения.
Подготовительный этап
Итак. Перейдем непосредственно к подготовительному этапу. Нам понадобится:
- Vim версии 7.4 (получить нужное можно либо скачиванием из репозиториев, либо сборкой вручную)
- Python 2.7 (с установленным pip)
- Клиент для работы с git
После того, как вышеперечисленное у нас имеется, можно приступать непосредственно к настройке и «кастомизации».
Настройка
Самое первой проблемой для любого новичка, который решает обуздать vim, является vimscript. Vimscript — это скриптовый язык, предназначенный для vim. На нем мы будем описывать используемые плагины, горячие клавиши и все тому подобное, чтобы обеспечить себе простую и легкую работу в vim. Для ознакомления советую посетить вот этот и этот сайты. Там достаточно неплохо все описано, что, где, как, и почему.
Первым делом стоит рассказать о том, что конфигурационный файл vim находится в домашнем каталоге пользователя (~/) и называется .vimrc. В нем-то и будут расписываться моменты относительно того, какие шрифты, цветовая схема, хоткеи и т.п. будут использоваться.
Во-вторых, при настойке текстового редактора, иногда будет необходимо заходить в каталог .vim (это скрытый каталог, и он расположен также в домашнем каталоге юзера), в который будут помещен ряд необходимых файлов, рассортированных по каталогам.
Какие включает в себя подкаталоги исходный каталог .vim? Примерно такие:
.vim
|____after
|____autoload
|____colors
|____doc
|____ftplugin
|____indent
|____plugin
|____scripts
|____syntax
Однако, из всех вышеперечисленных каталогов нам понадобится лишь несколько:
- colors — для цветовых схем/тем
- indent — сюда будет скидывать файлы для работы с тегами HTML/XML и т.п.
- scripts — для скриптов
- syntax — файлы синтаксиса
В эти каталоги помещаем соответствующие файлы, взяв их, например, у меня.
До начала установки и работа с менеджером пакетов пропишем в консоли:
pip install pyflakes pep8 pylint ipython
В дальнейшем, эти библиотеки нам пригодятся для того, чтобы отслеживать качество своего кода: ошибки, соответствие его PEP8 и т.п. Последняя же в этом списке библиотека/пакет — ipython нам будет удобна для настройки своего «дебаггера».
Также нам еще необходимо установить Exuberant ctags. Скачать его можно отсюда либо поискать и установить через менеджер пакетов apt-get/aptitude/rmp/pacman/и т.п.
Менеджер плагинов
Для того, чтобы нам было проще с установкой и использованием плагином будем использовать Vundle. Vundle — это пакетный менеджер для Vim, способный:
- настраивать и устанавливать плагины, указанные в. vimrc
- обновлять плагины при необходимости
- удалять неиспользуемые плагины
Однако прежде чем приступать к описанию необходимого набора плагинов в конфигурационном файле, сначала необходимо установить сам Vundle. Для этого делаем следующее:
git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
После выполнение этой команды Vundle будет установлен в ~/.vim/bundle/Vundle.vim
Теперь добавим следующую часть в свой новосозданный .vimrc если его еще нет:
set nocompatible " be iMproved, required
filetype off " required
"=====================================================
" Vundle settings
"=====================================================
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'gmarik/Vundle.vim' " let Vundle manage Vundle, required
"---------=== Code/project navigation ===-------------
Plugin 'scrooloose/nerdtree' " Project and file navigation
Plugin 'majutsushi/tagbar' " Class/module browser
"------------------=== Other ===----------------------
Plugin 'bling/vim-airline' " Lean & mean status/tabline for vim
Plugin 'fisadev/FixedTaskList.vim' " Pending tasks list
Plugin 'rosenfeld/conque-term' " Consoles as buffers
Plugin 'tpope/vim-surround' " Parentheses, brackets, quotes, XML tags, and more
"--------------=== Snippets support ===---------------
Plugin 'garbas/vim-snipmate' " Snippets manager
Plugin 'MarcWeber/vim-addon-mw-utils' " dependencies #1
Plugin 'tomtom/tlib_vim' " dependencies #2
Plugin 'honza/vim-snippets' " snippets repo
"---------------=== Languages support ===-------------
" --- Python ---
Plugin 'klen/python-mode' " Python mode (docs, refactor, lints, highlighting, run and ipdb and more)
Plugin 'davidhalter/jedi-vim' " Jedi-vim autocomplete plugin
Plugin 'mitsuhiko/vim-jinja' " Jinja support for vim
Plugin 'mitsuhiko/vim-python-combined' " Combined Python 2/3 for Vim
call vundle#end() " required
filetype on
filetype plugin on
filetype plugin indent on
Как вы видите, места где указаны Plugin 'ссылка_до_плагина'
представляет собой ссылки в интернете эти плагины, которые Vundle будет скачивать и в последствии устанавливать. Для себя, я разбивал эти плагины на «категории», но это уже дело вкуса. Сами плагины:
- NERDTree — навигация по файловой/директориям
- TagBar — навигация по классам/функциям/переменным
- vim-airline — строка статуса/состояния
- FixedTaskList — поиск в файле FIXME, TODO и т.п.
- conque-term — используем для вызова дебаггера
- vim-surround — автозакрытие тегов HML/XML/и т.п.
- vim-snipmate — сниппеты
- python-mode — рефакторинг, документация, дебаггер Python и т.п.
- jedi-vim — автодополнение для Python
- vim-jinja — поддержка синтаксиса шаблонов Jinja
В качестве руководства/гайда по использованию Vundle можно зайти сюда. Однако для наших целей будет предостаточно одной:
:PluginInstall
Эта команда сканирует файл .vimrc на наличие списка плагинов прописанных в виде Plugin 'ссылка_до_плагина'
.
Для того, чтобы запустить установку набора плагинов, заходим в vim/gvim и прописываем :PluginInstall
. Придется немного подождать, поскольку каждый плагин, указанный выше в конфиге, будет скачан с githuba либо еще откуда-то и настроен до установок «по умолчанию», подождите пару минут. Каждый выкачанный и настроенный плагин отмечается как «+». Как только увидите, что все из списка подсвечены «+» — значит, все готово. И для дальнейшего использования необходимо будет перезапустить vim. Однако на этом все еще не оканчивается статья — все необходимо «подкрутить», чтобы работать в vim’е было комфортно.
Общие настройки vim’а
Эти настройки для меня являются базовыми. Тут я указываю свои предпочтения относительно парочки плагинов, размера шрифтов, цветовой схемы, отображаемых элементов и т.п.
Добавьте эти строчки в конец своего .vimrc файла:
"=====================================================
" General settings
"=====================================================
set backspace=indent,eol,start
aunmenu Help.
aunmenu Window.
let no_buffers_menu=1
set mousemodel=popup
set ruler
set completeopt-=preview
set gcr=a:blinkon0
if has("gui_running")
set cursorline
endif
set ttyfast
" включить подсветку кода
syntax on
if has("gui_running")
" GUI? устаналиваем тему и размер окна
set lines=50 columns=125
colorscheme molokai
" раскомментируйте эти строки, если хотите, чтобы NERDTree/TagBar автоматически отображались при запуске vim
" autocmd vimenter * TagbarToggle
" autocmd vimenter * NERDTree
" autocmd vimenter * if !argc() | NERDTree | endif
" на маке vim?
if has("mac")
set guifont=Consolas:h13
set fuoptions=maxvert,maxhorz
else
" дефолтный GUI
set guifont=Ubuntu\ Mono\ derivative\ Powerline\ 10
endif
else
" терминал?
colorscheme myterm
endif
tab sball
set switchbuf=useopen
" отключаем пищалку и мигание
set visualbell t_vb=
set novisualbell
set enc=utf-8 " utf-8 по дефолту в файлах
set ls=2 " всегда показываем статусбар
set incsearch " инкреминтируемый поиск
set hlsearch " подсветка результатов поиска
set nu " показывать номера строк
set scrolloff=5 " 5 строк при скролле за раз
" отключаем бэкапы и своп-файлы
set nobackup " no backup files
set nowritebackup " only in case you don't want a backup file while editing
set noswapfile " no swap files
" прячем панельки
"set guioptions-=m " меню
set guioptions-=T " тулбар
"set guioptions-=r " скроллбары
" настройка на Tab
set smarttab
set tabstop=8
" при переходе за границу в 80 символов в Ruby/Python/js/C/C++ подсвечиваем на темном фоне текст
augroup vimrc_autocmds
autocmd!
autocmd FileType ruby,python,javascript,c,cpp highlight Excess ctermbg=DarkGrey guibg=Black
autocmd FileType ruby,python,javascript,c,cpp match Excess /\%80v.*/
autocmd FileType ruby,python,javascript,c,cpp set nowrap
augroup END
" указываем каталог с настройками SnipMate
let g:snippets_dir = "~/.vim/vim-snippets/snippets"
" настройки Vim-Airline
set laststatus=2
let g:airline_theme='badwolf'
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#formatter = 'unique_tail'
" TagBar настройки
map <F4> :TagbarToggle<CR>
let g:tagbar_autofocus = 0 " автофокус на Tagbar при открытии
" NerdTree настройки
" показать NERDTree на F3
map <F3> :NERDTreeToggle<CR>
"игноррируемые файлы с расширениями
let NERDTreeIgnore=['\~$', '\.pyc$', '\.pyo$', '\.class$', 'pip-log\.txt$', '\.o$']
" TaskList настройки
map <F2> :TaskList<CR> " отобразить список тасков на F2
" Работа буфферами
map <C-q> :bd<CR> " CTRL+Q - закрыть текущий буффер
Python-mode
Очень нравится этот плагинчик, который кстати, сделан klen. Предоставляет море возможностей при работе с кодом:
- рефакторинг
- автодополнение
- работа с дебаггером
- автофикс PEP8 ошибок
- и многое-многое другое…
Добавьте эти строчки в конец своего .vimrc файла:
"=====================================================
" Python-mode settings
"=====================================================
" отключаем автокомплит по коду (у нас вместо него используется jedi-vim)
let g:pymode_rope = 0
let g:pymode_rope_completion = 0
let g:pymode_rope_complete_on_dot = 0
" документация
let g:pymode_doc = 0
let g:pymode_doc_key = 'K'
" проверка кода
let g:pymode_lint = 1
let g:pymode_lint_checker = "pyflakes,pep8"
let g:pymode_lint_ignore="E501,W601,C0110"
" провека кода после сохранения
let g:pymode_lint_write = 1
" поддержка virtualenv
let g:pymode_virtualenv = 1
" установка breakpoints
let g:pymode_breakpoint = 1
let g:pymode_breakpoint_key = '<leader>b'
" подстветка синтаксиса
let g:pymode_syntax = 1
let g:pymode_syntax_all = 1
let g:pymode_syntax_indent_errors = g:pymode_syntax_all
let g:pymode_syntax_space_errors = g:pymode_syntax_all
" отключить autofold по коду
let g:pymode_folding = 0
" возможность запускать код
let g:pymode_run = 0
Jedi-vim
Очень полезный плагин, предоставляющий отличные возможности автокомплита, go to definition, и т.п.
В своем конфиге добавьте в конец этот фрагмент:
" Disable choose first function/method at autocomplete
let g:jedi#popup_select_first = 0
Этой строчкой я отрубаю в автокомплите выбор первой строки из списка выбора метода/библиотеки/класса автокомплита. Это связано с тем, что достаточно часто я выбираю не первую строку из нее, а автоматический выбор раздражает.
После настройки jedi-vim получаем отображение документации по функции
и добротный автокомплит по аргументам функций
Хоткеи
Тут сложно что-либо посоветовать. У всех различное понимание того, какие хоткеи нужны, а какие-нет. Могу лишь сказать, что для желающих, найти/написать необходимые кусочки vimscript, переопределяющих поведение стандартных горячих клавиш — очень много.
Добавьте этот фрагмент в конец конфига:
"=====================================================
" User hotkeys
"=====================================================
" ConqueTerm
" запуск интерпретатора на F5
nnoremap <F5> :ConqueTermSplit ipython<CR>
" а debug-mode на <F6>
nnoremap <F6> :exe "ConqueTermSplit ipython " . expand("%")<CR>
let g:ConqueTerm_StartMessages = 0
let g:ConqueTerm_CloseOnEnd = 0
" проверка кода в соответствии с PEP8 через <leader>8
autocmd FileType python map <buffer> <leader>8 :PymodeLint<CR>
" автокомплит через <Ctrl+Space>
inoremap <C-space> <C-x><C-o>
" переключение между синтаксисами
nnoremap <leader>Th :set ft=htmljinja<CR>
nnoremap <leader>Tp :set ft=python<CR>
nnoremap <leader>Tj :set ft=javascript<CR>
nnoremap <leader>Tc :set ft=css<CR>
nnoremap <leader>Td :set ft=django<CR>
Отступы, табы, пробелы для разных языков
Это связано с тем, что в том же Python табы не рекомендуется к использованию. Поэтому будем заменять их на пробелы. Один таб = 4 пробелам. Плюс ко всему необходимо помнить, что всегда нужно сделать переход на следующую строку + отступ, чтобы было соответствие операторам for/if/while/и т.п.
Для других языков предостаточно будет указать размер Таба, и замены их на пробелы.
Добавьте этот фрагмент в конец своего конфига:
"=====================================================
" Languages support
"=====================================================
" --- Python ---
"autocmd FileType python set completeopt-=preview " раскомментируйте, в случае, если не надо, чтобы jedi-vim показывал документацию по методу/классу
autocmd FileType python setlocal expandtab shiftwidth=4 tabstop=8
\ formatoptions+=croq softtabstop=4 smartindent
\ cinwords=if,elif,else,for,while,try,except,finally,def,class,with
autocmd FileType pyrex setlocal expandtab shiftwidth=4 tabstop=8 softtabstop=4 smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class,with
" --- JavaScript ---
let javascript_enable_domhtmlcss=1
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd BufNewFile,BufRead *.json setlocal ft=javascript
" --- HTML ---
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
" --- template language support (SGML / XML too) ---
autocmd FileType html,xhtml,xml,htmldjango,htmljinja,eruby,mako setlocal expandtab shiftwidth=2 tabstop=2 softtabstop=2
autocmd bufnewfile,bufread *.rhtml setlocal ft=eruby
autocmd BufNewFile,BufRead *.mako setlocal ft=mako
autocmd BufNewFile,BufRead *.tmpl setlocal ft=htmljinja
autocmd BufNewFile,BufRead *.py_tmpl setlocal ft=python
let html_no_rendering=1
let g:closetag_default_xml=1
let g:sparkupNextMapping='<c-l>'
autocmd FileType html,htmldjango,htmljinja,eruby,mako let b:closetag_html_style=1
autocmd FileType html,xhtml,xml,htmldjango,htmljinja,eruby,mako source ~/.vim/scripts/closetag.vim
" --- CSS ---
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
autocmd FileType css setlocal expandtab shiftwidth=4 tabstop=4 softtabstop=4
Подведение итогов
После прохождения столь длительного процесса настройки у нас получился достаточно гибкий инструмент для работы с Python. При этом, последующая установка, на другие ПК будет представлять только доустановку необходимых библиотек, переноса соответствующего конфига и установку плагинов.
После настройки мы получим примерно такой vim:
В режиме работы с HTML/JavaScript/XML будет все выглядеть примерно так:
Если кому-либо нужен больший функционал (например поддержка автокомплита для любых иных языков), то могу посоветовать лишь поискать необходимые плагины на GitHub’е или на офицальном сайте сайте vim’a.
Полезные ссылки:
Раздел script сайта vim.org — тут
wikia по vim’у — тут
OpenVim: уроки по азам в vim — тут
Шрифты для vim-airline — тут
Мой конфиг для vim на GitHub
Python-mode, a Python IDE for Vim
This project needs contributors.
Documentation:
:help pymode
- https://github.com/python-mode/python-mode/wiki
Important notes:
-
From 2017-11-19 onwards python-mode uses submodules instead of
hard coding 3rd party libraries into its codebase. Please issue the command:
git submodule update --init --recursive
inside your python-mode folder. -
From 2019-12-14 onwards
python-mode
dropped python2 support. If you
still need to use it with python2 you should look for thelast-py2-support
branch and/or tag.
If you are a new user please clone the repos using the recursive flag:
git clone —recurse-submodules https://github.com/python-mode/python-mode
Python-mode is a Vim plugin that magically converts Vim into a Python IDE.
Why Python-mode?
- Be more productive: Pymode saves time by bringing all the tools
necessary for professional developers so that you can focus on bigger
things. It has been finely tuned based on decades of experience working
with Vim and is constantly kept up to date. - Get smart assistance: Pymode knows all about your code. We use the
best-in-class intellisense code completion, on-the-fly error checking and
quick-fixes; easy project navigation and much more. - Use the full power and capabilities of Vim: Unlike traditional IDEs
which can only provide a small subset of Vim functionalities, you can do
everything and anything that you can in Vim. - Modular structure: We attempt to create Python-mode with the same
principles of python: i.e. have a modular structure, so that as and when
better libraries evolve, we can provide you the best experience, while
abstracting the details so that you can get back to what you do best. - Written mostly in Python: 96.1% written in Python. Well, we love Python
The plugin contains all you need to develop python applications in Vim.
- Support Python and 3.6+
- Syntax highlighting
- Virtualenv support
- Run python code (
<leader>r
) - Add/remove breakpoints (
<leader>b
) - Improved Python indentation
- Python motions and operators (
]]
,3[[
,]]M
,vaC
,viM
,
daC
,ciM
, …) - Improved Python folding
- Run multiple code checkers simultaneously (
:PymodeLint
) - Autofix PEP8 errors (
:PymodeLintAuto
) - Search in python documentation (
<leader>K
) - Code refactoring
- Intellisense code-completion
- Go to definition (
<C-c>g
) - And more, more …
See a screencast here: http://www.youtube.com/watch?v=67OZNp9Z0CQ.
Another old presentation here: http://www.youtube.com/watch?v=YhqsjUUHj6g.
To read python-mode documentation in Vim, use :help pymode
.
Requirements
Vim >= 7.3 (most features needed +python3 support) (also
--with-features=big
if you want g:pymode_lint_signs
).
How to install
Manually (according to vim’s package structure)
As of vim8 there is an officially supported way of adding plugins. See :tab help packages
in vim for details.
cd ~/.vim/pack/python-mode/start
git clone --recurse-submodules https://github.com/python-mode/python-mode.git
cd python-mode
Note. Windows OS users need to add -c core.symlinks=true
. See below.
pathogen
cd ~/.vim
mkdir -p bundle && cd bundle
git clone --recurse-submodules https://github.com/python-mode/python-mode.git
Enable pathogen in your ~/.vimrc
:
" Pathogen load
filetype off
call pathogen#infect()
call pathogen#helptags()
filetype plugin indent on
syntax on
vim-plug
Include the following in the vim-plug
section of your ~/.vimrc
:
Plug 'python-mode/python-mode', { 'for': 'python', 'branch': 'develop' }
NeoBundle
Add the following:
" python-mode: PyLint, Rope, Pydoc, breakpoints from box.
" https://github.com/python-mode/python-mode
NeoBundleLazy 'python-mode/python-mode', { 'on_ft': 'python' }
Manually
% git clone --recurse-submodules https://github.com/python-mode/python-mode.git
% cd python-mode
% cp -R * ~/.vim
Then rebuild helptags in vim:
filetype-plugin (:help filetype-plugin-on
) and filetype-indent
(:help filetype-indent-on
) must be enabled to use python-mode.
Troubleshooting/Debugging
First read our short
FAQ
or using :help pymode-faq
.
If your question is not described there then you already know what to do
(because you read the first item of our FAQ ).
Nevertheless just a refresher on how to submit bugs:
(From the FAQ)
Clear all python cache/compiled files (*.pyc
files and __pycache__
directory and everything under it) from your python-mode install directory.
In Linux/Unix/MacOS you can run:
find <path_to_pymode> -type f -iname '*.pyc' -o -iname '*.pyo' -delete && find . -type d -name '__pycache__' -delete
Then start python mode with:
vim -i NONE -u <path_to_pymode>/debugvimrc.vim
Reproduce the error and submit your python mode debug file. You can check its
location with :messages
for something like:
pymode debug msg 1: Starting debug on: 2017-11-18 16:44:13 with file /tmp/pymode_debug_file.txt
Please submit the entire content of the file along with a reasoning of why the
plugin seems broken.
Do check for sensitive information in the file before submitting.
Please, also provide more contextual information such as:
- your Operational System (Linux, WIndows, Mac) and which version
- the
vim --version
output - which is your default python (
python --version
) - the python version that vim has loaded in your tests:
:PymodePython import sys; print(sys.version_info)
output.
- and if you are using virtualenvs and/or conda, also state that, please.
- It would be good also to provide the output of the two following commands:
git status
(under your python-mode directory)tree <python-mode-directory>
or something similar (such asls -lR
)
Frequent problems
Read this section before opening an issue on the tracker.
Python 2/3 vim support
Vim has issues to work with both
python2 and python3 at the same time, so if your VIM is compiled with support
to both version you may find problems. The best way to handle it is to build
your vim again with only python3 support.
Here
is a good reference on how to build vim from source.
Python 3 syntax
python-mode
supports only python3, so, if you are using python2 we cannot
help you that much. Look for our branch with python2-support (old version,
not maintained anymore) (last-py2-support
).
Symlinks on Windows
Users on Windows OS might need to add -c core.symlinks=true
switch to
correctly clone / pull repository. Example: git clone --recurse-submodules https://github.com/python-mode/python-mode -c core.symlinks=true
Error updating the plugin
If you are trying to update the plugin (using a plugin manager or manually) and
you are seeing an error such as:
Server does not allow request for unadvertised object
Then we probably changed some repo reference or some of our dependencies had a
git push --force
in its git history. So the best way for you to handle it is
to run, inside the python-mode
directory:
git submodule update --recursive --init --force
git submodule sync --recursive
Documentation
Documentation is available in your vim :help pymode
.
Bugtracker
If you have any suggestions, bug reports or annoyances please report them to
the issue tracker at:
https://github.com/python-mode/python-mode/issues
Contributing
The contributing guidelines for this plugin are outlined at
:help pymode-development
.
- Author: Kirill Klenov (https://github.com/klen)
- Maintainers:
- Felipe Vieira (https://github.com/fmv1992)
- Diego Rabatone Oliveira (https://github.com/diraol)
Also see the AUTHORS file.
Development of python-mode happens at github:
https://github.com/python-mode/python-mode
Please make a pull request to development branch and add yourself to AUTHORS.
Python libraries
Vendored Python modules are located mostly in
pymode/libs/.
Copyright
Copyright © 2013-2015 Kirill Klenov (https://github.com/klen).
License
Licensed under a GNU lesser general public license.
If you like this plugin, I would very appreciated if you kindly send me
a postcard My address is here: «Russia, 143500, MO, Istra, pos. Severny 8-3»
to «Kirill Klenov». Thanks for support!
#статьи
-
0
Какие дополнения и зачем ставить, как их настроить.
evgeniy kornilov / shutterstock
Переводчик, специалист по авиационной безопасности, начинающий веб-разработчик. Убеждён, что любой человек может сочетать абсолютно разные интересы и сферы профессиональной деятельности, ведь наши возможности безграничны.
об авторе
Разработчик-стажёр в Facebook*. Работает над приложением Chai и рассказывает о нём в блоге. Живёт в Лондоне.
Vim (или Neovim) — мой любимый текстовый редактор и IDE. Мне нравится его хорошая настраиваемость, большой набор плагинов, удобный терминал и логичный язык команд.
- junegunn/vim-plug — очень популярный менеджер плагинов, в котором нет ничего лишнего;
- tpope/vim-commentary — позволяет закомментировать код: командой gcc — строку, а командой gc — выделенный фрагмент в визуальном режиме (когда работает мышка);
- jeetsukumaran/vim-pythonsense — включает поддержку привычных для Python текстовых объектов, а также команды, которые помогут перемещаться по файлу;
- junefunn/fzf — поможет молниеносно найти файл, используя нечёткий поиск (fuzzy search). (А вообще, fzf умеет гораздо больше.)
- scrooloose/nerdtree — это файловый менеджер, работающий в редакторе Vim;
- liuchengxu/vista.vim — находит и подсвечивает символы LSP, а также выводит обзор классов, функций и методов вашего проекта.
- Vimjas/vim-python-pep8-indent — плагин для автоматической расстановки отступов в коде ✨
Ещё один способ настроить отступы — это добавить в файл .vimrc строчку:
set tabstop=8 softtabstop=0 expandtab shiftwidth=4 smarttab
Если что, линтинг — это проверка синтаксиса
С Vim совместимо много отличных расширений для линтинга и исправления кода. Мои любимчики — это Syntastic и ALE, оба прекрасно справляются со своей задачей.
Но можно установить и другие удобные инструменты — вот так:
pip install pycodestyle | python style guide checker pip install vulture | finds ‘dead’/unused code pip install pylint | Linting
vim-syntastic/syntastic очень популярен, но работает синхронно, из-за чего возможны лаги интерфейса.
Syntastic невероятно просто установить, настроить и применять. Я работала с ним три года: он очень мне понравился.
ALE — это ещё один крутой линтер и корректор кода. Он настолько классный, что с ним я почти позабыла Syntastic.
Когда вы наводите курсор на строку с ошибкой, ALE выводит внизу экрана сообщение: объясняет, в чём ошибка и как её исправить. А чтобы увидеть все проблемы, достаточно выполнить команду :lopen.
Настраивать ALE можно как душа желает. Вот как я настроила свой:
let g:ale_linters = {'python': 'all'} let g:ale_fixers = {'python': ['isort', 'yapf', 'remove_trailing_lines', 'trim_whitespace']} let g:ale_lsp_suggestions = 1 let g:ale_fix_on_save = 1 let g:ale_go_gofmt_options = '-s' let g:ale_go_gometalinter_options = '— enable=gosimple — enable=staticcheck' let g:ale_completion_enabled = 1 let g:ale_echo_msg_error_str = 'E' let g:ale_echo_msg_warning_str = 'W' let g:ale_echo_msg_format = '[%linter%] [%severity%] %code: %%s'
Вдобавок я отключила предупреждения о стилистических погрешностях. Делается это в файле .pylintrc. Создайте его командой: pylint —generate-rcfile > ~/.pylintrc (вместо ~/ укажите расположение будущего файла 😊).
ALE поддерживает автозавершение кода. Но не только он.
Если вы уже установили ALE, но будете пользоваться другим плагином для автодополнения, не забудьте отключить эту функцию у ALE. Делается это в том же файле .vimrc:
let g:ale_completion_enabled = 0
davidhalter/jedi-vim добавляет автозавершение кода на Python. За основу взят Jedi, языковой сервер Python.
Я использую плагин автозавершения coc.nvim вместе с coc-jedi — coc.nvim-оболочкой для jedi-language-server 😊
- neoclide/coc.nvim — это движок интеллектуального анализа кода. Чтобы поддерживался LSP, установите CoC-расширение или настройте языковой сервер. (Обязательно должен стоять Node.js.)
- pappasam/coc-jedi — ещё одно расширение для Python. Установите его командой :CocInstall coc-jedi после coc.nvim и jedi-language-server.
Вот отличная статья о том, что хорошего в CoC и почему стоит применять coc-jedi: «Как написать расширение для coc.nvim».
ycm-core/YouCompleteMe использует Jedi. Код автодополняется по мере ввода. Кроме Python поддерживается много других языков.
Ура! Мы превратили Vim в отличную IDE для Python.
Тсс… всем, кто любит мышку: в Neovim она включается командой :set mouse=a 🐭
* Решением суда запрещена «деятельность компании Meta Platforms Inc. по реализации продуктов — социальных сетей Facebook* и Instagram* на территории Российской Федерации по основаниям осуществления экстремистской деятельности».
Научитесь: Администрирование ОС Linux
Узнать больше
It has come to my attention that somebody ‘round these parts has been preaching the gospel of Sublime Text 3. As the resident senior developer (err, old fogey), I feel it’s my duty to tell you about the only TRUE Python development environment you will ever need: VIM.
That’s right. VIM is ubiquitous and fast, and it never crashes. It can also do just about anything!
On the down side though, VIM can be a pain to configure, but fear not. This article will show you how to get a powerful VIM environment set up in a way that is geared towards wrangling Python day in and day out.
Updated 2018-06-01
Installing
Since VIM comes pre-installed on a number of *nix systems, let’s first check to see if it’s installed:
If it is installed, you should see something like:
At this point, you want to check two things:
- The VIM version should be higher than 7.3.
+python
should show up in the list of features, so you know Python is supported.
If both of these checks pass, then move right along to VIM Extensions. If not, it’s time to install/upgrade.
macOS / OS X
Grab Homebrew, if you don’t already have it, and run:
*NIX / Linux
For Debian or Ubuntu, you can try:
For other flavors of Linux, check the docs from your package manager. Here is a link to get you started: Install Vim.
Windows
There are many different ways to install VIM on Windows. Start with the official docs.
Verifying Your VIM Install
Make sure you have installed VIM > 7.3 with Python support. Again, run vim --version
to verify this. If you want to check the specific version of Python used in VIM, run :python import sys; print(sys.version)
from within VIM:
This should output your current version of Python. If you get an error, then you don’t have Python support and you either need to reinstall or recompile if you’re building from source.
With VIM installed, let’s look at how to customize VIM for Python development.
VIM Extensions
VIM can do a lot of what developers need right out of the box. However, it is also massively extensible, and there are some pretty killer extensions that make it behave more like a “modern” IDE. The very first thing you need is a good extension manager.
Vundle
VIM has several extension managers, but the one I strongly recommend is Vundle. Think of it as pip for VIM. It makes installing and updating packages trivial.
Let’s get Vundle installed:
This command downloads the Vundle plugin manager and chucks it in your VIM bundles directory. Now you can manage all your extensions from the .vimrc
configuration file.
Add the file to your user’s home directory:
Now set up Vundle in your .vimrc
by adding the following to the top of the file:
That’s it. You’re now set up to use Vundle. Afterward, you can add the plugins you want to install, then fire up VIM and run:
This command tells Vundle to work its magic—downloading all the plugins and installing/updating them for you.
Let’s Make an IDE
We couldn’t possibly list all the VIM features, but let’s look at a quick list of some of the powerful out-of-the-box features perfect for Python development.
Ditch the Mouse
Probably the most important feature of VIM is that it doesn’t require a mouse (except for the graphical variants of VIM). At first, this may seem like a horrible idea, but after you invest the time—and it does take time—to learn the key combinations, you will speed up your overall workflow!
Split Layouts
If you open a file with :sp <filename>
, you split the layout vertically (opening the new file below the current file). If you reverse the keys to :vs <filename>
, you get a horizontal split (opening the new file to the right of your current file).
You can nest splits as well, so you can have splits inside of splits, horizontal and vertical, to your heart’s content. As we all know, we often need to look at several files at once when developing.
Buffers
While VIM can do tabs, many users prefer buffers and splits. You can think of a buffer as a recently opened file. VIM provides easy access to recent buffers. Just type :b <buffer name or number>
to switch to an open buffer. (Auto-complete works here as well.) You can also use :ls
to list all buffers.
Code Folding
Most “modern” IDEs provide a way to collapse (or fold) methods and classes, showing you just the class/method definition lines instead of all the code.
You can enable that in .vimrc
with the following lines:
This works all right, but you have to type za
to fold (and unfold). The space key would be much better. So add this line to your .vimrc
file as well:
Now you can easily hide portions of your code that you’re not currently working on.
The initial command, set foldmethod=indent
, creates folds based upon line indents. This, however, often creates more folds than you really want. But have no fear! There are several extensions that attempt to rectify that. We recommend SimpylFold. Install it with Vundle by adding the following line to .vimrc
:
Python Indentation
Of course, for code folding to work based on indentations, you want your indents to be correct. Again, VIM falls short a bit out of the box because it doesn’t handle auto-indent after a function definition. You can do two things with indentation:
- Get indentation to follow PEP 8 standards.
- Better handle auto-indentation.
PEP 8
To add the proper PEP 8 indentation, add the following to your .vimrc
:
This will give you the standard four spaces when you hit tab, ensure your line length doesn’t go beyond 80 characters, and store the file in a Unix format so you don’t get a bunch of conversion issues when checking into GitHub and/or sharing with other users.
For full stack development, you can use another au
command for each filetype:
This way, you can have different settings for different filetypes. There is also a plugin called ftypes that will allow you to have a separate file for each filetype you want to maintain settings for, so use that if you see fit.
Auto-Indentation
autoindent
will help, but in some cases (like when a function signature spans multiple lines), it doesn’t always do what you want, especially when it comes to conforming to PEP 8 standards. To fix that, you can use the indentpython.vim extension:
Flagging Unnecessary Whitespace
You also want to avoid extraneous whitespace. You can have VIM flag that for you so that it’s easy to spot and then remove:
This will mark extra whitespace as bad and probably color it red.
UTF-8 Support
For the most part, you should be using UTF-8 when working with Python, especially if you’re working with Python 3. Make sure VIM knows that with the following line:
Auto-Complete
The best plugin for Python auto-complete is YouCompleteMe. Again, use Vundle to install:
Under the hood, YouCompleteMe uses a few different auto-completers (including Jedi for Python), and it needs some C libraries to be installed for it to work correctly. The docs have very good installation instructions, so I won’t repeat them here, but be sure you follow them.
It works out of the box pretty well, but let’s add a few customizations:
The first line ensures that the auto-complete window goes away when you’re done with it, and the second defines a shortcut for goto definition.
Virtualenv Support
One issue with the goto definition above is that VIM, by default, doesn’t know anything about virtualenv, so you have to make VIM and YouCompleteMe aware of your virtualenv by adding the following lines of code to .vimrc
:
This determines if you are running inside a virtualenv, switches to that specific virtualenv, and then sets up your system path so that YouCompleteMe will find the appropriate site packages.
Syntax Checking/Highlighting
You can have VIM check your syntax on each save with the syntastic extension:
Also add PEP 8 checking with this nifty little plugin:
Finally, make your code look pretty:
Color Schemes
Color schemes work in conjunction with the basic color scheme that you are using. Check out solarized for GUI mode, and Zenburn for terminal mode:
Then, just add a bit of logic to define which scheme to use based upon the VIM mode:
Solarized also ships with a dark and light theme. To make switching between them very easy (by pressing F5) add:
File Browsing
If you want a proper file tree, then NERDTree is the way to go:
If you want to use tabs, utilize vim-nerdtree-tabs:
Want to hide .pyc
files? Then add the following line:
Super Searching
Want to search for basically anything from VIM? Check out ctrlP:
As you might expect, pressing Ctrl+P will enable the search, so you can just start typing. If your search matches anything close to the file you’re looking for, it will find it. Oh, and it’s not just files: it will find tags as well! For more, check out this YouTube video.
Line Numbering
Turn on line numbers on the side of the screen with:
Git Integration
Want to perform basic git commands without leaving the comfort of VIM? Then vim-fugitive is the way to go:
See it in action on VIMcasts.
Powerline
Powerline is a status bar that displays things like the current virtualenv, git branch, files being edited, and much more.
It’s written in Python, and it supports a number of other environments like zsh, bash, tmux, and IPython:
Take a look at the official docs for all the configuration options.
System Clipboard
Vim usually has its own clipboard and ignores the system keyboards, but sometimes you might want to cut, copy, and/or paste to/from other applications outside of VIM. On OS X, you can access your system clipboard with this line:
VIM in the Shell
Finally, once you’ve mastered VIM and its keyboard shortcuts, you’ll often find yourself getting annoyed with the lack of those same shortcuts in the shell. Fear not: most shells have a VI mode. To turn it on for your shell, add the following line to ~/.inputrc
:
Now, you will be able to use VIM key combos not only in the shell but also in the Python interpreter and any other tool that uses GNU Readline (most database shells). Now you have VIM everywhere!
Conclusion
That’s more or less it (for Python development, at least). There are a ton of other extensions that you can use, as well as alternatives to everything detailed in this post. What are some of your favorite extensions? How have you configured VIM to match your personality?
Here is a link to my current VIM config. Got one of your own? Please share!
Thanks for reading!
Resources
- VIM Tutor comes with VIM, so once VIM is installed, just type
vimtutor
from the command line, and the program will teach you how to use VIM by, well, using VIM. - VIMcasts are advanced tutorial videos describing how to use many of VIM’s features.
- Official VIM docs
- Open Vim
- Learn Vimscript the Hard Way is perfect for learning vimscript.
Ребята! Ну вы чего! Только VIM, только скорость и решительность!
Пора явить интернету очередной гайд по настройке VIM для работы с Python day by day. Может быть, я смогу направить и вас на истинный путь тру девелопмента.
Установка
*NIX / Linux
В вашем *NIX / Linux, скорее всего уже есть vim. Проверяем:
vim --version
Вывод должен быть похож на этот:
VIM - Vi IMproved 8.2 (2019 Dec 12, собрано Apr 14 2020 16:54:38)
Заплатки: 1-577
Огромная версия без графического интерфейса.
Включённые(+) и отключённые(-) особенности:
+acl -farsi +mouse_sgr +tag_binary
+arabic +file_in_path -mouse_sysmouse -tag_old_static
+autocmd +find_in_path +mouse_urxvt -tag_any_white
+autochdir +float +mouse_xterm -tcl
-autoservername +folding +multi_byte +termguicolors
-balloon_eval -footer +multi_lang +terminal
+balloon_eval_term +fork() -mzscheme +terminfo
-browse +gettext +netbeans_intg +termresponse
++builtin_terms -hangul_input +num64 +textobjects
+byte_offset +iconv +packages +textprop
+channel +insert_expand +path_extra +timers
+cindent +ipv6 +perl +title
+clientserver +job +persistent_undo -toolbar
+clipboard +jumplist +popupwin +user_commands
+cmdline_compl +keymap +postscript +vartabs
+cmdline_hist +lambda +printer +vertsplit
+cmdline_info +langmap +profile +virtualedit
+comments +libcall -python +visual
+conceal +linebreak +python3 +visualextra
+cryptv +lispindent +quickfix +viminfo
+cscope +listcmds +reltime +vreplace
+cursorbind +localmap +rightleft +wildignore
+cursorshape +lua +ruby +wildmenu
+dialog_con +menu +scrollbind +windows
+diff +mksession +signs +writebackup
+digraphs +modify_fname +smartindent +X11
-dnd +mouse -sound +xfontset
-ebcdic -mouseshape +spell -xim
+emacs_tags +mouse_dec +startuptime +xpm
+eval -mouse_gpm +statusline +xsmp_interact
+ex_extra -mouse_jsbterm -sun_workshop +xterm_clipboard
+extra_search +mouse_netterm +syntax -xterm_save
Что нас здесь интересует? Поддержка python3 (python2, наверное, уже не так актуален).
Если vim не установлен, установим:
sudo apt update
sudo apt install vim
Если vim установлен, но не поддерживает python3, собираем из исходников:
- тык
- тык
Снова проверяем:
vim --version
Теперь проверим версию python, используемую в vim:
vim
- откроем интерпретатор
:!python
или:!ipython
(если пользуетесь)
Python 2.7.17 (default, Nov 7 2019, 10:07:09)
[GCC 9.2.1 20191008] on linux2
Да, сейчас 2.7, исправим это позже, с помощью виртуальных окружений.
Вероятно, дальше будет немного проще, если открыть мой .vimrc.
Плагины VIM
Плагины нужны, чтобы превратить vim в IDE.
Менеджер плагинов
Существуют разные плагин менеджеры. Хороший и популярный вариант — Vundle. Скопируем в директорию для расширений vim:
git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
Настроим Vundle.
Вероятно, у вас уже есть .vimrc в домашней директории. Если нет, создадим:
touch ~/.vimrc
Откроем ~/.vimrc:
vim ~/.vimrc
Копируем(пока, можно сделать это через контекстное меню):
set nocompatible " be iMproved, 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 'VundleVim/Vundle.vim'
" the place for other plugins
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
Здесь же разберемся, как устанавливать и удалять плагины.
Например, NERDTree, file browsing плагин — открывает в отдельном вертикальном split’е дерево файлов и директорий.
Достаточно добавить Plugin 'scrooloose/nerdtree'
между строками call vundle#begin()
и call vundle#end()
(там, где написано the place for other plugins
) и выполнить :PluginInstall
При установке появится окно установщика и +
напротив установленного плагина.
Чтобы удалить — уберите Plugin 'scrooloose/nerdtree'
и выполните :PluginClean
. Выше небольшой help.
В общем, всё это справедливо для большинства vim плагинов.
Добьем вопрос с NERDTree и установим плагин NERDTreetabs для работы в разных вкладках. По аналогии с NERDTree добавляем в ~/.vimrc:
Plugin 'jistr/vim-nerdtree-tabs'
Устанавливаем
:PluginInstall
Мы, все ещё, не вышли из vim. Проверим список установленных плагинов — :PluginList
, сохраним и выйдем :wq!
Кстати, можно выполнять команды Vundle из терминала, например, так:
vim +PluginInstall
или vim +PluginList
Key combinations
Надо, надо, ребята, потратить свое время на изучение. Свои основные кнопки написал в самом низу страницы.
Split Layouts
Можно открывать файлы в вертикальном и горизонтальном сплитах, а в этих сплитах открывать новые сплиты.
Настроим зоны для новых сплитов (новые вертикальные будут открываться справа, горизонтальные — внизу):
set splitbelow
set splitright
Настроим навигацию между сплитами:
" 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 переключиться влево
nnoremap переназначает одну комбинацию клавиш на другую, при работе в Normal Mode. Например, было <Ctrl+W><Ctrl+J>
, стало <Ctrl+J>
. При этом <Ctrl+W>
также будет работать. Подробнее
Code Folding
Полезная фича — сворачивание кода. Сворачивает до ближайшего whitespace на основе отступов (foldmethod=indent). Выглядит как-то так:
Добавляем в наш .vimrc:
" Enable folding
set foldmethod=indent
set foldlevel=99
По умолчанию, работает по комбинации za
. Меняю на пробел:
" Enable folding with the spacebar
nnoremap <space> za
Чтобы код сворачивался аккуратнее лучше установить какой-нибудь плагин, добавляем:
Plugin 'tmhedberg/SimpylFold'
Запускаем :PluginInstall
Python indentation
Для корректного code folding и соответствия PEP 8 настроим отступы и длину строки
au BufRead,BufNewFile *.py,*pyw set tabstop=4
au BufRead,BufNewFile *.py,*pyw set softtabstop=4
au BufRead,BufNewFile *.py,*pyw set autoindent
au BufRead,BufNewFile *.py,*pyw set shiftwidth=4
au BufRead,BufNewFile *.py,*.pyw set expandtab
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h set textwidth=79
au BufNewFile *.py,*.pyw,*.c,*.h set fileformat=unix
" for full stack development
au BufNewFile,BufRead *.js, *.html, *.css set tabstop=2
au BufNewFile,BufRead *.js, *.html, *.css set shiftwidth=2
au BufNewFile,BufRead *.js, *.html, *.css set softtabstop=2
Autoindent не всегда будет работать корректно, но это лечится плагином (устанавливаем через Vundle):
Plugin ‘vim-scripts/indentpython.vim’
Flagging Unnecessary Whitespace
Лишние пробелы в коде лучше сразу удалять. Создадим флаг и подсветим красным
" Use the below highlight group when displaying bad whitespace is desired.
highlight BadWhitespace ctermbg=red guibg=red
" Make trailing whitespace be flagged as bad.
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/
Чтобы удалить найденные пробелы можно воспользоваться заменой:
Можете выбрать подходящий вам вариант обработки пробелов здесь
UTF-8 Support
Для работы с Python3 Vim должен уметь кодировать utf-8. Добавим в .vimrc:
Virtualenv Support
То, что вам обязательно нужно — виртуальные окружения.
Про установку виртуальных окружений в Python:
- тык
- тык
По умолчанию, Vim ничего не знает об используемом виртуальном окружении.
Чтобы все было хорошо, и при запуске vim подхватывал то окрежние, в котором вы находитесь, добавим в .vimrc:
" python with virtualenv support
py3 << 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)) # устарел execfile
exec(open(activate_this).read(), dict(__file__=activate_this))
EOF
Но это не всё. Если у вас уже есть виртуальные окружения, то переключаться между ними можно внутри vim, вручную, с помощью плагина vim-virtualenv.
Установим через Vundle:
Plugin 'jmcantrell/vim-virtualenv'
:PluginInstall
Теперь, запустим виртуальное окружение:
:VirtualEnvActivate <tab>
Деактивируем:
:VirtualEnvDeactivate
Auto-Complete
С недавних пор пользуюсь автодополнением.
Использование плагина YouCompleteMe не принесло мне много радости. Но это субъективно.
Тут инструкция по установке
Есть проблемы и для решения, как правило, предлагают этот рецепт.
По душе мне пришелся neoclide/coc.nvim.
Он универсален, работает как с Jedi
, так и с Microsoft PLS
(и то, и другое — это Language Server, еще поговорим об этом). Умеет в IDE capabilities, например, покажет вам аннотации типов или __doc__
объекта. Удобно настраивать, опций — огромное множество.
Установим.
Сперва, Jedi или Jedi.
Jedi
— это Language Server, фоновый процесс, который будет анализировать наш код. С помощью coc.nvim
, будем просить его дополнить код, выполнить форматирование или рефакторинг. Здесь хорошо и кратко про Language Server Protocol (LSP)
.
Вариантов установки много, ставим через pip
в нужном виртуальном окружении (про установку виртуальных окружений, а еще чуть выше, в Virtualenv Support):
workon 3.8.4 # переключаемся в виртуальное окружение (у меня 3.8.4)
pip install jedi # или любой другой из предложенных вариантов
Кстати, там же, в документации, есть ссылка на клиент для Jedi
— JEDI-VIM. Можете попробовать как альтернативу coc.nvim
.
Теперь установим coc по инструкции из Wiki. У нас, конечно, же vim 8 (проверить можно через vim --version
), поэтому воспользуемся встроенный пакетным менеджером:
# for vim8
mkdir -p ~/.vim/pack/coc/start
cd ~/.vim/pack/coc/start
curl --fail -L https://github.com/neoclide/coc.nvim/archive/release.tar.gz|tar xzfv -
Здесь же, в .vimrc
, с помощью встроенного менеджера, установим coc-python
:
Откроем какой-нибудь скрипт, и, поскольку мы уже в нужном виртуальном окружении(настроили раньше, в Virtualenv Support), переключим интерпретатор на работу с Jedi
в этом же окружении. Делается это снова встроенным менеджером:
:CocCommand
# здесь мы должны выбрать то, виртуальное окружение, куда ранее установили Jedi
# опция будет постоянной и при работе в другом виртуальном окружении, желателательно снова переключиться
python.setInterpreter
В появившемся окне выбираем виртуальное окружение, куда ранее установили Jedi
. Вот в картинках, до момента выбора окружения:
С помощью CocCommand
можно настраивать много всего. Фактически, мы правим конфигурационный файл через интерфейс встроенного менеджера.
Посмотрим на интерфейс на примере функции print
:
Если coc.nvim
нужно отключить:
Включаем обратно:
Теперь добавим полезного в наш .vimrc
для работы с coc
:
vim ~/.vimrc # открываем
let mapleader = "," # назначим лидер-кнопку, она пригодится
# настроим отображение документации:
nmap <silent> gd <Plug>(coc-definition)
nnoremap <silent> K :call <SID>show_documentation()<CR>
function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction
Смотрим, как это выглядит (ставим курсор на print
, жмем K
):
Добавим аннотации в ~/.vimrc
:
nmap <silent> gd <Plug>(coc-definition)
Смотрим на том же примере (ставим курсор на print
, жмем gd
):
У проекта отличная Wiki, если вдруг.
File Browsing
Плагины nerdtree и vim-nerdtree-tabs мы уже установили.
Давайте добавим в конец .vimrc строку: let NERDTreeIgnore=['\.pyc$', '\~$']
NERDTree будет игнорировать .pyc
Если у вас есть вопрос по работе NERDTree, скорее всего он уже решен — F.A.Q.
Команды для работы с vim-nerdtree-tabs описаны в Commands and Mappings
Добавим в .vimrc возможность открытия NERDTree по <F3>
:
" map NERDTree on F3
map <F3> :NERDTreeToggle<CR>
Syntax Checking/Highlighting
Плагин для проверки синтаксиса:
Plugin 'vim-syntastic/syntastic'
Линтер для PEP 8:
Plugin 'nvie/vim-flake8'
Включаем подсветку синтаксиса:
let python_highlight_all=1
syntax on
Поддержка markdown
Ну, а почему нет?
Подсветка синтаксиса, превью — все, что нужно.
Смотрим топ плагинов здесь.
Хорошие — Vim Markdown и vim-instant-markdown как превью.
Устанавливаем уже знакомым способом, через Vundle
:
vim ~/.vimrc
# добавляем
Plugin 'suan/vim-instant-markdown', {'rtp': 'after'} "markdown preview plugin - https://github.com/suan/vim-instant-markdown
Plugin 'godlygeek/tabular' "for work with markdown plugin (Ctrl-p) - https://github.com/godlygeek/tabular
Plugin 'plasticboy/vim-markdown' " best markdown plugin - https://github.com/plasticboy/vim-markdown
# запускаем Vundle
:PluginInstall
Добавим для vim-instant-markdown
доступные настройки в наш ~/.vimrc
:
filetype plugin on
"Uncomment to override defaults:
"let g:instant_markdown_slow = 1
"let g:instant_markdown_autostart = 0
"let g:instant_markdown_open_to_the_world = 1
"let g:instant_markdown_allow_unsafe_content = 1
"let g:instant_markdown_allow_external_content = 0
"let g:instant_markdown_mathjax = 1
"let g:instant_markdown_logfile = '/tmp/instant_markdown.log'
"let g:instant_markdown_autoscroll = 0
"let g:instant_markdown_port = 8888
"let g:instant_markdown_python = 1
А для vim-markdown
добавим подсветку YAML, JSON, разрешим открывать ссылки на .md
в новых вкладках:
" vim markdown plugin options - https://github.com/plasticboy/vim-markdown
let g:vim_markdown_frontmatter = 1
let g:vim_markdown_json_frontmatter = 1
let g:vim_markdown_edit_url_in = 'tab'
Ну и для удобства настроим отсупы аналогично Python indentation. Мы уже делали это ранее, теперь только добавим *md
и *markdown
:
au BufRead,BufNewFile *.py,*pyw,*md,*markdown set tabstop=4
au BufRead,BufNewFile *.py,*pyw,*md,*markdown set softtabstop=4
au BufRead,BufNewFile *.py,*pyw,*md,*markdown set autoindent
au BufRead,BufNewFile *.py,*pyw,*md,*markdown set shiftwidth=4
au BufRead,BufNewFile *.py,*.pyw,*md,*markdown set expandtab
Например, теперь, помимо подсветки, можно открыть в отдельном сплите все заголовки вашего markdown-файла и переключаться между ними:
А превью будет сразу открываться как новая вкладка в браузере:
Color Schemes Switching
У меня много схем оформления vim и возможность переключения между ними по <F8>
.
Для начала скопируем в ~/.vim/colors/
схемы оформления. Возьмем их, например, здесь и здесь.
В качестве постоянной схемы я использую dogrun
. В .vimrc добавить схему как постоянную, можно так:
colorscheme dogrun
Добавим схемы оформления в vim:
:SetColors all
Добавим возможность переключения по <F8>
, скопировав этот скрипт в ~/.vim/plugin/setcolors.vim
Чтобы отобразить текущую схему, можно использовать :SetColors
.
Super Searching
Расширенные возможности поиска в vim будут добавлены вместе с плагином ctrlP
Устанавливаем обычно, через Vundle:
Plugin 'kien/ctrlp.vim'
Не забываем :PluginInstall
Status bar with vim-airline
Полезнейшая в работе вещь — статус бар. Есть powerline, но я использую vim-airline
Добавляем в .vimrc и устанавливаем через Vundle:
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes' "
Настраиваем:
" air-line settings
" enable tab line with vim-airline plugin
let g:airline#extensions#tabline#enabled = 1
let g:airline_skip_empty_sections = 1
let g:airline_theme='minimalist'
let g:airline_section_y = '%{virtualenv#statusline()}'
Теперь, vim будет выглядеть так:
vim-airline интегрируется со многими плагинами, например, с ctrlP
, который мы уже установили.
В vim-airline можно добавить, например, наименование используемого виртуального окружения, что мы и сделали.
Подробнее здесь
Git Integration
Как по мне, лучший плагин для интеграции vim с git — это fugitive.vim, хотя бы, по той причине, что он дублирует уже привычный набор команд git и не требует особого изучения.
Устанавливается, как обычно, через Vundle:
Plugin 'tpope/vim-fugitive'
Добавим в статус бар:
" to add fugitive plugin (for git) in statusline
let g:airline_section_b = '%{FugitiveStatusline()}'
Для работы с git есть плагин vimagit, но мне он кажется менее удобным.
Для отображения статуса git-репозитория в NERDTree попробуйте этот плагин
Line Numbering
Нумерация строк будет отображаться в статус баре, который мы установили ранее. Это удобно.
Но, если вы хотите отображать нумерацию строк в vim, добавьте в .vimrc:
set nu
PasteToggle
Иногда вам будет полезна опция :set paste
. Используется до вставки скопированного кода “как есть”, без autoindent. Актуально при работе в insert mode.
set pastetoggle=<F2>
Копируем код, переходим в insert mode, включаем pastetoggle (F2), вставляем код, отключаем pastetoggle(F2).
Подробнее здесь
Поддержка black и запуск python
Black — популярный форматтер python-кода.
Устанавливаем глобально, через pip:
pip install black
На этой же странице есть плагин для vim.
Применять black, достаточно, просто, поэтому отдельным плагином я не пользуюсь. Основные команды black:
black script.py (форматировать файл script.py)
black script.py -l 120 (форматировать с длиной строки 120. По умолчанию 88)
black --diff script.py (посмотреть изменения в формате, но не форматировать)
black . (форматировать все файлы в текущей директории)
А в .vimrc добавим hotkey на <F9>
для запуска black как стороннего инструмента:
" manual black code reformatting
nnoremap <F9> :w<CR>:!clear;black %<CR>
Теперь добавим возможность сохранения и запуска python-интерпретатора на <F5>
:
" save and run current python code
nnoremap <F5> ::w!<CR>:!clear;python %<CR>
Вкладки в vim
Добавим клавиши для переключения вкладок в vim:
" Ctrl-Left or Ctrl-Right to go to the previous or next tabs
nnoremap <C-Left> :tabprevious<CR>
nnoremap <C-Right> :tabnext<CR>
" Alt-Left or Alt-Right to move the current tab to the left or right
nnoremap <silent> <C-Down> :execute 'silent! tabmove ' . (tabpagenr()-2)<CR>
nnoremap <silent> <C-Up> :execute 'silent! tabmove ' . (tabpagenr()+1)<CR>
Ctrl+Left - переключить на предыдущую вкладку
Ctrl+Right - переключить на следуюущую вкладку
Alt+Left - переместить вкладку назад
Alt+Right - переместить вкладку вперед
Вкладки в vim:
Switching Buffers
Про работу с buffers в vim
Для переключения добавим hotkey на <F7>
:
" switching to another buffer manually - https://vim.fandom.com/wiki/Using_tab_pages
" :help switchbuf
set switchbuf=usetab
nnoremap <F7> :sbnext<CR>
nnoremap <S-F7> :sbprevious<CR>
History
Добавим полезную настройку — разрешим хранить историю после выхода из файла:
" Maintain undo history between sessions
set undofile
set undodir=~/.vim/undodir
Hotkeys
i
— insert — режим ввода/редактирования
esc
— выйти из режима редактирования/визуального режима (можно применять нужное кол-во раз)
dw
— удалить слово
dd
— удалить строку
d$
— удалить всё от текущего месторасположения курсора до конца строки
d^
— удалить всё от текущего месторасположения курсора до начала строки
:15 dgg
— прыгнуть на 15 строку и удалить всё, начиная с 15 строки, до начала файла (dG — до конца файла)
dt'
— удалить все символы в строке от текущего месторасположения до символа одинарной кавычки (можно использовать любой символ)
5dd
— удалить 5 строк
5dw
— удалить 5 слов
Символ удаления d
можно комбинировать с поиском. Например, чтобы удалить все от курсора до конкретного слова, жмем d
, открываем поиск с помощью /
, пишем слово, до которого удаляем.
yy
— скопировать строку (никто не отменял копирование через контестное меню)
yw
— скопировать слово
10yy
— скопировать 10 строк
p
— вставить после курсора (не всегда удобно)
P
— вставить до курсора
:q
— выйти из файла
:q!
— выйти из файла жестко, без сохранения изменений
:w
— сохранить файл
:wq
— сохранить файл и выйти
ctrl+V
— перейти в визуальный режим
u
— отменить действие (undo)
ctrl+R
— return или undo undo (повторить действие)
hjkl
— передвижение по vim
^
— начало строки (вернуться к первому не пустому символу в строке)
0
— вернуться в самое начало строки
$
— вернуться в конец строки
A
— вернуться в конец строки и открыть режим редактирования
I
— вернуться в начало строки и открыть режим редактирования
o
— прыгнуть на следуюущую строку и перейти в режим редактирования
w
— передвижение на одно слово вперед
W
— передвижение от пробела к пробелу (через слово)
b
— передвижение назад, от слова к слову
B
— передвижение назад, от пробела к пробелу
gg
— прыгнуть в начало файла
G
— прыгнуть в конец файла
30G
— прыгнуть на нужную строку (для gg аналогично)
:55
— передвинуть курсор на 55 строку
ctrl+D
— листать постранично вниз
ctrl+U
— листать постранично вверх
zt
— при нахождении на строке, которая расположена в нижней части терминала, поднимаем эту строку на самый верх
zz
— аналогично предыдущему, но поднимаем строку на середину
/
— поиск (здесь лучше сразу обратить внимание на инкрементальный режим, т.е. поиск в реальном времени). В поиске есть история — работает нажатием вверх или вниз (по аналогии с :). Для передвижения по результатам поиска жмем n
и N
?
— поиск в обратную сторону, по аналогии с /
.
— повторить предыдущую команду
:s/чтозаменить/начтозаменить
— замена в строке
:%s/чтозаменить/начтозаменить/
— замена во всем файле (если слово в строке встречается дважды, добавьте g, либо установите set gdefault
>>
— сдвинуть строку вправо
<<
— сдвинуть строку влево
12>
— сдвинуть 12 строк вправо (аналогично влево)
:vs имя файла
— вертикальный сплит
:sp
— горизонтальный сплит
:vertical resize30%
— изменить размер текущего сплита
:resize
— изменить размер для горизонтального сплита
za
— свернуть код
vim -p file1 file2 file3
— открыть несколько файлов в разных вкладках
:tabedit имя файла
— открыть файл в новой вкладке
:tabn (можно с номером вкладки
) — перейти на следующую вкладку
:tabp
— перейти на предыдущую вкладку
:tabc
— закрыть вкладку
:tabfirst
— перейти на первую вкладку
:tablast
— перейти на последнюю вкладку
:tabs
— открыть список доступных вкладок
:tabl
— прыгнуть на последнюю открытую вкладку
:tab split
— скопировать содержимое текущей вкладки в новую вкладку и перейти на неё
:tabonly
— закрыть все вкладки, кроме текущей
:tab ball
или :tabo
— показать все буферы во вкладках
:ls
— посмотреть буферы
q:
— открыть историю буферов
:qa
— закрыть всё
!ls
— выполнить shell команду из vim
!python file.py
— запустить python код (по аналогии с !ls)
Чтобы добавить вывод команды, запущенной из под vim, в файл, выполняем:
vim new_file.txt
:read !python file.py - вывод file.py попадет в new_file.txt
:read !ls -ls - вывод команды попадет в файл new_file.txt
Комментируем несколько строк в визуальном режиме:
ctrl+V
— переходим в визуальный режим (shift+V
— выделить всю строку)- выделяем нужное кол-во строк с помощью указателей (
jk
иливверх/вниз
) shift+I
— переходим в режим вставки, пишем символ решетки#
(а, например, если нужно удалить по символу в каждой из выделенных строк, жмемx
)esc
— возвращаемся в обычный режим (видим результат)
vim -S session.vim
— открыть сохраненную сессию
Resources
- Основной источник этой статьи
- Второй источник этой статьи
- Vim and Language Server Protocol
- Лекции по основам vim
- Mapping keys
- Using tab pages
- Отличный сборник плагинов для vim