web-dev-qa-db-ja.com

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

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

矢印キーを使用した、または 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 前進するには、Word by Word(または Ctrl-E 最後に行くと Alt-B その後、逆戻りします)。しかし、長い時間がかかりすぎて時間がかかりすぎます。検索して、変更する必要がある部分に直接ジャンプする方法が必要です。 option25

146
Frank

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

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

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

101
Pianosaurus

明確にするために、「terminalコマンドラインでカーソルをすばやく移動する方法」は望ましくありません。実際に必要なのは、Shellプログラムのコマンドラインをすばやく移動する方法です。

Bash は、たとえば非常に一般的なシェルです。 Readline ライブラリを使用して、コマンドライン入力を実装します。つまり、bashだけでなくReadlineバインディングを使用することは非常に便利です。たとえば、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-_またはC-x C-u最後の編集コマンドを取り消します。元に戻すと、空の行に戻ります。

移動

  • Ctrl-a行の先頭に移動します。
  • Ctrl-e行の末尾に移動します。
  • Meta-f Wordを前進させます。Wordは文字と数字で構成されます。
  • Meta-b Wordを後方に移動します。
  • Ctrl-l画面をクリアし、現在の行を上部に再印刷します。

殺してヤンク

  • Ctrl-k現在のカーソル位置から行末までのテキストを削除します。
  • M-dカーソルから現在のWordの末尾まで、または単語間の場合は次のWordの末尾までを強制終了します。単語の境界は、M-fで使用されるものと同じです。
  • M- [DEL]カーソルから現在のWordの先頭、または単語の間にある場合は前のWordの先頭までを削除します。単語の境界は、M-bで使用されるものと同じです。
  • Ctrl-wカーソルから前の空白までを削除します。単語の境界が異なるため、これはM-とは異なります。
  • Ctrl-y直前にキルされたテキストをヤンクしてカーソル位置のバッファに戻します。
  • M-yキルリングを回転させ、新しいトップをヤンクします。これは、前のコマンドがC-yまたはM-yの場合にのみ可能です。

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

更新

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

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

$ set -o vi

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

ボーナス

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

189
wonder.mice

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

私は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」で3番目の「5」を見つけてから、Wordの先頭に戻ります。

10
paxdiablo

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

OSXでは、MetaはESCとして翻訳されますが、これはひどいものです。

ただし、代わりに、端末設定->設定->プロファイル->キーボードを開き、「メタキーとしてオプションを使用する」をチェックすることもできます。

9
Edson Medina

コマンドを1回実行した後、fcを実行します

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

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

8
dbr

特定の数の単語を進めたい場合は、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のカーソル

4
user4401178

増分履歴検索

ターミナルで入力:

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

上向き矢印コマンドを押すとすぐに表示されます

2
Alexandr

1つのオプションは、emacsM-x Shellを使用することです。これにより、emacsが持つすべての編集機能とキーストロークが提供されるため、たとえばC-sを使用してテキストoption25を検索できます。

(しかし、誰かが私に優れた検索と編集機能を教えてくれるなら、代わりに実際の端末シェルにいることを好みます。)

1
Frank

Cygwinでは、ウィンドウを右クリックしてそのような機能を有効にできます。ポップアップウィンドウで、オプション...->マウス->有効化-コマンドラインカーソルのクリック->適用を選択します。

これ以降、コマンドライン内のある位置でマウスの左ボタンをクリックするだけで、カーソルがそこに配置されます。

0
Abdull

マウスを使う

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

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

set mouse=a
set ttymouse=xterm2

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

システム管理者はマウスを恐れてはいけません。

0
user7610

最初:export EDITOR = 'nano -m'

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

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

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

0
Octavius

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

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

github にあります

別の投稿 に関する詳細情報

マウスでクリックしたときにecho -e "\e[?1000;1006;1015h" # Enable trackingが端末にエスケープシーケンスを出力すると機能します

0
tinmarino