我想在 shell 中設定一些東西,以便只使用 shell(無 X)即可獲得類似 IDE 的體驗。我最接近的是使用 tmux,其中一個窗格中使用 vim,另一個窗格中使用命令列。這樣我就可以從 vim.w !bash
運行一行。
但這對我來說並不令人滿意,因為環境在單獨運行的命令之間並不持久。
如果我運行:
var1=FOO
進而
echo $var1
每次使用.w !bash
,FOO
都不會被回顯。
我真正想做的是瀏覽一個窗格中的文字文件,並使用快捷方式將一行傳送到另一個窗格中的終端,作為該終端會話的一部分。實現這目標的正確工具組合是什麼?我知道 emacs 可以配置為使用自己的終端模擬器執行類似的操作,但我想要一個與庫存工具(例如安裝程式)一起使用的解決方案。
編輯: tmux select-copy-paste 還不錯,但還是有點尷尬。
答案1
一個原型解決方案,具有sh
、vim
和tmux
,快速而骯髒的概念證明。
您.w !bash
運行bash
並將當前行發送到其標準輸入。讓我們替換bash
為一個腳本,該腳本將其標準輸入中的一行注入到tmux
.
這是基本腳本:
#!/bin/sh
pane="$(tmux list-panes -F '#{pane_active} #D' | awk '$1==0 {print $2;exit}')"
IFS= read -r line
tmux send-keys -l -t "$pane" "$line"
tmux send-keys -t "$pane" 'C-j'
程序,簡短說明:
- 識別不活動的窗格。
- 從標準輸入讀取一行。
- 將該行傳送到窗格,就像鍵入該行一樣。
- 傳送Enter到窗格。
將其另存為trun
,使其可執行並可透過 存取$PATH
。現在,如果您有兩個窗格tmux
並在其中一個窗格中運行trun
,然後鍵入一行並點擊Enter,那麼該行將被注入到另一個窗格中。
它應該可以工作,而vim
不是.w !bash
呼叫。.w !trun
將其綁定到一個鍵以方便存取。
筆記:
- 該腳本不會檢查是否剛好有兩個窗格。
- 該腳本不關心目標窗格中運行的內容;它只是發送密鑰。