1. 程式人生 > >又是一個名叫草泥馬的專案:thefuck--修復錯誤的命令列擴充套件

又是一個名叫草泥馬的專案: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 lssl

使用過 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 (thefuck(fc -ln -1)); history -r’
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,這樣可以自己決定是否執行修正後的命令。

5 其他參考