Magnificent app which corrects your previous console command
Settings management from configuration files and environment variables, supporting user customization of correction behavior, rule selection, and application preferences. The configuration system provides flexible control over thefuck's behavior through multiple sources.
Core functions for loading and managing application settings from multiple sources.
def get_settings(user_dir):
"""
Returns settings filled with values from settings.py and environment variables.
Parameters:
- user_dir (pathlib.Path): User configuration directory path
Returns:
Settings: Complete settings object with values from defaults, file, and environment
Loads settings in priority order:
1. Default settings
2. User settings file (~/.thefuck/settings.py)
3. Environment variables (highest priority)
"""
def initialize_settings_file(user_dir):
"""
Creates initial settings file if it doesn't exist.
Parameters:
- user_dir (pathlib.Path): User configuration directory path
Returns:
None
Creates ~/.thefuck/settings.py with default settings template and comments.
"""Built-in default settings and constants that define the base behavior.
DEFAULT_RULES = _DefaultRulesNames([])
"""
Default list of enabled rules.
Special list type that includes all rules with enabled_by_default=True.
"""
DEFAULT_PRIORITY = 1000
"""
Default priority value for rules when not specified.
"""
DEFAULT_SETTINGS = {
'rules': DEFAULT_RULES,
'wait_command': 3,
'require_confirmation': True,
'no_colors': False,
'debug': False,
'priority': {},
'env': {'LC_ALL': 'C', 'LANG': 'C', 'GIT_TRACE': '1'}
}
"""
Default configuration dictionary containing all default values.
Settings:
- rules: List of enabled correction rules
- wait_command: Timeout in seconds for command execution
- require_confirmation: Whether to require user confirmation before executing
- no_colors: Disable colored output
- debug: Enable debug logging
- priority: Dictionary of rule name to priority overrides
- env: Environment variables to set when executing commands
"""Environment variable to setting attribute mapping and processing.
ENV_TO_ATTR = {
'THEFUCK_RULES': 'rules',
'THEFUCK_WAIT_COMMAND': 'wait_command',
'THEFUCK_REQUIRE_CONFIRMATION': 'require_confirmation',
'THEFUCK_NO_COLORS': 'no_colors',
'THEFUCK_PRIORITY': 'priority',
'THEFUCK_DEBUG': 'debug'
}
"""
Mapping of environment variable names to settings attributes.
"""Specialized list types for rule management with enhanced behavior.
class _DefaultRulesNames(RulesNamesList):
"""
Special rules list that automatically includes rules with enabled_by_default=True.
Extends RulesNamesList with default rule inclusion behavior.
"""
def __contains__(self, item):
"""
Check if rule is enabled.
Parameters:
- item (Rule): Rule object to check
Returns:
bool: True if rule is in list or has enabled_by_default=True
"""
def __add__(self, items):
"""
Add items to rules list.
Parameters:
- items (list): Items to add
Returns:
_DefaultRulesNames: New list with added items
"""The settings file (~/.thefuck/settings.py) is a Python file that can set any of the configuration options:
# ~/.thefuck/settings.py example
# Rules to enable (list of rule names)
rules = ['git_push', 'sudo', 'cd_mkdir', 'apt_get']
# Timeout for command execution (seconds)
wait_command = 5
# Require user confirmation before executing corrections
require_confirmation = True
# Disable colored output
no_colors = False
# Enable debug logging
debug = False
# Override rule priorities (rule_name: priority)
priority = {
'sudo': 2000,
'git_push': 1500
}
# Environment variables for command execution
env = {
'LC_ALL': 'C',
'LANG': 'C',
'GIT_TRACE': '1'
}All settings can be overridden with environment variables:
# Environment variable formats:
THEFUCK_RULES = "sudo:git_push:cd_mkdir"
"""
Colon-separated list of rule names.
Use 'DEFAULT_RULES' to include all default rules plus additional ones.
"""
THEFUCK_WAIT_COMMAND = "5"
"""
Command timeout in seconds (integer).
"""
THEFUCK_REQUIRE_CONFIRMATION = "false"
"""
Boolean setting: 'true' or 'false' (case-insensitive).
"""
THEFUCK_NO_COLORS = "true"
"""
Boolean setting: 'true' or 'false' (case-insensitive).
"""
THEFUCK_DEBUG = "true"
"""
Boolean setting: 'true' or 'false' (case-insensitive).
"""
THEFUCK_PRIORITY = "sudo=2000:git_push=1500"
"""
Colon-separated rule=priority pairs.
"""from thefuck.conf import get_settings, initialize_settings_file
from thefuck.main import setup_user_dir
# Setup user directory and get settings
user_dir = setup_user_dir()
settings = get_settings(user_dir)
print(f"Wait timeout: {settings.wait_command}")
print(f"Confirmation required: {settings.require_confirmation}")
print(f"Enabled rules: {len(settings.rules)}")
print(f"Debug mode: {settings.debug}")import os
from thefuck.conf import get_settings
from thefuck.main import setup_user_dir
# Set environment variables
os.environ['THEFUCK_DEBUG'] = 'true'
os.environ['THEFUCK_WAIT_COMMAND'] = '10'
os.environ['THEFUCK_RULES'] = 'sudo:git_push:DEFAULT_RULES'
# Get settings (environment overrides file settings)
user_dir = setup_user_dir()
settings = get_settings(user_dir)
print(f"Debug enabled: {settings.debug}") # True
print(f"Wait timeout: {settings.wait_command}") # 10from thefuck.conf import get_settings
from thefuck.types import RulesNamesList
# Example of programmatic rules configuration
user_dir = setup_user_dir()
settings = get_settings(user_dir)
# Modify rules list
custom_rules = RulesNamesList(['sudo', 'git_push', 'cd_mkdir', 'apt_get'])
new_settings = settings.update(rules=custom_rules)
print(f"Original rules count: {len(settings.rules)}")
print(f"Custom rules count: {len(new_settings.rules)}")from thefuck.conf import get_settings
user_dir = setup_user_dir()
settings = get_settings(user_dir)
# Update rule priorities
priority_overrides = {
'sudo': 2000, # Higher priority
'git_push': 500, # Lower priority
'cd_mkdir': 1500 # Medium priority
}
custom_settings = settings.update(priority=priority_overrides)
print(f"Custom priorities: {custom_settings.priority}")Settings are loaded in the following order (later sources override earlier ones):
DEFAULT_SETTINGS~/.thefuck/settings.pyTHEFUCK_* environment variablesThis allows for flexible configuration with global defaults, user customization, and per-session overrides.
The configuration system handles errors gracefully:
Install with Tessl CLI
npx tessl i tessl/pypi-thefuck