パラメータをすばやく並べ替えることができるシェルはありますか?

パラメータをすばやく並べ替えることができるシェルはありますか?

私は多くのコマンドラインを使用しており、長年にわたって日常的なドライバシェルに移行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

そして順序が変わったことに気づきました。

別の一般的な状況は、「手動展開」ワークフローを実行するときです。まず、新しいコンテンツを実際のコンテンツと比較します。

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

いいですね。動作します!ああ、しかし私は必要です。ただ今パスを指定しますが、再実行したくありませんfind

cut -d ' ' -f 10 /these/are/the_chosen

ls -lhスペースの使用に問題があるため、出力はゴミです。しかし、私には戦略があります。連続空間を追加することです。tr -s空白文字を圧縮することを選択します。ここでは正規表現は必要ありません。ただし、tr標準入力が必要です。

cat /these/are/the_chosen | tr -s ' ' | cut -d ' ' -f 9- > filelist

この時点で、私たちはコマンド内でパラメータを切り取り、貼り付けるのに苦労しました。ここで私の選択は常に厄介な選択の間です。長いパスを移動したり、コマンドを移動したりできます。どちらを動かしてもコピーするには、マウスに手を差し伸べるか、新しい位置に再入力する必要があります。勝てない。コマンドラインを使用すると、ナビゲーションでも面倒です。特に、単語をスキップするためのショートカットがない場合は、さらにそうです。

マウスを使用してシェルプロンプトをすばやく移動することはできません! (マウスイベントをサポートするシェルを知っている人はいますか?)だから、これ私が取り除きたい非効率性です。モンスターパイプラインをプロトタイピングするときに、シェルオブジェクト(有効なパス文字列など)をつかみ、左右に自由に移動したときに発生する摩擦を取り除きたいと思います。この機能を使用すると、5回スパムを送信し、&シンボルの左側にパスをプッシュしcutて、残りのパイプラインを有機的に構築できます。

ライン編集機能が足りないのが問題だと思います。最初の例では、最初の2つのパラメータを置き換えようとしています。cptoパラメータを逆にしてcpコマンドに委任するために呼び出すことができる単純なシェルスクリプトを作成できます。しかし、私はそうしたくなく、3番目の例のように一般的に私には役に立ちません。

次のプラグインを使用してVimがさまざまな種類のリストを処理できるように、単純なキーの組み合わせを使用して入力した引数の順序を変更したいと思います。シャッギル

zsh用のプラグインはありますか?他のシェルのプラグインはありますか?

そうでなければ、zshを実装するのはどれほど難しいでしょうか?私はzsh-syntax-highlightingプラグインがパラメータ表示が可能であることを証明したと思います。実際、シェルはレコードから単一の引数を取得する方法を知っています。https://stackoverflow.com/a/21439621/340947

この問題は非常に深刻で使いすぎて、レコードの最後の項目を取得し、最後の2つのパラメータを置き換えてから、実行するショートカットにバインドする簡単なスクリプトを作成する必要がありました。ただし、コマンドの実行をコミットするのではなく、インタラクティブにスワップを実行できるように、ラインエディタを使用して動作するのと同じくらい理想的ではありません。

おそらくこれに対する改善は注入ですが!:0 !:2 !:1(zshは私に合うように自動サイズ変更されます)、これも多くの問題を抱えています:(1)間違ったコマンドを実行しないと機能しません。半分以上は、間違ったコマンドを入力した後に引数を変更したい(2)通常、コードスニペットで説明できないいくつかのフラグを使用します。

私も表示された方法を見ました。こここれは良いですが、まだ非常に不満足です。長いパスには多くの反復キー入力が必要で、Ctrl + Yアクションは複数の項目を保存するのではなく、最後に切り捨てた項目のみを呼び出すためです。知っておくと良いですが、私にはほとんど役に立ちません。

完全性のために、戦略は適切なキーの組み合わせを使用して単語を削除し、短いコマンドを削除して並べ替え、カーソル位置を変更し、マウスを使用して端末出力から削除されたパラメータをコピーし、貼り付けることです。普通の人には目もちらつきませんが、するたびに少し死んだような感じがします。コンピュータがこれを行うのがどれほど簡単か、そして私が感じる不正について考えることを止めることができないからです。 。マウスをつかむ必要があります。

ベストアンサー1

では、zshすべてのウィジェットはデフォルトで次から実行されます。性格一連の数字+文字で定義された単語のモードで機能するデフォルトのtranspose-wordsバインディングが含まれています。Alt+Temacs$WORDCHARS

$WORDCHARShasのデフォルト値*?_-.[]~=/&;!#$%^(){}<>は含まれているため、/転置に適している必要があります。これらのパスに追加の文字が含まれていない限り、問題ありません。:、、 ...を含むパスまたは@引用,符付きパスでは機能しません。

ただし、select-word-styleフレームワークを使用して定義を変更できます。言葉要求に応じて。

追加する場合:

autoload -U select-word-style
zle -N select-word-style
bindkey '\ez' select-word-style

それをあなたに与えて押す~/.zshrcと、Alt+Z次のオプションが表示されます。

Word styles (hit return for more detail):
(b)ash (n)ormal (s)hell (w)hitespace (d)efault (q)uit
(B), (N), (S), (W) as above with subword matching
?

押した後「詳しくはもう一度確認してください。」:

(b)ash:       Word characters are alphanumerics only
(n)ormal:     Word characters are alphanumerics plus $WORDCHARS
(s)hell:      Words are command arguments using shell syntax
(w)hitespace: Words are whitespace-delimited
(d)efault:    Use default, no special handling (usually same as `n')
(q)uit:       Quit without setting a new style

だから押すとSあなたに与えます変える2つのシェルワード(したがって、引用符で囲まれたスペースまたはコマンドの置換を含む単語を含む...)を使用しますAlt+T(または、1つを削除しCtrl+Wて1つに戻すAlt+Bなど)。

バラより

info zsh select-word-style

zsh-doc詳細は(zshドキュメント(Debianとその派生パッケージ)がシステムにインストールされていると仮定しています)。

あなたのために書かれているように見えるセクションがあり、それを調整して、transpose-wordsファイル名や単語の間などにカーソルがあるたびにカーソルがどのように機能するかを指定できます。

以下は、単語コンテキストスタイルを使用してコンテキストを拡張するいくつかの例です。

   zstyle ':zle:*' word-context \
          "*/*" filename "[[:space:]]" whitespace
   zstyle ':zle:transpose-words:whitespace' word-style shell
   zstyle ':zle:transpose-words:filename' word-style normal
   zstyle ':zle:transpose-words:filename' word-chars ''

これは、カーソルが単語間のスペースにあるのか、ファイル名(この場合は/を含む単語)にあるかに応じて、変換された単語を使用する2つの方法を提供します。空白の場合、標準シェル規則によって定義された完全なパラメータが置き換えられます。ファイル名には英数字のみが置き換えられます。他の場所では、単語はデフォルトのスタイルを使用して変わります :zle:transpose-words

たとえば、次のようになります。

autoload -U select-word-style
zle -N select-word-style
bindkey '\ez' select-word-style
select-word-style normal
zstyle :zle:transpose-words word-style shell

transpose-wordsするシェル常に単語を使用し、他のすべての単語ウィジェットはノーマル定義言葉Alt+Zを使用して変更できます(transpose-words

おすすめ記事