Featured image of post Double Commander:實現在另一側視窗以新分頁開啟目標目錄

Double Commander:實現在另一側視窗以新分頁開啟目標目錄

透過自訂 Lua 腳本與快捷鍵,實現在 Double Commander 中按下 Ctrl+ 左右鍵,自動於對側面板以新分頁開啟當前檔案或資料夾。

Double Commander 原生未提供「在對側視窗以新分頁開啟目前項目」的單一指令。為了達成流暢的雙面板操作體驗,我們可以利用其內建的 Lua 腳本引擎,搭配快捷鍵設定,建立一套自動判斷左右面板與檔案類型的無縫操作流程。

Double Commander 新分頁開啟效果


建立 Lua 腳本

請在 Double Commander 的安裝目錄下 (建議建立一個 scripts 資料夾) 建立一個純文字檔案,命名為 open_in_other_panel_tab.lua,並寫入以下程式碼。

此腳本利用原生剪貼簿暫存機制取得路徑,並具備自動還原剪貼簿資料與判斷檔案類型的功能。

--[[
  Double Commander 腳本:在對側面板以新分頁開啟目前項目
  此版本採用原生剪貼簿暫存機制,並支援自動判斷檔案或資料夾
--]]

-- 1. 備份目前的剪貼簿內容,避免覆蓋使用者的日常資料
local old_clip = Clipbrd.GetAsText()

-- 2. 執行內建指令,將目前游標所在項目的完整路徑複製到剪貼簿
DC.ExecuteCommand("cm_CopyFullNamesToClip")
local target_path = Clipbrd.GetAsText()

-- 3. 立即復原剪貼簿內容 (若原先為空則寫入空字串)
if old_clip ~= nil then
  Clipbrd.SetAsText(old_clip)
else
  Clipbrd.SetAsText("")
end

-- 4. 判斷是否有成功取得路徑
if target_path and target_path ~= "" then
  -- 若同時選取多個項目,剪貼簿會有多行,此處只擷取第一行的路徑並過濾換行符號
  local first_path = string.match(target_path, "([^\r\n]+)")
  
  if first_path and first_path ~= "" then
    -- 設定預設目標目錄為取得的路徑
    local target_dir = first_path
    
    -- 判斷該路徑是否為資料夾 (利用內建 SysUtils 模組檢查)
    if SysUtils.DirectoryExists(first_path) == false then
      -- 若不是資料夾 (即為檔案),擷取最後一個斜線前的所有字元取得父資料夾路徑
      target_dir = string.match(first_path, "(.*)[\\/]") or first_path
    end

    -- 記錄原本作用中的面板 (0 代表左邊面板,1 代表右邊面板)
    local original_panel = DC.CurrentPanel()
    
    -- 自動判定對側目標面板
    local target_panel_id = (original_panel == 0) and 1 or 0
    
    -- 切換至對側面板
    DC.CurrentPanel(target_panel_id)
    
    -- 在目標面板建立一個新分頁
    DC.ExecuteCommand("cm_NewTab")
    
    -- 將該新分頁的目錄變更為目標路徑
    DC.ExecuteCommand("cm_ChangeDir", target_dir)
    
    -- 將焦點還原回原本的來源面板
    DC.CurrentPanel(original_panel)
  end
end

設定快捷鍵

腳本準備好後,需至 Double Commander 內綁定快捷鍵。設定過程中一律使用系統變數 %COMMANDER_PATH% 來指定路徑,確保設定檔具備可攜性。

  1. 開啟 Double Commander,點選上方選單的 設定 (Configuration) -> 選項 (Options)
  2. 在左側清單切換至 熱鍵 (Hot keys)
  3. 在右側的 Filter 欄位輸入 cm_ExecuteScript 並選取該指令。
  4. 點選右下角的 Add hotkey 新增快捷鍵,並在鍵盤按下 Ctrl + Right
  5. 在下方的 參數 (Parameters) 欄位填入: %COMMANDER_PATH%\scripts\open_in_other_panel_tab.lua
  6. 再次點選 Add hotkey 新增第二個快捷鍵,按下 Ctrl + Left
  7. 參數 (Parameters) 欄位填入完全相同的路徑: %COMMANDER_PATH%\scripts\open_in_other_panel_tab.lua
  8. 點選 套用 (Apply)確定 (OK) 完成設定。

