2018年1月14日星期日

Linux 自訂右鍵選單功能

一些經常用到的功能,在 Linux 上,雖然打開 Terminal 輸入一些需要的指令便可以快速地完成
但打開 Terminal 還要輸入一堆指令還是有點麻煩
不知有否類似檔案開啟方法一般能讓使用者,按滑鼠功能鍵,在功能選單執行特定程式

見下文
可以到 ${HOME}/.config/caja/scripts 將執行檔加入便可以在右鍵選單 (Context Menu) 加入自訂的功能
通過自訂右鍵選單功能可以使用這些特定變數資料
較重要為 CAJA_SCRIPT_SELECTED_FILE_PATHS 能獲取被選取的檔案的絕對路徑並以 \n 分割
可以使用以下寫法,並將 echo "${f}" 內容修改成閣下需要的內容
#!/bin/bash

ifs=$IFS # 將分割字元保存
IFS=$'\n' # 將分割字元改為只以 \n 分割

for f in `echo -n "${CAJA_SCRIPT_SELECTED_FILE_PATHS}"`; do
    echo "${f}"
done

IFS=$ifs

見下文
但在右鍵選單功能執行功能不能顯示 Terminal 因此需要用另一個功能在 Terminal 執行原來的功能
製作先執 Terminal 的 script 並載入原來的 script 例如
mate-terminal -x "${HOME}/.config/caja/scripts/my-script"

見下文
見下文
見下文
見下文
其實實際操作上不一定需要顯示 Terminal 但有些操作需要較長時間運作,顯示進度可以了解狀態,必要時可以中斷程式
但同一個功能在選單中,很容易造成混亂,幸好隱藏的檔案不會在選單顯示
可以將原來的功能隱藏,將顯示 Terminal 的檔案為成原來的檔案名

留意
由於在下使用 Linux Mint Mate 桌面環境,使用 mate-terminal 為 Terminal 介面
並以 caja 作為預設檔案管理器,因此位置在 ~/.config/caja/scripts
因此 callback 時要考慮 Terminal 的介面及檔案管理器的腳本位置
例如 nautilus 位置會在 ~/.local/share/nautilus/scripts

若果效慮需要互動操作,甚至可以使用 zenity 或 yad 來進行
#!/bin/bash

ifs=$IFS
IFS=$'\n'
ESCAPE="\\\\"
NEWLINE="\\n"

WIDTH='600'
TITLE='Progress Title'
COMPLETE='Progress Complete'
FILE_COUNT=`echo -n "${CAJA_SCRIPT_SELECTED_FILE_PATHS}" | wc -l`
COUNT_LENGTH="${#FILE_COUNT}"

i='0'
for f in `echo -n "${CAJA_SCRIPT_SELECTED_FILE_PATHS}"` ''; do
    p=$((100*$i/$FILE_COUNT))
    if [ "${f}" = '' ]; then
        echo "#${i}/${FILE_COUNT} (${p}%)${NEWLINE}${NEWLINE}${COMPLETE}"
    else
        dirname=`dirname "${f}"`
        basename=`basename "${f}"`
        name=`echo -n "${basename}" | awk -F '.' '{print $1}'`
        extension=`echo -n "${basename}" | awk -F '.' '{print $NF}'`
        if [ "${name}" = "${extension}" ]; then
            extension=''
        fi
        # command start
        command="echo ${ESCAPE}${NEWLINE}"
        command="${command}'hello, world'"
        echo "${p}"
        echo "#${i}/${FILE_COUNT} (${p}%)${NEWLINE}${NEWLINE}${command}"
        command="${command//${ESCAPE}${ESCAPE}${ESCAPE}${NEWLINE}/}"
        eval "${command}"
        # command end
    fi
    i=$(($i+1))
done | zenity --progress --width="${WIDTH}" --title="${TITLE}" --auto-kill 2>/dev/null

IFS=$ifs

動態圖片只是參巧效果
動態圖片只是參巧效果

1 則留言 :