Wednesday, October 21, 2015

DIY一塊自定義小鍵盤

10/27 修正:
a) 多測試幾天後,發現我那塊自製的小鍵盤有些問題。把數字鍵盤變成Ctrl、Alt、Shift的語法似乎沒我想像中那麼簡單…目前發現到的問題都已經排除!會在底下Q&A的Q8做解釋。
b) 一開始po此文,沒有附上我最終的完整AHK語法,因為我一開始寫的語法太醜了不好意思分享…現在就把整理過一遍的版本貼上來。進入以下連結可以看到完整語法。
https://gist.github.com/anonymous/6929befbb84bd4575a8d
c) 對Q5的回答做了修正。另外補充了一些新的問答。
d) 感謝三鬼的測試,每塊數字鍵盤都可能會遇到不同的突發狀況,可至三鬼的tumblr參考她的語法範例&除錯方式:D
http://three-ghost.tumblr.com/post/131801665619/每個畫師應有的快捷鍵盤


我噗浪上的相關討論串:http://www.plurk.com/p/la9k9w
我的完整語法連結(10/27更新):https://gist.github.com/anonymous/6929befbb84bd4575a8d
需準備:數字鍵盤、電腦列印用標籤貼紙
我的作業環境:Win 7 (64bit) + Intuos 4 XL + Photoshop CS6



前幾天看到國外有人很佛心地寫了一篇教學,

Making a powerful programmable keypad for less than $30
http://www.instructables.com/id/Making-a-powerful-programmable-keypad-for-less-tha/
「花低於30鎂 就能製作一個強大的自定義小鍵盤」

看得很生火就立馬購入一塊數字鍵盤,隔天參考著文章搞定了一個屬於自己的版本(如上圖)。 最近正從PaintToolSAI轉跳到Photoshop,深深體會到沒多背幾個快捷指令便玩不動PS的痛扣,更早之前我慣用的是Painter,差不多只需要ctrl、shift、alt、space和一些集中在鍵盤左下角的英文字母,左手一點都不忙,轉練SAI之後變化也不大。但PS畢竟是「影像處理」軟體,對我這種右手拿筆、只剩左手能按快捷,而且桌上還有一塊繪圖板和鍵盤打架的繪者來說,快捷操作這方面就非常不親切。

為了方便說明只好公開喇A烏漆麻黑的作業空間

拍這張的時候已經買了小鍵盤,正在設定中。桌子雖有鍵盤架,但若鍵盤和繪板能放在同一個水平上,肩膀負擔會比較輕;XL號的繪板卻太有存在感(板子很大摳,上面竟然還是只有八個快捷鈕,有夠小氣),若要把鍵盤放桌面,就只好卡在螢幕和繪板之間的空隙,空隙太小導致鍵盤會疊上一部份的繪板,然後我繪板又習慣打斜放……………就這樣糾纏了幾個月,前天才興起另外購買輔助裝置的念頭,市售的現成輔助裝置都昂貴得不可思議,窮酸如我只能考慮DIY,接著就找到了上述的那篇教學文──「花低於30鎂」標題寫得太客氣,實際上連10鎂都不到哩!

細節就不詳述,前幾個步驟都能自己想辦法克服。教學文的大意如下:

1) 買一塊數字鍵盤,規畫好想放上去的各種指令,並為各個指令找到適合的圖示

2) 將圖示列印在標籤貼紙上,用美工刀割下來

3) 將剪下的標籤貼紙貼上數字鍵盤

前三個步驟不教好像也沒差

4) 下載程式HID Macros:
http://www.hidmacros.eu/

5) 使用HID Macros將指令對應上數字鍵盤

HID Macros是唯一不會將兩塊不同鍵盤指令「同步」的程式(OS系統的程式則不討論範圍內)。舉例來說,在其他remap程式中,若將「Ctrl+Z」這個還原指令對應到數字鍵盤上的「0」,主鍵盤中的「0」鍵也會被同步成「Ctrl+Z」。而HID Macros則沒有這個問題。

