端末のコマンドラインでカーソルを移動する最速の方法は?


155

ターミナルで与えられた非常に長いコマンドラインを移動する最良の方法は何ですか?

矢印キーまたはCtrl- を使用して、Rこの長いコマンドラインを取得するとします。

./cmd --option1 --option2 --option3 --option4 --option5 --option6 --option7 --option8 --option9 --option10 --option11 --option12 --option13 --option14 --option15 --option16 --option17 --option18 --option19 --option20 --option21 --option22 --option23 --option24 --option25 --option26 --option27 --option28 --option29 --option30 --option31 --option32 --option33 --option34 --option35 --option36 --option37 --option38 --option39 --option40 --option41 --option42 --option43 --option44 --option45 --option46 --option47 --option48 --option49 --option50 

ここで、カーソルを(行の最初または最後から)移動して、--option25そこで何かを変更する必要があります。

そこに到達する最速の方法は何ですか?私は通常行うことであるCtrl- Aを繰り返し、その後最初に取得し、ためにAlt- F(または単語によって、前方の単語を移動するCtrl- E最後に行くとAlt- Bその後、後方に行くこと)。しかし、長い時間がかかる長い列では。修正する必要がある部分を直接検索してジャンプする方法が必要option25です。

回答:


107

これはまだクローズされていないため、さらにいくつかのオプションがあります。

  • Ctrl+のx後にCtrl+ eを使用して、$FCEDITor $EDITORまたはorで指定されたエディターで現在の行を開きますemacs(この順序で試行されます)。
  • 以前にコマンドを実行した場合は、Ctrl+ rを押して逆履歴検索と入力を行いますoption25(この場合)。線が表示されます。ヒットTabこの時点で編集を開始します。
  • s///モディファイアで履歴拡張を使用します。たとえば!-2:s/--option25/--newoption/、最後から2番目のコマンドを再実行しますが、option25を置き換えます。最後の./cmdコマンドを変更するには、!string構文を使用します!./cmd:s/--option25/--newoption/
    。置換の/の代わりに任意の区切り文字を使用できます。
  • 前の行を編集する場合は、クイック置換を使用できます。 ^--option25^--newoption
  • 文字検索。これはPaxによって言及されており、通常のemacs-modeでCtrl+ ]を前方検索に、Ctrl+ Alt+ ]を後方検索に使用できます。

2番目のオプションをお勧めします。Ctrl+ rは非常に便利で高速で、エディターをいじる必要はありません。コマンドを実行する前に、履歴の展開とは異なり、結果が表示されます。


203

明確にするために、「端末のコマンドラインでカーソルをすばやく移動する方法」は必要ありません。実際に必要なのは、シェルプログラムのコマンドラインをすばやくナビゲートする方法です。

たとえば、bashは非常に一般的なシェルです。Readlineライブラリを使用してコマンドライン入力を実装します。言うまでもなく、Readlineバインディングはbashだけでなく使用されるため、知っておくと非常に便利です。たとえば、gdbもReadlineを使用して入力を処理します。

Readlineのドキュメントでは、ナビゲーション関連のすべてのバインディング(およびその他)を見つけることができます。http//www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

上記のリンクがダウンした場合は、短いコピー貼り付け:

ベアエッセンシャル

  • Ctrl-b 1文字戻ります。
  • Ctrl-f 1文字進みます。
  • [DEL]または[Backspace]カーソルの左側の文字を削除します。
  • Ctrl-dカーソルの下の文字を削除します。
  • Ctrl-_またはCx Cu最後の編集コマンドを元に戻します。空の行に戻るまで元に戻すことができます。

移動

  • Ctrl-a行の先頭に移動します。
  • Ctrl-e行の終わりに移動します。
  • Meta-f単語が文字と数字で構成される単語を前に移動します。
  • Meta-b単語を後方に移動します。
  • Ctrl-l画面をクリアし、現在の行を最上部に再印刷します。

キルアンドヤンク

  • Ctrl-k現在のカーソル位置から行末までのテキストを削除します。
  • Mdカーソルから現在の単語の終わりまで、または単語の間にある場合は次の単語の終わりまで殺します。単語の境界は、MFが使用するものと同じです。
  • M- [DEL]カーソルから現在の単語の先頭を削除します。単語間の場合は、前の単語の先頭まで削除します。単語の境界はMbで使用されているものと同じです。
  • Ctrl-wカーソルから前の空白まで削除します。単語の境界が異なるため、これはM-とは異なります。
  • Ctrl-y最後にキルしたテキストをカーソル位置のバッファにヤンクします。
  • 私はキルリングを回転させ、新しいトップをヤンクします。これは、前のコマンドがCyまたはMyの場合にのみ実行できます。

