web-dev-qa-db-ja.com

コピーと貼り付けの間にスクリプトを介してクリップボードテキストを処理する

貼り付けイベントをインターセプトし、スクリプトでテキストを実行したい。ユースケースはこのようなものです(stdinのテキストを受け入れ、「world」を「potato」に変換してstdoutに書き込むスクリプトがどこかにあると想定しています)。

  1. 「hello world!」というテキストを強調表示しますカーソルで
  2. マウスの中ボタンをクリックして選択バッファーから貼り付け、「hello potato!」現れる

1と2の間に手動ステップはありません、つまり、テキストが自動的に処理されるように、貼り付けイベント(またはコピーイベント)にフックが必要です。悪意はありません。 Webとの間でコピー/貼り付けを行うときに、ソースコードを自動フォーマットするだけです。

私の質問は選択バッファ(ミドルマウスクリップボード)に関係していますが、質問は一般に他のクリップボードテキストにも当てはまると思います。

5
wim

次のBash関数を使用できます。それを~/.bashrcにコピーし、ターミナルから. ~/.bashrcとしてソースします。

cngstr(){
    echo `xclip -o` | sed -e "s#$1#$2#g" | xclip
}

使用法

  • マウスでテキストを選択して強調表示します。通常どおり、選択したテキストは、マウスの中央クリックを使用して貼り付けることができます。
  • ターミナルで実行:

    $ cngstr "string" "replacement"
    
  • 次に、マウスの中央クリックを使用して貼り付けると、選択した単語の「文字列」が「置換」に置き換えられます。

あなたの選択は「hello world!」だとしましょう。次に、ターミナルで実行します。

cngstr world potato

複数のWordで構成される文字列に""を使用します。次に、マウス中央のクリップを使用して貼り付けると、「hello potato!」現れる。スクリーンショットをご覧ください。

Enter image description here

使い方

  1. xclip -oは、ここでsedにパイプされている標準出力に選択範囲を出力します。
  2. 次のsedは、ユーザーからの入力を受け取る文字列を置き換えます。
  3. 最後に、変更されたコンテンツはxclipに渡され、そこで[ プライマリ選択 に配置され、マウスの中央クリックで貼り付けできるようになります。

xclipにはデフォルトのUbuntuディストリビューションが付属していると思います。それ以外の場合は、apt-getを使用してインストールします。

Sudo apt-get install xclip

追加情報

変更されたコンテンツをクリップボードでも利用できるようにします

変更した内容もクリップボードで利用できるようにする場合は、 Ctrl+V 同様に機能します。上記のスクリプトに次の行を追加します。

echo `xclip -o` | xclip -selection c

上記の行は、プライマリ選択の内容をクリップボードに渡します。変更された関数は次のようになります。

cngstr(){
    echo `xclip -o` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}

クリップボードの内容を変更できるBash関数(つまり、 Ctrl+C または右クリックメニューから)、変更された文字列をプライマリ選択とクリップボードで使用できるようにします。

cngstr1(){
    echo `xclip -o -selection c` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}

xclip -oは、デフォルトでプライマリ選択の内容を出力します。 -selection cを使用して、クリップボードの内容を印刷します。詳細については man xclip をご覧ください。


スイッチケースを使用して、これらの2つの関数をスクリプトで組み合わせることができます、

#!/bin/sh
string="$2"
replacement="$3"

cngstr(){
    echo `xclip -o` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}

cngstr1(){
    echo `xclip -o -selection c` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}

if [ $# -lt 2 ]
then
    echo "Usage : $0 [c|p] \"string\" \"replacement\" "
    exit
fi

case "$1" in

    c)  cngstr1 "$string" "$replacement"
        ;;
    p)  cngstr "$string" "$replacement"
        ;;
    *) echo "Usage : $0 [c|p] \"string\" \"replacement\" "
        ;;
esac

使用法

./script.sh [c|p] "string" "replacement"
  • オプションcを使用して、クリップボードを使用してコピーされたコンテンツ、つまり、 Ctrl+C または右クリックメニューから。

  • オプションpを使用して、プライマリ選択を使用してコピーされたコンテンツを変更します。

3
souravc