質問: 引数の順序をすばやく変更できるシェルはありますか? 私はコマンドラインを多用し、長年にわたってbashからzshに毎日のドライバーシェルとして移行しています。通常、少しカスタマイズしたoh-my-zsh環境を使用しますが、一部のシステムはpreztoにあります。違いは大きくありません。私がzshに使用している最も生産的なプラグインはzsh-syntax-highlightingとhistory-substring-searchで、最近、履歴を取得するために非常に強力なfzfプラグインを使用しています。今、私はコマンドラインで私にとって残っている最大の問題点の1つをコマンド引数の並べ替えです。かなり頻繁に私はコマンドを実行しようとしますcommand very/long/filesystem/path/to/argumenta another/filesystem/or/network/path/argumentb 順序が逆になっていることに気づきます。もう1つのより一般的な状況は、「手動展開」ワークフローを実行する場合です。最初に、新しいものを実際のものと比較します。diff /opt/app/static/www/a.html /home/user/docs/dev/src/a.html cp /home/user/docs/dev/src/a.html /opt/app/static/www/a.html ok、ok、最後の例、これ以上約束しない。ここに完璧な現実世界の例があります。人間サイズの甘いファイルリストをいくつか見てみましょう。find /pool/backups -type f -print0 | xargs -0 ls -lh > filelisting サイズを並べ替えて選びたい:sort -rhk5 filelisting | fzf -m > /these/are/the_chosen うまくいきました!ああ、でもここにパスが必要です:cut -d ' ' -f 10 /these/are/the_chosen 出力はガベージです。ls -lhでセットバックが発生し、スペースが必要になります。しかし、再グループ化する準備ができています。隣接するスペースに参加します。 tr -sを選択して、スペース文字を絞り込みます。ここでは正規表現は必要ありません。ただし、trにはstdinが必要です。cat /these/are/the_chosen | tr -s ' ' | cut -d ' ' -f 9- > filelist ここでは、すでにカットアンドペーストで苦痛を感じています。ここでの私の選択は常に厄介な選択肢の間にあります。長いパスを移動したり、カットコマンドを移動したりできます。どちらの移動でも、マウスがそれをコピーできるように手を伸ばすか、新しい場所にもう一度入力する必要があります。勝てない。コマンドラインを使用すると、移動するのも面倒であり、word hopsホットキーを設定しないと非常に面倒です。マウスを使ってすばやくジャンプすることすらできません。だから、thisは私が廃止したい非効率です。モンスターパイプラインのプロトタイプを作成している間、シェルオブジェクト(有効なパス文字列など)をつかむ手間を省き、自由に左右に動かしたいと思います。その機能があれば、5回スパムしてcut&フラグの左側にパスを突き出し、残りのパイプラインを有機的に構築できます。ここで問題となっているのは、ライン編集力の欠如です。最も簡単な転置の例では、おそらくcptoを呼び出して引数を反転し、作業をcpコマンドにパントする簡単なシェルスクリプトを作成できます。しかし、私はそれをする必要はありません、そしてそれは3番目の例のために私を助けません。 sideways のようなプラグインを使用してvimにいる場合、さまざまなタイプのリストに対して実行できるように、単純なキーの組み合わせを使用して入力した引数を並べ替えることができるようにしたいと思います。そのようなプラグインはzshに存在しますか?そのようなプラグインは他のシェルに存在しますか?そうでない場合、zshの実装はどれほど難しいでしょうか? zsh-syntax-highlightingプラグインは、引数をトークン化することが可能であることを証明していると思います。実際、シェルは履歴から個々の引数を取得する方法を知っています: https://stackoverflow.com/a/21439621/340947 問題点は非常に厳しく、一般的であるため、履歴の最後のエントリを取得して最後の2つの引数を交換するホットキーにバインドして実行する簡単なスクリプトを作成する傾向があります。ただし、コマンドの実行をコミットするのではなく、対話的にスワップを実行できるように、ラインエディタ操作を使用するほど理想的ではありません。おそらく!:0 !:2 !:1を注入することで改善される可能性があります(zshがうまく自動拡張します)が、これにも多くの問題があります。間違ったコマンドを入力した後で自分自身をキャッチした後で引数を交換したい時間の半分以上、そして(2)そのスニペットが説明に失敗する使用されたフラグがしばしばあります。私はまた、示されているアプローチを見ました here これは問題ありませんが、長いパスではキーストロークを何度も繰り返す必要があるため、非常に満足できません。 ctrl + wで削除されたものの。基本的に役に立たない。完全を期すために、現在取られている戦術は、適切なキーの組み合わせを使用して単語を削除し、コマンドの短い方を削除して並べ替え、カーソルの位置を変更し、マウスを使用して削除された引数を端末出力からコピーし、貼り付けます。 。普通の人はこれに目を向けませんが、コンピューターが私のためにこのタスクを実行するのがどれほど簡単か、そして私が感じる不正義について考えるのを止めることができないので、私はそれをするたびに少し死んでしまいますマウスに手を伸ばさなければならない。
回答: zshのvimモードは、以前に認識したよりも少し進んでいることに気付きました。引数に対応するaテキストオブジェクトがあります。したがって、次のようなシーケンスを入力することで、筋肉の記憶を活用することができます escdaabpispace。しかし、8つのキーストロークが理想的とはほど遠いこともわかります。この操作では、vimでエレガントにプラグインを実行する必要があるため、zshラインエディターの場合も同じです。さらに、zshをvimモードにすると、すでに持っているバインディングが壊れますが、複製は簡単です。シェルにvimバインディングがあると本当にいいこともあります。しかし、私はまだ、挿入モードになっているシェルに対処する必要があることは問題に値しないというスタンスに傾いています。