Tmux

在 tmux 複製模式下執行任意命令

  • October 26, 2021

當我在 tmux 複製模式下選擇一些文本時,我可以在所選文本上呼叫系統命令,而不使用預定義的鍵綁定嗎?

例如,我可以呼叫pastebin以將選定的文本發送到 pastebin,或呼叫wc以計算行數。我嘗試了以下方法,但沒有奏效:

  1. 選擇文本c-b [

  2. 嘗試了這兩種方法:

  3. :,希望進入命令模式 - 沒用,因為這會提示“轉到行”

  4. c-b :copy-pipe wc- 不起作用,因為它說複製管道是未知命令

注意:我使用的是 Tmux 3.1c

我知道這樣的解決方案。但是,這需要我預見我的每個案例並為我將執行的每個可能的命令預定義鍵綁定。

在 Vim 中,這是支持的,即選擇文本,然後:!<system_command>將文本發送到system_command.

基於 NotTheDr01ds answer,我得到了一個完整的解決方案:

bind-key -T copy-mode   !  command-prompt -p "cmd:" "send-keys -X copy-selection-no-clear \; run-shell \"tmux show-buffer | %1\" "
bind-key -T copy-mode-vi   !  command-prompt -p "cmd:" "send-keys -X copy-selection-no-clear \; run-shell \"tmux show-buffer | %1\" "

用法:選擇一些文本然後按!。它將提示您輸入要執行的 shell 命令。選定的文本將作為標準輸入提供給 shell 命令。shell 命令的標準輸出將顯示回 tmux 窗格。

感謝 NotTheDr01ds 的出色提示!

你很近;好吧。複製模式命令需要通過sendkeys -X.

因此,要將所選文本通過管道傳輸到命令,它將是:

  • Prefix :
  • send-keys -X copy-pipe "wc"

但是,Tmux 不顯示copy-pipe任何地方的輸出。使用run-command,輸出顯示在複製緩衝區中。因為copy-pipe,它似乎只是被狼吞虎咽。您在另一個答案中連結到的範例只是保存了一個緩衝區,因此不需要輸出/回饋。

對於 a wc,這並不太有用。而且我猜測 的輸出pastebin是一個非常有用的 URL …

我發現的最簡單的替代方案開始變得混亂,尤其是因為您想使用任意命令來實現這一點:

  • Prefix :
  • send-keys -X copy-selection-no-clear ; run-shell "tmux show-buffer | wc"

請注意,那裡沒有錯誤檢查以確定是否選擇了某些內容。它只會show-buffer在最近的緩衝區上執行。

一個可能更好的選擇,恕我直言

由於 Vim 擅長這個案例,所以使用它。設置一個鍵綁定,在vim使用程序替換時打開回滾緩衝區。

在 shell 中進行測試(已測試):

tmux bind-key -T copy-mode v new-window -d -n scrollback "vi <(tmux capture-pane -p -S - -E -)" \\\; run-shell "sleep 1" \\\; select-window -t scrollback

或在您的配置中(未經測試):

bind-key -T copy-mode v new-window -d -n scrollback "vi <(tmux capture-pane -p -S - -E -)" \; run-shell "sleep 1" \; select-window -t scrollback

哈基,是的,你可能需要增加sleep更大的緩衝區——我還沒有測試過。可能有更好的方法,但這就是我想出的。

此外,您將失去 ANSI 顏色程式碼,但您可以使用AnsiEsc VIM 擴展來處理(如果您關心的話),以及添加(-ecapture-buffer將 ANSI 程式碼保留在緩衝區輸出中)。

引用自:https://unix.stackexchange.com/questions/665150