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
项目许可证可在此处找到。
返回目录
Metadata
Release files for tmdsb 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tmdsb-0.1.2.tar.gz | 91.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tmdsb-0.1.2-py2.py3-none-any.whl | Python 3, Python 2 | none | any | Details |
Total release size: 220.5 kB
Release files / tmdsb-0.1.2.tar.gz
| Download URL | tmdsb-0.1.2.tar.gz |
|---|---|
| Size | 91.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
154e189cfb2bfdf0c793b74b18096d51b3f1fd0694bf29353cb6e219acdb7557
|
|
BLAKE2b-256 checksum How to use checksums |
5564e9248efb420c8fba1186e0e617a4034a18ee260536763e7a9f8d610d9972
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / tmdsb-0.1.2-py2.py3-none-any.whl
| Download URL | tmdsb-0.1.2-py2.py3-none-any.whl |
|---|---|
| Size | 129.3 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
19cadcaf1f453fd43d7a2313174365adfc8b7e36f48638ee9614fff72e9ed9cf
|
|
BLAKE2b-256 checksum How to use checksums |
b07c7b785100b220371a898f3da297b3184281b597795a58141a27edaf50ae02
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|