web-dev-qa-db-ja.com

カーソルの前にコピーして後に貼り付けるbashコマンド?

これをどのように表現するかはわかりませんが、次のようなコマンドを入力することがよくあります。

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

通常、パスを2回入力するだけです(タブ補完あり)。または、パスをカーソルでコピーして貼り付けます。これをタイプしやすくするbashfooはありますか?

24
user1028270

いくつかのトリックがあります(重複が見つかると思います)が、これは私が行う傾向があります

cp /etc/prog/dir1/myconfig.yml{,.bak}

コマンドに展開されます。

これは ブレース展開 として知られています。ここで使用される形式では、{}式は、コンマで区切られたいくつかの文字列を指定します。これらは全体を「拡張」します/etc/prog/dir1/myconfig.yml{,.bak}式、{}各文字列の部分:空の文字列、/etc/prog/dir1/myconfig.yml、 その後 .bak/etc/prog/dir1/myconfig.yml.bak。結果は

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

これらの式はネストできます:

echo a{b,c,d{e,f,g}}

作り出す

ab ac ade adf adg

シーケンスを生成するために数値を使用するバリアントがあります:

echo {1..10}

作り出す

1 2 3 4 5 6 7 8 9 10

ステップを指定することもできます:

echo {0..10..5}

作り出す

0 5 10
43
Stephen Kitt

履歴の拡張は、この種のものに役立ちます(bash履歴が有効になっていると想定)。

あなたの例では、あなたは行うことができます:

cp /etc/prog/dir1/myconfig.yml !#:1.bak

ここでは、!#は現在の行を参照し、!#:1は、現在の行のパラメーター1を参照します。
および!#:1.bakは、現在の行のパラメータ1を指し、末尾に「.bak」が付加されています。

履歴指定子を入力すると、次のように使用できます Ctrl+Alt+E たとえば、必要に応じて実際の値に拡張します。ファイル名を再確認または変更してください。

Bash manページの「History Expansion」セクションに詳細情報があります。

12
Pooping

プロゴの答えに似ていますが、やや単純です:C-wカーソルの左側にある単語を切り取り(「キル」)、C-y挿入( "ヤンク")します。

$ cp /etc/dir1/myconfig.yml█                              (C-w)
$ cp █                                                    (C-y)
$ cp /etc/dir1/myconfig.yml█                              (space, C-y)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml█       (finish text)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml.bak█
8
mindriot

コマンドラインから実際にカットアンドペースト(emacs/bash用語ではkill-yank)して、編集のためにパーツを複製することもできます。

M-dはWordの境界まで前方にキルします。テキストを複数回キルすることができ、それらすべてを連結して1つの「貼り付け」にして、ヤンクを行うことができます。便利!

これをすべてC-yでカーソル位置のコマンドラインにヤンクします。したがって、次のような行がある場合(ブロック要素█はカーソル位置を示します):

$ cp avb.txt█                 (M-b M-b)
$ cp█avb.txt                  (M-d) kill the Word 'avb'
$ cp █.txt                    (C-y) yank it back
$ cp avb█.txt                 (C-e) to the end of line
$ cp avb.txt█                 (C-y) yank it again
$ cp avb.txt avb█             finish the line
$ cp avb.txt avb.foo█

どちらの方法を使用する場合でも、bashがインタラクティブな主要部門で何を提供する必要があるかを理解することは有益です。 http://web.mit.edu/gnu/doc/html/features_7.html

6
nperson325681

tcshまたはzshでは、 Alt+Ctrl+_emacsモード(copy-prev-Wordウィジェット)は最後のWordを挿入するので、

cp非常に長いパス Alt+Ctrl+_。バック

bashにはcopy-backward-Wordウィジェット(デフォルトではキーにバインドされていません)ですが、Wordをリングバッファにコピーするだけなので、次のキーも押す必要があります。 Ctrl-Yemacsモードの場合)ヤンクします。しかし、あなたは行うことができます:

bind '"\e[cpw~": copy-backward-Word'
bind '"\e\C-_": "\e[cpw~\C-Y"'

持つため Alt+Ctrl+_tcsh/zshのように、コピー/ snarfと貼り付け/ yankの両方を実行します。

6