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

17

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

  • стрелки влево + вправо для перемещения влево + вправо
  • Ctrl + стрелка для перемещения всего слова
  • начало / конец, чтобы перейти к началу / концу строки
  • 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 для поддержки этого?

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

monguin
источник
Обратите внимание, что выделение текста с помощью мыши не меняет положение курсора. Если вы хотите смешать в выборе текста с занесением обычных команд на клавиатуре, он бы просто действительно запутанный за пределы команды , которую вы только что ввели, но еще не выполняетесь. Вы можете выделить текст за пределами текстового поля на веб-странице с помощью клавиатуры? Также обратите внимание, что существуют программы, такие как screen, которые позволяют войти в другой режим, в котором есть выделение текста для всего терминала, но, конечно, больше не разрешается ввод команд.
Даниэль Бек
1
Даниэль: например, консоль Matlab - это интерфейс командной строки, который позволяет выделять текст с помощью клавиатуры. Это прекрасно работает в моем опыте; при желании он позволяет выполнять выбор за пределами текущей еще не выполненной команды, лично мне это мало пригодится.
Monguin
см. также stackoverflow.com/questions/1536757/…
Никос Александрис
и здесь также stackoverflow.com/q/312213/1172302
Никос Александрис

Ответы:

5

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

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

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дословно.)

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

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

Shift + стрелка для выделения текста Shift + Ctrl + стрелка для выделения всего слова

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

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

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

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

Танатос
источник
4
Я ценю время, которое вы потратили на написание своего ответа, но почему-то я не чувствую, что у меня есть лучшее понимание того, почему эта функция недоступна в эмуляторах терминала. Вы указали мне новую идею - эмулятор терминала уникален тем, что он может запускать другие программы, - но я не понимаю, почему только подмножество комбинаций клавиш невозможно сделать доступными для пользователя.
Monguin
2
Эмуляторы терминалов эмулируют физические терминалы . Они не были созданы с нуля, чтобы обеспечить интерфейс командной строки. Такие вещи, как Control-C, создали смысл задолго до того, как Microsoft решила использовать их в качестве сочетаний клавиш, и эмуляторы терминалов должны их придерживаться.
chepner
2
Я думаю, что дьявол кроется в деталях здесь. Это не невозможно: у экрана есть режим, чтобы делать то, что вы хотите, я думаю. Но для этого вам нужно переключиться в режим «Я хочу выбирать вещи». gnome-terminalбыли бы похожие проблемы: они, вероятно, не реализовали это, потому что это не совсем то, что вы делаете. Имейте в виду, что оболочка - не единственная запущенная программа: может быть запущена любая программа, и она может захотеть использовать любую последовательность клавиш, которую вы можете использовать для копирования / вставки, в своих собственных целях. На экране есть способы отправки ключей, которые он переопределяет, а gnome-терминал старается не наступать на пальцы.
Танатос
1
Выбор блока - это средство выбора прямоугольника: удерживайте управление и перетащите его в gnome-терминал, и вы должны сразу увидеть, чем он отличается. Большинство эмуляторов GUI-терминалов имеют такую ​​возможность, как и большинство современных текстовых редакторов. (См., Например, Визуальный блок в vim.)
Танатос
1
Ах, тогда я знаком с выбором блоков, но не знал названия. Я также не знаю о сочетаниях клавиш GUI для этого действия, поэтому, кажется, нет необходимости изобретать их, чтобы ответить на мой вопрос. Я ценю все комментарии здесь, но, так как я все еще не удовлетворен, я полагаю, что все, что я могу сейчас сделать, это самому покопаться в источнике ...
monguin
1

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ

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

Alex
источник
1

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

В вашей оболочке сценарий запуска (например ~/.bashrc, ~/.zshrc, ~/.rcrc), сделать

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-terminal Edit> Preferences> Shortcuts вы можете связать Copy и Paste с ctrl-c и ctrl-v. Обратите внимание, что терминал получит ключевые события до того, как что-либо будет отправлено на терминальное устройство, поэтому с этого момента вы не сможете отправлять '^ C' и '^ V' любому процессу, запущенному на терминале.

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

spelufo
источник
1
Спасибо за ответ. Между тем я привык к привязкам OSX и Emacs, а также просто
разочаровался
1

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

Первые элементы в вашем списке (клавиши со стрелками, Home / End и т. Д.) Обрабатываются непосредственно программой внутри терминала, поэтому положение курсора контролируется программой внутри терминала.

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

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

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

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

Qwertie
источник
Спасибо, я прочитаю эту статью TTY, но еще не прочитал. Это может объяснить разрыв в моем понимании разницы между «эмуляторами терминала» и «настольными приложениями, которые обрабатывают текстовые программы». Мой предыдущий пример, консоль Matlab, ведет себя именно так, как я хочу. Я не понимаю, почему не может быть настольного приложения с таким поведением, где текстовая программа, работающая в нем, является чем-то помимо Matlab. Скажем, я хотел использовать только самые основные команды оболочки - ls, cd, cp, mv - тогда я не вижу никакого конфликта. Такие программы, как screen или tmux, я понимаю, могут усложнить задачу.
Monguin
0

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

sudo apt-get удалить clipit

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

Мандела Пострадавший
источник
Вы ответили не на тот вопрос? Это был общий вопрос о возможностях всех эмуляторов терминала. Совершенно ясно, что нет «решения». У меня нет сейчас, и у меня никогда не было клипита, установленного на какой-либо машине.
Monguin