11/30/2021

Vim Python

Vim python ide

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.

There are example customisation files for Vim available in the Misc/Vim directory in the Python source tree. Tweets by @ThePSF. The Python Software Foundation is the organization behind Python. Become a member of the PSF and help advance the software and our mission. I've got Vim installed on MacOS using Brew and it installs with +python3 support for Python 3.7.2 by default. I'm writing a Vim plugin which utilises some Python 3.7 and would like this to be able to work on parity with Linux with how it works on MacOS. Vim (source code), short for Vi IMproved, is a configurable text editor often used as a Python development environment. Vim proponents commonly cite the numerous plugins, Vimscript and logical command language as major Vim strengths. Why is Vim a good Python development environment? IPython and Vim make for a great IDE. The following shortcuts can help to make it even better. To also avoid having to enter a test command in IPython, I use konsole and dcop to send the command to IPython automatically. In the following, ' is mapped to run the command 'r' in IPython. First, start IPython as follows: konsole -script ipython Next, add the following mapping to vimrc: nnoremap.

I've been working on a Python project for some time now. In the beginning, it wasn't very comfortable, as I was trying to learn the language and figure out my workflow and the tooling.

After a couple of months, I now finally have a working Vim setup with proper syntax highlighting, smart code completion, and refactoring capabilities. Read on to see what it looks like.

Disclaimer: My setup may seem like a bit too much. You don't have to install every plugin listed in this article or copy every configuration line. Pick up what you like.

TL;DR:

  • Basics: vim-plug, scrooloose/nerdtree, tpope/vim-commentary and junegunn/fzf.vim
  • numirias/semshi is the best for the syntax highlighting
  • Vimjas/vim-python-pep8-indent for proper indenting
  • dense-analysis/ale is an asynchronous linter plugin. Use it with flake8 and pylint; plus google/yapf as a formatter.
  • neoclide/coc.nvim with neoclide/coc-python for intellisense code completion

Essentials

Let's start with a list of some general-purpose plugins which I find irreplaceable for any language.

  • vim-plug is a minimalistic plugin manager
  • scrooloose/nerdtree to navigate the file tree
  • junegunn/fzf.vim fuzzy search through the files (and much more, really)
  • tpope/vim-commentary ( or scrooloose/nerdcommenter ) — press gcc to comment out a line or gc to comment a selection in visual mode
  • liuchengxu/vista.vim which is a 'tagbar' that learns from LSP servers

The other plugins I use include

  • jeetsukumaran/vim-pythonsense provides some Python-specific text objects: classes, functions, etc
  • jiangmiao/auto-pairs inserts closing quotes and parenthesis as you type

The colorscheme used on the screenshots is joshdick/onedark.vim, which is inspired by the Atom theme.

Syntax highlighting

Vim comes with syntax highlighting for many popular languages, including Python, though it is not always the best one.

There are several options to improve the default highlighting.

  • numirias/semshi, in my opinion, is the best. It works with Neovim only and requires the Python 3 support.
  • sheerun/vim-polyglot includes support for many languages including Python
  • python-mode/python-mode is also a decent one although it comes with a lots of other stuff beside highlighting which I don't quite like
Semshi (on the left) vs. the default one

My favorite color schemes (which I switch quite often) include junegunn/seoul256.vim and joshdick/onedark.vim (the one on the screenshots).

Indentation

You can set up indentation rules manually like this.

A better alternative is Vimjas/vim-python-pep8-indent plugin. It does a much better job complying with the PEP8 style guide.

Folding

Plug-ins

Folding (:help foldmethod) is when you collapse chunks of code to eliminate distraction.

The best approximation is to use the folding method indent though it doesn't work ideally.

To toggle a fold you can press za (:help fold-commands), and I have it mapped to Space for convenience.

Linting & Fixing

