web-dev-qa-db-ja.com

矢印キーを使用せずに最後のコマンドを繰り返すにはどうすればよいですか?

私は使用できることを知っています Up 以前のコマンドを繰り返す。 lastコマンドを実行すると、 Up + Enter。しかし、vimに多くの時間を費やすため、 Happy Hacking Keyboard の購入を考えていました。

このキーボードには矢印キーがありません。この種の動作を取得する方法を知る唯一の方法は、 Ctrl + R そして、私の前のコマンドを繰り返し始めます。

エミュレートする簡単な方法はありますか Up + Enter 矢印キーのないUNIX端末では?

121
quant

cshまたはcshのような履歴置換を実装する任意のシェル(tcshbashzsh):

!!

その後 Enter


または または

!-1

その後 Enter


または Ctrl+P、 Enter


魔法の空間

また、!!!-1は、実行するまで(手遅れになる可能性がある場合)、自動拡張されません。

bashを使用する場合は、bind Space:magic-space~/.bashrcに入れて、 Space コマンドがインラインでそれらを自動展開した後、実行前にそれらを検査することができます。これは、少し前に実行されたコマンドからの履歴拡張に特に役立ちます。 !echoは、echoで始まる最後のコマンド実行をプルします。マジックスペースを使用すると、コマンドを実行する前にプレビューできます。

これは、tcshまたはzshbindkey ' ' magic-spaceを実行するのと同じです。

171
Sparhawk

コマンドライン編集機能を持つほとんどのシェルは、Emacsキーバインディングをサポートしています。 (小さなサブセット)

Up     Ctrl+P
Down   Ctrl+N
Left   Ctrl+B
Right  Ctrl+F
Home   Ctrl+A
End    Ctrl+E
Delete Ctrl+D

または、set -o viをシェルのスタートアップファイル(~/.bashrcなど)に追加して、viコマンド編集モードを使用するようにシェルを設定することもできます。次に、たとえば、

  • 使用する EsckEnter 前のコマンドを再実行します(!!と同じ)。マイナスキー - 「上に移動」コマンドとしても機能します。
  • 使用する EsckkkkkkkkkkkkEnter または Esc12kEnter 前の12番目のコマンドを再実行します(!-12と同じ)。
  • 使用する Esc およびモーションコマンド(つまり、 k、適切に繰り返されます)、次にeditそこにあるbashコマンドラインを編集します。まだviコマンドモードであるため、vi編集コマンドを使用する必要があります(例: I、 A、 C、 R、またはそれらの小文字のいずれか)を実際に履歴からコマンドに追加します。
    たとえば、 EsckisudoSpaceEnter Sudo !!と同等です。
  • 上級ユーザー向け:1行から(y ank)テキストをコピーして別の行に貼り付け(p ut)することもできるので、!-2:- !$に匹敵する結果を得ることができます。 (残念ながら、名前付きバッファーをサポートしていないようです。)

私のお気に入りは CTRL + P その後 CTRL + O

これはデフォルトで機能し、追加の設定は必要ありません。 ^ Pでは最後のコマンドに切り替え、^ Oでは現在の行を実行できます

ご了承ください CTRL + O 何度でも使用できます

30
daisy

承知しました! viキーバインドに慣れているので、それに応答するようにシェルを設定してみませんか? bashの場合、これを~/.inputrc

set editing-mode vi

Bashのインスタンスを実行しても、ファイルは再度読み込まれないため、ログアウトして再度ログインします。

zshはこれを検出します。起動スクリプトがbindkeyもしあなたの$EDITOR環境変数にviが含まれていることが検出された場合、viキーバインドが自動的に有効になります。強制する必要がある場合は、これを~/.zshrc

bindkey -v

その後、 ESC 通常どおりコマンドラインを入力し、 k そして j 上下に移動します。

