何かをチェックしている間、ハーフタイプのコマンドを覚えておいてください


97

私はしばしば次の位置にいます:bashプロンプトで長いコマンドを入力し始めましたが、途中で別のコマンドで何かを確認する必要があることがわかりました。これは、コンソール(Xなし)にいるときの問題です。これはよくあることです。なぜなら、次のような不十分な方法しか持っていないからです。

  • ヒットctrl+ alt+ F2戻っていき、その後、別の仮想コンソールにログインして、私が望んでいたものを見つけます
  • ctrl+ a、echo + space+と入力してenter、必要なものを見つけ、コマンドが見つかるまで押しますctrl+ adelx 5、ctrl+ e、そして続行
  • マウスでこれまでに入力した内容をハイライトし(gpmが実行されている場合、通常)、中断するにはctrl+ cを押し、マウスを使ってハイライト表示しないように注意しながら必要なものを見つけ、マウスの中ボタンを押します新しいプロンプトで続行します
  • コマンドラインの神に祈ります。半分書かれたコマンドは悪影響を及ぼさず、単に失敗するだけで、Enterキーを軽く押してから、必要なものを見つけ、コマンドが返されるまで上矢印キーを押して続行します。
  • タイムマシンにジャンプして、時間をさかのぼり、コマンドを入力する前に画面を開始するように思い出させ、現在に戻り、ctrl+を押してa c、必要なものを見つけ、ctrl+を押してa ctrl+a続行します

私が知りたいのは、これを行うためのよりエレガントな方法がありますか?一種のサブシェルコマンドまたは類似のもの?

私は、動作するための準備やセットアップを必要としない方法に最も興味があります。

回答:


68

やや速いバージョンアレックスの Ctrl + A Ctrl+ K(行の先頭に移動し、その後、前方のすべてをカットする)だけで使用することですCtrl+ Ubashの上で後方に切断すると、全体のライン(関係なく、あなたの現在の位置の)zshの上。次に、Ctrl+ Yを使用して再度貼り付けます


1
これをテストすると、Ctrl + Uは後方に移動して前方にカットするのではなく、後方にカットするという結論に達しました。コマンドの中央にカーソルを置くと、コマンドラインでその後ろにあるものがすべて残ります。ただし、キーストロークを節約できるため、@ alexのソリューションよりも33%向上しています。
ラウリッツV.タウロウ

2
@lazyrああ、まったく正しい。その上zshで行全体をカットしますが、その上bashで後方にカットします。以前その違いに気づいたことはありませんでした
マイケルMrozek

2
ああ、Ctrl + Uがバッファを殺すためにテキストを入れることも知らなかった。知っておくといい!:)
アレックス

1
^U ^Kと同じ効果を持ちますが、^A ^K人間工学に基づいてわずかに人間工学的であり、の下で非常に便利screenです。
直観

53

Ctrlキーを押しながらAキーを押して行の先頭に移動し、ハッシュを追加してReturnキーを押すと、コマンド履歴にコメントとして残り、カーソルを上に戻すことができます

編集:これはあなたの#2のわずかにエレガントなバリアントであることに気付きました;)


1
はい、そしてなぜ私はそれを考えなかったのですか?ありがとうございました!
ラウリッツV.

1
自分の答えを投稿する前に読む必要があります。ジェームズはすぐにそれを持っています。
ショーンC.

4
これは、インタラクティブシェルでコメントを許可しないため、cshまたはzshコメントを許可しないため、機能しないことに注意してください。ではzsh、あなたは適切なオプションを有効にする必要がありますsetopt interactive_comments
サムホセバー

1
@Samはい、ただし「:コマンド」の効果は同じ(「:」= nullコマンド)
barrycarter

6
@barrycarter:いいえ、:この目的のために有害であると見なされるべきではありません。これは、関連するすべての副作用とともに、セミコロンの後、バッククティックなどの内側ですべてを実行します。
サムホセバー

29

を押してCtrl+ACtrl+K行の先頭に移動し、行末まで削除(kill)します。その後、調査を行い、続行する準備ができたらCtrl+Y、保存(キル)された行を戻すためにヒット(ヤンク)します。


