他妈的 - 一个能修正你之前控制台命令的牛逼应用
Project description
TMD 他妈的

TMD 是一个牛逼的应用,灵感来自 @liamosaur 的推文, 它可以修正你之前控制台命令中的错误。
注意:本项目复刻自 thefuck,已全面中文化并修改为
tmd(他妈的)版本。
TMD 太慢了?试试实验性的即时模式!
更多示例:
➜ 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?
➜ tmd
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
➜ tmd
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
➜ tmd
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
➜ tmd
git branch [enter/↑/↓/ctrl+c]
* master
➜ lein rpl
'rpl' is not a task. See 'lein help'.
Did you mean this?
repl
➜ tmd
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
...
如果你不害怕盲目运行修正后的命令,可以禁用
require_confirmation 设置 选项:
➜ 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?
➜ tmd
sudo apt-get install vim
[sudo] password for nvbn:
Reading package lists... Done
...
目录
要求
- python (3.5+)
- pip
- python-dev
返回目录
安装
Linux 安装步骤
在 Ubuntu / Debian / Mint 等 Linux 系统上,使用以下命令安装 TMD:
# 更新包列表
sudo apt update
# 安装必要的依赖
sudo apt install python3-dev python3-pip python3-setuptools
# 安装 TMD
pip3 install tmdsb --user
确保 ~/.local/bin 在 PATH 中:
export PATH=$HOME/.local/bin:$PATH
或者永久添加到 ~/.bashrc:
echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
其他 Linux 发行版
在其他 Linux 发行版上,使用 pip 安装:
pip install tmdsb
# 或
pip3 install tmdsb --user
# TMD 可以直接使用,无需配置别名!
安装后,直接使用 tmd 命令即可。TMD 会自动从 shell 历史文件中读取上一个命令。
可选:配置别名以获得更好的体验
如果你想使用别名(可选,不是必需的),可以将以下命令放在你的 .bash_profile、
.bashrc、.zshrc 或其他启动脚本中:
eval $(tmd --alias)
# 你可以使用任何你想要的别名,比如:
eval $(tmd --alias TMD)
或在你的 shell 配置文件中(Bash, Zsh, Fish, Powershell, tcsh)。
如果配置了别名,更改只在新 shell 会话中可用。要立即使更改生效,
运行 source ~/.bashrc(或你的 shell 配置文件,如 .zshrc)。
要在不确认的情况下运行修正后的命令,使用 --yeah 选项(或简写 -y,或者如果你特别烦躁,使用 --hard):
tmd --yeah
要递归修正命令直到成功,使用 -r 选项:
tmd -r
返回目录
更新
pip3 install tmdsb --upgrade
注意:别名功能在 TMD v1.34 中已更改
卸载
要移除 TMD,反向执行安装过程:
- 从你的 Bash, Zsh, Fish, Powershell, tcsh, ... shell 配置中删除或注释 tmd 别名行
- 使用你的包管理器(brew, pip3, pkg, crew, pip)卸载二进制文件
工作原理
TMD 尝试将之前的命令与规则匹配。如果找到匹配项, 则使用匹配的规则创建新命令并执行。以下规则默认启用:
adb_unknown_command– fixes misspelled commands likeadb logcta;ag_literal– adds-Qtoagwhen suggested;aws_cli– fixes misspelled commands likeaws dynamdb scan;az_cli– fixes misspelled commands likeaz providers;cargo– runscargo buildinstead ofcargo;cargo_no_command– fixes wrong commands likecargo buid;cat_dir– replacescatwithlswhen you try tocata directory;cd_correction– spellchecks and corrects failed cd commands;cd_cs– changescstocd;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 tocpormvto a non-existent onecp_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_login– executes adocker loginand 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 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_delete_checked_out– changesgit branch -dtogit checkout master && git branch -Dwhen trying to delete a checked out branch;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_branch_0flag– fixes commands such asgit branch 0vandgit branch 0rremoving 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 cloneto 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 --amendafter previous commit;git_commit_reset– offersgit reset HEAD~after previous commit;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_hook_bypass– adds--no-verifyflag previous togit am,git commit, orgit pushcommand;git_lfs_mistype– fixes mistypedgit lfs <command>commands;git_main_master– fixes incorrect branch name betweenmainandmastergit_merge– adds remote to branch names;git_merge_unrelated– adds--allow-unrelated-historieswhen requiredgit_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 branch 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 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--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;go_unknown_command– fixes wronggocommands, for examplego bulid;gradle_no_task– fixes not found or ambiguousgradletask;gradle_wrapper– replacesgradlewith./gradlew;grep_arguments_order– fixesgreparguments order for situations likegrep -lir . test;grep_recursive– adds-rwhen you try togrepdirectory;grunt_task_not_found– fixes misspelledgruntcommands;gulp_not_task– fixes misspelledgulptasks;has_exists_script– prepends./when script/binary exists;heroku_multiple_apps– adds--app <app>toherokucommands likeheroku pg;heroku_not_command– fixes wrongherokucommands likeheroku log;history– tries to replace command with the 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;long_form_help– changes-hto--helpwhen the short form version is not supportedln_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 try to create a directory without a parent;mvn_no_command– addsclean packagetomvn;mvn_unknown_lifecycle_phase– fixes misspelled life cycle 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;omnienv_no_such_command– fixes wrong commands forgoenv,nodenv,pyenvandrbenv(eg.:pyenv isntallorgoenv list);open– either prependshttp://to address passed toopenor creates a new file or directory and passes it toopen;pip_install– fixes permission issues withpip installcommands by adding--useror prependingsudoif necessary;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 try to run non-executable/without./python script;python_execute– appends missing.pywhen executing Python files;python_module_error– fixes ModuleNotFoundError by trying topip installthat 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-nativecommands;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-rfwhen you try to remove a 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 the 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;terraform_init.py– runsterraform initbefore plan or apply;terraform_no_command.py– fixes unrecognizedterraformcommands;test.py– runspytestinstead 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;unsudo– removessudofrom previous command if a process refuses to run on superuser privilege.vagrant_up– starts up the vagrant instance;whois– fixeswhoiscommand;workon_doesnt_exists– fixesvirtualenvwrapperenv 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 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;apt_list_upgradable– helps you runapt list --upgradableafterapt update;apt_upgrade– helps you runapt upgradeafterapt 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-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;nixos_cmd_not_found– installs apps on NixOS;pacman– installs app withpacmanif it is not installed (usesyay,pikauroryaourtif available);pacman_invalid_option– replaces lowercasepacmanoptions with uppercase.pacman_not_found– fixes package name withpacman,yay,pikauroryaourt.yum_invalid_operation– fixes invalidyumcalls, likeyum isntall vim;
以下命令与 TMD 捆绑在一起,但默认未启用:
git_push_force– adds--force-with-leaseto agit push(may conflict withgit_push_pull);rm_root– adds--no-preserve-roottorm -rf /command.
返回目录
创建自己的规则
要添加你自己的规则,在 ~/.config/tmd/rules 中创建一个名为 your-rule-name.py 的文件。
规则文件必须包含两个函数:
match(command: Command) -> bool
get_new_command(command: Command) -> str | list[str]
此外,规则可以包含可选函数:
side_effect(old_command: Command, fixed_command: str) -> None
规则还可以包含可选变量 enabled_by_default、requires_output 和 priority。
Command 有三个属性:script、output 和 script_parts。
你的规则不应更改 Command。
规则 API 在 3.0 中已更改: 要访问规则的设置,使用以下方式导入:
from tmd.conf import settings
settings 是一个特殊对象,由 ~/.config/tmd/settings.py 和
环境变量中的值组装而成(见下文)。
一个简单的使用 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
更多规则示例, 规则的实用函数, 应用/操作系统特定的辅助函数。
返回目录
设置
几个 TMD 参数可以在文件 $XDG_CONFIG_HOME/tmd/settings.py 中更改
($XDG_CONFIG_HOME 默认为 ~/.config):
rules– 启用的规则列表,默认为tmd.const.DEFAULT_RULES;exclude_rules– 禁用的规则列表,默认为[];require_confirmation– 在运行新命令前要求确认,默认为True;wait_command– 获取上一个命令输出的最大时间(秒);no_colors– 禁用彩色输出;priority– 规则优先级的字典,优先级较低的规则将首先匹配;debug– 启用调试输出,默认为False;history_limit– 要扫描的历史命令数量,如2000;alter_history– 将修正后的命令推送到历史记录,默认为True;wait_slow_command– 如果命令在slow_commands列表中,获取上一个命令输出的最大时间(秒);slow_commands– 慢速命令列表;num_close_matches– 建议的最大近似匹配数,默认为3。excluded_search_path_prefixes– 搜索命令时要忽略的路径前缀,默认为[]。
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
或通过环境变量:
TMD_RULES– 启用的规则列表,如DEFAULT_RULES:rm_root或sudo:no_command;TMD_EXCLUDE_RULES– 禁用的规则列表,如git_pull:git_push;TMD_REQUIRE_CONFIRMATION– 在运行新命令前要求确认,true/false;TMD_WAIT_COMMAND– 获取上一个命令输出的最大时间(秒);TMD_NO_COLORS– 禁用彩色输出,true/false;TMD_PRIORITY– 规则的优先级,如no_command=9999:apt_get=100, 优先级较低的规则将首先匹配;TMD_DEBUG– 启用调试输出,true/false;TMD_HISTORY_LIMIT– 要扫描的历史命令数量,如2000;TMD_ALTER_HISTORY– 将修正后的命令推送到历史记录,true/false;TMD_WAIT_SLOW_COMMAND– 如果命令在slow_commands列表中,获取上一个命令输出的最大时间(秒);TMD_SLOW_COMMANDS– 慢速命令列表,如lein:gradle;TMD_NUM_CLOSE_MATCHES– 建议的最大近似匹配数,如5。TMD_EXCLUDED_SEARCH_PATH_PREFIXES– 搜索命令时要忽略的路径前缀,默认为[]。
例如:
export TMD_RULES='sudo:no_command'
export TMD_EXCLUDE_RULES='git_pull:git_push'
export TMD_REQUIRE_CONFIRMATION='true'
export TMD_WAIT_COMMAND=10
export TMD_NO_COLORS='false'
export TMD_PRIORITY='no_command=9999:apt_get=100'
export TMD_HISTORY_LIMIT='2000'
export TMD_NUM_CLOSE_MATCHES='5'
返回目录
包含规则的第三方包
如果你想创建一组特定的非公开规则,但仍想
与他人分享,创建一个名为 tmd_contrib_* 的包,结构如下:
tmd_contrib_foo
tmd_contrib_foo
rules
__init__.py
*第三方规则*
__init__.py
*第三方工具*
setup.py
TMD 会在 rules 模块中查找规则。
返回目录
实验性即时模式
TMD 的默认行为需要时间重新运行之前的命令。 在即时模式下,TMD 通过使用 script 记录输出 然后读取日志来节省时间。
目前,即时模式仅支持 Python 3 与 bash 或 zsh。zsh 的自动更正功能也需要禁用,以便 tmd 正常工作。
要启用即时模式,在 .bashrc、.bash_profile 或 .zshrc 中的别名初始化中添加 --enable-experimental-instant-mode。
例如:
eval $(tmd --alias --enable-experimental-instant-mode)
返回目录
开发
许可证 MIT
项目许可证可在此处找到。
返回目录
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tmdsb-0.0.4.tar.gz.
File metadata
- Download URL: tmdsb-0.0.4.tar.gz
- Upload date:
- Size: 90.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e98626565c54be678aa30c8563167afe889b1190883684398bdc8a623ad14bb
|
|
| MD5 |
5f29d9e17824df747c13a6a0da6d8380
|
|
| BLAKE2b-256 |
01b30cc9a9085e078d2f22cd4a04715a53504da0a5b97415eb2271f0c7c07577
|
File details
Details for the file tmdsb-0.0.4-py2.py3-none-any.whl.
File metadata
- Download URL: tmdsb-0.0.4-py2.py3-none-any.whl
- Upload date:
- Size: 128.3 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5cfdcb2e181bf79ff635351cb838e233a04b93cb0b224900eaeb2f76189e976e
|
|
| MD5 |
6efcb51ff138852c2de2756c880ec53e
|
|
| BLAKE2b-256 |
0a4050cc44a3848df402c9d531d53e22ddc574c787c56f866feb5f89bae3727f
|