在 tmux 複製模式下執行任意命令
當我在 tmux 複製模式下選擇一些文本時,我可以在所選文本上呼叫系統命令,而不使用預定義的鍵綁定嗎?
例如,我可以呼叫
pastebin
以將選定的文本發送到 pastebin,或呼叫wc
以計算行數。我嘗試了以下方法,但沒有奏效:
選擇文本
c-b [
嘗試了這兩種方法:
按
:
,希望進入命令模式 - 沒用,因為這會提示“轉到行”按
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 擴展來處理(如果您關心的話),以及添加(
-e
以capture-buffer
將 ANSI 程式碼保留在緩衝區輸出中)。