Почему я не могу выделить текст в эмуляторе терминала linux с помощью клавиш shift+Стрелка?

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

  • влево+вправо стрелки для перемещения влево + вправо
  • ctrl + Стрелка для перемещения всего слова
  • home / end для перехода в начало / конец строки
  • ctrl+c / ctrl+v для копирования / вставки [некоторые терминалы могут использовать shift-ctrl-C / shift-ctrl-V; это хорошая замена]
  • shift + Стрелка к выделите текст
  • shift + ctrl + стрелка, чтобы выделить все слово

Я никогда не находил комбинацию оболочки плюс эмулятор терминала, который позволяет последние два пункта в этом списке, и это сводит меня с ума. Очевидно, что эмуляторы терминалов поддерживают подсветку (мышь может это сделать), и они поддерживают использование клавиш ctrl и shift в качестве модификаторов (их можно использовать для перемещения курсора по всему слову и для капитализации букв соответственно; [edit:] их можно даже использовать вместе копировать / вставлять с shift-ctrl-C и shift-ctrl-V), так в чем проблема, препятствующая этой функциональности? У меня несколько вопросов:

  • это проблема с моим эмулятором терминала или с моей оболочкой (bash, хотя я готов изменить)?
  • почему терминальные эмуляторы/оболочки не соответствуют этому универсальному стандарту?
  • если фактическая причина, то она стародедовская и устарелый, или она все еще уместна к значительно числу рабочий стол пользователи linux?
  • есть ли какой-либо обходной путь?
  • есть ли какая-то неясная программа, которую я могу использовать, которая поддерживает это?
  • возможно ли модифицировать источник, скажем, gnome-terminal для поддержки этого?

Я знаю, что текст может быть скопирован / вставлен с помощью мыши, это не то, о чем я спрашиваю. Я спрашиваю, почему я не могу делать эти вещи с клавиатурой в эмуляторе терминала.

24
задан monguin
13.03.2023 11:34 Количество просмотров материала 2494
Распечатать страницу

5 ответов

Я думаю, что было бы очень полезно, если бы я взял этот кусок за один раз. Общая задача: для кого предназначено нажатие клавиши? Терминал или программа, запущенная внутри терминала?

в качестве примера, "экран", который является kindof терминала, использует Ctrl+на в качестве префикса для своих команд, чтобы отличить их от вещей, идущих в самой запущенной программе. (И отправляет Ctrl+на.)

gnome-terminal есть несколько ключей, которые он захватывает, чтобы делать различные вещи, в том числе некоторые из тех, что вы спрашиваете про.

также имейте в виду, что "подсветка" терминала отделена от позиции курсора терминала. Некоторые терминалы вообще не имеют возможности подсветки.

теперь, принимая эту комбинацию клавиш в то время:

влево+вправо стрелки для перемещения влево + вправо Ctrl+Стрелка в ход целое слово начало / конец для перемещения в начало / конец строки

переместить что влево и вправо? Bash может быть настроен, чтобы сделать это, и, как правило, по умолчанию. Как правило, они перемещают положение курсора.

ctrl+c / ctrl+v для копирования / вставки

во-первых: копирование / вставка вообще имеет смысл? Если вы находитесь в VT, у вас действительно нет буфера обмена, особенно если X не работает.

некоторые терминалы могут копировать текст вывод, а некоторые также "вставить", имитируя ввод содержимого буфера обмена. Ctrl+Shift+V, например, вставить в gnome-terminal, которые могут помочь. (И Ctrl+Shift+C скопировать.) Как обсуждалось ранее, большая проблема с Ctrl+C и Ctrl+V они перекрываются с общими командами терминала / программы. (Ctrl+C отправить прерывание (SIGINT) и Ctrl+V - это дословно.)

некоторые терминалы также поддерживают два режима копирования данных: более обычный "просто копировать" и так называемый "выбор блока" или "копирование блока". (Hold Ctrl, а затем перетащить в gnome-terminal например.)

кроме того, xsel -b может использоваться для передачи содержимого буфера обмена. Зависит от точной situtation ли xsel или версия терминала пасты более полезна. См.man xsel.

shift + Стрелка для выделения текста shift + ctrl + стрелка, чтобы выделить все слово

подсветка вашего терминала (если она есть) отделена от позиции курсора. Опять же, отсутствие доступных ключевых комбо, вероятно, является фактором. Имейте в виду, что подсветка имеет две позиции: либо начало и конец, либо верхний левый и нижний правый углы. Как вы управляете оба?

наконец, обратите внимание, что многие терминалы GUI, дважды щелкнув слово будет выделить его. (И в X скопируйте в основное выделение.)

screen, как пример, имеет ключи, котор нужно переключить в режим для двигать вокруг буфера (предыдущего выхода) и экземпляра/вставки.

Я думаю, если вы адекватно использовать xsel и основной выбор, вы найдете операции буфера обмена являются достаточно редкими и достаточно сложными, чтобы заслужить с помощью мыши.

3
отвечен Thanatos 2023-03-14 19:22

Я не эксперт терминальных эмуляторов, но...

приложения, такие как bash (readline), работающие в эмуляторе терминала, ничего не знают о работающей системе X window и окне X, в котором они находятся, они знают stdin и stdout на терминальном устройстве (ttyS/ttyUSB/tty/pts на linux).

проблема не показать выделенный текст но как сообщить приложению X window (эмулятор терминала), что текст был выбран,через эти терминальные устройства.

