シェルのみ (X なし) を使用して IDE のようなエクスペリエンスを実現するために、シェル内に何かを設定したいと考えています。私が行った中で最も近い方法は、tmux を使用して、一方のペインに vim を配置し、もう一方のペインにコマンド ラインを配置することです。こうすることで、vim から.w !bash
1 行を実行できます。
しかし、個別に実行されるコマンド間で環境が維持されないため、これは私にとって満足できるものではありません。
実行した場合:
var1=FOO
その後
echo $var1
それぞれを使用すると.w !bash
、FOO
エコーされません。
私が本当にやりたいのは、1 つのペインでテキスト ファイルを調べ、ショートカットを使用して、そのターミナル セッションの一部として、もう 1 つのペインのターミナルに 1 行送信することです。これを実現するには、どのようなツールの組み合わせが適切でしょうか。emacs は、独自のターミナル エミュレーターを使用してこのような操作を行うように設定できることは理解していますが、標準ツール (インストーラーなど) で動作するソリューションがほしいです。
編集: tmux の選択、コピー、貼り付けはそれほど悪くはありませんが、まだ少し扱いにくいです。
答え1
sh
、vim
およびを使用したtmux
、迅速かつ大まかな概念実証のプロトタイプ ソリューション。
が.w !bash
実行されbash
、現在の行が stdin に送信されます。 を、bash
の別のペインに stdin から行を挿入するスクリプトに置き換えてみましょう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'
手順、簡単な説明:
- アクティブでないペインを識別します。
- stdin から 1 行読み取ります。
- 入力したかのように、行をペインに送信します。
- Enterペインに送信します。
これを として保存しtrun
、 から実行可能かつアクセス可能にします$PATH
。 に 2 つのペインがあり、そのうちの 1 つで をtmux
実行し、行を入力して を押すと、その行が他のペインに挿入されます。trun
Enter
では、 invokevim
の代わりに、動作するはずです。簡単にアクセスできるように、これをキーにバインドします。.w !bash
.w !trun
ノート:
- スクリプトは、ペインが正確に 2 つあるかどうかをチェックしません。
- スクリプトは、ターゲット ペインで何が実行されるかは気にせず、キーを送信するだけです。