現在のシェルコマンドを実行せずに編集するにはどうすればよいですか?


13

"edit-and-execute-command(Cx Ce)"を使用してエディターを使用してコマンドを編集および実行する方法についてはかなり多くの情報があるようですが、私が達成したいのは、現在のシェルコマンドを取得して適用することです特定のフィルタリング(スクリプトを使用)してから、実行前に、承認/手動変更を求めるプロンプトに戻ります。これはbashで可能ですか?


これは質問に対する正しい答えではありませんが、ネイティブのBashの代わりにZSH端末を使用してみてください。オートコンプリート機能があるため、すぐにコマンドを実行しないでください。私は個人的にこの特定のシナリオを試しましたが、を実行するときは常にEnterキーを押す必要がありますedit-and-execute-command
Praveen Premaratne

1
私にとってうまくいくショートカットはEscape+ ですがV、それでもコマンドは実行されます。回避策についてはecho、コマンドをコンソールに出力して確認することで実行するように前に追加します。
ケノーブ

2
具体例を挙げていただけますか?「特定のフィルタリングを適用し(スクリプトを使用)、プロンプトに戻す」と理解できません。
ケント

3
@PraveenPremaratne:zshはターミナルではなく、シェルです。
Arkadiusz Drabczyk

回答:


7

私の経験に関する最新の更新

0"+y$dd次のマッピングの部分は、実際に慎重に検討し、好み、ワークフロー、経験に合わせて調整する必要がある部分です。

たとえば、非常に頻繁に私は自分がバッファ内の複数の行で終わることに気づき、カーソルが置かれている行のみを実行したいと思っています。この場合、の0"+y$dd:%d<CR>代わりに使用できます0"+y$dd

そして、これは可能なシナリオの1つにすぎません。

好きな人のための最終的な答え vim

元の答え

私はしばしば同じことをする必要があります、そして私は次のようにそれをします。(私は通常、使用set -o vi中にbashあなたが使用している場合、以下の点1と2が異なっているので、set -o emacsそれはで統一されているポイント1及び2のように見えるあなたの質問に基づいて、デフォルトCtrl+ xに続くCtrl+ e入力するのは難しいです、私見。)

  1. Escape通常モードになるためにヒット、
  2. ヒットvコマンドを編集するエディタを入力し、
  3. 好きなようにコマンドを編集し、

(ここで質問します。)

  1. ヒットEscape0"+y$dd:wq
    • 注:0"+y$単に"+yyではなく、後者は改行もコピーし、コマンドラインに貼り付けるとコマンドが実行されるため、
  2. クリップボードをコマンドラインに貼り付ける
    • これを行う方法は、使用している端末によって異なります。私はヒットCtrl+ Alt+ vの中でURxvt
  3. 承認/手動編集に進みます。

明らかにこれは単なる回避策であり、編集されたコマンドをコマンド全体を削除する前にクリップボードにコピーすることで構成されているため、エディターを終了しても何も実行されません。しかし、それは私が自分で得ることができる最高のものです。

更新

EDITOR(およびVISUAL)はに等しいのでvim、コマンドを編集するときはで編集しvimます。

この点で、バッファの名前がであることに気づきました/tmp/bash-fc.random。ここrandomで、は6文字の英数字のランダム文字列です。

シーケンス全体を実行するためにvimマッピングを定義できるため、エディターとして使用する場合、これにより多くの可能性にスペースが与えられます。たとえば、コマンドラインの編集時にほとんど使用しないコマンドは次のとおりです。したがって、次のpingをファイルに入れることができます.vimrcEscape0"+y$dd:wqLeaderdmap.vimrc

au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>

上記のレシピのステップ4が

  1. ヒット EscapeLeaderd

私にとって、これはコマンドを編集する最良の方法です
A.Villegas

2

Bash / readlineではそれを行うことはできませんが、zshではedit-command-line次のコマンドを使用して可能です。

darkstar% autoload edit-command-line; zle -N edit-command-line
darkstar% bindkey "^X^E" edit-command-line

今プレスControl- x Control- eあなたのエディタを開くために、編集行は、エディタを終了-あなたが更新され、コマンドラインが表示されますが、それは自動的に実行されることはありません。


1

今考えてみると、@ kenorbがコメントで提案したもののバリエーションが、に固執したい場合の最善の回避策です(解決策は存在しないようです)bash

あなたができることは、コマンドの前に#bashではなくコメント文字)を付けることですecho。その後、出口を終了すると、コマンドは無効になり、arrow up(またはkを使用する場合はset -o vi)を押して削除し#、確認するだけで済みます。

この方法では、キーストロークが数個追加されるだけなので、入力レベルによってはかなり効率的になることに注意してください。


1

これらの部分はあなたをより近づけるかもしれません:

a)改行newline(ctrl-M)の通常のバインディングを置き換えます bind -x '"\C-M":date"

b)を使用して履歴から現在の行を取得します !#

日付を任意のスクリプトに置き換えます。

c)手動で編集する

d)必要に応じて、!!:p新しいコマンドをコマンドラインに出力しますが、実行しないので、手動で編集できます。

e)改行ではなくctrl-J submit編集コマンドを使用する

またはそうでないかもしれません...


1

コマンドを実行せずに履歴からコマンドを変更するオプションがbashにあります。これにスクリプトを使用することが可能かどうかはわかりませんが、可能性は低いようです。ただし、履歴修飾子を使用して変更を加えることができます。

  1. 変更されたコマンドの実行を防ぐために、オプションhistverifyを有効にします
  2. 修飾子のチェーンを使用して最後のコマンドを変更する
  3. 使用する "!!" 最終的な編集のために結果をコマンドラインに書き込む

これがどのように見えるかです:

$ shopt -s histverify
$ ls *.sh
script1.sh  script2.sh  script3.sh  script-return.sh
$ !!:s/*/script1/:p
ls script1.sh
$ !!:s/1/2/:p
ls script2.sh
$ !!
$ ls script2.sh
script2.sh

1

Bash のComposureフレームワークを紹介します(私はそれとは関係ありません):https : //github.com/erichs/composure

それは提供draftし、revise彼らはあなたが何をしようとしてで助けることができるようにその音機能。これは、プロジェクトのreadmeファイルからの(長い)引用です。

Composureを使用すると、簡単なシェル関数をすばやく作成でき、長いパイプフィルターと複雑なコマンドを読み取り可能で再利用可能なチャンクに分解できます。

最初に下書き、後で質問する

コマンドの宝石を作成したら、それを捨てないでください!使用 draft ()して良い名前を付けます。これにより、最後のコマンドが後で再利用できる関数として保存されます。下書きのように考えてください。

  $ cat servers.txt
  bashful: up
  doc: down

  up-arrow

  $ cat servers.txt | grep down
  doc: down

  $ draft finddown

  $ finddown | mail -s "down server(s)" admin@here.com

改訂、改訂、改訂!

最小限のシェル関数を取得したので、リファクタリングとリビジョンによってそれをより良くしたいかもしれません。revise ()コマンドを使用して、お好みのエディターでシェル関数を修正します。

  • 入力パラメーターを使用して関数を一般化する
  • 機能を追加または削除する
  • ドキュメントのサポートメタデータを追加する

    $ revise finddown
    finddown ()
    {
      about finds servers marked 'down' in text file
      group admin
      cat $1 | grep down
    }
    
    $ finddown servers.txt
    doc: down

0

キーボードショートカットでは、少なくとも次のことは不可能のようです。

$ bind -P | grep -e command -e edit
complete-command can be found on "\e!".
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
possible-command-completions can be found on "\C-x!".
vi-editing-mode is not bound to any keys
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.