check your whitespace
A while back I beefed up vim with some plugins, mostly around python programming and one for ledger, or my case the excellent hledger entry. This is all great until something starts conflicting or stops working.
For some reason — system update, plugin update, phase of moon changed — I started seeing lint complaints on python scripts I had previously written:
(from within vim)
[bad indentation] found 4 tabs, expected 1
W0311: Bad indentation. Found 4 tabs, expected 1 (bad-indentation) (from running pylint directly)
or similar, “Found 8 tabs, expected 2”, “Found 12 tabs, expected 3”, and so on.
I think the issue was due to a combination of flake8 (vim plugin) / pylint (linter) and a virtualenv (virtual environment) I had set up for particular projects. For reason of remembering in the future, the following sorted it:
- activate virtual environment (eg
source .env/bin/activateor similar)
- install pylint in that venv (eg
pip3 install pylint)
- set up a pylintrc for the venv (eg
pylint --generate-rcfile > .pylintrc)
That seemed to sort out the W0311 issues.
As a post-script, I had a look at the file itself to see if there were indeed a ridiculous number of tabs, which pylint should rightly complain about. Using eg
xxd to view a hexdump of a file (always a handy tool to have), a line might look like:
00000ed0: 2020 2023 2069 6620 636c 6970 6e75 6d20 # if clipnum
the first part,
00000ed0, is the location in the file. The second part,
2020 2023 2069 6620 636c 6970 6e75 6d20 is the hex representation of the file contents, and the last part is the plain text. Interestingly, the
0x20) are decimal
32s, and 32 is the character code for
space. I cross-checked with a new file created in vim with only a tab character, and…
00000000: 090a ..
Here the character is
0x09), which is indeed a tab character! It would seem that a plugin is setting my
expandtab but only for for python files.