Это стандартные сочетания клавиш для редактирования текста, которые я постоянно использую при редактировании текста, буквально, в любом приложении 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 для поддержки этого?
Я знаю, что текст можно копировать / вставлять с помощью мыши, это не то, о чем я спрашиваю. Я спрашиваю, почему я не могу сделать это с помощью клавиатуры в эмуляторе терминала.
источник
Ответы:
Я думаю, было бы очень полезно, если бы я взял этот кусок за раз. Общая проблема: для кого предназначено нажатие клавиши? Терминал или программа, работающая внутри терминала?
Например, «экран», который является своего рода терминалом, использует Ctrl+ Aв качестве префикса для своих команд, чтобы отличать их от вещей, идущих на саму запущенную программу. (И предоставляет способ отправить Ctrl+ A.)
gnome-terminal
имеет несколько ключей, которые он захватывает для выполнения различных задач, включая некоторые из тех, о которых вы спрашиваете.Также имейте в виду, что «подсветка» терминала отделена от позиции курсора терминала . Некоторые терминалы вообще не имеют возможности подсветки.
Теперь, принимая эту комбинацию клавиш одновременно:
Двигайся влево и вправо? Bash может быть настроен для этого, и обычно это по умолчанию. Как правило, они перемещают позицию курсора.
Первый: имеет ли смысл копировать / вставлять? Если вы находитесь в 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
.Подсветка вашего терминала (если у него есть такая возможность) отделена от позиции курсора. Опять же, отсутствие доступных комбинаций клавиш, вероятно, является фактором. Имейте в виду, что выделение имеет две позиции: либо начало и конец, либо верхний левый и нижний правый углы. Как вы управляете обоими?
Наконец, обратите внимание, что во многих графических терминалах двойной щелчок по слову выделяет его. (И в X, скопируйте в основной выбор.)
screen
Например, имеет ключи для переключения в режим перемещения по буферу (предыдущий вывод) и копирования / вставки.Я думаю, что если вы сделаете адекватное использование
xsel
и первичный выбор, вы обнаружите, что операции с буфером обмена являются достаточно редкими и достаточно сложными, чтобы их можно было использовать с помощью мыши.источник
gnome-terminal
были бы похожие проблемы: они, вероятно, не реализовали это, потому что это не совсем то, что вы делаете. Имейте в виду, что оболочка - не единственная запущенная программа: может быть запущена любая программа, и она может захотеть использовать любую последовательность клавиш, которую вы можете использовать для копирования / вставки, в своих собственных целях. На экране есть способы отправки ключей, которые он переопределяет, а gnome-терминал старается не наступать на пальцы.Я не эксперт по эмуляторам терминала, но ...
приложения, такие как 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
источник
Полученные ответы являются хорошим объяснением того, почему это сложно сделать. Вот что вы можете сделать в гном-терминала для установки ctrl-cи ctrl-vдля копирования и вставки, а подменой другие клавиши в терминале дисциплины с
stty
для отправкиSIGINT
и вставки символа дословно. Это не полное решение, потому что некоторые программы отключают терминальную дисциплину, и вы не сможете отправить им «^ C» и «^ V». Больше информации здесь .В вашей оболочке сценарий запуска (например
~/.bashrc
,~/.zshrc
,~/.rcrc
), сделатьЗатем в gnome-terminal Edit> Preferences> Shortcuts вы можете связать Copy и Paste с ctrl-c и ctrl-v. Обратите внимание, что терминал получит ключевые события до того, как что-либо будет отправлено на терминальное устройство, поэтому с этого момента вы не сможете отправлять '^ C' и '^ V' любому процессу, запущенному на терминале.
Я только что сделал это, и я посмотрю, как это происходит, и какие проблемы это вызывает. Я сделал stty's условно, чтобы применить их только тогда, когда я использую X.
источник
Как упомянул Танатос, следует различать эмулятор терминала (работающий на X Windows или Wayland) и программы, работающие в терминале (назовем это «оболочкой», хотя это может и не быть); эти две вещи изолированы друг от друга (см. технические детали ).
Первые элементы в вашем списке (клавиши со стрелками, Home / End и т. Д.) Обрабатываются непосредственно программой внутри терминала, поэтому положение курсора контролируется программой внутри терминала.
Скопировать и вставить ярлыки (Ctrl + Shift + C и Ctrl + Shift + V), с другой стороны, обрабатываются эмулятором терминала, который понимает мышь (так что вы можете выделять текст с помощью мыши), он знает, что на экране (чтобы он мог копировать), и может отправлять нажатия клавиш в программу внутри (чтобы он мог вставлять).
Чтобы поддерживать Shift + Left и Shift + Right, эмулятор терминала или оболочка должны были обрабатывать нажатие клавиш. В любом случае у нас есть проблема:
xclip
). И насколько я знаю, если оболочка поддерживает выделение текста, Linux не определяет какой-либо механизм для уведомления эмулятора терминала о том, что выбрано.~ $ ls -l
а эмулятор терминала не знает, что толькоls -l
часть принадлежит пользователю.Нетрудно представить себе эмулятор терминала, который поддерживает выделение с помощью Shift + Arrows, но я думаю, что ему придется скрыть курсор оболочки и ввести свой собственный «поддельный курсор», который временно существует, чтобы помочь вам выбрать что-то, а затем вы можете нажать Ctrl + C / Ctrl + Shift + C / Ctrl + Ins для копирования (или Esc для отмены) и показать реальный курсор еще раз. Конечно, в нем не было бы всех возможностей обычного выбора - в частности, вырезать и удалять не было бы.
источник
Я просто помог собеседнику решить проблему, аналогичную этой, и обнаружил, что виновником является клип менеджера буфера обмена.
sudo apt-get удалить clipit
был в состоянии восстановить все и работать просто отлично для него. Надеюсь, что это может помочь кому-то еще там.
источник