步驟6~8則在提remap過程中的細節,不過我後來使用了別的程式來remap,原因後頭再說。總之若想自行DIY一塊小鍵盤,真正的技術面問題是在測試以及修正指令這一塊。

用一張圖介紹利用HID macros做對應的流程:

教學文的重點,就是個把常用快捷匯集到第二塊鍵盤的概念,應該是針對影像處理使用者寫的文章,要套用在繪畫上也未嘗不可,但會遇到不少問題。

教學文還貼心地提供了現成的圖案貼紙檔,似乎是app版PS的工具圖示。湊不齊的部份我則跑到Flaticon裡挖。

Flation: http://www.flaticon.com/


[使用HID macros會遇到的問題]

接著談我的remap過程,先貼張比較圖:
我買的版本多了四個鍵,拿來當快捷pad用,鍵位當然是越多越好(但不能太占空間)。至於品質的話嘛嗯啊當成消耗品買就不講究了。

然後問題來了,這塊鍵盤最上方用紅線框起來的按鍵,分別可以叫出瀏覽器首頁、信箱、計算機,也就是所謂的multimedia key (多媒體按鍵)。HID macros無法接收到這些按鍵送出的指令,於是變成白白浪費空間的三個鍵,而且這三個鍵自身的功能我實在用不太到。

第二個問題,透過HID macros送出的快捷指令,有些會被部份程式擋下來。在HID macros的說明檔中就有建議,盡量避免用該程式送出與Alt和F10相關的指令。但不是每個人都會遇到這個問題,問題發生率是隨機的,原因可能是程式語言不穩定、支援度不夠廣泛、使用者電腦內灌了太多衝突程式等等。

我不幸地就碰上這個問題,PS不吃我remap出來的Alt相關指令。那該怎麼辦呢,使用滴管要用到它,水平翻轉畫面要用到它,連續還原步驟也要用到它捏!

第三個問題,HID macros只能在打字時正確送出space這個指令。(匪夷所思啊空白鍵超實用的ㄟ)

第四個問題,使用PS畫畫的人一定頗熟悉旋轉視圖(R)、放大鏡工具(Z)這兩個快捷,當用畫筆工具邊畫邊調整視圖的角度和大小時,我們習慣按下R或Z不放,然後用繪筆或滑鼠調整視圖,調好之後放開R或Z鍵,又會自動跳回畫筆工具。(註1) 但使用HID macros送出R和Z指令之後,就不會跳回去了──這問題也許能透過編寫script解決,但上述已經出現這麼多問題,我想HID macros並不是那麼適合用來自製繪圖輔助工具。

於是重上google,搜到了有更多人使用AutoHotKey (簡稱AHK)這個程式:
http://autohotkey.com/


註1)
使用Painter和SAI作畫也有類似的功能,在SAI裡,「當按鍵鬆開後,將切回上一個使用的工具」的動作,叫做「shift behavior」。


[使用AutoHotKey]

我對程式語言完全外行,不可能教別人怎麼深入AHK,但官網有非常詳盡的解說,和我一樣看得一頭霧水的話,水管上也有蠻多教學影片可以參考。

AutoHotkey Tutorial channel:
https://www.youtube.com/user/ahkTuts

中文維基有簡單的介紹:
https://zh.wikipedia.org/wiki/AutoHotkey

AHK並沒有任何程式介面,只是幾串以C++語言寫成的小工具,使用者若沒有自行編輯語法的需求,甚至可以不用安裝AHK。操作流程如下:

1) 安裝AHK。

2) 打開記事本(有Notepad++的話更好)

3) 編輯完以後存檔,命名隨你高興,檔案存哪都行,重點是要將副檔名改成.ahk。

4) 運行剛才編輯好的ahk檔,over!

值得一提的是,這個ahk檔可以拿來和別人分享,若將它編集(compile)成可以執行的exe檔,當編寫者將此exe檔分享給其他使用者時,其他使用者即使沒有安裝AHK,也可以執行裡面的指令。真的是非常輕巧環保方便。

一張圖說明如何compile:如下圖,右鍵ahk檔後選擇紅線框起來的指令即可。



