The Fuck — великолепное приложение, вдохновленное твитом @liamosaur, которое исправляет ошибки в предыдущих консольных командах.
The Fuck слишком медленный? Попробуйте экспериментальный мгновенный режим!
Еще примеры:
➜ 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
...
➜ 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.
...
➜ 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)
...
➜ git brnch
git: ' brnch ' is not a git command. See ' git --help ' .
Did you mean this ?
branch
➜ fuck
git branch [enter/↑/↓/ctrl+c]
* master
➜ 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
...
Если вы не боитесь слепо запускать исправленные команды, опцию настроек 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 ?
➜ fuck
sudo apt-get install vim
[sudo] password for nvbn:
Reading package lists... Done
...
В macOS или Linux вы можете установить The Fuck через Homebrew:
brew install thefuck
В Ubuntu/Mint установите The Fuck с помощью следующих команд:
sudo apt update
sudo apt install python3-dev python3-pip python3-setuptools
pip3 install thefuck --user
Во FreeBSD установите The Fuck с помощью следующих команд:
pkg install thefuck
В ChromeOS установите The Fuck с помощью chromebrew с помощью следующей команды:
crew install thefuck
В системах на базе Arch установите The Fuck с помощью следующей команды:
sudo pacman -S thefuck
В других системах установите The Fuck с помощью pip
:
pip install thefuck
Альтернативно вы можете использовать менеджер пакетов ОС (OS X, Ubuntu, Arch).
# Рекомендуется поместить эту команду в ваш .bash_profile
, .bashrc
, .zshrc
или другой сценарий запуска:
eval $( thefuck --alias )
# You can use whatever you want as an alias, like for Mondays:
eval $( thefuck --alias FUCK )
Или в конфигурации вашей оболочки (Bash, Zsh, Fish, Powershell, tcsh).
Изменения доступны только в новом сеансе оболочки. Чтобы изменения стали доступны немедленно, запустите source ~/.bashrc
(или файл конфигурации оболочки, например .zshrc
).
Чтобы запускать фиксированные команды без подтверждения, используйте опцию --yeah
(или просто -y
для краткости, или --hard
если вы особенно расстроены):
fuck --yeah
Чтобы рекурсивно исправлять команды до достижения успеха, используйте опцию -r
:
fuck -r
pip3 install thefuck --upgrade
Примечание. Функциональность псевдонима была изменена в версии 1.34 The Fuck.
Чтобы удалить The Fuck , выполните обратный процесс установки:
The Fuck пытается сопоставить предыдущую команду с правилом. Если совпадение найдено, новая команда создается с использованием совпавшего правила и выполняется. По умолчанию включены следующие правила:
adb_unknown_command
– исправляет команды с ошибками, такие как adb logcta
;ag_literal
– добавляет -Q
к ag
, когда это предлагается;aws_cli
— исправляет команды с ошибками, такие как aws dynamdb scan
;az_cli
— исправляет команды с ошибками, такие как az providers
;cargo
— запускает cargo build
вместо cargo
;cargo_no_command
– исправляет неправильные команды, такие как cargo buid
;cat_dir
– заменяет cat
на ls
при попытке cat
каталог;cd_correction
– проверяет орфографию и исправляет неудачные команды cd;cd_cs
– меняет cs
на cd
;cd_mkdir
– создает каталоги перед переходом в них;cd_parent
– меняет cd..
на cd ..
;chmod_x
– добавляет бит выполнения;choco_install
– добавляет общие суффиксы для шоколадных пакетов;composer_not_command
– исправляет имя команды композитора;conda_mistype
– исправляет команды conda;cp_create_destination
– создает новый каталог, когда вы пытаетесь cp
или mv
перейти в несуществующий каталог.cp_omitting_directory
– добавляет -a
, когда вы cp
каталог;cpp11
– добавляет отсутствующий -std=c++11
в g++
или clang++
;dirty_untar
– исправляет команду tar x
, которая была распакована в текущем каталоге;dirty_unzip
– исправляет команду unzip
, которая распаковывалась в текущий каталог;django_south_ghost
– добавляет --delete-ghost-migrations
к неудачной миграции из-за призраков django South;django_south_merge
– добавляет --merge
к несогласованной миграции django на юг;docker_login
– выполняет docker login
и повторяет предыдущую команду;docker_not_command
— исправляет неправильные команды Docker, такие как docker tags
;docker_image_being_used_by_container
— удаляет контейнер, использующий изображение, перед удалением изображения;dry
— исправляет повторы типа git git push
;fab_command_not_found
– исправляет ошибки в написании команд фабрики;fix_alt_space
– заменяет Alt+Пробел на пробел;fix_file
– открывает файл с ошибкой в вашем $EDITOR
;gem_unknown_command
– исправляет неправильные команды gem
;git_add
— исправляет «спецификация пути 'foo' не соответствовала ни одному файлу(ам), известному git». ;git_add_force
– добавляет --force
в git add <pathspec>...
когда пути имеют расширение .gitignore;git_bisect_usage
— исправляет git bisect strt
, git bisect goood
, git bisect rset
и т. д. при разделении пополам;git_branch_delete
– меняет git branch -d
на git branch -D
;git_branch_delete_checked_out
– заменяет git branch -d
на git checkout master && git branch -D
при попытке удалить извлеченную ветку;git_branch_exists
— предлагает git branch -d foo
, git branch -D foo
или git checkout foo
при создании уже существующей ветки;git_branch_list
– перехватывает git branch list
вместо git branch
и удаляет созданную ветку;git_branch_0flag
— исправляет такие команды, как git branch 0v
и git branch 0r
удаляющие созданную ветку;git_checkout
– исправляет имя ветки или создает новую ветку;git_clone_git_clone
– заменяет git clone git clone ...
на git clone ...
git_clone_missing
— добавляет git clone
к URL-адресам, которые, по-видимому, ссылаются на репозиторий git.git_commit_add
– предлагает git commit -a ...
или git commit -p ...
после предыдущей фиксации, если она не удалась, потому что ничего не было подготовлено;git_commit_amend
– предлагает git commit --amend
после предыдущего коммита;git_commit_reset
— предлагает git reset HEAD~
после предыдущего коммита;git_diff_no_index
– добавляет --no-index
к предыдущему git diff
для неотслеживаемых файлов;git_diff_staged
— добавляет --staged
к предыдущему git diff
с неожиданным выводом;git_fix_stash
— исправляет команды git stash
(подкоманда с ошибкой и отсутствие save
);git_flag_after_filename
— исправляет fatal: bad flag '...' after filename
git_help_aliased
— исправляет замену команд git help <alias>
на команду с псевдонимом;git_hook_bypass
— добавляет флаг --no-verify
перед командой git am
, git commit
или git push
;git_lfs_mistype
— исправляет опечатки в командах git lfs <command>
;git_main_master
– исправляет неправильное имя ветки между main
и master
git_merge
— добавляет удаленный доступ к именам веток;git_merge_unrelated
— добавляет --allow-unrelated-histories
когда это необходимо.git_not_command
— исправляет неправильные команды git, такие как git brnch
;git_pull
– устанавливает восходящий поток перед выполнением предыдущего git pull
;git_pull_clone
— клонирует вместо извлечения, когда репозиторий не существует;git_pull_uncommitted_changes
— сохраняет изменения перед извлечением и извлекает их после этого;git_push
– добавляет --set-upstream origin $branch
к предыдущему неудачному git push
;git_push_different_branch_names
— исправляет push-уведомления, когда имя локальной ветки не соответствует имени удаленной ветки;git_push_pull
– запускает git pull
если push
был отклонен;git_push_without_commits
— создает первоначальный коммит, если вы забудете, и только git add .
, при настройке нового проекта;git_rebase_no_changes
– запускает git rebase --skip
вместо git rebase --continue
когда изменений нет;git_remote_delete
– заменяет git remote delete remote_name
на git remote remove remote_name
;git_rm_local_modifications
— добавляет -f
или --cached
, когда вы пытаетесь rm
локально измененный файл;git_rm_recursive
– добавляет -r
при попытке rm
каталога;git_rm_staged
— добавляет -f
или --cached
, когда вы пытаетесь rm
файл с поэтапными изменениямиgit_rebase_merge_dir
– предлагает git rebase (--continue | --abort | --skip)
или удаление каталога .git/rebase-merge
когда выполняется перезагрузка;git_remote_seturl_add
— запускает git remote add
, когда git remote set_url
на несуществующем удаленном компьютере;git_stash
– сохраняет ваши локальные изменения перед перебазированием или переключением ветки;git_stash_pop
– добавляет ваши локальные изменения перед извлечением тайника, затем сбрасывает;git_tag_force
— добавляет --force
к git tag <tagname>
, если тег уже существует;git_two_dashes
– добавляет недостающее тире к таким командам, как git commit -amend
или git rebase -continue
;go_run
– добавляет расширение .go
при компиляции/запуске программ Go;go_unknown_command
— исправляет неправильные команды go
, например go bulid
;gradle_no_task
– исправляет не найденную или неоднозначную задачу gradle
;gradle_wrapper
– заменяет gradle
на ./gradlew
;grep_arguments_order
– исправляет порядок аргументов grep
для таких ситуаций, как grep -lir . test
;grep_recursive
– добавляет -r
при попытке войти в каталог grep
;grunt_task_not_found
– исправляет ошибки в написании команд grunt
;gulp_not_task
– исправляет неправильно написанные задачи gulp
;has_exists_script
– добавляет ./
когда существует скрипт/двоичный файл;heroku_multiple_apps
– добавляет --app <app>
к командам heroku
таким как heroku pg
;heroku_not_command
— исправляет неправильные команды heroku
, такие как heroku log
;history
– пытается заменить команду на наиболее похожую команду из истории;hostscli
– пытается исправить использование hostscli
;ifconfig_device_not_found
– исправляет неправильные имена устройств, например wlan0
до wlp2s0
;java
– удаляет расширение .java
при запуске программ Java;javac
– добавляет отсутствующий .java
при компиляции файлов Java;lein_not_task
– исправляет неправильные задачи lein
, такие как lein rpl
;long_form_help
– заменяет -h
на --help
, если короткая версия формы не поддерживаетсяln_no_hard_link
– отслеживает создание жестких ссылок в каталогах, предлагает символическую ссылку;ln_s_order
– исправляет порядок аргументов ln -s
;ls_all
– добавляет -A
к ls
, когда вывод пуст;ls_lah
– добавляет -lah
к ls
;man
– меняет раздел руководства;man_no_space
– исправляет команды man без пробелов, например mandiff
;mercurial
– исправляет неправильные команды hg
;missing_space_before_subcommand
– исправляет команду с отсутствующим пробелом, например npminstall
;mkdir_p
– добавляет -p
при попытке создать каталог без родителя;mvn_no_command
– добавляет clean package
в mvn
;mvn_unknown_lifecycle_phase
– исправляет неправильно написанные фазы жизненного цикла с помощью mvn
;npm_missing_script
– исправляет имя пользовательского скрипта npm
в npm run-script <script>
;npm_run_script
– добавляет отсутствующий run-script
для пользовательских скриптов npm
;npm_wrong_command
— исправляет неправильные команды npm, такие как npm urgrade
;no_command
– исправляет неправильные консольные команды, например vom/vim
;no_such_file
– создает недостающие каталоги командами mv
и cp
;omnienv_no_such_command
– исправляет неправильные команды для goenv
, nodenv
, pyenv
и rbenv
(например: pyenv isntall
или goenv list
);open
— либо добавляет http://
к адресу, переданному open
, либо создает новый файл или каталог и передает его open
;pip_install
– исправляет проблемы с разрешениями для команд pip install
, добавляя --user
или при необходимости добавляя sudo
;pip_unknown_command
– исправляет неправильные команды pip
, например pip instatl/pip install
;php_s
– заменяет -s
на -S
при попытке запустить локальный php-сервер;port_already_in_use
– убивает процесс, привязавший порт;prove_recursively
– добавляет -r
при вызове с каталогом;python_command
– добавляет python
в начало, когда вы пытаетесь запустить неисполняемый скрипт/скрипт Python без ./
;python_execute
– добавляет отсутствующий .py
при выполнении файлов Python;python_module_error
– исправляет ModuleNotFoundError, пытаясь pip install
этот модуль;quotation_marks
– исправляет неравномерное использование '
и "
при наличии аргументов;path_from_history
– заменяет не найденный путь аналогичным абсолютным путем из истории;rails_migrations_pending
– запускает ожидающие миграции;react_native_command_unrecognized
– исправляет нераспознанные команды react-native
;remove_shell_prompt_literal
– удаляет начальный символ приглашения оболочки $
, часто встречающийся при копировании команд из документации;remove_trailing_cedilla
– удаляет конечные седилья ç
, распространенную опечатку для европейских раскладок клавиатуры;rm_dir
– добавляет -rf
при попытке удалить каталог;scm_correction
— исправляет неправильный scm, например, hg log
в git log
;sed_unterminated_s
– добавляет отсутствующий '/' к s
sed
;sl_ls
– меняет sl
на ls
;ssh_known_hosts
– удаляет хост из known_hosts
при предупреждении;sudo
– добавляет sudo
к предыдущей команде, если она не удалась из-за разрешений;sudo_command_from_user_path
– запускает команды от пользователей $PATH
с помощью sudo
;switch_lang
– переключает команду с локальной раскладки на en;systemctl
— правильно упорядочивает сбивающие с толку параметры systemctl
;terraform_init.py
– запускает terraform init
перед планированием или применением;terraform_no_command.py
– исправляет нераспознанные команды terraform
;test.py
– запускает pytest
вместо test.py
;touch
– создает недостающие каталоги перед «прикосновением»;tsuru_login
— запускает tsuru login
если не аутентифицирован или сеанс истек;tsuru_not_command
– исправляет неправильные команды tsuru
, такие как tsuru shell
;tmux
– исправляет команды tmux
;unknown_command
— исправляет «неизвестную команду» в стиле Hadoop HDFS, например добавляет отсутствующий «-» к команде в hdfs dfs ls
;unsudo
– удаляет sudo
из предыдущей команды, если процесс отказывается запускаться с правами суперпользователя.vagrant_up
– запускает бродячий экземпляр;whois
– исправляет команду whois
;workon_doesnt_exists
— исправляет имя среды virtualenvwrapper
ОС предлагает создать новую.wrong_hyphen_before_subcommand
— удаляет неправильно поставленный дефис ( apt-install
-> apt install
, git-log
-> git log
и т.д.)yarn_alias
– исправляет команды yarn
с псевдонимами, такие как yarn ls
;yarn_command_not_found
– исправляет ошибки в написании команд yarn
;yarn_command_replaced
– исправляет замененные команды yarn
;yarn_help
– упрощает открытие документации yarn
; Следующие правила включены по умолчанию только на определенных платформах:
apt_get
— устанавливает приложение из apt, если оно не установлено (требуется python-commandnotfound
/ python3-commandnotfound
);apt_get_search
— изменения при попытке поиска с помощью apt-get
с поиском с помощью apt-cache
;apt_invalid_operation
— исправляет недопустимые вызовы apt
и apt-get
, например apt-get isntall vim
;apt_list_upgradable
– помогает запустить apt list --upgradable
после apt update
;apt_upgrade
– помогает запустить apt upgrade
после apt list --upgradable
;brew_cask_dependency
– устанавливает зависимости cask;brew_install
– исправляет имя формулы для brew install
;brew_reinstall
– превращает brew install <formula>
в brew reinstall <formula>
;brew_link
– добавляет --overwrite --dry-run
, если связывание не удалось;brew_uninstall
– добавляет --force
для brew uninstall
если было установлено несколько версий;brew_unknown_command
– исправляет неправильные команды пивоварения, например brew docto/brew doctor
;brew_update_formula
– превращает brew update <formula>
в brew upgrade <formula>
;dnf_no_such_command
– исправляет неправильно набранные команды DNF;nixos_cmd_not_found
– устанавливает приложения на NixOS;pacman
— устанавливает приложение с помощью pacman
если оно не установлено (использует yay
, pikaur
или yaourt
, если доступно);pacman_invalid_option
– заменяет строчные параметры pacman
на прописные.pacman_not_found
– исправляет имя пакета с помощью pacman
, yay
, pikaur
или yaourt
.yum_invalid_operation
– исправляет недопустимые вызовы yum
, например yum isntall vim
;Следующие команды включены в состав The Fuck , но по умолчанию они не включены:
git_push_force
– добавляет --force-with-lease
к git push
(может конфликтовать с git_push_pull
);rm_root
– добавляет --no-preserve-root
к команде rm -rf /
. Чтобы добавить собственное правило, создайте файл с именем your-rule-name.py
в ~/.config/thefuck/rules
. Файл правил должен содержать две функции:
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 thefuck.conf import settings
settings
— это специальный объект, собранный из ~/.config/thefuck/settings.py
и значений из env (подробнее см. ниже).
Простой пример правила для запуска скрипта с помощью 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
Дополнительные примеры правил, служебные функции для правил, помощники для конкретных приложений/ОС.
Несколько параметров The Fuck можно изменить в файле $XDG_CONFIG_HOME/thefuck/settings.py
(по умолчанию $XDG_CONFIG_HOME
имеет значение ~/.config
):
rules
– список включенных правил, по умолчанию thefuck.const.DEFAULT_RULES
;exclude_rules
– список отключенных правил, по умолчанию []
;require_confirmation
– требует подтверждения перед запуском новой команды, по умолчанию True
;wait_command
– максимальное время в секундах для получения вывода предыдущей команды;no_colors
– отключить цветной вывод;priority
– диктовать приоритеты правил, правило с более низким 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
Или через переменные среды:
THEFUCK_RULES
– список включенных правил, например DEFAULT_RULES:rm_root
или sudo:no_command
;THEFUCK_EXCLUDE_RULES
– список отключенных правил, например git_pull:git_push
;THEFUCK_REQUIRE_CONFIRMATION
– требовать подтверждения перед запуском новой команды, true/false
;THEFUCK_WAIT_COMMAND
– максимальное время в секундах для получения вывода предыдущей команды;THEFUCK_NO_COLORS
– отключить цветной вывод, true/false
;THEFUCK_PRIORITY
– приоритет правил, например no_command=9999:apt_get=100
, правило с более низким priority
будет сопоставлено первым;THEFUCK_DEBUG
– включает вывод отладки, true/false
;THEFUCK_HISTORY_LIMIT
– сколько команд истории будет проверено, например 2000
;THEFUCK_ALTER_HISTORY
– перенести фиксированную команду в историю true/false
;THEFUCK_WAIT_SLOW_COMMAND
– максимальное время в секундах для получения вывода предыдущей команды, если она есть в списке slow_commands
;THEFUCK_SLOW_COMMANDS
– список медленных команд, например lein:gradle
;THEFUCK_NUM_CLOSE_MATCHES
– максимальное количество близких совпадений, которое можно предложить, например 5
.THEFUCK_EXCLUDED_SEARCH_PATH_PREFIXES
— префиксы пути, которые следует игнорировать при поиске команд, по умолчанию []
.Например:
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 '
export THEFUCK_NUM_CLOSE_MATCHES= ' 5 '
Если вы хотите создать определенный набор закрытых правил, но при этом хотите поделиться ими с другими, создайте пакет с именем thefuck_contrib_*
со следующей структурой:
thefuck_contrib_foo
thefuck_contrib_foo
rules
__init__.py
*third-party rules*
__init__.py
*third-party-utils*
setup.py
The Fuck найдет правила, расположенные в модуле rules
.
Поведение The Fuck по умолчанию требует времени для повторного запуска предыдущих команд. В мгновенном режиме The Fuck экономит время, записывая выходные данные с помощью скрипта, а затем читая журнал.
В настоящее время мгновенный режим поддерживает только Python 3 с bash или zsh. Функцию автозамены zsh также необходимо отключить, чтобы thefuck работал правильно.
Чтобы включить мгновенный режим, добавьте --enable-experimental-instant-mode
к инициализации псевдонима в .bashrc
, .bash_profile
или .zshrc
.
Например:
eval $( thefuck --alias --enable-experimental-instant-mode )
См. CONTRIBUTING.md
Лицензию проекта можно найти здесь.