一鍵fxxk,程式碼修復神器拯救你

AI科技大本營發表於2019-02-02

640?wx_fmt=jpeg


作者 | 一一

出品 | AI科技大本營(ID:rgznai100)


在成為一個合格的開發者之前,大多數人一般都經歷過被命令列反覆“fuck”蹂躪。當然,改程式碼改不動了,你的內心也是“無 fuck 可說”,尤其在檢查半天之後發現這個 bug 可能只是拼寫出現了錯誤。


這時候,你應該萬分期待有個 AI 工具進行智慧處理或者自動化的程式碼修復工具。


在 GitHub 上,就有這樣一個程式碼修復萬能神器的專案,它可以糾正你之前的控制檯命令中的錯誤,一鍵執行,隨後一路暢通。


目前,這個名叫 The Fuck 的抒情性名稱專案在 GitHub 上已收穫 40564 個 Star,2011 個 fork,可以說擁有超高人氣。


這個工具的用法簡單高效,當你在 Terminal 裡打錯一個命令時,不用修改後重新打一遍,而是直接寫個 fuck,該工具就會自動幫你修證然後執行程式。站在錯誤命令列的對面,這詞天生大有“去你的”的壓迫性氣勢,聽起來是不是既解氣又暢快?


具體是如何糾正程式碼錯誤的?舉幾個例子:


比如忘記輸入 sudo,只執行 apt-get install vim,它就會提示 permission denied,這時執行 fuck,就會自動幫你執行 sudo apt-get install vim。


➜ 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,就會提示 The current branch master has no upstream branch,隨後執行 fuck,則自動執行 git push --set-upstream origin master。


➜ 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. ...     


如果犯了低階拼寫錯誤,比如把 python 打成了 puthon,執行 puthon 後就會提醒 No command 'puthon' found,那麼再次祭出 fuck,就會自動執行 python,再也不用為拼寫錯誤費神了。


➜ 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,就會顯示 not a git command,這時果斷 fuck,就會自動執行 git branch 。


➜ 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 時會提示 not a task,同樣 fuck 一出,通暢無阻,它會自動執行 lein repl。一招致勝,厲害嗎?


➜ 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 ...     


對了,在知乎有開發者朋友在這裡想要友情提醒一下:執行的時候千萬不要讀出來,用習慣了容易成為口頭禪......用著就會發現,每一個需要修改的命令列你都會不由自主想使 fuck。


還有個問題你可能想問,The Fuck 的執行速度會不會太慢了?在這裡你感受下的即時模式。(https://github.com/nvbn/thefuck#experimental-instant-mode


The Fuck 的預設行為需要時間來重新執行以前的命令。在即時模式下,The Fuck 通過使用指令碼記錄輸出,然後讀取日誌來節省時間。


640?wx_fmt=gif


目前,即時模式僅支援使用 bash 或 zsh 的 Python 3,還需禁用 zsh 的自動更正功能才能正常使用。


要啟用即時模式,新增 --enable-experimental-instant-mode 到別名初始化 .bashrc,.bash_profile 或 .zshrc。


例如:


eval $(thefuck --alias --enable-experimental-instant-mode)     


有沒有想要試一試的衝動?接下來,將為你介紹 The Fuck 如何安裝?具體又有哪些要求?


要求


  • python (3.4+)

  • pip

  • python-dev


安裝


可以安裝 The Fuck 的系統有很多,你可以在 OS X, Homebrew,或 Linux 上的 Linuxbrew 中安裝 The Fuck:


brew install thefuck

     

在 Ubuntu / Mint 上使用以下命令安裝 The Fuck:


sudo apt update sudo apt install python3-dev python3-pip python3-setuptools sudo pip3 install thefuck     


在 FreeBSD 上使用以下命令進行安裝:


sudo portsnap fetch updatecd /usr/ports/misc/thefuck && sudo make install clean


在 ChromeOS 的 chromebrew 中使用以下命令安裝:


crew install thefuck     


在其他系統,使用 pip 進行安裝:


pip install thefuck


或者,你也可以使用 OS package 管理器(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)     


或者使用 shell 配置(Bash,Zsh,Fish,Powershell,tcsh)。


更改僅在新的 shell 會話中可用。如果要立即進行更改,請執行 source ~/.bashrc(或者像 .zshrc 這樣的 shell 配置檔案)。


要在沒有確認的情況下執行固定命令,請使用 --yeah 選項(或者 -y):


fuck --yeah     


如果要以遞迴方式修復命令,請使用 -r 選項:


fuck -r     



如何運轉?


The Fuck 整體的運轉依靠的是將上一個命令與規則進行匹配。如果找到匹配項,則使用匹配的規則建立新命令並執行。另外,你也可以建立屬於自己的規則,還可以在檔案中更改幾個 The Fuck 引數。


預設情況下啟用的規則大約有 120 個,以下給出 5 個命令的示例:


  • adb_unknown_command—像 adb logcta 那樣修復拼寫錯誤的命令;

  • ag_literal—需要建議時給 ag 新增 -Q ;

  • aws_cli—像 aws dynamdb scan 那樣修復拼寫錯誤的命令 ;

  • az_cli—像 az providers 那樣修復拼寫錯誤的命令;

  • cargo—替換 cargo,執行 cargo build。


預設情況下,僅在特定平臺上啟用的規則有 15 個,以下列出 3 個示例:


  • apt_get如果還沒有安裝,則從 apt 安裝應用程式(需要 python-commandnotfound/ python3-commandnotfound);

  • apt_invalid_operation修復無效 apt 和 apt-get calls,如 apt-get isntall vim;

  • brew_cask_dependency安裝 cask 依賴項。


以下命令與 The Fuck 捆綁在一起,但預設情況下不啟用:


  • git_push_force給--force-with-lease 新增一個 git push(可能與 git_push_pull 衝突);

  • rm_root給 rm -rf / 命令新增 --no-preserve-root。


如果你要新增屬於自己的規則,在 ~/.config/thefuck/rules 建立一個 your-rule-name.py 檔案。規則檔案必須包含兩個函式:


match(command: Command) -> bool
get_new_command(command: Command) -> str | list[str]


此外,規則可以包含可選功能:


side_effect(old_command: Command, fixed_command: str) -> None


規則還可以包含可選變數 enabled_by_defaultrequires_outputpriority


Command 有三個屬性:script,output 和 script_parts。你的規則不應該改變 Command。


以下給出使用 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


走起來,安裝一個試試?不爽就扔個 fuck。


GitHub 連結:


https://github.com/nvbn/thefuck


推薦

640?wx_fmt=png


推薦閱讀

640?wx_fmt=png

點選“閱讀原文”,開啟CSDN APP 閱讀更貼心!

相關文章