2021年9月11日 星期六

pdmenu 幫麻瓜製作常用功能文字選單

pdmenu 文字選單畫面 像我天天在用 regular expressions、 命令代換 $(...)、 pipe 等等工具, 把很多小工具湊起來解決自己日常生活的轉檔/撈資料等等問題, 如果有人願意請我幫他檢視經常性的電腦工作流程, 一定可以發現很多重複性、 機械化的動作其實都可以用簡單兩三句 perl + shell script 解決。 (可惜連老婆都不覺得她需要我幫忙, 更不想改用 linux...) 總之假設你身旁有一位已被你說服用 linux 的電腦麻瓜, 而且你已幫他寫了很多 scripts。 下一步就是用 pdmenu 把這些 scripts 包成一個文字選單, 讓他可以用快速鍵或滑鼠點選執行你幫他寫的 scripts。

請安裝 pdmenu 套件, 並下載 example.pdmenu, 然後執行: pdmenu -c example.pdmenu 。 給使用者的快速提醒:

  1. 用上下箭頭移動, 按 Enter 選擇。
  2. 或是按特殊顏色的字元, 那是快速鍵。
  3. 如果是在純文字模式下 (vt1 到 vt6) 而且系統有安裝 gpm, 滑鼠也可以用。
  4. Esc 鍵是離開, 或是退回上一層選單。
  5. 有時畫面會亂掉, 可以按 ctrl-r 重新整理。

再來是 pdmnu 選單檔的撰寫要點, 從最簡單的開始:

  1. 縮排空格數其實並不重要。
  2. 每個選項一列; 如果太長需要換列, 就要在未完的那一列最後面加上 \ 。
  3. 每個選項有四個欄位: pdmenu 命令、 顯示的文字含快速鍵、 選項、 要執行的 shell 命令。
  4. 最常用最簡單的 pdmenu 命令就是 exec, 也就是執行某個命令。
  5. 顯示的文字我偏好用英文, 這樣子在 (未進入 X window 的) 純文字終端機 vt1 到 vt6 裡面也可以讀, 而且 (用 _ ) 指定快速鍵比較自然。
  6. 選項的話, 我最常用的是 pause 或 display, 主要都是要讓系統可以停下來讓用戶看執行的結果。 用 display 看起來比較漂亮; 但如果想保留先前的指令的結果, 用 pause 比較合適。 請見 「硬碟用量」 的兩個範例。
  7. 如果有些命令需要用戶填參數, 可以用 edit 選項。 這會令 pdmenu 跳出一列的輸入框, 再把用戶填的結果塞到命令列上適當的地方: 從 ~ 開始到 ~ 為止的那一串會被用戶填的結果代換掉。 像 google 的那個例子, pdmenu 所印的輸入框裡, 標題會是 「搜尋關鍵詞」 而預設值 (使用者想搜尋什麼?) 會是 「玩具烏托邦」。 中文字的位置怪怪的... 沒有深入研究。
  8. 如果要顯示子選單, 就用 show 這個 pdmenu 命令。 此時最後一欄是子選單的名稱。

另外 pdmenu 有一個 preproc 命令可以動態地產生選單內容; 不過我自己沒在用, 而是會採取以下兩步驟達到類似的效果: 先用一個 exec 指令 (例如範例中的 "_Build download menu") 產生一個 pdmenu 檔 (wget.pdmenu), 再叫 pdmenu 重新載入主選單 ("Reload _menu"), 此時這個新產生的 pdmenu 檔就會被主選單裡面的 read 命令讀進來。 以這個下載的範例來說, 我可以在伺服器上新增一個映像檔, 然後請用戶執行這兩步, 就會看到新的 (多一個選項的) 下載子選單。 exec:Reload _menu::exec pdmenu -c example.pdmenu 當中的第二個 exec 是叫 shell 不要再 fork 一個子程序, 而是直接變身成下一個 pdmenu , 以免變成 tail recursion 製造不必要的浪費。

更完整的說明請見 man pdmenurc 。 Pdmenu 超級好用的, 比 dialog 簡單太多了。 我大概十幾年前就發現了, 這兩年為了管理電腦教室才又開始用。 可是竟然連英文的文章都找不太到。 那就由我來分享給小格的讀者們吧!

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。