This release replaces the old linting infrastructure with Ruff, a modern, fast Python linter and formatter written in Rust.
The following linting tools are no longer available as submodules or separate checkers:
- pylint - Replaced by Ruff PLE/PLR/PLW rules
- pyflakes - Replaced by Ruff F rules
- pycodestyle - Replaced by Ruff E/W rules
- mccabe - Replaced by Ruff C90 rules
- pydocstyle - Replaced by Ruff D rules
- pylama - No longer needed (was a wrapper)
- autopep8 - Replaced by Ruff format
Migration: Your existing g:pymode_lint_checkers configuration is automatically mapped to Ruff rules. No immediate action required, but see migration guide below.
- Ruff must be installed:
pip install ruff - Ruff is now an external dependency (not bundled as a submodule)
g:pymode_lint_checkersvalues are now mapped to Ruff rule categories (not actual tools)- Old tool-specific options (
g:pymode_lint_options_*) are mapped to Ruff configuration - New Ruff-specific options available:
g:pymode_ruff_enabled- Enable/disable Ruff lintingg:pymode_ruff_format_enabled- Enable/disable Ruff formattingg:pymode_ruff_select- Select specific Ruff rulesg:pymode_ruff_ignore- Ignore specific Ruff rulesg:pymode_ruff_config_file- Specify Ruff config file path
- Formatting:
:PymodeLintAutonow uses Ruff format instead of autopep8 (faster, PEP 8 compliant) - Linting: Ruff may report different errors than pylint/pyflakes (usually fewer false positives)
- Performance: Significantly faster linting (10-100x improvement expected)
Removed submodules:
submodules/pyflakessubmodules/pycodestylesubmodules/mccabesubmodules/pylintsubmodules/pydocstylesubmodules/pylamasubmodules/autopep8submodules/snowball_py(was only used by pydocstyle)submodules/appdirs(not used in pymode code)submodules/astroid(was only needed for pylint)submodules/toml(not used; Ruff handles its own TOML parsing)
Remaining submodules (3 total, down from 13):
submodules/rope- Refactoring and code intelligence (essential)submodules/tomli- TOML parsing (required by pytoolconfig)submodules/pytoolconfig- Tool configuration (required by rope)
Repository cleanup:
- Removed git index entries for all removed submodules
- Cleaned up
.git/modulesreferences (freed ~90MB+ of repository space) - Physical directories removed from working tree
- Migration Guide: See
doc/MIGRATION_GUIDE.mdfor step-by-step instructions - Configuration Mapping: See
doc/RUFF_CONFIGURATION_MAPPING.mdfor detailed rule mappings - Migration Script: Use
scripts/migrate_to_ruff.pyto convert your vimrc configuration - Validation Script: Use
scripts/validate_ruff_migration.shto verify your setup
If you need to rollback to the old system:
- Checkout previous version:
git checkout v0.14.0 - Install old dependencies:
pip install pylint pyflakes pycodestyle mccabe pydocstyle autopep8 - Restore old configuration in your
.vimrc
Note: The old tools are no longer maintained as submodules. You'll need to install them separately if rolling back.
- Performance: Significantly faster linting and formatting with Ruff
- Maintenance: Reduced from 13 submodules to 3, simplifying dependency management
- Modern tooling: Using Ruff, a actively maintained, modern Python linter
- Unified configuration: Single tool configuration instead of multiple tool configs
- Better error messages: Ruff provides clearer, more actionable error messages
- Added comprehensive migration guide (
doc/MIGRATION_GUIDE.md) - Added Ruff configuration mapping documentation (
doc/RUFF_CONFIGURATION_MAPPING.md) - Updated
doc/pymode.txtwith Ruff configuration options - Added migration tools (
scripts/migrate_to_ruff.py,scripts/validate_ruff_migration.sh)
- Added comprehensive Ruff integration tests (
tests/vader/ruff_integration.vader) - All existing tests continue to pass
- Verified compatibility with Python 3.10-3.13
- Verified Docker environment compatibility
- Multi-platform CI testing: Added support for testing on Linux, macOS, and Windows
- Windows PowerShell test script (
scripts/cicd/run_vader_tests_windows.ps1) - Updated GitHub Actions workflow for cross-platform testing
- Tests run on all platforms with Python 3.10, 3.11, 3.12, and 3.13
- Platform-specific test result aggregation in PR summaries
- Platform-specific fixes:
- macOS: Fixed
mapfilecompatibility (bash 3.x/zsh), empty array handling, sed errors - Windows: Fixed path resolution across drive letters,
/tmp/path redirection to$TEMP - Added robust error handling and timeout support across all platforms
- Improved Vim detection and PATH configuration for Windows
- macOS: Fixed
- Windows PowerShell test script (
- Update submodules
- Fix Errors related to these updates
- Improve tests outputs
- Fix Global and Module MoveRefactoring (#1141) Thanks to @lieryan
- Text object/operator/motion mapping to select logical line (#1145). Thanks to @lieryan
- Remove dead keywords and builtins; add match, case (#1149). Thanks to @NeilGirdhar
- Add syntax highlight for walrus (#1147) Thanks to @fpob
- Add configurable prefix for rope commands (#1137) TThanks to @NathanTP
- Add option g:pymode_indent_hanging_width for different hanging indentation width (#1138). Thanks to @wookayin
- Add toml submodule
- Improve breakpoint feature
- Improve debugging script
- Update submodules
- Improve tests
-
Move changelog rst syntax to markdown
-
pymode_rope: check disables -
BREAKING CHANGE: Remove supoort for python 2. From 0.11.0 on we will focus on supporting python 3+ (probably 3.5+).
-
Inspect why files starting with the following code do not get loaded:
def main(): pass if __name__ == '__main__': main()
-
added github actions test suit and remove travis
-
improved submodules cloning (shallow)
-
Removes
sixsubmodule -
Fix motion mapping
-
Fix breakpoint feature
After many changes, including moving most of our dependencies from copied source code to submodules, and lot's of problems maintaining Python 2 and Python 3 support, this (0.10.x) is the last version of python-mode that will support Python 2. Some patches may be done in order to fix issues related to Python 2 or some backward compatible changes that can be applied.
- pylama: migrated to submodule
-
pylama: fixed erratic behavior of skip option causing unintended skipping of lint checkers
-
PEP257 requires
snowbalstemmer: added as submodule -
Fixed handling of
g:pymode_lint_ignoreandg:pymode_lint_select: from strings to list -
Migrated modules from pymode/libs to submodules/
- Rationale: no need to single handedly update each module; removes burden from developers
-
Improved folding accuracy
- Improved nested definitions folding
- Improved block delimiting
- Pylama updated to version 5.0.5
- Rope libs updated
- Add wdb to debugger list in breakpoint cmd
- Add
pymode_options_max_line_lengthoption - Add ability to set related checker options
:help pymode-lint-optionsOptions added:pymode_lint_options_pep8,pymode_lint_options_pep257,pymode_lint_options_mccabe,pymode_lint_options_pyflakes,pymode_lint_options_pylint - Highlight comments inside class/function arg lists
- Don't fold single line def
- Don't skip a line when the first docstring contains text
- Add Python documentation vertical display option
- Rope: correct refactoring function calls
-
Pylama updated to version 3.3.2
-
Get fold's expression symbol from &fillchars;
-
Fixed error when setting
g:pymode_breakpoint_cmd(expobrain); -
Fixed code running;
-
Ability to override rope project root and .ropeproject folder
-
Added path argument to PymodeRopeNewProject which skips prompt
-
Disable
pymode_rope_lookup_projectby default -
Options added:
pymode_rope_project_root,pymode_rope_ropefolder
-
Update indentation support;
-
Python3 support;
-
Removed pymode modeline support;
-
Disabled async code checking support;
-
Options changes:
pymode_doc_key->pymode_doc_bindpymode_run_key->pymode_run_bindpymode_breakpoint_key->pymode_breakpoint_bindpymode_breakpoint_template->pymode_breakpoint_cmdpymode_lint_write->pymode_lint_on_writepymode_lint_onfly->pymode_lint_on_flypymode_lint_checker->pymode_lint_checkerspymode_lint_minheight->pymode_quickfix_minheightpymode_lint_maxheight->pymode_quickfix_maxheightpymode_rope_autocomplete_map->pymode_rope_completion_bindpymode_rope_enable_autoimport->pymode_rope_autoimport
-
Options removed:
pymode_lint_hold,pymode_lint_config,pymode_lint_jump,pymode_lint_signs_always_visible,pymode_rope_extended_complete,pymode_rope_auto_project,pymode_rope_autoimport_generate,pymode_rope_autoimport_underlines,pymode_rope_codeassist_maxfixes,pymode_rope_sorted_completions,pymode_rope_extended_complete,pymode_rope_confirm_saving,pymode_rope_global_prefix,pymode_rope_local_prefix,pymode_rope_vim_completion,pymode_rope_guess_project,pymode_rope_goto_def_newwin,pymode_rope_always_show_complete_menu
-
Options added:
pymode_rope_regenerate_on_write,pymode_rope_completion,pymode_rope_complete_on_dot,pymode_lint_sort,pymode_rope_lookup_project,pymode_lint_unmodified
-
Commands added:
PymodeVirtualenv
-
Commands changed:
PyDoc->PymodeDocPyrun->PymodeRunPyLintToggle->PymodeLintTogglePyLint->PymodeLintPyLintAuto->PymodeLintAutoRopeOpenProject->PymodeRopeNewProjectRopeUndo->PymodeRopeUndoRopeRedo->PymodeRopeRedoRopeRenameCurrentModule->PymodeRopeRenameModuleRopeModuleToPackage->PymodeRopeModuleToPackageRopeGenerateAutoimportCache->PymodeRopeRegenerateRopeOrgamizeImports->PymodeRopeAutoImport
-
Commands removed:
PyLintCheckerToggle,RopeCloseProject,RopeProjectConfig,RopeRename,RopeCreate<...>,RopeWriteProject,RopeRename,RopeExtractVariable,RopeExtractMethod,RopeInline,RopeMove,RopeRestructure,RopeUseFunction,RopeIntroduceFactory,RopeChangeSignature,RopeMoveCurrentModule,RopeGenerate<...>,RopeAnalizeModule,RopeAutoImport
- Added
g:pymode_rope_autocomplete_mapoption; - Removed
g:pymode_rope_map_spaceoption; - Added PEP257 checker;
- Support 'pudb' in breakpoints;
- Pyrun can now operate on a range of lines, and does not need to save (c) lawrenceakka
- Update pylama to version 1.5.0
- Add a set of
g:pymode_lint_*_symboloptions (c) kdeldycke; - Support virtualenv for python3 (c) mlmoses;
- Fixed autopep8 (PyLintAuto) command;
- Fix error on non-ascii characters in docstrings;
- Update python syntax;
- Update Pylint to version 0.28.0;
- Update pyflakes to version 0.7.3;
- Fixed lint_ignore options bug;
- Fixed encoding problems when code running;
- Improvement folding (thanks @alvinfrancis);
- Bugfix release
- Update PEP8 to version 1.4.5;
- Update Pylint to version 0.27.0;
- Update pyflakes to version 0.6.1;
- Update autopep8 to version 0.8.7;
- Fix breakpoint definition;
- Update python syntax;
- Fixed run-time error when output non-ascii in multibyte locale;
- Move initialization into ftplugin as it is python specific;
- Pyrex (Cython) files support;
- Support raw_input in run python code;
- Dont raise an exception when Logger has no message handler (c) nixon
- Improve performance of white space removal (c) Dave Smith
- Improve ropemode support (c) s0undt3ch
- Add
g:pymode_updatetimeoption - Update autopep8 to version 0.8.1
- Update autopep8
- Improve
pymode#troubleshooting#Test()
- Add PEP8 indentation
:help pymode_indent
- Fix documentation. Thanks (c) bgrant;
- Fix pymode "async queue" support.
- Updated Pep8 to version 1.3.3
- Updated Pylint to version 0.25.2
- Fixed virtualenv support for windows users
- Added pymode modeline
:help PythonModeModeline - Added diagnostic tool
:call pymode#troubleshooting#Test() - Added PyLintAuto command
:help PyLintAuto - Code checking is async operation now
- More, more fast the pymode folding
- Repaired execution of python code
- Add
pymode_pathsoption - Rope updated to version 0.9.4
- Fix pydocs integration
- Fix
pymode_runfor "unnamed" clipboard - Add
pymode_lint_mccabe_complexityoption - Update Pep8 to version 1.0.1
- Warning! Change
pymode_rope_goto_def_newwinoption for open "goto definition" in new window, set it to 'new' or 'vnew' for horizontally or vertically split If you use default behaviour (in the same buffer), not changes needed.
- Add
pymode_lint_holdoption - Improve pymode loading speed
- Add pep8, mccabe lint checkers
- Now
g:pymode_lint_checkercan have many values Ex. "pep8,pyflakes,mccabe" - Add
pymode_lint_ignoreandpymode_lint_selectoptions - Fix rope keys
- Fix python motion in visual mode
- Add folding
pymode_folding - Warning:
pymode_lint_checkernow set to 'pyflakes,pep8,mccabe' by default
- Fix pylint for Windows users
- Python documentation search running from Vim (delete
g:pydocoption) - Python code execution running from Vim (delete
g:pythonoption)
- Fix
g:pymode_lint_messagemode error - Fix breakpoints
- Fix python paths and virtualenv detection
- Fix
g:pymode_syntaxoption - Show error message in bottom part of screen see
g:pymode_lint_message - Fix pylint for windows users
- Fix breakpoint command (Use pdb when idpb not installed)
- Add a sign for info messages from pylint. (c) Fredrik Henrysson
- Change motion keys: vic - viC, dam - daM and etc
- Add
g:pymode_lint_onflyoption
- Prevent the configuration from breaking python-mode (c) Dirk Wallenstein
- Fix ropeomnicompletion
- Add preview documentation
- Happy new year!
- Objects and motion fixes
- Add python objects and motions (beta)
:h pymode_motion
- Add PyLintWindowToggle command
- Fix some bugs
-
Enable all syntax highlighting For old settings set in your vimrc:
let g:pymode_syntax_builtin_objs = 0 let g:pymode_syntax_builtin_funcs = 0 -
Change namespace of syntax variables See README
- Add
g:pymode_syntaxoption - Highlight 'self' keyword
- Minor fixes
- Fix pyflakes
- Add FAQ
- Some refactoring and fixes
- Add alternative code checker "pyflakes" See
:h pymode_lint_checker - Update install docs
- Fix RopeShowDoc
- Add
g:pymode_options_*stuff, for ability to disable default pymode options for python buffers
- Add
g:pymode_rope_always_show_complete_menuoption - Some pylint fixes
- Add
g:pymode_lint_minheightandg:pymode_lint_maxheightoptions - Fix PyLintToggle
- Fix Rope and PyLint libs loading
- Auto open cwindow with results on rope find operations
- Add
pymode_lint_jumpoption
- Minor fixes (virtualenv loading, buffer commands)
- Add
<C-space>shortcut for macvim users. - Add VIRTUALENV support
- Add current work path to sys.path
- Add
g:pymodeoption (disable/enable pylint and rope) - Fix pylint copyright
- Hotfix rope autocomplete
- Change rope variables (
ropevim_<name>->pymode_rope_<name>) - Add
pymode_rope_auto_projectoption (default: 1) - Update and fix docs
pymode_rope_extended_completeset by default- Auto generate rope project and cache
<C-c>r afor RopeAutoImport
- Add default pylint configuration
- Fix pylint and update docs
- First public release
