Почему сочетание клавиш Shift+Insert в некоторых приложениях вставляет данные из БУФЕРА ОБМЕНА, а в других — из ПЕРВИЧНОГО?

Почему сочетание клавиш Shift+Insert в некоторых приложениях вставляет данные из БУФЕРА ОБМЕНА, а в других — из ПЕРВИЧНОГО?

Как вставить из ПЕРВИЧНОГО выделения (например, выделенного мышью текста) с помощью сочетания клавиш? Shift+Insertнепоследовательно вставляет из ПЕРВИЧНОГО выделения или БУФЕРА ОБМЕНА в зависимости от приложения.

Фон:

Ctrl+CКопирует выделенный текст в БУФЕР ОБМЕНА, а выделение мышью копирует в ПЕРВИЧНЫЙ. Вставить из БУФЕРА ОБМЕНА с помощью Ctrl+Vи вставить из ПЕРВИЧНОГО с помощью mouse-middle-click.

В эмуляторе терминала (gnome-terminal) вставьте из БУФЕРА ОБМЕНА с помощью Ctrl+Shift+V. (Вставьте из ПЕРВИЧНОГО с помощью mouse-middle-clickstill.)

Я хочу вставить из PRIMARY с помощью сочетания клавиш. В gnome-terminal это Shift+Insert, но в gedit и Firefox Shift+Insertвставляет из БУФЕРА ОБМЕНА. Мне нужна комбинация клавиш, которая последовательно вставляет из БУФЕРА ОБМЕНА, и другая комбинация клавиш, которая последовательно вставляет из PRIMARY.

Я использую Ubuntu 14.04 с xmonad и Firefox 34.0.

решение1

Все приложения, которые вы упомянули,gtk+ приложениями, поэтому ответить на них довольно легко.Почему... Потому что ввсе gtk+Программы (Кроме одного), Shift+ Insertвставляет из БУФЕРА ОБМЕНА - т.е. эквивалентно Ctrl+ V. Сочетание клавиш жестко закодировано вgtkentry.c(строка 2022) иgtktextview.c(строка 1819):

gtk_binding_entry_add_signal (binding_set, GDK_KEY_Insert, GDK_SHIFT_MASK,
                "paste-clipboard", 0);

Это также задокументировано вСправочное руководство GTK+ 3подGtkEntry:

The “paste-clipboard” signal
void
user_function (GtkEntry *entry,
               gpointer  user_data)
The ::paste-clipboard signal is a keybinding signal which gets emitted
to paste the contents of the clipboard into the text view.
The default bindings for this signal are Ctrl-v and Shift-Insert.

Насколько мне известно, это было сделано для согласованности с другими DE (см. привязки KDEклавиш QtвQTextEdit Class ) и ОС Windows 1 .
только исключениеявляется gnome-terminal. После долгих дебатов разработчики решили (для согласованности с другими терминалами), что в gnome-terminal+ Shiftследует Insertвставлять из ПЕРВИЧНОГО, а Ctrl++ Shiftследует Vвставлять из БУФЕРА ОБМЕНА (хотя у вас есть возможность настроить некоторые сочетания клавиш).


ОтносительноКаквставить выделенный фрагмент с помощью сочетания клавиш... простого способа нет.

Самый простой способ — назначить ярлык для скрипта, который запускается xdotool click 2(имитирует нажатие средней кнопки мыши). Хотя это работает (и должно работать со всеми или большинством DE и наборов инструментов), это работает только в том случае, если курсор мыши находится над полем ввода текста, в противном случае это не сработает.

Другой относительно простой способ — через Gnome Accessibility, если он доступен в вашей системе. Он также требует наличия цифровой клавиатуры. Перейдите в Universal Access>> Pointing & Clickingи включите Mouse Keys. Убедитесь, NumLockчто он выключен. Затем вы можете использовать клавиши цифровой клавиатуры для перемещения курсора и щелчка. Чтобы имитировать щелчок средней кнопкой мыши, нажмите (и отпустите) *(звездочка), затем нажмите 5(вот краткийгид). Это решение, кажется, всегда работает в gtk+среде. Недостатком является то, что оно требует Gnome Accessibilityи цифровой клавиатуры. Кроме того, вы не можете настроить сочетание клавиш.

Интересное решение было предложеноgnome-bugzilla (ошибка 643391). (Обновление 2018: проблема перемещеназдесь.) Требуется исправление некоторых исходных файлов и настройка параметров конфигурации ~/.config/gtk-3.0/gtk.css(или ~/.gtkrc-2.0для gtk+2 приложений). Я не пробовал это лично, но отзывы положительные.

В идеале вы бы исправили исходные файлы и определили "paste-selection"сигнал, а затем связали бы Shift+ Insertс "paste-selection"вместо "paste-clipboard". Код Энди (прикрепленный в отчете об ошибке, ссылка на который приведена выше) мог бы послужить руководством о том, как это сделать. Даже в этом случае это повлияло бы только на gtk+приложения (я не KDE/Qtпарень, поэтому понятия не имею, как изменить Qtповедение приложений).


1: (не говоря уже о CUA от IBM)

решение2

Извините: я не могу написать комментарий из-за репутации, поэтому пишу в качестве ответа. Это не прямое решение, но оно мне помогает...

Вы можете использовать комбинацию информации:

  1. Измените тему GTK и разрешите привязку клавиш по своему усмотрению..

  2. Пример создания привязки клавиш gtk 3.0 в css темы.

  3. Пример переопределения привязок клавиш gtk и отмены привязки.

  4. Пример изменения сочетания клавиш для gnome-terminal

  5. Автоматический запуск autocutsel с параметрами по умолчанию для синхронизации БУФЕРА ОБМЕНА с CUTBUFFER(это необязательно). Эта ссылка предназначена только для получения информации о проблеме.

  6. Используйте clipman для графического доступа к нескольким буферам(ПЕРВИЧНЫЙ и БУФЕР ОБМЕНА), без выбора автоматической синхронизации (двунаправленная автоматическая синхронизация делает ошибку).

Поэтому я просто выбираю тему gtk и изменяю CSS темы, чтобы назначить необходимые сочетания клавиш для сигналов копирования в буфер обмена (Ctrl+Insert) и вставки в буфер обмена (Shift+Insert).

Связанный контент