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


24

私はこれをどのように表現するのかわかりませんが、私はしばしば自分自身が次のようなコマンドを入力していることに気付きます:

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

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


2
私はあなたを意味すると思いますbash-fu:)

回答:


43

いくつかのトリックがあります(重複していると思います)が、このために私はする傾向があります

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

いまいましい甘い。私は最初に尋ねたのではなく、ちょっとした難しい質問だと思いました。
user1028270

そこでコンマは何をしますか?
user1028270

5
マニュアルのブレース拡張を参照してください。拡張で使用される値を分離します。ここで、2つの値は空の文字列と.bakです。
スティーブンキット

12

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

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

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

ここで、!#は、現在の行を!#:1指し、現在の行のパラメーター1
!#:1.bak指し、最後に '.bak'が付加された現在の行のパラメーター1 を指します。

履歴指定子を入力した後、たとえばファイル名を再確認または変更する場合は、Ctrl+ Alt+ Eを使用して実際の値に展開できます。

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


8

progoの答えに似ていますが、やや単純です。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

2
また、複数の単語を連続して使用してこれを行うことができることに注意してください(たとえば、ファイル名にスペースが含まれる場合)。単一文字の削除(backspace / del / ctrl-dなど)を除く削除コマンドの組み合わせは、これで機能します。
Random832

6

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

M-d単語の境界まで前方にキルし、テキストを複数回キルすることができ、それらはすべてヤンクするために単一の「ペースト」に連結されます。便利!

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

$ cp avb.txt                 (M-b M-b)
$ cpavb.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

tcsh又はzshAlt+Ctrl+_emacsモード(copy-prev-wordウィジェット)ので、最後の単語を挿入します

cp very-long-path Alt+Ctrl+_.back

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

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

持っているAlt+Ctrl+_のように/ヤンクを両方のコピー/ SNARFを行い、ペーストtcsh/ zsh

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