Skip to main content

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

Project description

TMD 他妈的 Version Build Status Coverage MIT License

TMD 是一个牛逼的应用,灵感来自 @liamosaur推文, 它可以修正你之前控制台命令中的错误。

注意:本项目复刻自 thefuck,已全面中文化并修改为 tmd(他妈的)版本。

TMD 太慢了?试试实验性的即时模式!

gif with 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?

➜ 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
...

目录

  1. 要求
  2. 安装
  3. 更新
  4. 工作原理
  5. 创建自己的规则
  6. 设置
  7. 包含规则的第三方包
  8. 实验性即时模式
  9. 开发
  10. 许可证

要求

  • 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 like adb logcta;
  • ag_literal – adds -Q to ag when suggested;
  • aws_cli – fixes misspelled commands like aws dynamdb scan;
  • az_cli – fixes misspelled commands like az providers;
  • cargo – runs cargo build instead of cargo;
  • cargo_no_command – fixes wrong commands like cargo buid;
  • cat_dir – replaces cat with ls when you try to cat a directory;
  • cd_correction – spellchecks and corrects failed cd commands;
  • cd_cs – changes cs to cd;
  • cd_mkdir – creates directories before cd'ing into them;
  • cd_parent – changes cd.. to cd ..;
  • 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 to cp or mv to a non-existent one
  • cp_omitting_directory – adds -a when you cp directory;
  • cpp11 – adds missing -std=c++11 to g++ or clang++;
  • dirty_untar – fixes tar x command that untarred in the current directory;
  • dirty_unzip – fixes unzip 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 a docker login and repeats the previous command;
  • docker_not_command – fixes wrong docker commands like docker tags;
  • docker_image_being_used_by_container ‐ removes the container that is using the image before removing the image;
  • dry – fixes repetitions like git 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 wrong gem commands;
  • git_add – fixes "pathspec 'foo' did not match any file(s) known to git.";
  • git_add_force – adds --force to git add <pathspec>... when paths are .gitignore'd;
  • git_bisect_usage – fixes git bisect strt, git bisect goood, git bisect rset, etc. when bisecting;
  • git_branch_delete – changes git branch -d to git branch -D;
  • git_branch_delete_checked_out – changes git branch -d to git checkout master && git branch -D when trying to delete a checked out branch;
  • git_branch_exists – offers git branch -d foo, git branch -D foo or git checkout foo when creating a branch that already exists;
  • git_branch_list – catches git branch list in place of git branch and removes created branch;
  • git_branch_0flag – fixes commands such as git branch 0v and git branch 0r removing the created branch;
  • git_checkout – fixes branch name or creates new branch;
  • git_clone_git_clone – replaces git clone git clone ... with git clone ...
  • git_clone_missing – adds git clone to URLs that appear to link to a git repository.
  • git_commit_add – offers git commit -a ... or git commit -p ... after previous commit if it failed because nothing was staged;
  • git_commit_amend – offers git commit --amend after previous commit;
  • git_commit_reset – offers git reset HEAD~ after previous commit;
  • git_diff_no_index – adds --no-index to previous git diff on untracked files;
  • git_diff_staged – adds --staged to previous git diff with unexpected output;
  • git_fix_stash – fixes git stash commands (misspelled subcommand and missing save);
  • git_flag_after_filename – fixes fatal: bad flag '...' after filename
  • git_help_aliased – fixes git help <alias> commands replacing with the aliased command;
  • git_hook_bypass – adds --no-verify flag previous to git am, git commit, or git push command;
  • git_lfs_mistype – fixes mistyped git lfs <command> commands;
  • git_main_master – fixes incorrect branch name between main and master
  • git_merge – adds remote to branch names;
  • git_merge_unrelated – adds --allow-unrelated-histories when required
  • git_not_command – fixes wrong git commands like git brnch;
  • git_pull – sets upstream before executing previous git 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 failed git push;
  • git_push_different_branch_names – fixes pushes when local branch name does not match remote branch name;
  • git_push_pull – runs git pull when push was rejected;
  • git_push_without_commits – creates an initial commit if you forget and only git add ., when setting up a new project;
  • git_rebase_no_changes – runs git rebase --skip instead of git rebase --continue when there are no changes;
  • git_remote_delete – replaces git remote delete remote_name with git remote remove remote_name;
  • git_rm_local_modifications – adds -f or --cached when you try to rm a locally modified file;
  • git_rm_recursive – adds -r when you try to rm a directory;
  • git_rm_staged – adds -f or --cached when you try to rm a file with staged changes
  • git_rebase_merge_dir – offers git rebase (--continue | --abort | --skip) or removing the .git/rebase-merge dir when a rebase is in progress;
  • git_remote_seturl_add – runs git remote add when git 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 to git tag <tagname> when the tag already exists;
  • git_two_dashes – adds a missing dash to commands like git commit -amend or git rebase -continue;
  • go_run – appends .go extension when compiling/running Go programs;
  • go_unknown_command – fixes wrong go commands, for example go bulid;
  • gradle_no_task – fixes not found or ambiguous gradle task;
  • gradle_wrapper – replaces gradle with ./gradlew;
  • grep_arguments_order – fixes grep arguments order for situations like grep -lir . test;
  • grep_recursive – adds -r when you try to grep directory;
  • grunt_task_not_found – fixes misspelled grunt commands;
  • gulp_not_task – fixes misspelled gulp tasks;
  • has_exists_script – prepends ./ when script/binary exists;
  • heroku_multiple_apps – adds --app <app> to heroku commands like heroku pg;
  • heroku_not_command – fixes wrong heroku commands like heroku log;
  • history – tries to replace command with the most similar command from history;
  • hostscli – tries to fix hostscli usage;
  • ifconfig_device_not_found – fixes wrong device names like wlan0 to wlp2s0;
  • java – removes .java extension when running Java programs;
  • javac – appends missing .java when compiling Java files;
  • lein_not_task – fixes wrong lein tasks like lein 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 – fixes ln -s arguments order;
  • ls_all – adds -A to ls when output is empty;
  • ls_lah – adds -lah to ls;
  • man – changes manual section;
  • man_no_space – fixes man commands without spaces, for example mandiff;
  • mercurial – fixes wrong hg commands;
  • missing_space_before_subcommand – fixes command with missing space like npminstall;
  • mkdir_p – adds -p when you try to create a directory without a parent;
  • mvn_no_command – adds clean package to mvn;
  • mvn_unknown_lifecycle_phase – fixes misspelled life cycle phases with mvn;
  • npm_missing_script – fixes npm custom script name in npm run-script <script>;
  • npm_run_script – adds missing run-script for custom npm scripts;
  • npm_wrong_command – fixes wrong npm commands like npm urgrade;
  • no_command – fixes wrong console commands, for example vom/vim;
  • no_such_file – creates missing directories with mv and cp commands;
  • omnienv_no_such_command – fixes wrong commands for goenv, nodenv, pyenv and rbenv (eg.: pyenv isntall or goenv list);
  • open – either prepends http:// to address passed to open or creates a new file or directory and passes it to open;
  • pip_install – fixes permission issues with pip install commands by adding --user or prepending sudo if necessary;
  • pip_unknown_command – fixes wrong pip commands, for example pip 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 – prepends python 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 to pip 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 unrecognized react-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 like hg log to git log;
  • sed_unterminated_s – adds missing '/' to sed's s commands;
  • sl_ls – changes sl to ls;
  • ssh_known_hosts – removes host from known_hosts on warning;
  • sudo – prepends sudo to the previous command if it failed because of permissions;
  • sudo_command_from_user_path – runs commands from users $PATH with sudo;
  • switch_lang – switches command from your local layout to en;
  • systemctl – correctly orders parameters of confusing systemctl;
  • terraform_init.py – runs terraform init before plan or apply;
  • terraform_no_command.py – fixes unrecognized terraform commands;
  • test.py – runs pytest instead of test.py;
  • touch – creates missing directories before "touching";
  • tsuru_login – runs tsuru login if not authenticated or session expired;
  • tsuru_not_command – fixes wrong tsuru commands like tsuru shell;
  • tmux – fixes tmux commands;
  • unknown_command – fixes hadoop hdfs-style "unknown command", for example adds missing '-' to the command on hdfs dfs ls;
  • unsudo – removes sudo from previous command if a process refuses to run on superuser privilege.
  • vagrant_up – starts up the vagrant instance;
  • whois – fixes whois command;
  • workon_doesnt_exists – fixes virtualenvwrapper 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 aliased yarn commands like yarn ls;
  • yarn_command_not_found – fixes misspelled yarn commands;
  • yarn_command_replaced – fixes replaced yarn commands;
  • yarn_help – makes it easier to open yarn documentation;
