mirror of
https://github.com/nvbn/thefuck.git
synced 2025-02-22 04:48:57 +00:00
Avoid the warning: The directory '/home/someuser/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
361 lines
14 KiB
Markdown
361 lines
14 KiB
Markdown
# The Fuck [](https://travis-ci.org/nvbn/thefuck)
|
|
|
|
Magnificent app which corrects your previous console command,
|
|
inspired by a [@liamosaur](https://twitter.com/liamosaur/)
|
|
[tweet](https://twitter.com/liamosaur/status/506975850596536320).
|
|
|
|
[](https://raw.githubusercontent.com/nvbn/thefuck/master/example.gif)
|
|
|
|
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 (2.7+ or 3.3+)
|
|
- pip
|
|
- python-dev
|
|
|
|
## Installation [*experimental*]
|
|
|
|
On Ubuntu and OS X you can install `The Fuck` with installation script:
|
|
|
|
```bash
|
|
wget -O - https://raw.githubusercontent.com/nvbn/thefuck/master/install.sh | sh - && $0
|
|
```
|
|
|
|
## Manual installation
|
|
|
|
Install `The Fuck` with `pip`:
|
|
|
|
```bash
|
|
sudo -H pip install thefuck
|
|
```
|
|
|
|
[Or using an OS package manager (OS X, Ubuntu, Arch).](https://github.com/nvbn/thefuck/wiki/Installation)
|
|
|
|
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`).
|
|
|
|
|
|
## Update
|
|
|
|
```bash
|
|
sudo pip 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:
|
|
|
|
* `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 ..`;
|
|
* `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`;
|
|
* `fix_alt_space` – replaces Alt+Space with Space character;
|
|
* `fix_file` – opens a file with an error in your `$EDITOR`;
|
|
* `git_add` – fixes *"pathspec 'foo' did not match any file(s) known to git."*;
|
|
* `git_branch_delete` – changes `git branch -d` to `git branch -D`;
|
|
* `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_diff_staged` – adds `--staged` to previous `git diff` with unexpected output;
|
|
* `git_fix_stash` – fixes `git stash` commands (misspelled subcommand and missing `save`);
|
|
* `git_help_aliased` – fixes `git help <alias>` commands replacing <alias> with the aliased command;
|
|
* `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_push` – adds `--set-upstream origin $branch` to previous failed `git push`;
|
|
* `git_push_pull` – runs `git pull` when `push` was rejected;
|
|
* `git_rm_recursive` – adds `-r` when you try to `rm` a directory;
|
|
* `git_remote_seturl_add` – runs `git remote add` when `git remote set_url` on nonexistant remote;
|
|
* `git_stash` – stashes you local modifications before rebasing or switching branch;
|
|
* `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;
|
|
* `grep_arguments_order` – fixes grep arguments order for situations like `grep -lir . test`;
|
|
* `grep_recursive` – adds `-r` when you trying to `grep` directory;
|
|
* `gulp_not_task` – fixes misspelled `gulp` tasks;
|
|
* `has_exists_script` – prepends `./` when script/binary exists;
|
|
* `heroku_not_command` – fixes wrong `heroku` commands like `heroku log`;
|
|
* `history` – tries to replace command with most similar command from history;
|
|
* `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;
|
|
* `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;
|
|
* `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_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` – prepends `http` to address passed to `open`;
|
|
* `pip_unknown_command` – fixes wrong `pip` commands, for example `pip instatl/pip install`;
|
|
* `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';
|
|
* `rm_dir` – adds `-rf` when you trying to remove directory;
|
|
* `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;
|
|
* `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.
|
|
|
|
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`;
|
|
* `brew_install` – fixes formula name for `brew install`;
|
|
* `brew_unknown_command` – fixes wrong brew commands, for example `brew docto/brew doctor`;
|
|
* `brew_upgrade` – appends `--all` to `brew upgrade` as per Homebrew's new behaviour;
|
|
* `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`, `stdout` and `stderr`.
|
|
|
|
*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.stderr.lower()
|
|
or 'EACCES' in command.stderr)
|
|
|
|
|
|
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`.
|
|
|
|
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
|
|
```
|
|
|
|
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`.
|
|
|
|
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'
|
|
```
|
|
|
|
## Developing
|
|
|
|
Install `The Fuck` for development:
|
|
|
|
```bash
|
|
pip install -r requirements.txt
|
|
python setup.py develop
|
|
```
|
|
|
|
Run unit tests:
|
|
|
|
```bash
|
|
py.test
|
|
```
|
|
|
|
Run unit and functional tests (requires docker):
|
|
|
|
```bash
|
|
py.test --enable-functional
|
|
```
|
|
|
|
For sending package to pypi:
|
|
|
|
```bash
|
|
sudo apt-get install pandoc
|
|
./release.py
|
|
```
|
|
|
|
## License MIT
|
|
Project License can be found [here](LICENSE.md).
|