Чому я не можу виділити текст у емуляторі терміналу Linux за допомогою клавіш shift + стрілки?


19

Це стандартні комбінації клавіш для редагування тексту, якими я постійно користуюсь під час редагування тексту, буквально, у будь-якому додатку Linux, окрім емуляторів терміналів:

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

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

  • Це проблема з моїм термінальним емулятором або з моєю оболонкою (баш, хоча я готовий змінити)?
  • Чому термінальні емулятори / оболонки не відповідають цьому інакше універсальному стандарту?
  • Якщо є фактична причина, вона давня і застаріла, чи вона все ще стосується значної кількості користувачів настільних Linux?
  • Чи є якесь вирішення?
  • Чи є якась незрозуміла програма, яку я можу використовувати, яка підтримує це?
  • Чи можливо змінити джерело, скажімо, gnome-терміналу для підтримки цього?

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


Зауважте, що вибір тексту за допомогою миші не змінює положення курсору. Якщо ви хочете змішати в виборі тексту із занесенням звичайні команди на клавіатурі, він би просто дійсно заплутаним за межами команди , яку ви тільки що ввели, але ще не виконується. Чи можете ви вибрати текст за межами текстового поля на веб-сторінці за допомогою клавіатури? Також зверніть увагу, що існують такі програми, як екран, які дозволяють перейти в інший режим, який має вибір тексту для всього терміналу, але, звичайно, більше не дозволяє вводити команди.
Даніель Бек

1
Даніель: Наприклад, консоль Matlab - це CLI, що дозволяє виділяти текст за допомогою клавіатури. На моєму досвіді це прекрасно працює; це дозволяє вибір за межі поточної ще не виконаної команди за бажанням, особисто я для цього мало користі.
monguin


Відповіді:


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 + стрілка для виділення цілого слова

Родзинка вашого терміналу (якщо він має цю можливість) є окремою від позиції курсору. Знову ж таки, відсутність доступних ключових комбо, мабуть, є фактором. Майте на увазі, що підсвітка має два положення: або початок і кінець, або верхній лівий і нижній правий кути. Як ви керуєте обома?

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

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

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


5
Я вдячний за час, який ви зайняли, щоб написати свою відповідь, але я якось не відчуваю, що розумію, чому це не доступна функція в емуляторах терміналів. Ви вказали мені нову ідею - що термінальний емулятор унікальний тим, що він може запускати інші програми - але я не розумію, чому лише вибраний підмножина комбінацій клавіш неможливо зробити доступною для користувача.
monguin

2
Термінальні емулятори імітують фізичні термінали . Вони створені не з нуля, щоб забезпечити інтерфейс командного рядка. Такі речі, як Control-C, мали своє значення задовго до того, як Microsoft вирішила вибирати їх як комбінації клавіш, і термінальні емулятори повинні дотримуватися їх.
чепнер

2
Я думаю, чорт тут у деталях. Це не неможливо: на екрані є режим робити те, що ви хочете, я думаю. Але для цього вам потрібно перейти в режим "Я хочу вибрати речі". gnome-terminalмали б подібні проблеми: вони, ймовірно, не реалізували це, оскільки це не зовсім те, що ти робиш. Пам’ятайте, що оболонка не є єдиною запущеною програмою: будь-яка програма може працювати, і вона може використовувати будь-яку послідовність клавіш, яку ви можете використовувати для копіювання / вставки для власних цілей. на екрані є способи надіслати ключі, які він переосмислює, і gnome-terminal намагається не наступати на пальці.
Танатос

1
Вибір блоку - це засіб вибору прямокутника: Тримайте контроль і перетягуйте в gnome-terminal, і вам слід негайно побачити, як це відрізняється. Більшість емуляторів терміналів GUI мають таку можливість, а також більшість сучасних текстових редакторів. (Див., Наприклад, Visual block in vim.)
Thanatos

1
Ага, тоді я знайомий з вибором блоку, але не знав назви. Я також не знаю комбінації клавіш для графічного інтерфейсу для цієї дії, тому здається, що не потрібно вигадувати її для того, щоб відповісти на моє запитання. Я ціную всі коментарі тут, але оскільки я все ще незадоволений, я вважаю, що все, що я можу зробити, - це самому
копатись

1

Я не фахівець емуляторів терміналів, але ...

такі програми, як bash (readline), що працюють в емуляторі терміналу, нічого не знають про працюючу X-віконну систему та X-вікно, в якому вони знаходяться, вони знають stdin та stdout на термінальному пристрої (ttyS / ttyUSB / tty / pts у Linux).

Проблема полягає не в тому, щоб відобразити якийсь виділений текст, а як повідомити програмі X вікна (емулятор термінала), що текст був вибраний за допомогою цих термінальних пристроїв.

Я думаю, що додаток X-терміналу відкриє один із цих пристроїв на вході та виході, а потім переводить X ключові події на правильний вихід (з боку X) вхід (з боку bash). Повертайте вихідний потік bash до X-терміналу як вхід , тут X-термінал обробляє цей вхід для переміщення курсору, заповнення фонового кольору деяким кольором, відповідно до виходу програми bash.

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