AHK唯一的缺點,就是每個連接到同一台電腦上的鍵盤指令都是同步的。若在數字鍵上對應好快捷,邊使用Photoshop邊運行AHK,用文字工具輸入數字時一定會遇到數字鍵全變成了快捷指令的窘境。但這點是可以靠一行簡單語法克服的。(網路上也有人分享別的方法)

要怎麼編寫ahk檔?我沒有程式語言基礎,不適合在這裡誤導大家,就只提幾個較實用的概念:

假設我要將數字鍵盤上的[1],對應成Photoshop裡的[還原]指令,還原指令眾所皆知是[Ctrl+z],那要如何在記事本裡寫下這個對應呢?

Numpad1::^Z

假設將數字鍵盤上的[2],對應成筆刷工具(PS中預設為[B]),寫法就是:

Numpad2::B

這兩個例子應該可以看出規律,在雙冒號"::"的左邊,是鍵盤預設的指令,右邊則是我重新設定好的指令。右方的指令串,在單純代表擊鍵動作時,也可叫「keystroke」;若除了擊鍵動作以外、還含有更複雜的程式語言指令,通常就稱script。在AHK中,當Ctrl寫於雙冒號的右邊,可以^表示之。關於各個鍵盤指令在AHK中要怎麼寫,官網有個清單可供參考:

List of Keys, Mouse Buttons, and Joystick Controls
http://ahkscript.org/docs/KeyList.htm

根據該清單,我買的那塊數字鍵盤可以整理出如下圖表:
使用數字鍵盤的NumLock可以在兩種模式中切換,因此一塊鍵位23顆的數字鍵盤,實際上能送出23+10=33種指令。(我在plurk裡說的有錯~~歹勢歹勢)

我個人不希望鍵面太花,因此只remap了15個快捷+7個常用功能鍵+1個開關,沒利用NumLock來切換模式。目的就是讓繪圖作業時只需要用到繪板+小鍵盤,然後封印主鍵盤(收到鍵盤架上意味)。下有成果示意圖:
左圖是說明每個圖案標籤代表的功能,括號中是PS預設的快捷。
右圖則說明每個功能所需對應的keystroke。紅字代表的兩個工具設定方式較特別,將在下方的Q3做解答。
(10/27修正:右圖的Shift、Ctrl、Alt之對應stroke都有再做修正,正確設定法請見Q8。)

至於前文提到的數個問題,AHK送出的指令會不會被程式擋下來?要怎麼在ahk運行的情況下正常輸入數字?如何做到shift behavior?以下也都有解。

Q1: AHK送出的指令會不會被程式擋下來?
A: 我在Photoshop CS6 (64bit)中測試到目前為止,還沒遇到這個問題。(又話說從做好鍵盤到現在也才過一天而已)

Q2: 要怎麼在AHK運行的情況下正常輸入數字?
A: 我在數字鍵盤上留了一個鍵,將這個鍵做成了「開關」(上圖Pad中右上角那顆)。按下這個開關,ahk檔就會暫停運行,再按一次這個開關,即會恢復運行。
此動作稱做Suspend。綜合上面兩張圖示,可以得知開關的寫法為

Launch_App2::Suspend

Q3: 如何做到shift behavior?
A: 這點比較麻煩,以我個人之力完全寫不來,幸好在AHK官方論壇中有人提出可用的語法,來源為此帖:http://autohotkey.com/board/topic/87067-photoshop-shortcut-toggle-key/

帳號ixaarii在問答中張貼了一串語法,我抱著誤打誤撞的精神(?)胡亂套用並測試之後,發現問題就這樣解決了!!(灑花) 但我還沒把那串語法看懂(入門才兩天誤怪),無法多做說明orz

以下是我拿來套用的語法,依個人需求將藍字置換掉即可:
需要對應的按鍵:: 
send {keystroke down}
Loop
{
  sleep, 10
  GetKeyState, state, 需要對應的按鍵, p 
  if state = u
  break
}
send {keystroke up}
return


[補充Q&A]

Q4: 如何離開AHK?
A: 拿鍵盤上任一鍵來製作一個開關,最好是幾乎用不到的按鍵,我是用F2當開關,當按下F2的時候,即會跳出AHK。(和Suspend指令不同,再按一下並不會再度運行AHK)
所以以我的情況為例,語法即為:

