懶惰是程式設計師的美德 懶惰程式設計師的最愛AutoHotkey 嚐鮮
懶惰是程式設計師的美德! 懶惰程式設計師的最愛AutoHotkey 嚐鮮
Don’t Repeat yourself在程式設計領域成為DRY原則,是知道我們編寫強壯程式碼的重要指導原則之一,但是,事實上在其他領域也是一樣的(我也不知道此原則是否最先出現在程式設計領域)。Larry Wall的懶惰是程式設計師的美德的話我是記憶深刻。作為一個對計算機著迷,對程式無比投入的人,深知學海無涯,但是,正是因為學無止盡,更迫切的需要我們做追求效率的程式設計師,將重複的工作交給最擅長做重複工作的電腦去做,只有這樣,我們才能將更多的時間節省下來,去幹我們自己想幹的事情。(雖然工作時不太可能-_-!但是起碼能贏得一句手快的評價,再次-_-!)學習VIM,Bash,Python,Lua,Qt,SQL都是如此,在這條路上已經走了這麼遠的我們,又何懼為了更加提高效率,再多學AutoHotkey這樣一個小工具呢?既然選擇了遠方,就只顧風雨兼程,既然選擇了程式設計,就只能忘了遠方。-_-!敲自己的鍵盤,讓別人走路去吧。
AutoHotkey的名字大家說不上如雷貫耳,久仰大名,起碼也是早有耳聞了吧。讓我們不懼艱險(又是一種指令碼語言-_-!)將AutoHotkey作為飯後甜點好好品嚐一下吧吧^^
AutoHotkey是什麼
AutoHotkey簡單來說是一個附帶鍵盤巨集錄製的指令碼工具,但是因為功能太過強大了,叫做自動化工具也許較為合適。從自動化工作這一點來看,AutoHotkey類似Linux下的Bash,都不以指令碼語言的邏輯表達能力取勝,專門針對自動化工作設計,只不過Bash是命令列下的,對視窗一無所知,而AutoHotkey可以說是專門針對Windows的視窗平臺的,有對快捷鍵和視窗環境的強大支援。(我見人將其稱作GUI-Scripting,實在貼切)也許可以說AutoHotkey就是GUI環境下的Bash。既然Linux下Bash是必學的(的確應該學),那麼AutoHotkey也就順面學了吧。
安裝配置
下載安裝我就不多說了,真的不知道這裡有個地址可以去看看。善用佳軟的AutoHotkey 0級教程,順面推薦下善用佳軟,推崇並介紹了很多好用的免費軟體,個人很喜歡。
AutoHotkey的指令碼是以ahk為字尾的文字檔案,用你自己最喜歡的編輯器編輯吧,對於vim來說,已經內建了對ahk的語法高亮,我習慣將AutoHotkey的安裝目錄新增進環境的PATH中,這樣用vim編輯指令碼的時候可以直接簡單的通過!Autohotkey %來執行指令碼。(事實上我將其map到了F5上)但是願意的話,其實.ahk檔案在AutoHotkey安裝後是與其關聯的,直接雙擊也可以執行此指令碼。
初步
首先編個最簡單的指令碼,看看效果先。
將上一行的程式碼儲存成文字,雙擊執行,或者用autohotkey執行之,會自動開啟你機器上的預設瀏覽器登入我的部落格,建議大家每天執行100次以上^^這個功能有點像Python的os模組的startfile函式,通過解析後面的字串來判斷應該使用什麼與其關聯的程式執行。當年工作的時候我有個開機指令碼就是用Python此函式做的,功能就是開啟工作需要的一大堆程式,VS,MSDN,TotalCommand自動一個一個開啟並開啟合適的工程或目錄。現在這個功能也可以交由autohotkey來完成了。就是一條Run命名。
相對來說,對於特定用途的工具(比如Bash,autohotkey)來完成其擅長的事情是會比通用工具(比如Python)來的簡潔的,此即一例,Python中雖然也能完成這樣的工作(在沒有學習Bash前,在linux下它都是我的指令碼工具),但是,需要進行import模組,函式呼叫等一堆難看的東西,autohotkey只需要一個Run。這裡之所以講的多點,是想說明一個特定工具哪怕並不是完成了什麼不可能完成的任務,也許僅僅是將任務完成的更加簡潔高效和優雅,也是一個工具的用途體現。至於值不值得為了這份優雅付出學習的代價,那就見仁見智了。
再看個例子:
Run c:/DirTest.txt
此指令碼會自動的用你機器配置的文字編輯器開啟此檔案。(檔案必須存在)
但是以下指令碼
Run notepad.exe c:/DirTest.txt
無論檔案存在不存在都會開始記事本,其中的區別,大家自己體會一下。事實上解析的強度比一般人能夠想象的還要厲害,幫助檔案中有這個示例:
呵呵,什麼意思大家都知道,牛吧。可惜我一般不用客戶端寫郵件-_-!
快捷鍵
AutoHotkey自然對Hotkey又特別支援啦,指令碼中用符號表示快捷鍵,一次排列,幾個常見的修飾鍵對應符號是#Win, !Alt,^Control,+Shift。那麼什麼叫依次排列呢?看下面的例子。
以上的例子即將Win + space 鍵設定為訪問我的部落格,執行後發現沒有直接的反應,不像上述例子,此時AutoHotkey以trayicon小圖示的形式運行於右下角,當你輸入Win + space的時候會觸發其執行預設的瀏覽器開啟網站,並且一直有效,直到你將其關閉。(此例也推薦大家每日執行100遍^^與前面第一個例子結合交叉執行效果更佳)同理,要ctrl+space就是^space,要ctrl+alt+space就是^!space。
事實上,一個快捷鍵可以對應多個命令,也可以多個快捷鍵對應一個命令,格式有點不多,見下例。
此例即是在按下Win + space時開啟我的CSDN部落格和空間兩個網頁,並且CTRL + WIN + A與CTRL + WIN + B都是開啟我的部落格。舉這兩個例子主要是告訴大家AutoHotkey的格式相對比較靈活,比如這裡的一對多和多對一。當不是一對一併且寫在一行時,需要以return來表示指令碼的結束。
資訊視窗
這也許是最先應該說的,MsgBox
MsgBox Text
即可以通過MessageBox彈出Text的資訊,比較方便
可以通過MsgBox彈出Yes Or No等選項,並獲取,以判斷分支執行程式。
MsgBox, 4,?,Yes or No? ifMsgBox Yes MsgBox You Said Yes! else MsgBox You Said No?
分支執行的語法比較奇怪,通過if結合MsgBox構成一個IfMsgBox特別應對MsgBox的選擇。
對視窗的控制
個人感覺,對視窗的控制是AutoHotkey的精髓所在,這也是為什麼我將其比作GUI下的bash。這裡我還是通過從簡單到複雜的例子來描述。比如,我現在在編輯文件的時候常常會需要開啟AutoHotkey的幫助文件檢視,一般我的操作是用滑鼠點選其最小化的視窗以啟用,或者我也會需要開啟gvim以編輯示例程式,也是需要用滑鼠去啟用,因為用atl+Tab的方式還不如用滑鼠快,有了AutoHotkey,我們就有更方便的Hotkey去完成這樣的任務了。
SetTitleMatchMode 2 #tab:: ifWinNotExist, GVIM { MsgBox GVIM is not running return } IfWinNotActive,GVIM WinActivate,GVIM else WinActivate,Windows Live Writer return
如上指令碼,先判斷是否有標題包含GVIM的視窗存在,不存在則報告GVIM沒有執行,不然WIN+TAB鍵的效果就是在GVim與Windows Live Writer之間切換,非常方便。ifWinNotExist如其名,用於判斷一個視窗是否存在,ifWinNotActive也如其名用於判斷一個視窗是否啟用,第一個引數都是表示視窗標題文字的匹配,匹配模式由SetTitleMatchMode決定。
1: A window's title must start with the specified WinTitle to be a match. 2: A window's title can contain WinTitle anywhere inside it to be a match. 3: A window's title must exactly match WinTitle to be a match.
我們使用的是2,表示任意位置都匹配,預設是1,速度最快,必須是開始位置匹配。if一組的函式都還支援其他引數,具體的請檢視幫助文件了,我這裡主要是展示一下用途。
實際上AutoHotkey對視窗的控制還有很多強大的功能,一篇小文無法一一盡數,這裡再舉個例子:
SetTitleMatchMode 2 Loop, 10 { Random, x, 0, 50 Random, y, 0, 50 WinMove,GVIM,, %x%, %y% WinHide,GVIM Sleep, 100 WinShow,GVIM }
上述程式執行後,GVIM視窗會變的瘋狂。。。WinMove,WinHide,WinShow的意思都很明顯,分別是移動,隱藏,顯示視窗,這裡有兩個有新意的地方,一個是Random和x,y,有點程式設計知識的人都看出來了,AutoHotkey是允許設定變數的,此處的x,y就是,引用變數的方式是前後各1個百分號,與windows批處理程式的一樣。另外就是Loop,10表示的迴圈結構了。
操作記錄器
這個功能有點像國內一個也比較強大的軟體鍵盤精靈的功能(當年玩那種泡菜網路遊戲沒有少用過它,單純的鍵盤滑鼠模擬功能不比AutoHotkey差),就是將鍵盤滑鼠操作記錄下來,自動生成AutoHotkey的指令碼。省去了重複工作的指令碼編寫之苦。帶GUI介面,截圖如下:
點選左上角的Record按鈕就開始記錄鍵盤滑鼠的操作了。然後通過點選錄製時螢幕左上角的Stop停止錄製。上面的指令碼是我錄製的一段啟用Windows live Writer和最小化Windows live Writer的過程。
WinWait, , IfWinNotActive, , , WinActivate, , WinWaitActive, , MouseClick, left, 1159, 889 Sleep, 100 WinWait, xfsdlaf.ahk (E:/work) - GVIM, IfWinNotActive, xfsdlaf.ahk (E:/work) - GVIM, , WinActivate, xfsdlaf.ahk (E:/work) - GVIM, WinWaitActive, xfsdlaf.ahk (E:/work) - GVIM, MouseClick, left, 908, 17 Sleep, 100 WinWait, , IfWinNotActive, , , WinActivate, , WinWaitActive, , MouseClick, left, 33216, 32891 Sleep, 100 WinWait, Don’t Repeat yourself 懶惰是程式設計師的美德 AutoHotkey 嚐鮮 - Windows Live Writer, IfWinNotActive, Don’t Repeat yourself 懶惰是程式設計師的美德 AutoHotkey 嚐鮮 - Windows Live Writer, , WinActivate, Don’t Repeat yourself 懶惰是程式設計師的美德 AutoHotkey 嚐鮮 - Windows Live Writer, WinWaitActive, Don’t Repeat yourself 懶惰是程式設計師的美德 AutoHotkey 嚐鮮 - Windows Live Writer, MouseClick, left, 1362, 10 Sleep, 100 MouseClick, left, 1387, 10 Sleep, 100
會發現自動生成的程式碼較人工的程式碼還是亂了很多-_-!機器嘛,不是那麼聰明。上面程式碼很重要的一個就是通過MouseClick來模擬滑鼠的點選,有了這個功能,想幹什麼都可以了………………順面提及一下,也可以通過
Send Keys SendRaw Keys SendInput Keys SendPlay Keys SendEvent Keys
來模擬鍵盤的輸入。下面是一個當你暫時離開機器卻有不想鎖屏時可以提出警告的指令碼。:)
SetTitleMatchMode 2 SetKeyDelay 50 Words = WARNING{!} DO NOT OPERATE MY COMPUTER{!}
KeyWait, LButton, D run,gvim YouAreUnderMonitored,,Max WinWait,YouAreUnderMonitored Send i%Words%{Esc}
此指令碼等待滑鼠左鍵單擊,然後自動開啟gvim並最大化,然後一個字一個字輸入警告資訊^^不明就裡的人一看估計碰鬼了。
小結
對於AutoHotkey這樣強大的東西,一篇3000來字的小文實在是無法詳細盡數其功能,而本人的目的也就是提供給覺得AutoHotKey複雜而不去學習的人嚐個鮮,知道了AutoHotkey沒有那麼難以後,伴隨著使用,參考著幫助文件,慢慢的會發現AutoHotkey也是一個離不開的工具了。我就在網上看到很多人狂喊,Linux下什麼都好,就是沒有AutoHotkey-_-!(其實類似的言論非常多,比如也沒有Windows Live Writer equivalent)
原創文章作者保留版權 轉載請註明原作者 並給出連結