Я думаю , що не стандартне визначення вам доведеться пропатчити всі додатки ви хочете , щоб підтримати його , щоб дізнатися про комбінації клавіш натиснула і вихід відповідного код втечі Readline , якщо ви хочете його в БАШЕЄВ, Х емулятори терміналу на інша сторона, щоб правильно обробити код евакуації (і нарешті надіслати інформацію до буфера обміну). Можливо, реалізація цього як можливості терміналу врятує вас від виправлення кожної програми. Я сподіваюся (і здогадуюсь), що драйвери термінальних пристроїв у ядрі хочуть якомога менше знати про коди евакуації, тому, якщо вам пощастить, патч не знадобиться.

X-термінал малює вихід, тож, коли ви користуєтесь мишею, легко дізнаєтесь, який текст / символи ви вибираєте.

Графічний текстовий віджет знає все про його вікно X, і тому так легко здійснити вибір і скопіювати.

EDIT

Ось цей патч urxvt-9.16-відображення зображень може стати гарною відправною точкою для розуміння того, що потрібно для підтримки нових кодів евакуації. http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html


1

Надані відповіді - це хороші пояснення того, чому це важко. Ось що ви можете зробити в gnome-терміналі для установки 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> ярлики ви можете прив’язати Copy and Paste до ctrl-c та ctrl-v. Зауважте, що термінал отримає ключові події до того, як що-небудь буде надіслано термінальному пристрою, тому з цього моменту ви не зможете надсилати "^ C" і "^ V" на будь-який процес, що працює на терміналі.

Я щойно це зробив, і я побачу, як це відбувається, і які проблеми це викликає. Я робив умовно stty, щоб застосувати їх лише тоді, коли я запускаю X.


1
Дякуємо за відповідь. Тим часом я звик до прив’язок OSX та Emacs, а також просто відмовився від мрії про ctrl + shift + стрілка в терміналі ...
monguin

1

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

Перші елементи у вашому списку (клавіші зі стрілками, Головна / Кінець тощо) обробляються безпосередньо програмою всередині терміналу, і тому положення курсору контролюється програмою всередині терміналу.

Комбінації клавіш швидкого доступу (Ctrl + Shift + C і Ctrl + Shift + V), з іншого боку, обробляються емулятором терміналу, який розуміє мишу (тому ви можете вибрати текст за допомогою миші), він знає, що таке на екрані (щоб воно могло скопіювати) і може надсилати натискання клавіш програмі всередині (щоб вона могла вставити).

Для підтримки Shift + Вліво і Shift + Вправо, або емулятор термінала, або оболонка повинні були обробляти натискання клавіші. У будь-якому випадку у нас є проблеми:

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

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


Дякую, я прочитаю цю статтю TTY, але поки не. Це може пояснити розбіжність у моєму розумінні різниці між "емуляторами терміналів" та "настільними програмами, які обробляють текстові програми". Мій попередній приклад, консоль Matlab, поводиться саме так, як я хочу. Я не розумію, чому не може бути настільного додатка з такою поведінкою, де текстова програма, що працює в ньому, є чимось крім Matlab. Скажіть, я хотів використовувати лише найосновніші команди оболонки - ls, cd, cp, mv - тоді я не бачу жодного конфлікту. Такі програми, як екран або tmux, я розумію, що можуть зробити речі складнішими.
monguin

1

Це прив'язки клавіатури CUA, які ви описуєте, стандарт IBM в середині 80-х:

https://en.wikipedia.org/wiki/IBM_Common_User_Access

Вони, як правило, реалізуються у всіх робочих середовищах, створених з тих пір. DOS, Windows, Motif, навіть інструменти мережевого програмного забезпечення, всі вони сходилися за цим стандартом. Один виняток - Mac, який використовує досить схожий, але різний набір (Cmd замість Ctrl) з того самого періоду часу.

Однак термінали Unix набагато передували цьому стандарту і здебільшого його ігнорували. Крім того, якщо вони реалізують ці ключові прив'язки, це може заважати програмам TUI, які вже використовують їх для інших функцій. Тому, хоча технічно це можливо, теж проблематично.

Програми:

microТекстовий редактор є найкращим , що я бачив в емулює текстовий редактор GUI, схожий на DOS  , editале з більш сучасними функціями а - ля Sublime Text. neє старішим в репоні Debian, і навіть nanoйого можна налаштувати за допомогою розумних клавіш. Але голий термінал / оболонка, ні.

З libvteцим може бути легко побудувати рудиментарний віртуальний термінал, який самостійно обробляє ці вкладки. Але багато роботи для невеликого прибутку, однак.


0

Я просто допоміг приятелю через подібне питання до цього і з’ясував, що винуватцем менеджера буфера обміну є винуватцем.

sudo apt-отримати видалити кліп

зміг повернути все до нього і працює для нього просто чудово. Сподіваюся, що це може допомогти комусь іншому там.


Ви відповіли неправильно? Це було загальним питанням щодо можливостей усіх емуляторів терміналів. Цілком зрозуміло, що "рішення" немає. Я ні зараз, ні в мене ніколи не був встановлений кліпт на жодній машині.
monguin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.