I Угадай приложение X terminal откройте одно из этих устройств на входе и выходе, а затем переведите ключевые события X правильно выход (со стороны X) input (со стороны bash). Наоборот Баш выход поток к терминалу X как input, вот процесс X терминал этот вход, чтобы переместить курсор, заполнения фона цветом, в соответствии с приложением Баш выход.

for my knowledge escape коды могут быть использованы для управления специальными поведения, как очистить, заполнить фон, переместить курсор, и может быть некоторые custom escape-код может быть добавлен, чтобы сообщить терминалу X, что текст из ряда, col в ряд, col был выбран, просто пример, возможно, вместо выбранного текста может быть просто возвращен (деталь реализации).

I Угадай не является стандартом определение вам нужно будет исправить каждое приложение, которое вы хотите поддержать, чтобы узнать о комбинации клавиш, и вывести соответствующий escape-код, строку readline, если вы хотите, чтобы она была в bash, эмулятор терминала X с другой стороны, чтобы правильно обработать escape-код (и, наконец, отправить информацию в буфер обмена). Вероятно, реализует это как способность терминала спасет вас от исправления каждой заявки. Я надеюсь (и думаю) драйверы терминальных устройств в ядре хотят знать как можно меньше о escape-кодах, так что если повезет, патч не потребуется.

стержень X рисует выход, поэтому он легко знает, когда вы используете мышь, какие текст/характеры вы выбираете.

графический текстовый виджет знает все о своем X-окне, поэтому его так легко реализовать select & copy.

EDIT

здесь этот патч urxvt-9.16-image-display может быть хорошей отправной точкой для понять, что нужно поддерживать новые коды побег. http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html

1
отвечен Alex 2023-03-14 21:39

ответы даны хорошие объяснения, почему это трудно. Вот что вы можете сделать в gnome-terminal для установки сочетания клавиш CTRL-C и и ctrl-v копировать и вставлять, при перекомпоновке других ключей в терминальной дисциплине с stty отправить SIGINT и вставьте символ дословно. Это не полное решение, потому что некоторые программы отключают терминальную дисциплину, и вы не сможете отправить их "^C " и "^V". Более подробную информацию здесь.

в сценарии запуска оболочки (например,~/.bashrc,~/.zshrc,~/.rcrc), do

stty intr '^Q' 2>/dev/null  # To send SIGINT I will use ctrl-q
stty lnext '^A' 2>/dev/null # To insert a character verbatim I will use ctrl-a

потом в GNOME-терминал редактирование " > "установки" > " комбинации можно привязать скопировать и вставить на CTRL-C и ctrl-v. обратите внимание, что терминал будет ключевых событий прежде всего направляется к терминалу устройства, так что с тех пор вы не сможете отправить '^C' и '^V', чтобы любой процесс, работающий на терминале.

Я просто сделал это, и я посмотрю, как это происходит, и какие проблемы это вызывает. Я сделал stty условно применять их только тогда, когда я бегу X.

1
отвечен spelufo 2023-03-14 23:56

как упоминал Танатос, существует различие между эмулятор терминала (работает на X Windows или Wayland) и программы, работающие в терминале (назовем это" оболочкой", хотя может и не быть); эти две вещи изолированы друг от друга (см. технические детали).

первые пункты вашего списка (клавиши со стрелками, начало/конец и т. д.) обрабатываются непосредственно программой внутри терминала, курсор управляется программой внутри терминала.

копировать и вставлять горячие клавиши (Ctrl+сдвиг+C и ctrl+v), то с другой стороны, обрабатываются эмулятор терминала, который понимает мышкой (так что вы можете выбрать текст с помощью мыши), он знает, что находится на экране (поэтому его можно скопировать), и можете отправлять нажатия клавиш в программе внутри (поэтому он может вставить).

для поддержки Shift + влево и Shift+вправо, либо эмулятор терминала или оболочки для обработки нажатия клавиш. В любом случае у нас есть проблема:

  1. оболочка не может легко обрабатывать эти ключи, потому что в конечном итоге вы захотите скопировать выбранный текст в буфер обмена, а буфер обмена-это концепция X Windows, к которой оболочка не обязательно имеет доступ (но см. xclip). И насколько я знаю, если оболочка поддерживает выделение текста, Linux не определяет никакого механизма уведомления эмулятора терминала о том, что выбирать.
  2. между тем, эмулятор терминала не отвечает за местоположение курсора. Даже если эмулятор терминала может изменить местоположение курсора, он, вероятно, не знает, где начинается и заканчивается текущая строка текста. Например, терминал может содержать текст вида ~ $ ls -l и эмулятор терминала не знает, что только ls -l часть принадлежит пользователь.

нетрудно представить эмулятор терминала, который поддерживает выбор с помощью Shift + стрелки, но я думаю, что ему придется скрыть курсор оболочки и ввести свой собственный "поддельный курсор", который временно существует, чтобы помочь вам выбрать что-то, а затем вы можете нажать Ctrl+C / Ctrl+Shift+C / Ctrl+Ins для копирования (или Esc для отмены) и снова показать реальный курсор. Это не будет иметь все возможности нормального выбора, конечно-особенно вырезать и удалить не будет существовать.

1
отвечен Qwertie 2023-03-15 02:13

Я просто помог приятелю через аналогичный вопрос к этому и узнал, что менеджер буфера обмена clipit был виновником.

sudo apt получить удалить clipit

был в состоянии получить все обратно и работает просто отлично для него. Надеюсь, это поможет кому-то еще.

0
отвечен Mandela Affected 2023-03-15 04:30

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх