命令修正-thefuck
介绍
linux 程序员,属于面向命令行的一类,经常要记忆各种终端命令,往往输错的情况下,导致各种问题,并极大影响心情,所以 thefuck出现了.
- 基于
Python
安装方式
mac
brew install thefuck
Ubuntu
sudo apt update
sudo apt install python3-dev python3-pip
sudo pip3 install thefuck
其他环境
pip install thefuck
环境变量
在.bashrc 或者 .bash_profile或者.zshrc中添加
eval "$(thefuck --alias)"
常用使用场景
- apt-get
➜ 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
➜ 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.
...
- python
➜ 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)
...
- repl
➜ 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
...
命令修正
ag_literal– adds-Qtoagwhen suggested;aws_cli– fixes misspelled commands likeaws dynamdb scan;cargo– runscargo buildinstead ofcargo;cargo_no_command– fixes wrongs commands likecargo buid;cd_correction– spellchecks and correct failed cd commands;cd_mkdir– creates directories before cd'ing into them;cd_parent– changescd..tocd ..;chmod_x– add execution bit;composer_not_command– fixes composer command name;cp_omitting_directory– adds-awhen youcpdirectory;cpp11– adds missing-std=c++11tog++orclang++;dirty_untar– fixestar xcommand that untarred in the current directory;dirty_unzip– fixesunzipcommand that unzipped in the current directory;django_south_ghost– adds--delete-ghost-migrationsto failed because ghosts django south migration;django_south_merge– adds--mergeto inconsistent django south migration;docker_not_command– fixes wrong docker commands likedocker tags;dry– fixes repetitions likegit git push;fab_command_not_found– fix 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 wronggemcommands;git_add– fixes "pathspec 'foo' did not match any file(s) known to git.";git_add_force– adds--forcetogit 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 -dtogit branch -D;git_branch_exists– offersgit branch -d foo,git branch -D fooorgit checkout foowhen creating a branch that already exists;git_branch_list– catchesgit branch listin place ofgit branchand removes created branch;git_checkout– fixes branch name or creates new branch;git_diff_no_index– adds--no-indexto previousgit diffon untracked files;git_diff_staged– adds--stagedto previousgit diffwith unexpected output;git_fix_stash– fixesgit stashcommands (misspelled subcommand and missingsave);git_flag_after_filename– fixesfatal: bad flag '...' after filenamegit_help_aliased– fixesgit help <alias>commands replacing with the aliased command;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 $branchto previous failedgit push;git_push_different_branch_names– fixes pushes when local brach name does not match remote branch name;git_push_pull– runsgit pullwhenpushwas 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 --skipinstead ofgit rebase --continuewhen there are no changes;git_remote_delete– replacesgit remote delete remote_namewithgit remote remove remote_name;git_rm_local_modifications– adds-for--cachedwhen you try torma locally modified file;git_rm_recursive– adds-rwhen you try torma directory;git_rm_staged– adds-for--cachedwhen you try torma file with staged changesgit_rebase_merge_dir– offersgit rebase (--continue | --abort | --skip)or removing the.git/rebase-mergedir when a rebase is in progress;git_remote_seturl_add– runsgit remote addwhengit remote set_urlon nonexistant 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--forcetogit tag <tagname>when the tag already exists;git_two_dashes– adds a missing dash to commands likegit commit -amendorgit rebase -continue;go_run– appends.goextension when compiling/running Go programs;gradle_no_task– fixes not found or ambiguousgradletask;gradle_wrapper– replacesgradlewith./gradlew;grep_arguments_order– fixes grep arguments order for situations likegrep -lir . test;grep_recursive– adds-rwhen you trying togrepdirectory;grunt_task_not_found– fixes misspelledgruntcommands;gulp_not_task– fixes misspelledgulptasks;has_exists_script– prepends./when script/binary exists;heroku_not_command– fixes wrongherokucommands likeheroku log;history– tries to replace command with most similar command from history;hostscli– tries to fixhostscliusage;ifconfig_device_not_found– fixes wrong device names likewlan0towlp2s0;java– removes.javaextension when running Java programs;javac– appends missing.javawhen compiling Java files;lein_not_task– fixes wrongleintasks likelein rpl;ln_no_hard_link– catches hard link creation on directories, suggest symbolic link;ln_s_order– fixesln -sarguments order;ls_all– adds-Atolswhen output is empty;ls_lah– adds-lahtols;man– changes manual section;man_no_space– fixes man commands without spaces, for examplemandiff;mercurial– fixes wronghgcommands;missing_space_before_subcommand– fixes command with missing space likenpminstall;mkdir_p– adds-pwhen you trying to create directory without parent;mvn_no_command– addsclean packagetomvn;mvn_unknown_lifecycle_phase– fixes misspelled lifecycle phases withmvn;npm_missing_script– fixesnpmcustom script name innpm run-script <script>;npm_run_script– adds missingrun-scriptfor customnpmscripts;npm_wrong_command– fixes wrong npm commands likenpm urgrade;no_command– fixes wrong console commands, for examplevom/vim;no_such_file– creates missing directories withmvandcpcommands;open– either prependshttp://to address passed toopenor create a new file or directory and passes it toopen;pip_unknown_command– fixes wrongpipcommands, for examplepip instatl/pip install;php_s– replaces-sby-Swhen trying to run a local php server;port_already_in_use– kills process that bound port;prove_recursively– adds-rwhen called with directory;python_command– prependspythonwhen you trying to run not executable/without./python script;python_execute– appends missing.pywhen executing Python files;quotation_marks– fixes uneven usage of'and"when containing args';path_from_history– replaces not found path with similar absolute path from history;react_native_command_unrecognized– fixes unrecognizedreact-nativecommands;remove_trailing_cedilla– remove trailling cedillasç, a common typo for european keyboard layouts;rm_dir– adds-rfwhen you trying to remove directory;scm_correction– corrects wrong scm likehg logtogit log;sed_unterminated_s– adds missing '/' tosed'sscommands;sl_ls– changessltols;ssh_known_hosts– removes host fromknown_hostson warning;sudo– prependssudoto previous command if it failed because of permissions;sudo_command_from_user_path– runs commands from users$PATHwithsudo;switch_lang– switches command from your local layout to en;systemctl– correctly orders parameters of confusingsystemctl;test.py– runspy.testinstead oftest.py;touch– creates missing directories before "touching";tsuru_login– runstsuru loginif not authenticated or session expired;tsuru_not_command– fixes wrongtsurucommands liketsuru shell;tmux– fixestmuxcommands;unknown_command– fixes hadoop hdfs-style "unknown command", for example adds missing '-' to the command onhdfs dfs ls;vagrant_up– starts up the vagrant instance;whois– fixeswhoiscommand;workon_doesnt_exists– fixesvirtualenvwrapperenv name os suggests to create new.yarn_alias– fixes aliasedyarncommands likeyarn ls;yarn_command_not_found– fixes misspelledyarncommands;yarn_command_replaced– fixes replacedyarncommands;yarn_help– makes it easier to openyarndocumentation;
特定平台开启的功能:
apt_get– installs app from apt if it not installed (requirespython-commandnotfound/python3-commandnotfound);apt_get_search– changes trying to search usingapt-getwith searching usingapt-cache;apt_invalid_operation– fixes invalidaptandapt-getcalls, likeapt-get isntall vim;brew_cask_dependency– installs cask dependencies;brew_install– fixes formula name forbrew install;brew_link– adds--overwrite --dry-runif linking fails;brew_uninstall– adds--forcetobrew uninstallif 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;pacman– installs app withpacmanif it is not installed (usesyaourtif available);pacman_not_found– fixes package name withpacmanoryaourt.
隐藏没有开启的功能:
git_push_force– adds--force-with-leaseto agit push(may conflict withgit_push_pull);rm_root– adds--no-preserve-roottorm -rf /command.
自定义规则
在~/.config/thefuck/rules目录中添加自定义规则的文件your-rule-name.py.
文件中必须包含两个功能
match(command: Command) -> boolget_new_command(command: Command) -> str | list[str]
# 是否匹配正确的命令
def match(command):
return ('permission denied' in command.output.lower()
or 'EACCES' in command.output)
# 修正的命令, 此修正为 命令前加 sudo
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