nvbn/thefuck
Fork: 3446 Star: 86013 (更新于 2024-12-20 04:09:49)
license: MIT
Language: Python .
Magnificent app which corrects your previous console command.
最后发布版本: 3.32 ( 2022-01-03 06:17:40)
The Fuck
The Fuck is a magnificent app, inspired by a @liamosaur tweet, that corrects errors in previous console commands.
Is The Fuck too slow? Try the experimental instant mode!
More examples:
➜ apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
➜ fuck
sudo apt-get install vim [enter/↑/↓/ctrl+c]
[sudo] password for nvbn:
Reading package lists... Done
...
➜ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
➜ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...
➜ puthon
No command 'puthon' found, did you mean:
Command 'python' from package 'python-minimal' (main)
Command 'python' from package 'python3' (main)
zsh: command not found: puthon
➜ fuck
python [enter/↑/↓/ctrl+c]
Python 3.4.2 (default, Oct 8 2014, 13:08:17)
...
➜ git brnch
git: 'brnch' is not a git command. See 'git --help'.
Did you mean this?
branch
➜ fuck
git branch [enter/↑/↓/ctrl+c]
* master
➜ lein rpl
'rpl' is not a task. See 'lein help'.
Did you mean this?
repl
➜ fuck
lein repl [enter/↑/↓/ctrl+c]
nREPL server started on port 54848 on host 127.0.0.1 - nrepl://127.0.0.1:54848
REPL-y 0.3.1
...
If you're not afraid of blindly running corrected commands, the
require_confirmation
settings option can be disabled:
➜ apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
➜ fuck
sudo apt-get install vim
[sudo] password for nvbn:
Reading package lists... Done
...
Contents
- Requirements
- Installations
- Updating
- How it works
- Creating your own rules
- Settings
- Third party packages with rules
- Experimental instant mode
- Developing
- License
Requirements
- python (3.5+)
- pip
- python-dev
Back to Contents
Installation
On macOS or Linux, you can install The Fuck via Homebrew:
brew install thefuck
On Ubuntu / Mint, install The Fuck with the following commands:
sudo apt update
sudo apt install python3-dev python3-pip python3-setuptools
pip3 install thefuck --user
On FreeBSD, install The Fuck with the following commands:
pkg install thefuck
On ChromeOS, install The Fuck using chromebrew with the following command:
crew install thefuck
On Arch based systems, install The Fuck with the following command:
sudo pacman -S thefuck
On other systems, install The Fuck by using pip
:
pip install thefuck
Alternatively, you may use an OS package manager (OS X, Ubuntu, Arch).
#
It is recommended that you place this command in your .bash_profile
,
.bashrc
, .zshrc
or other startup script:
eval $(thefuck --alias)
# You can use whatever you want as an alias, like for Mondays:
eval $(thefuck --alias FUCK)
Or in your shell config (Bash, Zsh, Fish, Powershell, tcsh).
Changes are only available in a new shell session. To make changes immediately
available, run source ~/.bashrc
(or your shell config file like .zshrc
).
To run fixed commands without confirmation, use the --yeah
option (or just -y
for short, or --hard
if you're especially frustrated):
fuck --yeah
To fix commands recursively until succeeding, use the -r
option:
fuck -r
Back to Contents
Updating
pip3 install thefuck --upgrade
Note: Alias functionality was changed in v1.34 of The Fuck
Uninstall
To remove The Fuck, reverse the installation process:
- erase or comment thefuck alias line from your Bash, Zsh, Fish, Powershell, tcsh, ... shell config
- use your package manager (brew, pip3, pkg, crew, pip) to uninstall the binaries
How it works
The Fuck attempts to match the previous command with a rule. If a match is found, a new command is created using the matched rule and executed. The following rules are enabled by default:
-
adb_unknown_command
– fixes misspelled commands likeadb logcta
; -
ag_literal
– adds-Q
toag
when suggested; -
aws_cli
– fixes misspelled commands likeaws dynamdb scan
; -
az_cli
– fixes misspelled commands likeaz providers
; -
cargo
– runscargo build
instead ofcargo
; -
cargo_no_command
– fixes wrong commands likecargo buid
; -
cat_dir
– replacescat
withls
when you try tocat
a directory; -
cd_correction
– spellchecks and corrects failed cd commands; -
cd_cs
– changescs
tocd
; -
cd_mkdir
– creates directories before cd'ing into them; -
cd_parent
– changescd..
tocd ..
; -
chmod_x
– adds execution bit; -
choco_install
– appends common suffixes for chocolatey packages; -
composer_not_command
– fixes composer command name; -
conda_mistype
– fixes conda commands; -
cp_create_destination
– creates a new directory when you attempt tocp
ormv
to a non-existent one -
cp_omitting_directory
– adds-a
when youcp
directory; -
cpp11
– adds missing-std=c++11
tog++
orclang++
; -
dirty_untar
– fixestar x
command that untarred in the current directory; -
dirty_unzip
– fixesunzip
command that unzipped in the current directory; -
django_south_ghost
– adds--delete-ghost-migrations
to failed because ghosts django south migration; -
django_south_merge
– adds--merge
to inconsistent django south migration; -
docker_login
– executes adocker login
and repeats the previous command; -
docker_not_command
– fixes wrong docker commands likedocker tags
; -
docker_image_being_used_by_container
‐ removes the container that is using the image before removing the image; -
dry
– fixes repetitions likegit git push
; -
fab_command_not_found
– fixes misspelled fabric commands; -
fix_alt_space
– replaces Alt+Space with Space character; -
fix_file
– opens a file with an error in your$EDITOR
; -
gem_unknown_command
– fixes wronggem
commands; -
git_add
– fixes "pathspec 'foo' did not match any file(s) known to git."; -
git_add_force
– adds--force
togit add <pathspec>...
when paths are .gitignore'd; -
git_bisect_usage
– fixesgit bisect strt
,git bisect goood
,git bisect rset
, etc. when bisecting; -
git_branch_delete
– changesgit branch -d
togit branch -D
; -
git_branch_delete_checked_out
– changesgit branch -d
togit checkout master && git branch -D
when trying to delete a checked out branch; -
git_branch_exists
– offersgit branch -d foo
,git branch -D foo
orgit checkout foo
when creating a branch that already exists; -
git_branch_list
– catchesgit branch list
in place ofgit branch
and removes created branch; -
git_branch_0flag
– fixes commands such asgit branch 0v
andgit branch 0r
removing the created branch; -
git_checkout
– fixes branch name or creates new branch; -
git_clone_git_clone
– replacesgit clone git clone ...
withgit clone ...
-
git_clone_missing
– addsgit clone
to URLs that appear to link to a git repository. -
git_commit_add
– offersgit commit -a ...
orgit commit -p ...
after previous commit if it failed because nothing was staged; -
git_commit_amend
– offersgit commit --amend
after previous commit; -
git_commit_reset
– offersgit reset HEAD~
after previous commit; -
git_diff_no_index
– adds--no-index
to previousgit diff
on untracked files; -
git_diff_staged
– adds--staged
to previousgit diff
with unexpected output; -
git_fix_stash
– fixesgit stash
commands (misspelled subcommand and missingsave
); -
git_flag_after_filename
– fixesfatal: bad flag '...' after filename
-
git_help_aliased
– fixesgit help <alias>
commands replacingwith the aliased command; -
git_hook_bypass
– adds--no-verify
flag previous togit am
,git commit
, orgit push
command; -
git_lfs_mistype
– fixes mistypedgit lfs <command>
commands; -
git_main_master
– fixes incorrect branch name betweenmain
andmaster
-
git_merge
– adds remote to branch names; -
git_merge_unrelated
– adds--allow-unrelated-histories
when required -
git_not_command
– fixes wrong git commands likegit brnch
; -
git_pull
– sets upstream before executing previousgit pull
; -
git_pull_clone
– clones instead of pulling when the repo does not exist; -
git_pull_uncommitted_changes
– stashes changes before pulling and pops them afterwards; -
git_push
– adds--set-upstream origin $branch
to previous failedgit push
; -
git_push_different_branch_names
– fixes pushes when local branch name does not match remote branch name; -
git_push_pull
– runsgit pull
whenpush
was rejected; -
git_push_without_commits
– creates an initial commit if you forget and onlygit add .
, when setting up a new project; -
git_rebase_no_changes
– runsgit rebase --skip
instead ofgit rebase --continue
when there are no changes; -
git_remote_delete
– replacesgit remote delete remote_name
withgit remote remove remote_name
; -
git_rm_local_modifications
– adds-f
or--cached
when you try torm
a locally modified file; -
git_rm_recursive
– adds-r
when you try torm
a directory; -
git_rm_staged
– adds-f
or--cached
when you try torm
a file with staged changes -
git_rebase_merge_dir
– offersgit rebase (--continue | --abort | --skip)
or removing the.git/rebase-merge
dir when a rebase is in progress; -
git_remote_seturl_add
– runsgit remote add
whengit remote set_url
on nonexistent remote; -
git_stash
– stashes your local modifications before rebasing or switching branch; -
git_stash_pop
– adds your local modifications before popping stash, then resets; -
git_tag_force
– adds--force
togit tag <tagname>
when the tag already exists; -
git_two_dashes
– adds a missing dash to commands likegit commit -amend
orgit rebase -continue
; -
go_run
– appends.go
extension when compiling/running Go programs; -
go_unknown_command
– fixes wronggo
commands, for examplego bulid
; -
gradle_no_task
– fixes not found or ambiguousgradle
task; -
gradle_wrapper
– replacesgradle
with./gradlew
; -
grep_arguments_order
– fixesgrep
arguments order for situations likegrep -lir . test
; -
grep_recursive
– adds-r
when you try togrep
directory; -
grunt_task_not_found
– fixes misspelledgrunt
commands; -
gulp_not_task
– fixes misspelledgulp
tasks; -
has_exists_script
– prepends./
when script/binary exists; -
heroku_multiple_apps
– adds--app <app>
toheroku
commands likeheroku pg
; -
heroku_not_command
– fixes wrongheroku
commands likeheroku log
; -
history
– tries to replace command with the most similar command from history; -
hostscli
– tries to fixhostscli
usage; -
ifconfig_device_not_found
– fixes wrong device names likewlan0
towlp2s0
; -
java
– removes.java
extension when running Java programs; -
javac
– appends missing.java
when compiling Java files; -
lein_not_task
– fixes wronglein
tasks likelein rpl
; -
long_form_help
– changes-h
to--help
when the short form version is not supported -
ln_no_hard_link
– catches hard link creation on directories, suggest symbolic link; -
ln_s_order
– fixesln -s
arguments order; -
ls_all
– adds-A
tols
when output is empty; -
ls_lah
– adds-lah
tols
; -
man
– changes manual section; -
man_no_space
– fixes man commands without spaces, for examplemandiff
; -
mercurial
– fixes wronghg
commands; -
missing_space_before_subcommand
– fixes command with missing space likenpminstall
; -
mkdir_p
– adds-p
when you try to create a directory without a parent; -
mvn_no_command
– addsclean package
tomvn
; -
mvn_unknown_lifecycle_phase
– fixes misspelled life cycle phases withmvn
; -
npm_missing_script
– fixesnpm
custom script name innpm run-script <script>
; -
npm_run_script
– adds missingrun-script
for customnpm
scripts; -
npm_wrong_command
– fixes wrong npm commands likenpm urgrade
; -
no_command
– fixes wrong console commands, for examplevom/vim
; -
no_such_file
– creates missing directories withmv
andcp
commands; -
omnienv_no_such_command
– fixes wrong commands forgoenv
,nodenv
,pyenv
andrbenv
(eg.:pyenv isntall
orgoenv list
); -
open
– either prependshttp://
to address passed toopen
or creates a new file or directory and passes it toopen
; -
pip_install
– fixes permission issues withpip install
commands by adding--user
or prependingsudo
if necessary; -
pip_unknown_command
– fixes wrongpip
commands, for examplepip instatl/pip install
; -
php_s
– replaces-s
by-S
when trying to run a local php server; -
port_already_in_use
– kills process that bound port; -
prove_recursively
– adds-r
when called with directory; -
python_command
– prependspython
when you try to run non-executable/without./
python script; -
python_execute
– appends missing.py
when executing Python files; -
python_module_error
– fixes ModuleNotFoundError by trying topip install
that module; -
quotation_marks
– fixes uneven usage of'
and"
when containing args'; -
path_from_history
– replaces not found path with a similar absolute path from history; -
rails_migrations_pending
– runs pending migrations; -
react_native_command_unrecognized
– fixes unrecognizedreact-native
commands; -
remove_shell_prompt_literal
– removes leading shell prompt symbol$
, common when copying commands from documentations; -
remove_trailing_cedilla
– removes trailing cedillasç
, a common typo for European keyboard layouts; -
rm_dir
– adds-rf
when you try to remove a directory; -
scm_correction
– corrects wrong scm likehg log
togit log
; -
sed_unterminated_s
– adds missing '/' tosed
'ss
commands; -
sl_ls
– changessl
tols
; -
ssh_known_hosts
– removes host fromknown_hosts
on warning; -
sudo
– prependssudo
to the previous command if it failed because of permissions; -
sudo_command_from_user_path
– runs commands from users$PATH
withsudo
; -
switch_lang
– switches command from your local layout to en; -
systemctl
– correctly orders parameters of confusingsystemctl
; -
terraform_init.py
– runsterraform init
before plan or apply; -
terraform_no_command.py
– fixes unrecognizedterraform
commands; -
test.py
– runspytest
instead oftest.py
; -
touch
– creates missing directories before "touching"; -
tsuru_login
– runstsuru login
if not authenticated or session expired; -
tsuru_not_command
– fixes wrongtsuru
commands liketsuru shell
; -
tmux
– fixestmux
commands; -
unknown_command
– fixes hadoop hdfs-style "unknown command", for example adds missing '-' to the command onhdfs dfs ls
; -
unsudo
– removessudo
from previous command if a process refuses to run on superuser privilege. -
vagrant_up
– starts up the vagrant instance; -
whois
– fixeswhois
command; -
workon_doesnt_exists
– fixesvirtualenvwrapper
env name os suggests to create new. -
wrong_hyphen_before_subcommand
– removes an improperly placed hyphen (apt-install
->apt install
,git-log
->git log
, etc.) -
yarn_alias
– fixes aliasedyarn
commands likeyarn ls
; -
yarn_command_not_found
– fixes misspelledyarn
commands; -
yarn_command_replaced
– fixes replacedyarn
commands; -
yarn_help
– makes it easier to openyarn
documentation;
Back to Contents
The following rules are enabled by default on specific platforms only:
-
apt_get
– installs app from apt if it not installed (requirespython-commandnotfound
/python3-commandnotfound
); -
apt_get_search
– changes trying to search usingapt-get
with searching usingapt-cache
; -
apt_invalid_operation
– fixes invalidapt
andapt-get
calls, likeapt-get isntall vim
; -
apt_list_upgradable
– helps you runapt list --upgradable
afterapt update
; -
apt_upgrade
– helps you runapt upgrade
afterapt list --upgradable
; -
brew_cask_dependency
– installs cask dependencies; -
brew_install
– fixes formula name forbrew install
; -
brew_reinstall
– turnsbrew install <formula>
intobrew reinstall <formula>
; -
brew_link
– adds--overwrite --dry-run
if linking fails; -
brew_uninstall
– adds--force
tobrew uninstall
if multiple versions were installed; -
brew_unknown_command
– fixes wrong brew commands, for examplebrew docto/brew doctor
; -
brew_update_formula
– turnsbrew update <formula>
intobrew upgrade <formula>
; -
dnf_no_such_command
– fixes mistyped DNF commands; -
nixos_cmd_not_found
– installs apps on NixOS; -
pacman
– installs app withpacman
if it is not installed (usesyay
,pikaur
oryaourt
if available); -
pacman_invalid_option
– replaces lowercasepacman
options with uppercase. -
pacman_not_found
– fixes package name withpacman
,yay
,pikaur
oryaourt
. -
yum_invalid_operation
– fixes invalidyum
calls, likeyum isntall vim
;
The following commands are bundled with The Fuck, but are not enabled by default:
-
git_push_force
– adds--force-with-lease
to agit push
(may conflict withgit_push_pull
); -
rm_root
– adds--no-preserve-root
torm -rf /
command.
Back to Contents
Creating your own rules
To add your own rule, create a file named your-rule-name.py
in ~/.config/thefuck/rules
. The rule file must contain two functions:
match(command: Command) -> bool
get_new_command(command: Command) -> str | list[str]
Additionally, rules can contain optional functions:
side_effect(old_command: Command, fixed_command: str) -> None
Rules can also contain the optional variables enabled_by_default
, requires_output
and priority
.
Command
has three attributes: script
, output
and script_parts
.
Your rule should not change Command
.
Rules api changed in 3.0: To access a rule's settings, import it with
from thefuck.conf import settings
settings
is a special object assembled from ~/.config/thefuck/settings.py
,
and values from env (see more below).
A simple example rule for running a script with sudo
:
def match(command):
return ('permission denied' in command.output.lower()
or 'EACCES' in command.output)
def get_new_command(command):
return 'sudo {}'.format(command.script)
# Optional:
enabled_by_default = True
def side_effect(command, fixed_command):
subprocess.call('chmod 777 .', shell=True)
priority = 1000 # Lower first, default is 1000
requires_output = True
More examples of rules, utility functions for rules, app/os-specific helpers.
Back to Contents
Settings
Several The Fuck parameters can be changed in the file $XDG_CONFIG_HOME/thefuck/settings.py
($XDG_CONFIG_HOME
defaults to ~/.config
):
-
rules
– list of enabled rules, by defaultthefuck.const.DEFAULT_RULES
; -
exclude_rules
– list of disabled rules, by default[]
; -
require_confirmation
– requires confirmation before running new command, by defaultTrue
; -
wait_command
– the max amount of time in seconds for getting previous command output; -
no_colors
– disable colored output; -
priority
– dict with rules priorities, rule with lowerpriority
will be matched first; -
debug
– enables debug output, by defaultFalse
; -
history_limit
– the numeric value of how many history commands will be scanned, like2000
; -
alter_history
– push fixed command to history, by defaultTrue
; -
wait_slow_command
– max amount of time in seconds for getting previous command output if it inslow_commands
list; -
slow_commands
– list of slow commands; -
num_close_matches
– the maximum number of close matches to suggest, by default3
. -
excluded_search_path_prefixes
– path prefixes to ignore when searching for commands, by default[]
.
An example of settings.py
:
rules = ['sudo', 'no_command']
exclude_rules = ['git_push']
require_confirmation = True
wait_command = 10
no_colors = False
priority = {'sudo': 100, 'no_command': 9999}
debug = False
history_limit = 9999
wait_slow_command = 20
slow_commands = ['react-native', 'gradle']
num_close_matches = 5
Or via environment variables:
-
THEFUCK_RULES
– list of enabled rules, likeDEFAULT_RULES:rm_root
orsudo:no_command
; -
THEFUCK_EXCLUDE_RULES
– list of disabled rules, likegit_pull:git_push
; -
THEFUCK_REQUIRE_CONFIRMATION
– require confirmation before running new command,true/false
; -
THEFUCK_WAIT_COMMAND
– the max amount of time in seconds for getting previous command output; -
THEFUCK_NO_COLORS
– disable colored output,true/false
; -
THEFUCK_PRIORITY
– priority of the rules, likeno_command=9999:apt_get=100
, rule with lowerpriority
will be matched first; -
THEFUCK_DEBUG
– enables debug output,true/false
; -
THEFUCK_HISTORY_LIMIT
– how many history commands will be scanned, like2000
; -
THEFUCK_ALTER_HISTORY
– push fixed command to historytrue/false
; -
THEFUCK_WAIT_SLOW_COMMAND
– the max amount of time in seconds for getting previous command output if it inslow_commands
list; -
THEFUCK_SLOW_COMMANDS
– list of slow commands, likelein:gradle
; -
THEFUCK_NUM_CLOSE_MATCHES
– the maximum number of close matches to suggest, like5
. -
THEFUCK_EXCLUDED_SEARCH_PATH_PREFIXES
– path prefixes to ignore when searching for commands, by default[]
.
For example:
export THEFUCK_RULES='sudo:no_command'
export THEFUCK_EXCLUDE_RULES='git_pull:git_push'
export THEFUCK_REQUIRE_CONFIRMATION='true'
export THEFUCK_WAIT_COMMAND=10
export THEFUCK_NO_COLORS='false'
export THEFUCK_PRIORITY='no_command=9999:apt_get=100'
export THEFUCK_HISTORY_LIMIT='2000'
export THEFUCK_NUM_CLOSE_MATCHES='5'
Back to Contents
Third-party packages with rules
If you'd like to make a specific set of non-public rules, but would still like
to share them with others, create a package named thefuck_contrib_*
with
the following structure:
thefuck_contrib_foo
thefuck_contrib_foo
rules
__init__.py
*third-party rules*
__init__.py
*third-party-utils*
setup.py
The Fuck will find rules located in the rules
module.
Back to Contents
Experimental instant mode
The default behavior of The Fuck requires time to re-run previous commands. When in instant mode, The Fuck saves time by logging output with script, then reading the log.
Currently, instant mode only supports Python 3 with bash or zsh. zsh's autocorrect function also needs to be disabled in order for thefuck to work properly.
To enable instant mode, add --enable-experimental-instant-mode
to the alias initialization in .bashrc
, .bash_profile
or .zshrc
.
For example:
eval $(thefuck --alias --enable-experimental-instant-mode)
Back to Contents
Developing
See CONTRIBUTING.md
License MIT
Project License can be found here.
Back to Contents
最近版本更新:(数据更新于 2024-10-07 08:29:19)
2022-01-03 06:17:40 3.32
2021-06-10 03:58:15 3.31
2020-03-20 01:47:56 3.30
2019-05-28 00:43:34 3.29
2018-11-30 06:56:35 3.28
2018-05-23 01:31:37 3.27
2018-04-26 00:30:53 3.26
2017-11-24 03:56:19 3.25
2017-10-17 02:26:16 3.24
2017-08-29 15:41:24 3.23
主题(topics):
python, shell
nvbn/thefuck同语言 Python最近更新仓库
2024-12-30 10:09:28 xtekky/gpt4free
2024-12-30 02:38:15 home-assistant/core
2024-12-29 14:44:41 jxxghp/MoviePilot
2024-12-29 13:23:10 mem0ai/mem0
2024-12-29 08:53:22 hankcs/HanLP
2024-12-29 01:41:10 rashevskyv/dbi