F2::ExitApp

Q5: AHK穩定嗎?
A: 中文維基介紹頁中即有說明:
AutoHotkey體積小巧、語法簡明使其易學易用,同時在熱鍵、熱字串實作的快捷、高效(同時也強大,這點其他語言也能做到)方面沒有其他語言能超越,不過缺點同樣明顯,即沒有官方內建或第三方實作的完善的標準庫,這樣需要實作未內建的功能時通常需要直接呼叫Windows API或尋找別人封裝好的函式(註:命令列命令或COM等與Windows API在功能全面性上相差太遠)。換句話說,普通人極容易使用,但熟悉後要提升以實作更強大的功能時困難重重,這點從大量使用者選擇該語言入手而後一些需求較高的使用者則轉向其他語言容易看的出來。
我自己的解讀:AHK拿來寫簡單的熱鍵對應,應該是足夠的。不過還是有可能會發生一些突發狀況,比方說我常碰到編寫的內容照理來說是對的,但系統卻判定無效。所以也有可能某人寫了一個ahk檔,在他的電腦裡能用,下載到你的電腦裡卻不能用。總之若想為日後的工作省力氣時間,就花個幾天寫一個自己專屬的的ahk檔吧!或者砸錢直接換mac

Q6: Ctrl+S這麼常用的快捷,你怎麼沒對應上去?
A:我把這功能放在Intuos板子上。比較不怕不小心按到。

Q7: 所以AHK沒辦法區分兩塊以上鍵盤的差異?
A: 照理說是沒辦法。不過官方論壇上有人針對設備同步問題寫了幾個工具,名叫AHKHID,可惜我的電腦無法正確地運行它,也可能只是我不會操作(毆),順帶一提HID即是Human interface device(人機介面裝置)的縮寫。

AHKHID - An AHK implementation of the HID functions:
http://autohotkey.com/board/topic/38015-ahkhid-an-ahk-implementation-of-the-hid-functions/

Q8: 如何正確地把Ctrl、Alt、Shift等功能鍵對應到數字鍵盤?
A: 是說,我一開始的寫法照理來說是合理的,但實際在Photoshop中測試後,發現若「長按著不放」這三種功能鍵,系統的判定會出現問題。Ctrl和Alt的情況相同,若照前文圖表設定,「長按著不放」時會被錯判成「快速連擊」,解決的方式是讓系統能正確地偵測到使用者的物理動作。正確語法如下,藍字部份請再照自己的需求做替換:

需要對應的按鍵::
send {功能鍵 down}
keywait, 需要對應的按鍵
send {功能鍵 up}
Return

另外,Shift鍵的情形更特別,若我照前文所列的圖表,將Keystroke寫成+號,照理來說是對的,但實際操作也會發生「長按著不放」時被錯判成「快速連擊」,按照Ctrl與Alt的方式修改也無效。另外還有個難題,假設我將數字鍵1(Numpad1)改成Shift,當我在NumLock On的情況下長按住Numpad1,輸入模式會自動切換到NumLock Off,也就是我的輸入變成了NumpadEnd。解決的方式就是將Numpad1和NumpadEnd都對應成Shift,換言之,對應為Shift的數字鍵,無法再對應成其他熱鍵。正確寫法如下:

Numpad1::Shift
NumpadEnd::Shift

意外地很簡單。修正這個功能鍵花了我最多時間!真是吐血。以上都應該能當AHK的標準庫不夠完善的範例來看。

Q9: 能不能設定讓語法只對Photoshop有效?
A: 可以滴,追加以下這句即可:

#IfWinActive, ahk_class Photoshop

Q10: Return在語法中一直出現,它到底是三小?
A:return在很多情況下其實可加可不加,在官網上能查到它的定義:
http://ahkscript.org/docs/commands/Return.htm
當與return同列的右側沒有再輸入任何文字時,我流的解讀是「到此為止」,在keystroke/script描述篇幅較長的時候,建議最尾列都加個return。