[〜#〜] also [〜#〜]:ほとんどのシェルのデフォルトのシェルバインディングはemacsバインディングなので、実際には Crtl-P そして Ctrl-N 何も変更しなくても、すでに機能するはずです。

16
Celada

User Portabilityオプション(kshzshbashyash)、fcコマンドを使用することもできます:

fc -e : -1

例を見る:

$ echo "hello"
hello

$ fc -e : -1
echo "hello"
hello

詳細は 履歴から一連のコマンドを実行 のジョナサン・レフラーによる答え。

10
fedorqui

スーパーユーザーとしてコマンドを頻繁にやり直す必要があるので、

Sudo !!

最初の場所でSudoと入力したことを覚えているかのように、前のコマンドをやり直します。

6

すべてのMac iterm2ユーザーの場合:

バインドできます +R 0x0C 0x10 0x0d。これにより、ターミナルがクリアされ、最後のコマンドが実行されます。

iterm 2 key preferences

6
Brian Wigginton

cshまたはcshに似た履歴置換(tcshbashzsh)を実装するシェルでは、!<beginning of command>も使用できます<beginning of command>で始まる最後のコマンドを呼び出す。

たとえばあなたが走った場合

$ tail file.txt
$ less otherfile.txt
$ !ta

!tatail file.txtを実行します

3
Dan

kshシェルには、最新のコマンドを繰り返すデフォルトのエイリアスrがあります。 fc -sにバインドされています:

alias r='fc -s'

興味深いことに、bash組み込みのfcドキュメント(help fc、およびマニュアル自体にも)はこれについても言及していますが、そのシェルのデフォルトのエイリアスではありません。

これに使用する便利なエイリアスはr='fc -s'です。したがって、r ccと入力すると、ccで始まる最後のコマンドが実行され、rと入力すると、最後のコマンドが再実行されます。

bashでは、set +Hで履歴の展開をオフにしている場合でも、これは機能します。

zshシェルには、fc -e -と同じであると記載されているrビルトインがあります。

fcユーティリティは POSIX標準ユーティリティ です。

3
Kusalananda

tl; dr !!は、現在のコマンドに最後のコマンドを追加するだけです。 <backtick>!!<backtick>は最後のコマンドを実行し、現在のコマンドに出力を追加します。

実際には2つのバリアントがあります。

  1. 最後のコマンド自体
  2. 最後のコマンドの結果

2つの例を紹介しましょう。

例1

$ mkdir /test
mkdir: /test: Permission denied

$ Sudo !!
Sudo mkdir /test
Password:

上記のように、私はコマンドを実行しており、基本的に最後のコマンドを追加しています。

別のバリエーション

例2

$ find ~/Documents "test.txt"
/Users/<user>/Documents/test.txt

$ vi `!!`
# Opens test.txt. But if you do
$ vi !!
vi find ~/Documents -name "test.txt"
VIM - Vi IMproved 8.1 (2018 May 18, compiled Oct 29 2018 06:55:58)
Unknown option argument: "-name"
More info with: "vim -h"
1

!nターミナルでn番目のコマンドを実行します。ここで、「n」はhistoryコマンドの行番号です。

0
Ravi Sevta

私が良いxtermエミュレータを使用しているとき。 PuTTY、私のお気に入りの続行方法は、改行を含むコマンドを選択し、それをクリップボードにコピーしてから、マウスを右クリックして貼り付けることです。これにより、シングルクリックでコマンドが繰り返されます。これは、セミコロンで区切られた一連のコマンドでも正常に機能します。

0
Bernard Perrin

最後のコマンドを要求できる層がいくつかあります。

ラインエディター

ラインエディター(コマンドを入力する場所)は、ksh、bashのライブラリreadline、およびzshのライブラリzleによって直接提供されます。 dashなどの他のシェルには、このキーを理解するための編集ライブラリがない 場合があります(--with-libeditオプションを有効にしてコンパイルした場合を除く)。

Ksh、bash、zshでのこの作業:

Ctrl-P #Emacsモード(前)
Ctrl-N #Emacsモード(次へ)
ESC-k #viモードESCでコマンドモードに、kでアップ
ESC-j #viモードESCでコマンドモードに、jでダウン

歴史

多くのシェルによって提供される履歴システムは、いくつかのショートカットの拡張を可能にします:

!!    # bash and zsh, may be provided by `alias \!\!='fc -e -'` in ksh.
!-1   # bash and zsh only

コマンド

履歴コマンドを取得できるコマンドがいくつかあります。

かなり冗長なコマンドのように(印刷のみ):

history 2 | head -n-1

またはolderのため、通常はより移植性の高いfcコマンド(直接再実行):

fc -e - -1

または、おそらくより単純なfc -s -1ですが、zshはfcにそのようなオプションを受け入れません。

コマンドをprintだけにしたい場合は、fc -nl -1 -1を使用します。

編集するには、FCEDITをテキストエディター(ex、ed、emacs、viなど)に設定し、fcを直接使用します:fc -1

0
Isaac
  • Historyと入力し、実行して使用するコマンドの前の番号を書き留めます!number

  • !-1を使用することもできます(1は最後に実行するコマンドであり、取得したカウント数に置き換えます)最後に実行されたものを1として下から実行した場合)

  • !-2(最後から2番目など)
0
Lovish