mirror of
https://github.com/nvbn/thefuck.git
synced 2025-03-16 07:38:50 +00:00
From https://git-scm.com/docs/merge-options#merge-options---allow-unrelated-histories > By default, `git merge` command refuses to merge histories that do not share a common ancestor. This option can be used to override this safety when merging histories of two projects that started their lives independently.
475 lines
21 KiB
Markdown
475 lines
21 KiB
Markdown
# The Fuck [![Version][version-badge]][version-link] [![Build Status][travis-badge]][travis-link] [![Windows Build Status][appveyor-badge]][appveyor-link] [![Coverage][coverage-badge]][coverage-link] [![MIT License][license-badge]](LICENSE.md)
|
|
|
|
Magnificent app which corrects your previous console command,
|
|
inspired by a [@liamosaur](https://twitter.com/liamosaur/)
|
|
[tweet](https://twitter.com/liamosaur/status/506975850596536320).
|
|
|
|
The Fuck is too slow? [Try experimental instant mode!](#experimental-instant-mode)
|
|
|
|
[![gif with examples][examples-link]][examples-link]
|
|
|
|
Few more examples:
|
|
|
|
```bash
|
|
➜ 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
|
|
...
|
|
```
|
|
|
|
```bash
|
|
➜ 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.
|
|
...
|
|
```
|
|
|
|
```bash
|
|
➜ 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)
|
|
...
|
|
```
|
|
|
|
```bash
|
|
➜ git brnch
|
|
git: 'brnch' is not a git command. See 'git --help'.
|
|
|
|
Did you mean this?
|
|
branch
|
|
|
|
➜ fuck
|
|
git branch [enter/↑/↓/ctrl+c]
|
|
* master
|
|
```
|
|
|
|
```bash
|
|
➜ 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 are not scared to blindly run the changed command, there is a `require_confirmation`
|
|
[settings](#settings) option:
|
|
|
|
```bash
|
|
➜ 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
|
|
...
|
|
```
|
|
|
|
## Requirements
|
|
|
|
- python (3.4+)
|
|
- pip
|
|
- python-dev
|
|
|
|
## Installation
|
|
|
|
On OS X you can install `The Fuck` with [Homebrew][homebrew]:
|
|
|
|
```bash
|
|
brew install thefuck
|
|
```
|
|
|
|
On Ubuntu you can install `The Fuck` with:
|
|
```bash
|
|
sudo apt update
|
|
sudo apt install python3-dev python3-pip
|
|
sudo pip3 install thefuck
|
|
```
|
|
|
|
On FreeBSD you can install `The Fuck` with:
|
|
```bash
|
|
sudo portsnap fetch update
|
|
cd /usr/ports/misc/thefuck && sudo make install clean
|
|
```
|
|
|
|
On other systems you can install `The Fuck` with `pip`:
|
|
|
|
```bash
|
|
pip install thefuck
|
|
```
|
|
|
|
[Or using an OS package manager (OS X, Ubuntu, Arch).](https://github.com/nvbn/thefuck/wiki/Installation)
|
|
|
|
<a href='#manual-installation' name='manual-installation'>#</a>
|
|
You should place this command in your `.bash_profile`, `.bashrc`, `.zshrc` or other startup script:
|
|
|
|
```bash
|
|
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).](https://github.com/nvbn/thefuck/wiki/Shell-aliases)
|
|
|
|
Changes will be available only in a new shell session.
|
|
To make them available immediately, run `source ~/.bashrc` (or your shell config file like `.zshrc`).
|
|
|
|
If you want to run fixed command without confirmation you can use `-y` option:
|
|
|
|
```bash
|
|
fuck -y
|
|
```
|
|
|
|
If you want to fix commands recursively until success you can use `-r` option:
|
|
|
|
```bash
|
|
fuck -r
|
|
```
|
|
|
|
## Update
|
|
|
|
```bash
|
|
pip3 install thefuck --upgrade
|
|
```
|
|
|
|
**Aliases changed in 1.34.**
|
|
|
|
## How it works
|
|
|
|
The Fuck tries to match a rule for the previous command, creates a new command
|
|
using the matched rule and runs it. Rules enabled by default are as follows:
|
|
|
|
* `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`;
|
|
* `cargo` – runs `cargo build` instead of `cargo`;
|
|
* `cargo_no_command` – fixes wrongs commands like `cargo buid`;
|
|
* `cd_correction` – spellchecks and correct failed cd commands;
|
|
* `cd_mkdir` – creates directories before cd'ing into them;
|
|
* `cd_parent` – changes `cd..` to `cd ..`;
|
|
* `chmod_x` – add execution bit;
|
|
* `composer_not_command` – fixes composer command name;
|
|
* `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_not_command` – fixes wrong docker commands like `docker tags`;
|
|
* `dry` – fixes repetitions like `git 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 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_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_checkout` – fixes branch name or creates new branch;
|
|
* `git_commit_amend` – offers `git commit --amend` 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 <alias> with the aliased command;
|
|
* `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 brach 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 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 `--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;
|
|
* `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 trying 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` – add `--app <app>` to `heroku` commands like `heroku pg`;
|
|
* `heroku_not_command` – fixes wrong `heroku` commands like `heroku log`;
|
|
* `history` – tries to replace command with 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`;
|
|
* `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 trying to create directory without parent;
|
|
* `mvn_no_command` – adds `clean package` to `mvn`;
|
|
* `mvn_unknown_lifecycle_phase` – fixes misspelled lifecycle 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;
|
|
* `open` – either prepends `http://` to address passed to `open` or create a new file or directory and passes it to `open`;
|
|
* `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 trying to run not executable/without `./` python script;
|
|
* `python_execute` – appends missing `.py` when 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 unrecognized `react-native` commands;
|
|
* `remove_trailing_cedilla` – remove trailling cedillas `ç`, a common typo for european keyboard layouts;
|
|
* `rm_dir` – adds `-rf` when you trying to remove 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 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`;
|
|
* `test.py` – runs `py.test` 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`;
|
|
* `vagrant_up` – starts up the vagrant instance;
|
|
* `whois` – fixes `whois` command;
|
|
* `workon_doesnt_exists` – fixes `virtualenvwrapper` env name os suggests to create new.
|
|
* `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;
|
|
|
|
Enabled by default only on specific platforms:
|
|
|
|
* `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_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;
|
|
* `pacman` – installs app with `pacman` if it is not installed (uses `yaourt` if available);
|
|
* `pacman_not_found` – fixes package name with `pacman` or `yaourt`.
|
|
|
|
Bundled, but not enabled by default:
|
|
|
|
* `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.
|
|
|
|
## Creating your own rules
|
|
|
|
For adding your own rule you should create `your-rule-name.py`
|
|
in `~/.config/thefuck/rules`. The rule should contain two functions:
|
|
|
|
```python
|
|
match(command: Command) -> bool
|
|
get_new_command(command: Command) -> str | list[str]
|
|
```
|
|
|
|
Also the rule can contain an optional function
|
|
|
|
```python
|
|
side_effect(old_command: Command, fixed_command: str) -> None
|
|
```
|
|
and optional `enabled_by_default`, `requires_output` and `priority` variables.
|
|
|
|
`Command` has three attributes: `script`, `output` and `script_parts`.
|
|
Rule shouldn't change `Command`.
|
|
|
|
|
|
*Rules api changed in 3.0:* For accessing settings in rule you need to import it with `from thefuck.conf import settings`.
|
|
`settings` is a special object filled with `~/.config/thefuck/settings.py` and values from env ([see more below](#settings)).
|
|
|
|
Simple example of the rule for running script with `sudo`:
|
|
|
|
```python
|
|
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](https://github.com/nvbn/thefuck/tree/master/thefuck/rules),
|
|
[utility functions for rules](https://github.com/nvbn/thefuck/tree/master/thefuck/utils.py),
|
|
[app/os-specific helpers](https://github.com/nvbn/thefuck/tree/master/thefuck/specific/).
|
|
|
|
## Settings
|
|
|
|
The Fuck has a few settings parameters which can be changed in `$XDG_CONFIG_HOME/thefuck/settings.py` (`$XDG_CONFIG_HOME` defaults to `~/.config`):
|
|
|
|
* `rules` – list of enabled rules, by default `thefuck.conf.DEFAULT_RULES`;
|
|
* `exclude_rules` – list of disabled rules, by default `[]`;
|
|
* `require_confirmation` – requires confirmation before running new command, by default `True`;
|
|
* `wait_command` – max amount of time in seconds for getting previous command output;
|
|
* `no_colors` – disable colored output;
|
|
* `priority` – dict with rules priorities, rule with lower `priority` will be matched first;
|
|
* `debug` – enables debug output, by default `False`;
|
|
* `history_limit` – numeric value of how many history commands will be scanned, like `2000`;
|
|
* `alter_history` – push fixed command to history, by default `True`;
|
|
* `wait_slow_command` – max amount of time in seconds for getting previous command output if it in `slow_commands` list;
|
|
* `slow_commands` – list of slow commands.
|
|
|
|
Example of `settings.py`:
|
|
|
|
```python
|
|
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']
|
|
```
|
|
|
|
Or via environment variables:
|
|
|
|
* `THEFUCK_RULES` – list of enabled rules, like `DEFAULT_RULES:rm_root` or `sudo:no_command`;
|
|
* `THEFUCK_EXCLUDE_RULES` – list of disabled rules, like `git_pull:git_push`;
|
|
* `THEFUCK_REQUIRE_CONFIRMATION` – require confirmation before running new command, `true/false`;
|
|
* `THEFUCK_WAIT_COMMAND` – 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, like `no_command=9999:apt_get=100`,
|
|
rule with lower `priority` will be matched first;
|
|
* `THEFUCK_DEBUG` – enables debug output, `true/false`;
|
|
* `THEFUCK_HISTORY_LIMIT` – how many history commands will be scanned, like `2000`;
|
|
* `THEFUCK_ALTER_HISTORY` – push fixed command to history `true/false`;
|
|
* `THEFUCK_WAIT_SLOW_COMMAND` – max amount of time in seconds for getting previous command output if it in `slow_commands` list;
|
|
* `THEFUCK_SLOW_COMMANDS` – list of slow commands, like `lein:gradle`.
|
|
|
|
For example:
|
|
|
|
```bash
|
|
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'
|
|
```
|
|
|
|
## Third-party packages with rules
|
|
|
|
If you want to make very specific rules or rules, that you don't want to make public,
|
|
but share with other people.
|
|
You can create a special package with name `thefuck_contrib_*` with following structure:
|
|
|
|
```
|
|
thefuck_contrib_foo
|
|
thefuck_contrib_foo
|
|
rules
|
|
__init__.py
|
|
*third-party rules*
|
|
__init__.py
|
|
*third-party-utils*
|
|
setup.py
|
|
```
|
|
|
|
And thefuck will find all rules from `rules` module.
|
|
|
|
## Experimental instant mode
|
|
|
|
By default The Fuck reruns a previous command and that takes time,
|
|
in instant mode The Fuck logs output with [script](https://en.wikipedia.org/wiki/Script_(Unix))
|
|
and just reads the log.
|
|
|
|
[![gif with instant mode][instant-mode-gif-link]][instant-mode-gif-link]
|
|
|
|
At the moment only Python 3 with bash or zsh is supported.
|
|
|
|
For enabling instant mode you need to add `--enable-experimental-instant-mode`
|
|
to alias initialization in your `.bashrc`, `.bash_profile` or `.zshrc` like:
|
|
|
|
```bash
|
|
eval $(thefuck --alias --enable-experimental-instant-mode)
|
|
```
|
|
|
|
## Developing
|
|
|
|
See [CONTRIBUTING.md](CONTRIBUTING.md)
|
|
|
|
## License MIT
|
|
Project License can be found [here](LICENSE.md).
|
|
|
|
|
|
[version-badge]: https://img.shields.io/pypi/v/thefuck.svg?label=version
|
|
[version-link]: https://pypi.python.org/pypi/thefuck/
|
|
[travis-badge]: https://travis-ci.org/nvbn/thefuck.svg?branch=master
|
|
[travis-link]: https://travis-ci.org/nvbn/thefuck
|
|
[appveyor-badge]: https://ci.appveyor.com/api/projects/status/1sskj4imj02um0gu/branch/master?svg=true
|
|
[appveyor-link]: https://ci.appveyor.com/project/nvbn/thefuck
|
|
[coverage-badge]: https://img.shields.io/coveralls/nvbn/thefuck.svg
|
|
[coverage-link]: https://coveralls.io/github/nvbn/thefuck
|
|
[license-badge]: https://img.shields.io/badge/license-MIT-007EC7.svg
|
|
[examples-link]: https://raw.githubusercontent.com/nvbn/thefuck/master/example.gif
|
|
[instant-mode-gif-link]: https://raw.githubusercontent.com/nvbn/thefuck/master/example_instant_mode.gif
|
|
[homebrew]: http://brew.sh/
|