BREAKING CHANGES: Ruff Migration
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_checkers values 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 linting
- g:pymode_ruff_format_enabled - Enable/disable Ruff formatting
- g:pymode_ruff_select - Select specific Ruff rules
- g:pymode_ruff_ignore - Ignore specific Ruff rules
- g:pymode_ruff_config_file - Specify Ruff config file path
- Formatting: :PymodeLintAuto now 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/pyflakes
- submodules/pycodestyle
- submodules/mccabe
- submodules/pylint
- submodules/pydocstyle
- submodules/pylama
- submodules/autopep8
- submodules/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/modules references (freed ~90MB+ of repository space)
- Physical directories removed from working tree
- Migration Guide: See doc/MIGRATION_GUIDE.md for step-by-step instructions
- Configuration Mapping: See doc/RUFF_CONFIGURATION_MAPPING.md for detailed rule mappings
- Migration Script: Use scripts/migrate_to_ruff.py to convert your vimrc configuration
- Validation Script: Use scripts/validate_ruff_migration.sh to 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.txt with 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 mapfile compatibility (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
- 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
- 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 six submodule
-
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_ignore and g: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
(changelog poorly maintained) 0.8.2
- Pylama updated to version 5.0.5
- Rope libs updated
- Add wdb to debugger list in breakpoint cmd
- Add pymode_options_max_line_length option
- Add ability to set related checker options :help pymode-lint-options
Options 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_project by 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_bind
- pymode_run_key -> pymode_run_bind
- pymode_breakpoint_key -> pymode_breakpoint_bind
- pymode_breakpoint_template -> pymode_breakpoint_cmd
- pymode_lint_write -> pymode_lint_on_write
- pymode_lint_onfly -> pymode_lint_on_fly
- pymode_lint_checker -> pymode_lint_checkers
- pymode_lint_minheight -> pymode_quickfix_minheight
- pymode_lint_maxheight -> pymode_quickfix_maxheight
- pymode_rope_autocomplete_map -> pymode_rope_completion_bind
- pymode_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:
-
Commands changed:
- PyDoc -> PymodeDoc
- Pyrun -> PymodeRun
- PyLintToggle -> PymodeLintToggle
- PyLint -> PymodeLint
- PyLintAuto -> PymodeLintAuto
- RopeOpenProject -> PymodeRopeNewProject
- RopeUndo -> PymodeRopeUndo
- RopeRedo -> PymodeRopeRedo
- RopeRenameCurrentModule -> PymodeRopeRenameModule
- RopeModuleToPackage -> PymodeRopeModuleToPackage
- RopeGenerateAutoimportCache -> PymodeRopeRegenerate
- RopeOrgamizeImports -> 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_map option;
- Removed g:pymode_rope_map_space option;
- 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_*_symbol options (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);
- 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_updatetime option
- 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_paths option
- Rope updated to version 0.9.4
- Fix pymode_run for "unnamed" clipboard
- Add pymode_lint_mccabe_complexity option
- Update Pep8 to version 1.0.1
- Warning! Change pymode_rope_goto_def_newwin option 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_hold option
- Improve pymode loading speed
- Add pep8, mccabe lint checkers
- Now g:pymode_lint_checker can have many values Ex. "pep8,pyflakes,mccabe"
- Add pymode_lint_ignore and pymode_lint_select options
- Fix rope keys
- Fix python motion in visual mode
- Add folding pymode_folding
- Warning: pymode_lint_checker now set to 'pyflakes,pep8,mccabe' by default
- Fix pylint for Windows users
- Python documentation search running from Vim (delete g:pydoc option)
- Python code execution running from Vim (delete g:python option)
- Fix g:pymode_lint_message mode error
- Fix breakpoints
- Fix python paths and virtualenv detection
- Fix g:pymode_syntax option
- 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_onfly option
- 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
- Add g:pymode_syntax option
- Highlight 'self' keyword
- Add FAQ
- Some refactoring and fixes
- Add alternative code checker "pyflakes" See :h pymode_lint_checker
- Update install docs
- Add g:pymode_options_* stuff, for ability to disable default pymode options
for python buffers
- Add g:pymode_rope_always_show_complete_menu option
- Some pylint fixes
- Add g:pymode_lint_minheight and g:pymode_lint_maxheight options
- Fix PyLintToggle
- Fix Rope and PyLint libs loading
- Auto open cwindow with results on rope find operations
- Add pymode_lint_jump option
- 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:pymode option (disable/enable pylint and rope)
- Fix pylint copyright
- Hotfix rope autocomplete
- Change rope variables (ropevim_<name> -> pymode_rope_<name>)
- Add pymode_rope_auto_project option (default: 1)
- Update and fix docs
- pymode_rope_extended_complete set by default
- Auto generate rope project and cache
- <C-c>r a for RopeAutoImport
- Add default pylint configuration
- Fix pylint and update docs