Mはメタキーです。Max OS Xターミナルの場合は、[設定/キーボード]で[オプションをメタキーとして使用]を有効にできます。Linuxの場合はさらに複雑です。

更新

また、Readlineは次の2つのモードで動作できることに注意してください。

Bashを切り替えてviモードを使用するには:

$ set -o vi

個人的には、テキスト編集にvimを使用するため、viモードを好みます。

ボーナス

macOSターミナルアプリ(およびiTermでも)では、Optionキーを押しながらクリックしてカーソルを移動できます(カーソルはクリックした位置に移動します)。これは内部でも機能しますvim


3
私はこの答えを好みます。それは、bashキーボード入力がどのように機能するか(それがどこから来るか)、つまり[Readline]の[エッセンス/ルート/理由]が下がるからです。
eugenevd 2013

6
標準のUbuntuターミナルでは、メニューアクセスのキーボードショートカットを無効にしない限り、メタ(M)はAlt + Shiftです。
brianpeiris 2013年

2
Konsole in Konsoleでは、メタ(M)はaltキーです
Pipo

問題は、ALTが実行中のプログラム(この場合は端末)のメニューにアクセスできるため、MetaがALTの場合、Meta + Fが機能しないことです。代わりはありますか?
ピティコス2014年

1
Mfとは何か、ここではコントロールを使用しないので、それは何ですか?
PositiveGuy

33

Optionキーを押しながらカーソルを移動したい場所をクリックすると、Terminalがカーソルをその正確な位置に移動します。


2
あなたはちょうど私の効率を重複
レイ・ゴンサレス

これはどの環境で機能しますか?私はMac OSだけで推測しますか?
アブドル2017年

ジャンプサーバーを介しても、リモートのssh linuxで動作します。
ジョンジャン

10

私はvi編集モードを好む傾向があります(これらのキーストロークは今では脊髄に埋め込まれているため(脳はまったく使用されていません)、WordStar 3.3のCTRL-K、CTRL-Xと一緒です:-)。コマンドラインset -o viを使用して、アクティブ化(およびset -o emacs復帰)できます。

Viでは、(ESC-Kで最初にラインアップを取得します) " f5;;B"(二重引用符なし)になります。

もちろん、これを回避するには、何が問題になっているのかを理解する必要があります。基本的には

f5 to find the first occurrence of "5" (in --option5).
;  to find the next one (in --option15).
;  to find the next one (in --option25).
B  to back up to the start of the word.

emacs愛好家が5回未満のキーストロークでより良い解決策を考え出せるかどうかを見てみましょう(ただし、宗教戦争は開始したくありません)。

この恐ろしく長いコマンドをスクリプトに入れるかどうかについて考えましたか?:-)

実際、私はそれよりも1つ上に行くことができます。「3f5B」で「5」の3番目の出現を見つけてから、単語の先頭に戻ります。


スクリプトは必要ありません-viモードで「v」を押して、エディターでコマンドラインを開きます。コマンドライン、エラー、「スクリプト」を改行でより適切にフォーマットでき、一時ファイルは必要ありません。:)したがって、「v / 25」は4文字で表示されます。
dannysauer 2009

しかし、それを実行するには、<Enter>キー以上のものが必要です。@dannysauer
CDR

9

Meta-b / Meta-fを使用して、単語ごとに前後に移動します。

OSXでは、MetaはESCに変換されます。

しかし、別の方法として、ターミナルの設定->設定->プロファイル->キーボードを開き、「オプションをメタキーとして使用」をチェックすることもできます


8

コマンドを一度実行した後、実行します fc

$EDITOR前のコマンドで起動し、通常のエディターを使用してコマンドを変更できます。保存して終了すると、ファイルが実行されます。

..しかし、Paxが言ったように、コマンドラインは不条理に長い行を編集するのに特に適していません。コマンドをスクリプトにしてみませんか?


4

特定の数の単語を前に進めたい場合は、ヒットM-<n>M-Metaとその通常のエスケープキー用)を押してから、数字を押します。これは繰り返し引数をreadlineに送信するので、好きなコマンドを繰り返すことができます。前に進みたい場合は、を押すM-<n> M-fとカーソルが<n>単語数だけ前に移動します。