返回目录

以下规则仅在特定平台上默认启用:

  • apt_get – installs app from apt if it not installed (requires python-commandnotfound / python3-commandnotfound);
  • apt_get_search – changes trying to search using apt-get with searching using apt-cache;
  • apt_invalid_operation – fixes invalid apt and apt-get calls, like apt-get isntall vim;
  • apt_list_upgradable – helps you run apt list --upgradable after apt update;
  • apt_upgrade – helps you run apt upgrade after apt list --upgradable;
  • brew_cask_dependency – installs cask dependencies;
  • brew_install – fixes formula name for brew install;
  • brew_reinstall – turns brew install <formula> into brew reinstall <formula>;
  • brew_link – adds --overwrite --dry-run if linking fails;
  • brew_uninstall – adds --force to brew uninstall if multiple versions were installed;
  • brew_unknown_command – fixes wrong brew commands, for example brew docto/brew doctor;
  • brew_update_formula – turns brew update <formula> into brew upgrade <formula>;
  • dnf_no_such_command – fixes mistyped DNF commands;
  • nixos_cmd_not_found – installs apps on NixOS;
  • pacman – installs app with pacman if it is not installed (uses yay, pikaur or yaourt if available);
  • pacman_invalid_option – replaces lowercase pacman options with uppercase.
  • pacman_not_found – fixes package name with pacman, yay, pikaur or yaourt.
  • yum_invalid_operation – fixes invalid yum calls, like yum isntall vim;

