web-dev-qa-db-ja.com

クリップボードにのみ追加する方法(ただし、現在のデータを上書きしない方法)

かなり大きなファイルがあるため、コンテンツ全体をどこかにコピーする必要がありますが、ページを下にスクロールすると、選択したすべてのデータが選択されなくなります。ブロックごとにコピーして貼り付けることもできますが、現在のクリップボードデータの最後に内容を追加できるようにするだけで、データがたくさんあるため、はるかに簡単です。それは可能ですか?

これは、キーボードショートカットを使用して、これをクリップボードにコピーできるようにするためです。

I am some Nice new text.

これが既にある場合:

I am the old text.

貼り付けたときに次のようになります。

I am the old text.
I am some Nice new text.

したがって、私はこれから本当にしたい3つのことがあります(これを行うには3つのキーボードショートカットがあります):

  1. クリップボードの最後にデータを追加し、それを RETURN その前に(上記の例に示すように)。

  2. クリップボードの最後にデータを追加しますが、データがないようにします RETURN 最初に同じ行で継続するように、その前に。

  3. このすべてを持っているが、データがクリップボードの先頭に置かれ、現在そこにあるすべてのデータの前に置かれるようにする。

Ubuntu GNOME 16.04とGNOME 3.20を実行しています。

7
user364819

簡単ですが、最初にツールxselをインストールする必要があります。

Sudo apt-get install xsel

TL; DR:これは、最終的にショートカットに使用する可能性があるコマンドです。より単純なバリアントで十分な場合でも、均一性とカスタマイズを容易にするために、どこでもprintfのバージョンを使用しています。

  • 選択範囲をクリップボードの最後に直接追加します。

    bash -c 'printf "%b%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c'
    
  • 改行の後、クリップボードの最後に選択を追加します。

    bash -c 'printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c'
    
  • 選択範囲をクリップボードの先頭に直接追加します。

    bash -c 'printf "%b%b" "$(xsel)" "$(xsel -b)" | xsel -ib ; xsel -c'
    
  • 改行後に選択範囲をクリップボードの先頭に追加します。

    bash -c 'printf "%b\n%b" "$(xsel)" "$(xsel -b)" | xsel -ib ; xsel -c'
    

同じコンテンツが二重に追加されるのを防ぐために、クリップボードに追加した後にプライマリバッファーリセットが含まれています。そうしたくない場合は、各コマンドの末尾から; xsel -cを削除してください。


詳細な説明:

Xには3つのバッファー、primary selection、secondary selection、およびclipboardが含まれていることを知っておく必要があります。

あなたはクリップボードを知っています Ctrl+C、 Ctrl+V など。コピーや貼り付けに通常使用するバッファーです。

ただし、主な選択項目は、選択されたテキストが自動的に含まれるバッファです。どのウィンドウにいても、追加のユーザー操作なしで。
問題が1つあります。テキストスニペットを選択するとバッファが更新されますが、他の場所をクリックして選択をキャンセルしてもバッファはクリアされません。最後の選択内容が引き続き含まれます。

二次選択は、いくつかのプログラムでのみ使用され、ここでは興味深いものではありません。


つまり、次の動作を模倣できるということです。 Ctrl+C 次のコマンドを使用して、プライマリ選択(最後に強調表示されたテキスト)をクリップボードにコピーします。

xsel | xsel -ib

引数なしのxselは、プライマリ選択のコンテンツをSTDOUTに出力します。 xsel -abは、STDINのデータをクリップボードに書き込みます(-i)(-b)。


データを置き換えるのではなく、現在のクリップボードの内容に(改行せずに)直接追加するには、-aの代わりに-iオプションを使用します。このコマンドは、最後に選択したテキストスニペットを現在のクリップボードのコンテンツに追加します。

xsel | xsel -ab

追加の改行やその他の書式設定が本当に必要な場合は、printfまたは処理に使用する他のツールを介してデータをパイプ処理できます。以下は、最後の選択と現在のクリップボードコンテンツの両方を読み取り、改行を使用してそれらを結合する例です。

printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib

xsel -bは、現在のクリップボードのコンテンツを返します。 printfのフォーマット文字列は、%bを引数のプレースホルダーとして使用し、\nは改行を表します。 man printfと入力すると、printfの詳細を確認できます。

文字列の末尾の2つの引数を切り替えることにより、順序を逆にして末尾ではなく先頭に追加できます。


誤って同じデータをクリップボードに2回追加しないようにしたい場合(2回追加したい場合は再度選択する必要があります!)、次のコマンドを実行した後、プライマリ選択バッファーを手動でクリアできます。

xsel -c

次のように、基本的なクリップボード追加コマンドの後に単純に実行します。

printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c

これをすべて知っているので、キーボードショートカット用のコマンドを書くことができます。ただし、私たちのワンライナーはすべてパイピングなどのBash機能を多用しているので、Bashで実行する必要があります。

bash -c 'COMMAND'

ショートカットの作成に適したコマンドリストについては、回答の上部にあるTL; DRセクションを参照してください。