例えば

 $|echo "two three four five six seven"
 $ M-4
 (arg: 4) echo "two three four five six seven"
 $ M-f
 $ echo "two three four| five six seven"

したがって、あなたの例では、行の先頭にあるカーソルからヒットし、M-26 M-fカーソルは--option25|-または-行の終わりからM-26 M-bカーソルを--|option25


2

増分履歴検索

端末に入力:

gedit  ~/.inputrc

次に、コピーして貼り付けて保存します

"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char

前のコマンドを見つけるために必要なのは、最初の2文字または3文字を入力するだけです。上矢印を押すと、すぐに私が欲しいと言います。

for f in *.mid ; do timidity "$f"; done

入力するだけです

fo

上矢印キーを押すコマンドがすぐに表示されます


1

1つのオプションは、で使用M-x shellすることemacsです。これは、すべての編集機能とキーストロークをemacs備えているためC-s、テキストの検索に使用できますoption25たとえば、。

(しかし、誰かが私に良い検索と編集機能を教えてくれるなら、私は実際のターミナルシェルにいるほうがいいです。)


0

マウスを使う

コマンドラインを編集する最も簡単な方法は、マウスを使用することです。以前のいくつかの回答では、$ EDITORで現在の行を開くコマンドを提供しています。私(zhmlとgrml config)の場合、その組み合わせはAlt+eです。エディターでマウスを有効にすると、それを利用できます。

Vimでマウスを有効にするには、これを〜/ .vimrcに追加します

set mouse=a
set ttymouse=xterm2

(マウスクリックをvimに渡す代わりに)端末でテキスト選択を行う場合は、Shiftキーを押しながらクリックします。もちろん、これは端末固有です。

システム管理者はマウスを恐れるべきではありません。


0

Cygwinでは、ウィンドウを右クリックすることでそのような機能をアクティブ化できます。ポップアップウィンドウで、[ オプション...] -> [マウス]-> [ クリック]を選択し、コマンドラインカーソルを配置します -> [適用]をクリックします

これからは、コマンドライン内の任意の位置でマウスの左ボタンをクリックするだけで、そこにカーソルが置かれます。


0

最初:export EDITOR = 'nano -m'

次に、CTRL + X CTRL + Eを順に押します。

現在の行は、マウスを有効にしてnanoエディターで開きます。テキストの任意の部分をクリックして編集できます

CTRL + Xで終了し、yで保存を確認します。


0

コマンドラインカーソルをマウスのクリックで移動させるスクリプトを作成しました。

  1. xtermマウス追跡レポートを有効にする
  2. クリックによって生成されたエスケープシーケンスを使用するようにreadlineバインディングを設定する

これは、上で見つけることができますgithubの

別の投稿の詳細

あれば動作しますecho -e "\e[?1000;1006;1015h" # Enable trackingマウスでクリックすると、端末上で印刷エスケープシーケンス


0

最速ではないかもしれませんが、これはここにある必要があります。ANSIカーソルの動きについてのいくつかの資料

ANSIエスケープシーケンスを使用すると、画面上でカーソルを自由に移動できます。これは、シェルスクリプトによって生成される全画面のユーザーインターフェイスの場合に便利ですが、プロンプトでも使用できます。移動エスケープシーケンスは次のとおりです。

- Position the Cursor:
  \033[<L>;<C>H
     Or
  \033[<L>;<C>f
  puts the cursor at line L and column C.
- Move the cursor up N lines:
  \033[<N>A
- Move the cursor down N lines:
  \033[<N>B
- Move the cursor forward N columns:
  \033[<N>C
- Move the cursor backward N columns:
  \033[<N>D

- Clear the screen, move to (0,0):
  \033[2J  or \033c
- Erase to end of line:
  \033[K

- Save cursor position:
  \033[s
- Restore cursor position:
  \033[u

(...)

プロンプトで次のコード行を入力してみてください(これを入力すると、プロンプトが端末の下に数行ある場合の動作が少しわかります)。echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"これにより、カーソルが画面上に7行移動し、「BASH "、それから通常のプロンプトを生成し始めた場所に戻ります。


カーソルを7行戻します。

echo -e "\033[7A"

カーソルを行10、列5に移動します。

echo -e "\033[10;5H"

プログラムをカラー化するために、カラーコードをすばやくエコーします

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