3
ああ、今これは私が念頭に置いていたものに似ています。そして、私はEmacsでいつもそうしています。コマンドラインで同じことをすることを考えるべきでした。
ラウリッツV.ソーロウ

13

zshでは、入力中のコマンドを「中断」して別のコマンドを入力するためにCtrl+ Zを入力します。そのコマンドを実行した(またはCtrl+で中止したC)後、中断されたコマンドは編集のために戻ります(カーソルの位置を覚えていても)。さらに便利なように、Ctrl+ を入力したときにコマンドラインが空の場合Z、キーはbg代わりに組み込みを呼び出します(したがって、ダブルCtrl+ Zは実行中のコマンドを直接バックグラウンドに送信します)。

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

bashで似たようなことをする方法がわかりません。

どのシェルでも、現在の行の先頭にa#追加するローテクな方法を使用できます。


2
あなたの機能は立派ですが、既に組み込まれzshている機能があることを知っていましたか?それは呼ばれpush-line、あなたがする必要があるのはbindkeyそれを得るために使用することです。
カレブ

@Caleb:ここではpush-inputなく、なぜ私が使用するのかわかりませんpush-linepush-lineもっと適切だと思われます(古いバージョンのzshにしかなかったのpush-inputでしょうか?)。しかし、それは関数の残りの部分に置き換わるものではありません。
ジル

私が知る限り、唯一の違いは、実行中のジョブをバックグラウンドにバインドする効果です。何か不足していますか?
カレブ

1
@カレブ:いいえ、ちょうど2つの組み合わせが便利だと思うだけです(push-line空の行では役に立たない、bgオンCtrl+Zはそのプロセスを中断したときにのみ有用ですCtrl+Z)とニーモニック(私はプロセスをバックグラウンドにしています)または部分的なコマンドライン)。
ジル

3
@Caleb push-inputは入力バッファ全体を一時停止しますがpush-line、現在の行のみを一時停止します。複数行のコマンドを入力している場合、コマンド全体を中断したいのでpush-input、正しいコマンドも中断します。私push-inputpush-line(複数行の入力バッファの行を遅らせたい場合、単に行の先頭に移動して改行を挿入することができます)よりも便利であることがわかっているので、実際push-lineにデフォルトのキーバインディングがあり、ではない理由を疑問に思いますpush-input
ジル

13

bashでは、単にAlt+を入力し#ます。

次に、準備ができたら、Up次にAlt+を押します#

最初は#、行の先頭にa を挿入してコメントに変換し、次にを押したかのようにその行を受け入れますEnter

次に、2回目に実行すると、行#の先頭に既にaが表示されているので、削除して受け入れ、再びEnterキーを保存します。

2回目に別のものを挿入する場合は、代わりに+ + #を入力する必要があります。Alt- Alt#

あなたはzshに同じことをさせることができます

bindkey -M emacs '\e#' pound-insert

〜/ .zshrcで。

または、viバインディングを使用している場合#は、bashとzshの両方でコマンドモードから入力できます。


2
私にとってはうまくいきません。#を削除することを意図した2番目のコマンドは、先頭に#を追加するだけです。
ローリッツV. Thaulow

1
最初のものは機能しますか?使用しているbashのバージョンは何ですか?
ミケル

3
Alt +#は、3番目の段落で説明したとおりに機能しますが、4番目の段落ではなく、単に先頭に別の#を追加して行を受け入れます。Ubuntu 10.10ではbash 4.1.5(1)-releaseを使用しています。
ローリッツV.タウロウ

1
ああ、bashでは数値引数が必要です。たとえばEsc+1Alt+ #を押して切り替えます。
ミケル

これは機能しますが、特にAlt +#が実際にはAlt + Shift + 3であるキーボードレイアウトでは、Ctrl + A Del Ctrl + Eよりもはるかに面倒です。
ローリッツV.タウロウ

10

私のお気に入りの機能の1つは、zshここにある他の回答のハッカーなしでこれを処理する組み込みのプッシュライン機能です。私のファイルでは、次のようにCtrl+ lにバインドされてい.zshrcます。

bindkey '^L' push-line

次に、いくつかのコマンドを入力していて、何か他のことをすばやく実行する必要がある場合、1つのキーでそれを呼び出して、空白のプロンプトを表示できます。他のコマンドを実行した後、以前に入力していた内容がプロンプトに自動的に入力されます。

