Indent Finder
From Freehackers
The end of your indentation's nightmare
by Bluebird
Contents |
[edit] Introduction
Indentation of external sources is a common problem. Some people use two spaces, some four spaces, some tabulations, some (horror!) mix tab and spaces. Text editors have usually options helping to deal with the way you indent your files. Pressing tab will insert spaces of tabulations depending on your settings. However, it only works properly with your own files, which have been indented in your own way.
As soon as you start editing external sources, you are likely to face a different indentation. Then your careful editor setting will simply fuck up the file you edit unless the guy did use the same indentation as yours. And you may not notice it. For example if I indent with tab but sets them to be displayed as four columns and if I edit a file indented with 4 spaces, all the lines I create will be indented with tab. They will render fine on my editor, but probably not on someone else's editor.
It is especially annoyhing if you program in python as the indentation is part of the program structure.
I haven't found (yet) an editor that deals properly with this problem. The solution however is simple: the text editor must find the indentation used within a file and tune its settings according to this. This is what Indent Finder does.
[edit] Description
Indent Finder is a python script that reads a file and tells you what indentation is used inside the file. The indentation analysis works on any language. It was tested successfully with C, C++, python and Java code.
The current version provides helps for the integration with vim. I hope other editors will pick either the script or the idea, and that auto-detecting indentation will become common amongst text editors. I am releasing the code under the BSD License to encourage this.
The script is written in python because it was quick and easy way to write it. The algorithm is pretty simple, and could be rewritten in C to avoid the small (almost unnoticeable) delay due to the python interpreter starting.
The version 1.2 includes a new script indent_checker.py that checks a source tree to find inconsistent indentation. I use it as a source validation tool in Vy.
[edit] Usage
[edit] On the command line
In command line mode, it produces simple output like: space 4 or tab 8. This output can by used in other programs or shell scripts.
$ python indent_finder.py --separate tests/*.* tests/DebugClient.py : space 4 tests/IOtest.java : space 4 tests/TestRunner.cpp : space 2 tests/cml.py : space 4 tests/diffmodel.cpp : tab 8 tests/pretty-make.py : tab 8
Check your source tree:
$ python indent_checker.py 'space 4' *.py Target indentation is: space 4 Inconsistent indentation for indent_checker.py: tab 8 Inconsistent indentation for setup.py: tab 8 Inconsistent indentation for test_indent_checker.py: tab 8 Inconsistent indentation for test_indent_finder.py: tab 8
[edit] With Vim
- Install the python script (python setup.py install)
- Drop the file indent_finder.vim inside your vim plugin directory
All new opened buffer will be scanned by Indent Finder, which will set the vim settings appropriately. The settings modified are: shiftwidth, tabstop, softtabstop and expandtab. By default, all file types are scanned but you may restrict this by editing the indent_finder.vim script.
[edit] How it works
Indent Finder scans each line of the entry file for a space character (white space or tab) repeated until a non space character is found. Such a line is considered to be a properly indented line of code. Blank lines and mixed indentation lines are safely ignored. Lines coming after a line ending in '\\' have higher chance of being not properly indented, and are thus ignored too.
An array stores the number of lines that have a specific indentation: tab, number of spaces between 2 and 8. For space indentation, a line is considered indented with a base of x if the number of spaces modulo x yields zero. Thus, an indentaiton of 4 spaces increases the 2-spaces and the 4-spaces indentation line count.
At the end of the scan phase, the indentation that was used with the highest number of lines is taken. For spaces, to avoid the problemes of multiples like 2 and 4, the highest indentation number is preferred. A lower number is chosen if it reports at least 10% more lines with this indentation.
The step of each indentation increase is also a strong hint of the current indentation of the file. The step will grant a 10 points bonus to the number of spaces used.
[edit] License
Indent Finder is released under the BSD license.
[edit] Download
[edit] version 1.2 : 16 nov 2007
Add Indent Checker script to check the indentation consistency of a source tree.
- Windows Version: zip file
- Unix Version: tgz file
[edit] version 1.1 : 10 juil 2005
Improve heuristic by detecting indentation steps.
- Windows Version: zip file
- Unix Version: tgz file
[edit] version 1.0 : 22 nov 2002
Initial and stable release.
- Windows Version: zip file
- Unix Version: tgz file
[edit] Feedback
Indent Finder is developed by Bluebird.
If IndentFinder ever reports wrong indentation, send me immediately a mail, if possible with the offending file.
Bugs, suggestions, patch, I am open to feedback: Mail me.
[edit] Other Projects of Bluebird
- Vy: a generic vi engine written in Python
- LuaUnit: a unittest framework for the Lua language
- Klotski: a mind-breaking game
- Yzis: a generic vi engine written in C++
- Indent Finder: set your editor to the correct indentation automatically
- Pretty Make: beautify your make output
- Keep Cool: keep your CPU at low temperature while compiling.
- KMerge: text document merging tool developed for KDE 1.