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


115

Up以前のコマンドを反復処理するために使用できることを知っています。最後のコマンドの実行には、単にUp+が含まれEnterます。しかし、私はで多くの時間を過ごすので、Happy Hacking Keyboardを買うことを考えていましたvim

このキーボードには矢印キーがありません。このような動作を実現する方法を知る唯一の方法は、Ctrl+ Rを押して前のコマンドを繰り返し始めることです。

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


1
端末タグは、使用するシェルに置き換える必要があります。
クリスティアンシウピトゥ14

2
@illuminÉマウスなし...
quant 14

Happy Hacking Keyboardは2006年に廃止されませんでしたか?
ピーターモーテンセン

@PeterMortensenいいえ、まだ利用可能です。最初のバージョンを参照しているかもしれませんが、新しいモデルは引き続き利用可能です。
quant

回答:


164

cshまたは任意のシェル実行csh様ヒストリ置換(tcshbashzsh):

!!

それからEnter


または、代わりに

!-1

それからEnter


またはCtrl+ PEnter


マジックスペース

また、それを注意!!して!-1(それは遅すぎるかもしれないとき)あなたがそれらを実行するまで、あなたのための自動展開しません。

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

これはbindkey ' ' magic-spacetcshまたはで行うのと同等ですzsh


1
@アーマンは助けてくれてうれしい。たくさんの履歴展開コマンドがあります。リンクにはそれらの一部がリストされています。これらのいくつかの使用に役立つかもしれない魔法の空間に関するいくつかの情報を編集しました。
Sparhawk

3
magic-spaceそれは一つの甘いオプションです!
fduff 14

1
また、readlineで履歴展開を実行するが、Enterキーを最初に押したときにコマンドを実行しないhistverifyオプションもありますshopt。これにより、結果を評価し、それを実行するかどうかを決定できます。
エタンReisner 14

2
理由がわからない!! CTRL-Pよりもはるかに多く使用されます。CTRL-Pを使用すると、コマンドを実行する前に確認できます。また、変更することもできます。私はいつもサイコロを振っているような気がします!!。
abonet

1
@abonet私が見つけたもう1つの用途!!は、その拡張をインプレースで使用することです。たとえばsudo !!
スパラフーク14

50

コマンドライン編集機能を備えたほとんどのシェルは、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シェル起動ファイル(例:)に追加して、viコマンド編集モードを使用するようにシェルをセットアップできます~/.bashrc。次に、たとえば、次のことができます

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

端末とのemacsの関係については知っていました...しかし、viトリックは素晴らしかったです!!!
Dox 14

deleteZtlでCtl + u を取得
Timo

1
これはreadlineライブラリによって実装されます。さらなるショートカットはそのドキュメントにあります。
スパイディ

28

私のお気に入りはCTRL+ Pthen CTRL+O

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

CTRL+ Oは何度でも使用できることに注意してください


2
^ Oは私のMacでは何もしません。
スノークラッシュ

1
@Snowcrashトライ^J
デイジー

これはlspwd以前に行ったことがある場合でも、空白行をエコーするだけです。
スノークラッシュ

それだ^ P ^その後、J ... @Snowcrash
デイジー

Ctrl + PはHP-UXでは機能しません(使用しているシェルがわかりません)。回避策は、「zsh」を呼び出すことです。
ピーターモーテンセン

15

承知しました!あなたはviキーバインディングに慣れているので、それらに応答するようにシェルを設定してみませんか?のためにbash、これをあなたのに入れてください~/.inputrc

set editing-mode vi

bashのインスタンスを実行してもファイルは再読み取りされないため、ログアウトしてからログインし直してください。

zshでも、あなたのためにこれを検出します:あなたの起動スクリプトはいずれも一つの方法または他の使用して編集モードを強制していない場合bindkey ご使用の場合は$EDITOR、環境変数が含まれていることが検出されvi、それが自動的に有効になりますviキーバインドを。あなたがそれを強制する必要がある場合、これをあなたのに入れてください~/.zshrc

bindkey -v

その後、使用ESCのコマンドラインを入力すると、通常のようにkしてj上下に移動すること。

ALSO:ほとんどのシェルではデフォルトのシェルバインディングはそう実際、EmacsのバインディングですCrtl-PCtrl-N、すでに何も変更せずに動作するはずです。


9

すべてのPOSIXシェルが実装して、ユーザーの携行用オプション(含んをkshzshbashyash)、あなたも使用できるfcコマンドを:

fc -e : -1

例を参照してください。

$ echo "hello"
hello

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

Jonathan Lefflerによるhistoryの回答からの一連のコマンドの実行の詳細。


6

Mac iterm2ユーザーの場合:

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

iterm 2の主要な設定


ターミナルをクリアせずに最後のコマンドを繰り返す方法はありますか?
ルークデイビス

ああ、決して気にしないでください:これを読んでいる人は、端末をクリアせずに繰り返すには、使用します0x10 0x0d(つまり、を省略します0x0C)。
ルークデイビス

5

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

sudo !!

そもそもタイプsudoするのを覚えているかのように前のコマンドをやり直します。


2
私はこれが本当に好きで、「許可が拒否されました」に対する良い反応のようにも見えます。「sudo ffsを意味しました!」
ヴィクトルメルグレン14

3

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

alias r='fc -s'

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

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

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

zsh殻があり、r同じであることが実証されている組み込みfc -e -

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


2

csh実装するか、任意のシェルcsh様ヒストリ置換を(tcshbashzsh)、あなたも使用することができます!<beginning of command>から始まる最後のコマンドを呼び出すこと<beginning of command>

たとえば、走った場合

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

!ta 実行するだろう tail file.txt


1

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 vi `!!`。非常に便利
le_daim

0

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


0

!nターミナルでn番目のコマンドを実行するために使用できます。ここで、「n」はhistoryコマンドの行番号です。


どのシェル!?が最後のコマンドに展開されますか?混同していないのは確かですか!!(他の回答で既に説明しました)。
アンソニージョゲガン

申し訳ありませんが、実際には、このコマンドを実験していました。編集した回答を確認してください。@AnthonyGeoghegan
ラビセヴタ

これが私が探していた近道でした。ありがとう!
le_daim

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

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

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

0

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

行エディタ

行エディタ(コマンドを入力する場所)は、ksh、bashのライブラリreadline、およびzshのライブラリzleによって直接提供されます。ダッシュなどの他のシェルには、このキーを理解するための編集ライブラリがない場合があります(--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

または、より古く、したがって通常はより移植性の高いfcコマンド(直接再実行):

fc -e - -1

または、もっと単純かもしれfc -s -1ませんが、zshはfcのそのようなオプションを受け入れません。

コマンドのみを印刷する場合は、次を使用しますfc -nl -1 -1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.