又是一個名叫草泥馬的專案:thefuck--修復錯誤的命令列擴充套件
一般而言,能受到廣泛關注的開源專案分為這麼幾類:
類別 | 例子 |
---|---|
分離出去的專案 | 例如 io.js |
解決了痛點的專案 | 例如 jQuery |
提高效率的專案 | 例如 Anjular.js |
大公司的專案或者本來就特別火的專案 | 例如 .NET |
當然也有腦洞大開的專案,比如 SegmentFault 上之前介紹過的《程式語言中的精品——草泥馬語》
更比如,今天要講的主角:thefuck
開發者都或多或少接觸過 linux
接觸過命令列, 當然肯定也都被命令列狠狠地"fuck"
過. 我很多時候都是微不足道的原因導致了命令列出錯, 例如將 python
ptyhon
, 例如將 ls -alh
輸入成 ls a-lh
而導致出錯,這個時候我會想說 : “fuck”
1 起源
開發 thefuck
的這位同仁, 恐怕也經常會有這種不和諧的情況. 因此開發了這個軟體 thefuck
.
thefuck
不僅僅能修復字元輸入順序的錯誤, 在很多別的你想說”fuck”的情況下, thefuck
依然有效。
例如以下情況。
2 案例
任何情況下你想說”我操”, 你都可以用得到 thefuck
例如:
2.1 ls
和 sl
使用過 ubuntu
的開發者很多都知道有這麼一條命令:sl
. 這條命令是在你將 ls
sl
時, 會在螢幕上快速駛過一輛火車. 當然, 有了 thefuck
, sl
似乎也可以退休了。
➜ sl
The program 'sl' is currently not installed. You can install it by typing:
sudo apt-get install sl
➜ fuck
ls #修正
a.go b.php dockerui jekyll-casper main.go PureBlog
2.2 忘記 sudo
➜ 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
2.3 操作 git
➜ 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
Counting objects: 9, done.
2.4 錯輸命令
➜ 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
Python 3.4.2 (default, Oct 8 2014, 13:08:17)
2.5 選項修正
➜ git brnch
git: 'brnch' is not a git command. See 'git --help'.
Did you mean this?
branch
➜ fuck
git branch
* master
2.7 其他
thefuck 還有其他很多種用法,就等著你去發現。
3 安裝
3.1 安裝需求
python (2.7+ or 3.3+)
pip
3.2 安裝方法
可以使用 pip 安裝:sudo pip install thefuck
或者使用 OS X、Ubuntu、Arch 的包管理器安裝。
安裝後配置bash:
alias fuck=’eval
Zsh、Fish 和 PowerShell 的 配置方法見這裡。
3.3 更新
更新到最新的 thefuck 的方法非常簡單:
sudo pip install thefuck --upgrade
4 其他
4.1 軟體原理
前面說了那麼多用法,
那麼有人覺得 thefuck 可能只是一個用來
thefuck 進行命令修復的模組名和對應的修復原理如下:
模組 | 修復 |
---|---|
brew_unknown_command | 修復 brew 命令,例如將 brew docto 修復為 brew doctor |
cd_parent | 將 cd.. 修正為 cd .. |
cd_mkdir | cd 進入不存在的目錄時嘗試建立目錄 |
cp_omitting_directory | cp 時新增 -a 選項 |
fix_alt_space | 將所有的的Alt+Space 修正為 Space |
git_add | 修正沒有 git add 的情況 |
git_checkout | git checkout 不存在的分支之前嘗試建立分支 |
git_no_command | 修正錯誤的選項,例如 git brnch |
git_push | 如果 push 失敗,嘗試將 git push 修正為 git push –set-upstream origin $branch |
has_exists_script | 為所有的提示不存在的命令嘗試新增 ./ 字首 |
lein_not_task | 修正 lein,例如 lein rpl |
mkdir_p | mkdir 時嘗試新增 -p 選項 |
no_command | 修正不存在的命令,例如 vom 修正為 vim |
man_no_space | 將沒有空格的 man 命令新增空格,例如 mandiff 修正為 man diff |
pacman | arch 系統上,如果使用沒有安裝的軟體,嘗試使用 pacman 或者 yaourt 安裝 |
pip_unknown_command | 修正錯誤的 pip 命令,例如 pip isntall 修正為 pip install |
python_command | 當前目錄試圖執行沒有 x 許可權的 python 程式時,修復為新增 python 字首 |
sl_ls | sl 修正為 ls |
rm_dir | 如果刪除資料夾,為 rm 新增 -rf 選項 |
ssh_known_hosts | 如果遠端主機公鑰不匹配,嘗試將遠端主機公鑰從 know_hosts 中移除 |
sudo | 如果提示沒有許可權,嘗試新增 sudo |
switch_layout | 將鍵盤佈局修正為英語佈局 |
apt_get | 如果不存在命令,嘗試使用 apt-get 包管理器安裝 |
brew_install | 修正 brew install 的格式 |
composer_not_command | 修正 composer 命令 |
4.2 沒有啟用的模組
| ls_lah | 為 ls 新增 -alh 選項 |
| rm_root | 為 rm -rf / 新增 –no-preserve-root 選項 |
4.3 自定義規則
當然,你也可以自定義修正規則:
一個自定義規則的案例:
def match(command, settings):
return ('permission denied' in command.stderr.lower()
or 'EACCES' in command.stderr)
# 獲取 stderr 中的字串和程式返回值(errno),
# 修正規則(命令前新增 sudo)
def get_new_command(command, settings):
return 'sudo {}'.format(command.script)
# 以下為可選項
# 預設是否開啟
enabled_by_default = True
# 附加命令
def side_effect(command, settings):
subprocess.call('chmod 777 .', shell=True)
# 優先順序,數字越大優先順序越低。
priority = 1000
4.3 使用須知
雖然 thefuck
帶來了很多便利,不過仍然建議注意這件事情:
thefuck
會給出的修正後的命令,但是預設情況下你看到它們的時候,命令都已經預設執行了。
大部分情況下,thefuck
可能給出的是正確的修正,但是小部分情況下,給出的修正並不是你想要的。
所以建議將 ~/.thefuck/settings.py
中的設定改為 require_confirmation = True
,這樣可以自己決定是否執行修正後的命令。