參數欄位切勿加上引號或任何外部變數參數,系統會自動透過腳本內部邏輯判定當前面板方向。


跨平台相容性:Ubuntu (Linux) 系統的設定調整

如果您是在 Ubuntu 或其他 Linux 發行版上使用 Double Commander,在設定快捷鍵時,必須特別注意路徑分隔符號的差異。Linux 系統嚴格要求使用正斜線 /

請將上述參數欄位中的反斜線更改為正斜線: %COMMANDER_PATH%/scripts/open_in_other_panel_tab.lua

建議:由於 Windows 系統也能順利識別正斜線 /,若您會跨平台共用設定檔 (shortcuts.scf),強烈建議一律統一使用正斜線,以徹底避免切換系統時產生的路徑報錯。


常見問題與解決方式

開發與設定此功能時,可能會遇到以下狀況:

錯誤:找不到檔案或腳本執行失敗

  • 原因:在快捷鍵的參數欄位中,若輸入了如 %"0%p0 right 這類的變數與字串,Double Commander 的 cm_ExecuteScript 會將整串文字含空格視為一個「檔案名稱」,進而導致找不到該 Lua 檔案。
  • 解決方式:移除參數欄位的所有外部變數,僅保留單純的腳本路徑,改由 Lua 腳本自行擷取路徑與判斷左右面板。

錯誤:按下快捷鍵後毫無反應 (靜默崩潰)

  • 原因:若在 Lua 腳本中呼叫了不相容或不存在的內部指令 (例如誤用 Total Commander 專屬的 cm_SaveSelectionToFile),腳本會在背景中斷且不顯示錯誤視窗。
  • 解決方式:改用 Double Commander 原生支援的 cm_CopyFullNamesToClip 指令,並搭配 Lua 的 Clipbrd 模組來處理路徑暫存與還原。

錯誤:變更目錄到檔案路徑失敗

  • 原因:當游標停留在「檔案」而非「資料夾」時,系統執行開新分頁後,嘗試使用 cm_ChangeDir 進入該檔案,由於不符合資料夾格式而產生錯誤警告。
  • 解決方式:在 Lua 腳本內加入 SysUtils.DirectoryExists 判斷邏輯。若是檔案,則透過字串正規表達式擷取其父資料夾路徑後,再執行變更目錄動作。

錯誤:Ubuntu 系統下出現「File “…” not found」

  • 原因:若您直接匯入 Windows 的設定檔,或是複製貼上帶有反斜線 \ 的路徑 (例如 /usr/lib/doublecmd\scripts\open_in_other_panel_tab.lua),Linux 系統會將整串包含反斜線的字元視為一個怪異的檔案名稱,導致無法正確解析目錄。
  • 解決方式:進入熱鍵設定,將參數路徑中的反斜線 \ 全數替換為正斜線 / 即可。

錯誤:Ubuntu 系統下出現「Problem loading Lua library file “liblua5.1.so.0”」

  • 原因:Windows 版本的 Double Commander 通常內建 Lua 執行環境,但在 Linux 環境下,您需要手動安裝並補齊這個相依的動態連結函式庫。
  • 解決方式
  1. 開啟終端機 (Terminal),執行以下指令安裝所需套件:
sudo apt update
sudo apt install liblua5.1-0
  1. 安裝完成後重新測試快捷鍵。若系統仍跳出「Do you want to configure Lua library location?」的提示,請點選 是 (Y)
  2. 在彈出的檔案選擇視窗中,導覽至 /usr/lib/x86_64-linux-gnu/ 目錄,找到並選取 liblua5.1.so.0 檔案即可完成綁定。

結論

透過結合 Double Commander 的 Lua 腳本控制引擎與剪貼簿模組,可以完美繞過預設指令不足與快捷鍵參數解析的限制。這個自動化腳本不僅解決了單向面板設定繁瑣的問題,也確保了日常複製操作的資料不受干擾。不論游標目前指在檔案還是資料夾上,只需直覺地按下 Ctrl 加上左右方向鍵,即可實現高效的雙面板目錄導航與分頁管理。加上完善的跨平台路徑設定與函式庫補齊,這套流程在 Windows 與 Ubuntu 上皆能流暢運行。