web-dev-qa-db-ja.com

カーソルの下のコマンドのためにbashシェルの男を​​呼び出す

zshで私はできる Esch 任意のコマンドについて、このコマンドのmanページを取得し、manページャーを終了して、すべての引数を指定してコマンドを取得します。たとえば、私のシェルには次のように入力されます。

zsh# tar -czvf docs.tgz docs

を押すと、tarの男性を呼び出すことができます Esch、任意の場所にカーソルを置きます。

今、私は同じことをしたいのですが、bashです。考えられる解決策の1つを以下に示しますが、他に解決策があるかどうかを知りたいと思います。

bind '"\eh": "\C-a\ef\C-k\C-f\C^Cman \C-y\C-m\C-y\C-y\ey"'
6
ayambit

コマンドライン操作について話すときは、実際にはreadlineライブラリについて話します。リードラインバインディングの更新は、例のようにコマンドラインから、リードライン/etc/inputrcのメインinitファイル(echo $INPUTRCで確認)で実行するか、アカウント~/.inputrcのローカルinitを作成することができます。まだルックアップしていない場合GNU readlineライブラリ( ここで試してください

そうは言っても、ここにあなたの問題に対するいくつかの提案があります:


提案1

  • zshはreadlineを使用しており、zshのアカウントでESC-h(\eh)のキーバインディングを検査し、そのバインディングをbashでアカウントにコピーできる可能性があります。一部の本当に賢い人々はそれらのバインディングをまとめました、そしてそれは微調整なしで働くかもしれません。
    • Zshアカウントでは、bindコマンド(bind -P [生のバインディング出力に小文字のpスイッチを使用])を使用して、zshアカウントのアクティブなバインディングを表示します。
    • Bindの出力から実際のコードをつなぎ合わせる必要があるかもしれません。
    • Bashアカウントのバインディングに完全な行を追加します(上記で試みたように)

提案2

  • 上記の例のパスに従ってください

その点で、上記の例は機能する可能性がありますが、少し調整する必要があります。これは私のために働いた

  • "\eh": "\C-a\C-kman \e1\e.\C-m\C-y\M-y"

バインディングを/ etc/inputrcに入れました。キーシーケンスctrl+x ctrl+rを使用して、コマンドラインでinputrcを再度読み取る必要があります。

しかし、あなたの質問は、カーソルの下のWordに対してこれをどのように行うかです。これは私のために働いた:

  • "\eh": "\ef\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d"

要するに、それはこのように機能します:

キーシーケンスの場合\eh(ESC + h)

  • 最初に単語の終わりを見つけ、次に始まりを見つけます(\ef\eb
  • 現在のWord(興味のあるWord)を削除し、元に戻します(\ed\C-y)。キルバッファに入れる必要があります。
  • コマンドライン全体をコメントアウトして、新しいプロンプトに移動します(\e#
  • コマンドラインで「man」と入力します(スペースに注意してください)
  • 目的のコマンドをコマンドラインに貼り付けて実行します(\C-y\C-m
  • コマンド履歴で2番目の(前の)エントリを見つけます(「man」、次に元のコマンド)(\C-p\C-p)。
  • 行の先頭に移動し、コメント文字を削除します(\C-a\C-d

提案3

  • Emacsとviモードを使用するようにreadlineを設定します。キーバインディングで、お気に入りの非常に強力なエディタコマンドのほとんどを使用できる場合があります。

注:これまでこのオプションをバインディングとして実装しようとしたことはありませんが、コマンドラインで使用しています。これは、inputrcファイルまたはbashrcを介して設定できます。

  • Inputrcの場合:set editing-mode vi
  • Bashrcの場合:set -o vi

バインディングを実行するプロセスは、デフォルトのreadlineキーシーケンスに似ているようです。しかし、提案2の例は、正しい道を歩むはずです。

2
Wolf