以下命令与 TMD 捆绑在一起,但默认未启用:

  • git_push_force – adds --force-with-lease to a git push (may conflict with git_push_pull);
  • rm_root – adds --no-preserve-root to rm -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_defaultrequires_outputpriority

Command 有三个属性:scriptoutputscript_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_rootsudo: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 记录输出 然后读取日志来节省时间。

即时模式 gif

目前,即时模式仅支持 Python 3 与 bash 或 zsh。zsh 的自动更正功能也需要禁用,以便 tmd 正常工作。

要启用即时模式,在 .bashrc.bash_profile.zshrc 中的别名初始化中添加 --enable-experimental-instant-mode

例如:

eval $(tmd --alias --enable-experimental-instant-mode)
返回目录

开发

参见 CONTRIBUTING.md

许可证 MIT

项目许可证可在此处找到。

返回目录

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tmdsb-0.0.8.tar.gz (90.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tmdsb-0.0.8-py2.py3-none-any.whl (128.7 kB view details)

Uploaded Python 2Python 3

File details

Details for the file tmdsb-0.0.8.tar.gz.

File metadata

  • Download URL: tmdsb-0.0.8.tar.gz
  • Upload date:
  • Size: 90.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for tmdsb-0.0.8.tar.gz
Algorithm Hash digest
SHA256 aee0f3b33b6687039a165189d55af02b3cd220e582edf7e2c8a03c1362b4bcb4
MD5 c0bcc59a245c445e780acdf25e3eafbb
BLAKE2b-256 ce2388f71c504bd19659c9490cf114469561dddf482aa9bcf9b1494932a5f116

See more details on using hashes here.

File details

Details for the file tmdsb-0.0.8-py2.py3-none-any.whl.

File metadata

  • Download URL: tmdsb-0.0.8-py2.py3-none-any.whl
  • Upload date:
  • Size: 128.7 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for tmdsb-0.0.8-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 fe44e510b84bee64a1d5e46f1ec045ab531377baea091a8bd10f4234a6af9df8
MD5 5600dc0d7162696cd91c99b44d9c08ea
BLAKE2b-256 03305ac5517d4280fcfa76cc04b86b5ea2c7fb640e41415ba72a7e9db259c3b4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page