これの複数のレイヤーをチェーンすることもでき、コマンドはキューにプッシュしたのと逆の順序で戻ってきます。


5
バインドCtrl+Qし、ESC q(Emacsのモード)はデフォルトで。
ジル

bashに似たようなものはありますか?
マグナス

@Magnus:この質問に関する残りの回答を確認してください。bashには解決策がありますが、これほどエレガントではありません。
カレブ

@カレブ、私はもっと具体的にすべきでしたが、bash には同様の単一のキーの組み合わせがありますか?
マグナス

1
Zshにとって、これは明らかに「正しい」答えです。push-line-or-editデフォルトでキーマップにバインドされていないウィジェットについて言及したいだけです。トップレベルのプロンプトでは、と同じことをしpush-lineますが、それより低いプロンプトレベルでは、入力されるコマンド全体を複数行のバッファーに変換します。1つのキーバインドで2つの素晴らしい機能!私push-line-or-editはプレーンの代わりにバインディングをお勧めできpush-lineます。あなたは何も失うことなく、有用な機能を獲得します。
wjv

5

加えてctrl- a ctrl- kあなたは画面にならトリック、ちょうどctrl- a dと再接続し、その後デタッチしますscreen -r

ctrl+で別のウィンドウを開くこともできますa c


8
画面にいる場合は、で別のウィンドウを開いてくださいCtrl+A c
ジル

1
@Gilles ..シェル状態の何らかの側面(変数、関数、エイリアスなど)を使用する必要がない限り。
直観

4

ただし、完璧ではない別の方法を押しCtrl-X Ctrl-Eます。これにより、ハーフタイプされたコマンドを含むデフォルトのエディターが開きます。次に、コマンドをファイルに保存するか、エディター内から新しいシェルを開きます。新しいシェルを終了すると、エディターに戻り、内容を保存すると自動的に実行されます。

これは元のシェルに戻らないため完全ではありませんが、コマンドの実行を強制するか、完全に破棄します。ただし、心配する一時的な選択やキルバッファはありません。また、たとえば、editor = vi

:wq            # execute the command
:cq            # cancel and abort
:! command     # execute command
:shell         # open a new shell
:r filename    # insert the contents of a file for editing
:r ! command   # insert the output of a command for editing

とてもいい代替品。私はvi-emacsにとらわれないので、powertoolsが本当に必要なときにこれを使用してハマグリとして幸せになります。(viといえば、私は少し前にN64 LinuxエミュレーターMupen64Plusを試しました。Escは保存せずにエミュレーターを終了しました。すぐに何もするのをあきらめました。)
Lauritz V. Thaulow

1
@ lazyr、debian / ubuntuを実行sudo update-alternatives --config editorして、お気に入りのエディターを選択します。他のシステムでは、EDITORまたはVISUAL環境変数をお好みのエディターに設定export EDITOR=/usr/bin/nanoします。たとえば、.bashrcを追加します。
-forcefsck

3

#行の先頭に追加する方法と同様に、行の先頭に戻る必要のない、私が使用するほぼ単純な方法があります。

ただ、オープン引用符を追加して、それを閉じていないシングルまたはダブルか。

次にを押しEnterます。

次にを押しCtrlCます。

部分的なコマンドはコマンド履歴に保存されます(上矢印で使用可能)が、実際には実行されません。


2

zshを使用して<ESC> q(escape、次にQ)と入力すると、プロンプト行が切り取られるため、別のコマンドを入力できます。次のプロンプトでカットテキストが自動的に返されます。

同時に複数の行を記憶できるため、行が待機しているときに使用できます。空白行で使用して、カットラインの再開を遅らせることもできます。

チェック/準備に複数のコマンドを使用する必要がある場合、これは最も効率的な方法ではありません(<ESC> q各コマンドの前に再入力する必要があります)。しかし、より短いショートカットにバインドすることは可能だと思います。


マニュアルを確認するだけの場合は、<ESC> h(エスケープしてからH)と入力します。これrun-helpにより、コマンドラインの最初の単語を引数として組み込みコマンドが実行されます。完了したら、元のラインに戻ります。


ほとんどの端末では、M-q代わりに<ESC> q
-sleblanc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.