The fantastical dense-analysis/ale plugin can be used for linting (which essentially means checking for syntax errors) and auto-fixing extremely well. It's asynchronous, meaning that it won't block the UI while running an external linter, and it supports a great range of languages and tools.

ALE highlights problems with your code in the gutter. When you move the cursor to the problematic line, it shows the full error message at the bottom of the screen.

By default, ALE will use all linters (which are just executables) it could find on your machine. Run :ALEInfo to see which linters are available and which are enabled.

It is better though to explicitly specify which ones you're going to use with a particular filetype:

Some of the linters are also capable of fixing the problems in your code. ALE has a special command :ALEFix that fixes the whole file. So far, I'm only Google's YAPF as a fixer that formats the whole file when I press F10 or save the current buffer.

The last option is a huge time saver — it will automatically fix (and thus format) your file on save.

I also have a little piece of configuration that shows the total number of warnings and errors in the status line. Very convenient.

And here are a couple of alternatives to ALE:

  • vim-syntastic/syntastic very popular one but synchronous which can cause significant lags in UI
  • neomake/neomake asynchronous linting and make framework for Neovim/Vim (didn't try that one)

Jedi

Jedi is a 'language server' (see my LSP article), a separate process running in the background and analyzing your code.

Other clients (editors or IDEs) can connect to the server and request some information, like completion options, or 'go to definition' coordinates.

Basically, Jedi is an IDE as a service, without the GUI.

In order to use it, you need to install it with pip install jedi, and then also add a client. The davidhalter/jedi Vim plugin does a good job.

Here's what it can do:

  • Press ctrl + space for the completion options
  • <leader>d goes to definition
  • <leader>g goes to assignment
  • K shows the documentation
  • and more

Recently I have switched to neoclide/coc.nvim and coc-python. Coc is an 'an intellisense engine' for Vim and Neovim and does a really good job when it comes to completion and communicating with language servers.

Coc (Conquer of Completion)

To me, the selling point is the usage of the new floating window API of Neovim, which makes it very convenient.

Coc-python can use both Jedi and the Microsoft's Python Language Server. The first time you run it, it will ask you to install the components it needs (like a linter).

Coc provides (with the help of Jedi) some basic IDE capabilities like

  • Going To definition
  • Displaying documentation (in the floating window!)
  • Smart rename (renames the exports across all files)

And of course the auto-complete menu (which you can see on the very first screenshot) appears as you type.

Basically, it's a very solid and comprehensive plugin which covers almost all of our needs.

Read to the wiki for more information about its capabilities.

The 2 drawbacks of using Coc are:

  • An expensive Node process that Coc needs to run in order to operate
  • It has its own independent extension system and its own (JSON-based) configuration file. Not a Vim-way.

Still, it does the job well, and I continue using it (until there's a better option).

Where to go next?

Here are some other articles I learned from a lot:

And some more articles in the similar vein from this website:

And...

  • Follow me on Twitter ;)

Vim (source code),short for Vi IMproved, is a configurable text editor often used asa Python development environment. Vim proponents commonly cite the numerousplugins, Vimscript and logical command language as major Vim strengths.

Why is Vim a good Python development environment?

Vim python mode

Vim's philosophy is that developers are more productive when they avoidtaking their hands off the keyboard. Code should flow naturally from thedeveloper's thoughts through the keyboard and onto the screen. Using a mouseor other peripheral is a detriment to the rate at which a developer'sthoughts become code. This 'efficiency by keyboard'keeps Vim as one of the most popular text editorsdespite having been around for decades. Few programming tools have that kindof staying power.

Vim has a logical, structured command language. When a beginner is learningthe editor she may feel like it is impossible to understand all the keycommands. However, the commands stack together in a logical way so that overtime the editor becomes predictable.

Vim is an implementation of the text editors and IDEs concept. Learn how these parts fit together in the development environments chapter or view all topics.

Configuring Vim with a Vimrc file

The Vimrc file is used to configure the Vim editor. A Vimrc file can rangefrom nothing in it to very complicated with hundreds or thousands of linesof configuration commands.

Here's a short, commented example .vimrc file I use for Python developmentto get a feel for some of the configuration statements:

Here is how these configuration options look with a dark background onMac OS X while editing the markdown for this webpage (how meta!).

Take a look at another example using these configuration options, this timewith a light background and editing Python code from myChoose Your Own Adventures Presentationsproject.

The Vimrc file lives under the home directory of the user account runningVim. For example, when my user account is 'matt', on Mac OS X my Vimrcfile is found at /Users/matt/.vimrc. On Ubuntu Linux my .vimrc filecan be found within the /home/matt/ directory.

If a Vimrc file does not already exist, just create it within the user'shome directory and it will be picked up by Vim the next time you open theeditor.

The following are a few resources for learning what to put in, and how tostructure a .vimrc file. I recommend adding configuration options oneat a time to test them individually instead of going whole hog with a Vimrcyou are unfamiliar with.

  • A Good Vimrc is a fantastic,detailed overview and opinionated guide to configuring Vim. Highlyrecommended for new and experienced Vim users.

  • 5 lines for a blank .vimrcshows settings for case insensitive search, highlighting as you search,disabling swap, and a couple more 'must have' enhancements to thedefault configuration.

  • Vim and Python showsand explains many Python-specific .vimrc options.

  • Vim as a Python IDEshows a slew of plugins and configuration options for coding with Pythonin Vim.

  • Thisrepository's folder with Vimrc fileshas example configurations that are well commented and easy to learn from.

  • For people who are having trouble getting started with Vim, check out thisblog post on thetwo simple steps that helped this author learn Vim.

Vim tutorials

Vim has a reputation for a difficult learning curve, but it's much easierto get started with these tutorials.

  • Learn Vim Progressivelyis a wonderful tutorial that follows the path I took when learning Vim:learn just enough to survive with it as your day-to-day editor then beginadding more advanced commands on top.

  • A vim Tutorial and Primer is anincredibly deep study in how to go from beginner to knowledgeable in Vim.

  • Why Atom Can't Replace Vimdiscusses one of Vim's core principles: command composability. Vim hasa language where simple commands are combined to execute more advancedoperations. For example, in command mode,$ moves to the end of a line.When $ is preceded by d then everything to the end of the line isdeleted. Over time the simple commands become intuitive and thecombinations become more powerful than having distinct commands such asa drop-down menu with a specific option to delete all text until the endof the line.

  • Vim as a Languageexplains the language syntax and how you can build up over time to masterthe editor.

  • How to install and use Vim on a cloud serveralong with How to use Vim for advanced editing of code on a VPSare two detailed Digital Ocean guides for getting up and running with Vim,regardless of whether you're using it locally or on a cloud server.

  • PacVim: a commandline game to learn Vim commandstakes the PacMan theme and teaches you how to use Vim by forcing youto move around and use Vim commands while gaming.

  • Ten years of Vimprovides an insightful retrospective on one experienced developer'sjourney with using Vim as a primary text editor and developmentenvironment. I found the part about going overboard with plugins beforeswitching back to a simpler configuration fascinating because it isthe same path I've found myself taking as I approach my own ten yearmark with Vim.

  • At least one Vim trick you might not know aboutis a collection of non-obvious keyboard shortcuts, many of which areinfrequently used but still useful.

  • Vim Adventures is a cute, fun browser-basedgame that helps you learn Vim commands by playing through the adventure.

  • In Vim: revisited theauthor explains his on-again off-again relationship with using Vim. He thenshows how he configures and uses the editor so it sticks as his primarycode editing tool.

  • Things About Vim I Wish I Knew Earlierexplores the lessons one developer learned while exclusively using Vimfor several years. The author includes using relative instead of absoluteline numbering, setting numerous configuration options and fuzzy findingto quickly open files in other directories rather than expanding thewhole path.

  • Seven habits of effective text editingexplains moving around efficiently, fixing errors quickly and forming goodhabits.

Vim installation guides

These installation guides will help you get Vim up and running on Mac OS X,Linux and Windows.

  • Upgrading Vim on OS Xexplains why to upgrade from Vim 7.2 to 7.3+ and how to do it usingHomebrew.

  • The easiest way to install Vim on Windows 7+ is to download and run thegvim74.exe file.

  • On Linux make sure to install thevim package withsudo apt-get install vim.

  • If you're using PyCharm as your IDE you won't need to install Vim as aseparate text editor - instead use theIdeaVim PyCharm plugin to getVim keybindings, visual/insert mode, configuration with ~/.ideavimrc andother Vim emulation features.

Using Vim as a Python IDE

Once you get comfortable with Vim as an editor, there are severalconfiguration options and plugins you can use to enhance your Pythonproductivity. These are the resources and tutorials to read when you'reready to take that step.

  • VIM and Python - a Match Made in Heaven details how to set up a powerful VIM environment geared towards wrangling Python day in and day out.

  • The python-mode project is a Vimplugin with syntax highlighting, breakpoints, PEP8 linting, code completionand many other features you'd expect from an integrated developmentenvironment.

  • Vim as Your IDE discusses how toset up Vim for greater productivity once you learn the initial Vim languagefor using the editor.

  • Setting up Vim for Pythonhas a well written answer on Stack Overflow for getting started with Vim.

  • If you're writing your documentation in Markdown using Vim, be sure toread thisinsightful post on a Vim setup for Markdown.

Vim Plugin resources

  • 5 Essential VIM Plugins That Greatly Increase my Productivitycovers the author's experience with the Vundle, NERDTree, ctrlp, Syntasticand EasyMotion Vim plugins.

  • Getting more from Vim with pluginsprovides a list of plugins with a description for each one on itsusefulness. The comments at the bottom are also interesting as people havesuggested alternatives to some of the plugins mentioned in the post.

  • Powerline is a popular statuslineplugin for Vim that works with both Python 2 and 3.

  • VimAwesome is a directory of Vim plugins sourcedfrom Vim.org, GitHub and user submissions.

  • Command-T is a Vim plugin forfast fuzzy searching files.

  • YouCompleteMe(source code) is acode-completion engine and plugin that works for Python.

Vim Plugin Managers

If you use many Vim plugins together it is really handy to have a pluginmanagers to sort out all of the dependencies. The following plugin managersare the most commonly-used ones in the Vim ecosystem.

  • Vundle comes highly recommendedas a plugin manager for Vim.

  • Pathogen is a widely usedplugin manager.

  • Vim-plug bills itself as aminimalistic Vim plugin manager.

Niche tutorials

After you have been using Vim for awhile there will be features you bumpinto without realizing they were ever there. The following tutorials showhow to use some specific niche features. You may already know about theseif you have been using Vim for awhile but everyone's learning path isdifferent so it's useful to do a quick scan to make sure you are not missinganything.

  • Vim’s absolute, relative and hybrid line numbersshows how to change the line numbering scheme. There was a period oftime I used relative line numbers although I eventually switched backto absolute numbers. The usefulness of these schemes is often dependenton what language you are working in.

  • A simpler Vim statuslineexplains how to customize your bottom screen statusline without usingplugins such as vim-powerlineor vim-airline.

  • The vim-clutch is a really coolproject and walkthrough that shows how you can create a foot pedal toswitch between Normal and Insert modes instead of using the typical ESCkey (or a remapped key).

  • How I'm able to take notes in mathematics lectures using LaTeX and Vimexplains how the author is able to keep up with mathematicslectures by using Vim and LaTeX which produces gorgeous notesthat can be used to study.

Now that you know about Vim, what do you want to develop in it?

I want to learn how to code a Python web application using a framework.

Vim Python Plugin

I've built a Python web app, now how do I deploy it?