Как только добавить к буферу обмена (но не перезаписать текущие данные)?

У меня есть довольно большой файл, я должен скопировать все содержание где-нибудь, но когда я прокручиваю страницу вниз все данные, я выбрал, становится отмененным выбор. Я мог просто скопировать и вставить блок блоком, но я найду это намного легче, поскольку существует много данных, чтобы просто смочь добавить содержание в конец текущих данных буфера обмена. Это возможно?

Это - то, так, чтобы у меня могло быть сочетание клавиш, которое позволит мне скопировать это в буфер обмена:

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. Добавьте данные в конец буфера обмена и имейте его, вставил ВОЗВРАТ перед ним (как показано в примере выше).

  2. Добавьте данные в конец буфера обмена, но имейте его так, чтобы не было ВОЗВРАТА перед ним так, чтобы это продвинулось бы на той же строке первоначально.

  3. Имейте все это, но так, чтобы данные были помещены в начале буфера обмена перед всеми данными, которые в настоящее время являются там.

Я выполняю Ubuntu GNOME 16.04 с GNOME 3.20.

7
задан 10 July 2016 в 13:32

4 ответа

Это просто, но необходимо установить инструмент 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 буфера, основной выбор, вторичный выбор и буфер обмена.

Вы знаете буфер обмена от Ctrl+C, Ctrl+V и т.д. Это - буфер, который Вы обычно используете для копии и вставляете материал.

Основной выбор, хотя буфер, который всегда автоматически содержит текст, который Вы выбираете, неважно, какое окно это находится в и без любого дополнительного взаимодействия с пользователем.
У нас просто есть одна проблема: буфер обновляется момент, Вы выбираете текстовый отрывок, но это не становится очищенным, когда Вы нажимаете где-либо еще для отмены выбора. Это будет все еще содержать контент Вашего последнего выбора.

Вторичный выбор только используется немногими программами и не интересный для нас здесь.


Это означает, что мы можем подражать поведению Ctrl+C с этой командой, ниже которых копий основной выбор (длятся выделенный текст) к буферу обмена:

xsel | xsel -ib

xsel без любых аргументов печатает контент основного выбора к STDOUT. xsel -ab записи (-i) данные от STDIN до буфера обмена (-b).


Для прямого добавления данных к текущему содержанию буфера обмена (без промежуточного разрыва строки) вместо того, чтобы заменить его мы используем -a опция вместо -i. Эта команда добавит последний выбранный текстовый отрывок к текущему содержанию буфера обмена:

xsel | xsel -ab

Если Вы действительно хотите дополнительный разрыв строки или какое-либо другое форматирование, мы можем передать данные по каналу через printf или любой другой инструмент, который Вы хотите использовать для обработки его. Вот пример, который читает и последний выбор и текущее содержание буфера обмена и присоединяется к ним вместе использование новой строки:

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

xsel -b возвращает текущее содержание буфера обмена. Строка формата printf использование %b как заполнитель для аргументов, \n представляет разрыв строки. Можно узнать больше о printf путем ввода man printf.

Путем переключения этих двух аргументов в конец строки можно инвертировать их порядок и добавить к началу вместо конца.


Если Вы не хотите добавлять те же данные к буферу обмена дважды случайно (необходимо будет выбрать его снова, если Вы хотите добавить его дважды!), можно очистить основной буфер выбора вручную после того, как команда была выполнена с помощью этого:

xsel -c

Просто выполненный, что после основной команды добавления буфера обмена, как этот:

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

Так зная все это, можно записать команды для сочетаний клавиш, которые делают точно, что Вы хотите, но помните, что наши остроты, все делают интенсивное использование функций Bash как передача по каналу, таким образом, необходимо выполнить их с Bash:

bash -c 'COMMAND'

Посмотрите TL; раздел DR наверху ответа для списка команд, подходящего для создания ярлыков.

9
ответ дан 23 November 2019 в 06:14

Вот другой очень легкий метод, который использует короткий сценарий Bash. Сначала удостоверьтесь, что у Вас есть установленный xclip. Затем создайте свой сценарий удара следующим образом:

#!bin/bash
p=$(xclip -selection primary -o)
c=$(xclip -selection clipboard -o)
new= 

Позволяют нам назвать этот файл apndpc.sh и поместить его в некоторую папку, сказать, что ~/myscripts Теперь связывают определяемый пользователем ключ к этому. Сделайте это Параметрами настройки системы>> Клавиатура и нажмите на вкладку Shortcuts. Нажмите на Custom Shortcuts и затем нажмите +, подают знак добавлять Ваше желаемое сочетание клавиш. В помещенном поле команды:

удар-c 'колотит ~/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
\n' echo "$c$new$p" | xclip -selection clip

Позволяют нам назвать этот файл apndpc.sh и поместить его в некоторую папку, сказать, что ~/myscripts Теперь связывают определяемый пользователем ключ к этому. Сделайте это Параметрами настройки системы>> Клавиатура и нажмите на вкладку Shortcuts. Нажмите на Custom Shortcuts и затем нажмите +, подают знак добавлять Ваше желаемое сочетание клавиш. В помещенном поле команды:

удар-c 'колотит ~/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
ответ дан 23 November 2019 в 06:14

X-сервер имеет несколько буферов обмена. Тот с Ctrl + C упоминается как буфер обмена, тот, где Вы выделяетесь, что-то называют основным. xclip позволяет вставлять вывод также. Например, я скопировал часть Вашего вопроса, но выделил некоторый другой текст в терминале:

enter image description here

Можно далее использовать ту идею в сценарии, который подключен к сочетанию клавиш. На самом деле я записал сценарий, который отправляется как суть GitHub

Основная идея состоит в том, чтобы связать его с сочетанием клавиш. Выделите то, что Вы хотите добавленный, затем нажмите ярлык. Например, я связал мой с 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)

Примечания:

  • xclip должен быть установлен через sudo apt-get install xclip
  • Я записал индикатор менеджера по буферу обмена для Ubuntu с рабочим столом Единицы, который может использовать регулярные выражения (sed и Python re стиль) для добавления повторной строки к буферу обмена. Например, если часто необходимо добавлять ту же строку много раз, можно использовать следующий Python re regex:

enter image description here

5
ответ дан 23 November 2019 в 06:14

Я использую менеджера по буферу обмена, названного clipit.

Затем каждый раз, когда я хочу видеть последние вещи на клавиатуре, я делаю это на консоли:

strings ~/.local/share/clipit/history

Это распечатает историю буфера обмена, разделенную \n.

0
ответ дан 23 November 2019 в 06:14

Другие вопросы по тегам:

Похожие вопросы: