vim v. IDE for Python programming
#################################
:date: 2017-10-30
:category: computer
:tags: blogComment, python, vim, emacs, git, FLOSS
(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
$