vim v. IDE for Python programming
Mon 30 October 2017
(somebody asked me in email about my opinions on vim v. IDE for Python programming, I think it could be worthy of being available to others as well)
Obviously you are interested in Python and Vim. Therefore I'd like to ask you whether you use a Python IDE. If so, is it a Vim-based one or a different tool like Eric or PyCharm (by JetBrains with its headquarters in Prague).
NetBeans was a Czech project, Eclipse and JetBrains just have labs here (JetBrains is more a Russian company, headquartered in St. Petersburg, as far as I know, although I wonder whether they won’t follow all smart Russians and move out of the reach of Mr. Putin).
Concerning me and IDE. No, I don't write my emails in my $EDITOR, but that's just because I work for Red Hat as a Desktop QA, so I am trying to use our products as much as possible (i.e., switching between Thunderbird and Evolution with local mails on IMAP server on localhost). Otherwise, everything else (from Python to writing a novel) I do in vim.
However, I constantly feel in background that there is something wrong with using gqap in Normal mode when it is year 2017, so I tried I believe almost all alternatives (I have been using Linux since 2000, most of the time having vim as my $EDITOR). From other editors (Emacs, gedit … I have even started https://gitlab.com/mcepl/gedit-rope, Sublime) to all possible IDEs (Eclipse with PyDev, NetBeans … just briefly, PyCharm, VS Code, yes, even Eric) and scenario is always the same. First moment is enchantment with new opportunities (e.g., I really liked Mylyn on Eclipse) and then hard life of trying to survive with the new environment. After grinding my teeth over the need to learn new stuff I always get to that state of uncontrollable rage when I have no clue how to do what I would like to do, but I know four keystrokes which would do it for me in vim. So, I am back with vim again.
Part of my problem is that I really don’t do large Python projects with zilion of files, classes, etc. in the Java meaning of the word ‘project’. A colleague from the JBoss team was sitting next to me for many years. He was working almost all his hours on one project inside of the gigantic cloud of Java classes and symbols. For him there never was anything else than his IDE (originally Eclipse, now mostly IntelliJ IDEA), it was literally only program he run most of the day. He finally learnt how to run his unit tests inside of his IDE and then he just didn't use anything else (except, for some weird reason, he hated integrated support for git, so he used terminal just for that). When he needed that weird class in one of the other hundreds of classes it was just at his fingertips and life was good again. The only other alternative of using editor was him using a debugger, which was again in his IDE.
That is unfortunately (?) not how I work. I usually write just plenty of not so complicated Python scripts and I need to run them in bash all the time (or via some other command line utility in our testing server on the other side of the world). I don’t use complicated weird list of classes (aside from one or two external libraries we try to keep ourselves mostly inside of the stdlib), I mostly don't use debugger (usually logging.debug() is the best debugging tool I can get anyway), so there is really not much I can expect from IDE.
I tried some attempts to use some vim plugins for project-like organization, but I usually don’t use them in the end. I even use too little of vim-snippets (although these could be useful).
In the end I have decided to stay with vim (and I maintain https://copr.fedorainfracloud.org/coprs/mcepl/vim8/), but I think that your decision to use one or another depends a lot on the style of your work. I can imagine that with complicated large Django project you may be closer to my JBoss colleague and use good Python IDE (and if using professional PyCharm, you can use Django-specific support and/or SQL databases support). PyCharm has surprisingly good vim emulation (not just hjkl keys, which I don't use anyway, but really nice work with objects, like ci" or similar).
The only thing which made me think for a second over VS Code from Microsoft was their debugger. Really slick, if you can use it, worthy of consideration.
Some of my colleagues developing big Python/Django projects used PyDev (http://www.pydev.org/) or vim-pydjango (https://github.com/yodiaditya/vim-pydjango) but switched to PyCharm after a while.
Just to note that vim-pydjango looks like one of those poorly stitched together collections of „everything I have currently on my disc“. I prefer to use original plug-ins themselves (ropevim or Jedi for code completion and jumping in the code, UltraSnips & vim-snippets, of course everybody has to have vim-fugitive installed, etc.). With the packages support now in vim8 (did I tell I maintain Fedora/RHEL builds of the latest vim8? ;), it is really no trouble to have multiple plug-ins constantly updated (put ~/.vim/pack into git repository and all individual modules as git submodules), and you get the latest code and the best support.
My younger colleagues say they were much more productive with a good IDE and PyCharm is perhaps the best one, at least the commercial version. I prefer open source tools with the full feature set, so PyCharm would not be my first choice.
There is free (both as in beer and as in free speech) version of PyCharm, but it doesn't have those special plugins for Django/SQL. Fedora/RHEL packages from one of my colleagues are on https://copr.fedorainfracloud.org/coprs/phracek/PyCharm/ but I am sure you get them somewhere for any Linux distribution.
However, as I said, ‘better’ means different things for different people. Try some IDE and you can see how it works for you.
Do you have a recommendation? In case you use a Vim-based IDE which one do you prefer? If you use Vim as pure text editor and not as IDE: Do you have special plugins and settings for Python?
By the way, vim-based IDE (i.e., those vim-pydjango or https://github.com/python-mode/python-mode) are usually horrible combination of all worst parts of vim and IDE. Too heavy, not well maintained, and not as good as true IDE. Use vim plugins directly and sparingly.
https://michiganlabs.com/2014/08/29/vim-python-ide/ and https://blog.jetbrains.com/pycharm/2013/06/vim-as-a-python-ide-or-python-ide-as-vim/ (yes, it is from marketing guy at JetBrains)
are two articles worthy of consideration. However, the conclusion depends on you.
I myself take the standard Vim distribution maintained by Bram and a small .vimrc with no real Python-specific settings. For me that has been enough so far but I want to find out if there is a better environment I can live with.
I really believe that SOME plug-ins are worthy of installation. Below is the output of ls -1 -d ~/.vim/pack/*/*/* I have too many plugins, and there are many I don't use, but some (ALE for running pylint/flake8/etc. in background, fugitive for weirder aspects of life with git, vim-unimpaired, vim-textobj*, ultisnips, ropevim, Ack.vim with ripgrep) are seriously useful.:
$ /bin/ls -d ~/.vim/pack/*/*/* /home/matej/.vim/pack/own/start/slovnik-seznam /home/matej/.vim/pack/own/start/vim-diff_navigator /home/matej/.vim/pack/thirdparty/opt/vim-ditto /home/matej/.vim/pack/thirdparty/opt/vim-racer /home/matej/.vim/pack/thirdparty/start/ack.vim /home/matej/.vim/pack/thirdparty/start/ale /home/matej/.vim/pack/thirdparty/start/asyncrun.vim /home/matej/.vim/pack/thirdparty/start/closetag.vim /home/matej/.vim/pack/thirdparty/start/ctrlp.vim /home/matej/.vim/pack/thirdparty/start/editorconfig-vim /home/matej/.vim/pack/thirdparty/start/fugitive-gitlab.vim /home/matej/.vim/pack/thirdparty/start/html5-natalian /home/matej/.vim/pack/thirdparty/start/lexima.vim /home/matej/.vim/pack/thirdparty/start/mediawiki.vim /home/matej/.vim/pack/thirdparty/start/pydoc.vim /home/matej/.vim/pack/thirdparty/start/pyunit.vim /home/matej/.vim/pack/thirdparty/start/Recover.vim /home/matej/.vim/pack/thirdparty/start/ropevim /home/matej/.vim/pack/thirdparty/start/todo.txt-vim /home/matej/.vim/pack/thirdparty/start/ultisnips /home/matej/.vim/pack/thirdparty/start/unicode.vim /home/matej/.vim/pack/thirdparty/start/VCard-syntax /home/matej/.vim/pack/thirdparty/start/vim-behave /home/matej/.vim/pack/thirdparty/start/vim-characterize /home/matej/.vim/pack/thirdparty/start/vim-commentary /home/matej/.vim/pack/thirdparty/start/vim-cuesheet /home/matej/.vim/pack/thirdparty/start/vim-fugitive /home/matej/.vim/pack/thirdparty/start/vim-gitlab /home/matej/.vim/pack/thirdparty/start/vim-indent-object /home/matej/.vim/pack/thirdparty/start/vim-makegreen /home/matej/.vim/pack/thirdparty/start/vimoutliner /home/matej/.vim/pack/thirdparty/start/vim-repeat /home/matej/.vim/pack/thirdparty/start/vim-restructuredtext /home/matej/.vim/pack/thirdparty/start/vim-rooter /home/matej/.vim/pack/thirdparty/start/vim-scriptease /home/matej/.vim/pack/thirdparty/start/vim-snippets /home/matej/.vim/pack/thirdparty/start/vim-solarized8 /home/matej/.vim/pack/thirdparty/start/vim-speeddating /home/matej/.vim/pack/thirdparty/start/vim-sticky-notes /home/matej/.vim/pack/thirdparty/start/vim-surround /home/matej/.vim/pack/thirdparty/start/vim-textobj-function /home/matej/.vim/pack/thirdparty/start/vim-textobj-python /home/matej/.vim/pack/thirdparty/start/vim-textobj-quote /home/matej/.vim/pack/thirdparty/start/vim-textobj-user /home/matej/.vim/pack/thirdparty/start/vim-unimpaired /home/matej/.vim/pack/thirdparty/start/vim-vinegar /home/matej/.vim/pack/vimballs/start/math-vba /home/matej/.vim/pack/vimballs/start/vim-info $