9
Byte Commander

Xサーバーには複数のクリップボードがあります。あるもの Ctrl + C クリップボードと呼ばれ、何かを強調表示するものはプライマリと呼ばれます。 xclipは、いずれかの出力を貼り付けることができます。たとえば、あなたの質問の一部をコピーしましたが、ターミナルで他のテキストをハイライトしました:

enter image description here

さらに、キーボードショートカットに接続されているスクリプトでそのアイデアを使用できます。実際、 github Gist として投稿されているスクリプトを書きました。

基本的な考え方は、キーボードショートカットにバインドすることです。追加するものを強調表示し、ショートカットを押します。たとえば、私はにバインドしました Ctrl+Alt+V 。正確なコマンドはpython /path/to/file.pyです

使用例:

  1. 投稿のI have a rather large file部分をハイライトし、コピーして Ctrl + C
  2. That is so that I can have a keyboard shortcutなど、他の何かを強調表示します
  3. ショートカットを押します(私のものは Ctrl+Alt+V
  4. 追加したクリップボードをどこかで解放します Ctrl + V 。結果の出力は次のとおりです。I have a rather large fileThat is so that I can have a keyboard shortcut

スクリプトソース

 import gi
    gi.require_version('Notify', '0.7')
    from gi.repository import Notify
    import subprocess
    import os
    import sys

    # This script is meant to be bound to keyboard shortcut

    def send_notification(title, text):
        Notify.init(sys.argv[0])
        n = Notify.Notification.new(title, text)
        n.show()


    def run_cmd(cmdlist):
        # function for running 
        try:
            stdout = subprocess.check_output(cmdlist)
        except subprocess.CalledProcessError:
              send_notification(sys.argv[0],"Clipboard error")
              sys.exit(1)
        else:
            if stdout:
                return  stdout



    # get contents of both clipboards
    clip = run_cmd("xclip -o -sel clip".split())
    primary = run_cmd("xclip -o -sel primary".split())

    # write to temp file contents
    # of both clipboards appended
    temp_file = "/tmp/append.clip"
    f = open(temp_file, "w")
    f.write( clip + primary  )
    f.close()

    # Read the new contents into clipboard
    run_cmd(("xclip -sel clip " + temp_file).split())

    # clean up
    os.remove(temp_file)

ノート:

  • xclipSudo apt-get install xclip経由でインストールする必要があります
  • nityを使用するUbuntuのクリップボードマネージャーインジケーター デスクトップを作成しました。デスクトップでは、正規表現(sedおよびpythonのreスタイル)を使用して、クリップボードに繰り返し文字列を追加できます。たとえば、同じ文字列を何度も何度も追加する必要がある場合は、次のpython re正規表現を使用できます。

enter image description here

5

短いBashスクリプトを使用する別の非常に簡単な方法を次に示します。まず、xclipがインストールされていることを確認してください。次に、次のようにbashスクリプトを作成します。

#!bin/bash
p=$(xclip -selection primary -o)
c=$(xclip -selection clipboard -o)
new=$'\n'
echo "$c$new$p" | xclip -selection clip

このファイルにapndpc.shという名前を付けて、〜/ myscriptsというフォルダーに入れましょう。ユーザー定義キーをこれにバインドします。システム設定>>キーボードでこれを行い、ショートカットタブをクリックしてください。 [カスタムショートカット]をクリックし、[+]記号をクリックして、目的のキーの組み合わせを追加します。コマンドボックスに以下を入力します。

bash -c 'bash〜/ myscripts/apndclp.sh'

次に、キーの組み合わせを定義します。 ALT + 3を使用してアクションをトリガーします。

それだ。大規模なコピー操作の準備ができました。通常のCtrl + c(または右クリックしてコピーを選択)を使用して、テキストの最初のチャンクをコピーします。次のチャンクを選択し(コピーのみを選択しない)、ショートカットキー(ATL + 3)を押します。これにより、選択したテキストがクリップボードに追加されます。完了するまでそれを続けてください。その後、いつものように貼り付けます。 Ctrl + v(または右クリックして貼り付けを選択)を押して、最終的に蓄積されたテキストをダンプします。

上記のスクリプトで文字列操作が気に入らない場合は、代わりにこのスクリプトを使用します。

#!bin/bash
# this is another version of clipboard append tool
# here we use a temporary file to append highlighted text to the clipboard
# the temporary file is deleted at the end of the operation

tmpfile="file111000111"
xclip -selection clipboard -o  > $tmpfile   # first dump the current clipboard to the tmpfile
printf '\n' >> $tmpfile                     # then add new line
xclip -selection primary -o >> $tmpfile     # and finally add the highlighted text
cat $tmpfile | xclip -selection clip        # now read the file back into the clipboard
rm $tmpfile             # and remove the tempfile
2
elmclose

Clipitと呼ばれるクリップボードマネージャーを使用します。

次に、キーボードで最後のものを見たいときはいつでもコンソールでこれを行います:

strings ~/.local/share/clipit/history

\nで区切られたクリップボード履歴を印刷します。

0
dfer