Почему Ctrl + V не вставляется в Bash (оболочка Linux)?


192

Когда я копирую что-то в буфер обмена и нажимаю Ctrl+ Vв Bash, ничего не происходит; Тем не менее, щелкнув правой кнопкой мыши и выбрав Вставить, сделает работу.

Почему? Есть ли какая-либо разумная проблема (я уверен, что есть) за этим поведением в Linux?


25
Shift- Insertтакже работает
bonyiii

33
Я предпочитаю Ctrl-Shift-V, лично.
Амаллой

3
Вы также можете использовать Shift + Insert в большинстве оболочек.
Фабиан

4
Что делать, если у вас не будет ключа вставки?
Бен Рацикот

3
он также не работает в командной строке
Windows

Ответы:


360

Во времена физических терминалов буфер обмена в течение сеанса не существовал, лишь немногие программы поддерживали внутреннее копирование / вставку - часто под названием «буферы» или «кольца уничтожения» - и использовали различные нажатия клавиш. Например, оболочка bash использует CtrlKили CtrlU«убивать» (вырезать), CtrlY«дергать» (вставлять); это происходит от в Emacs редактора .

CtrlCпочти везде в Unix была клавиша «прерывание» , используемая для отмены текущей программы или операции. CtrlVКлюч часто означает «дословную вставку» - то есть, вставить следующий символ буквально без выполнения каких - либо соответствующих действий. Например, нормальный Escпереключается в режим в команду VI редакторе, но CtrlV, Escбудет вставлять ESCсимвол в документ.

Использование CtrlCкопировать и CtrlVвставлять из буфера обмена всей сессии было введено Mac OS в 1983 году и Microsoft Windows 3.x в 1990 году. (Более ранние версии Windows (1.x и 2.x), а также IBM OS / 2 , поддерживается только ключи IBM CUACtrlIns для копирования и ShiftInsвставки; эти сочетания клавиш поддерживаются всеми версиями Windows.)

Когда GUI с поддержкой буфера обмена наконец достигли Unix, Ctrlнажатия клавиш уже использовались многими терминальными программами. Кроме того, графический интерфейс X имел несколько иные механизмы : «выборки» и «обрезки буферов». Даже сейчас вы можете выделять текст в одной программе и вставлять его с помощью средней кнопки мыши, без каких-либо явных действий копирования.

Короче говоря, к тому времени, когда были написаны Xterm и GNOME Terminal (я полагаю, вы используете последний), они CtrlV уже много лет имели совершенно другое значение и не могли быть изменены. Кроме того, альтернативный метод копирования текста - «выделение» - уже присутствовал в X11, поэтому явное действие копирования / вставки, вероятно, считалось не таким важным, как в Windows. Это означает, что нужно было выбирать разные сочетания клавиш - например, большинство современных терминальных программ, таких как GNOME Terminal, используют CtrlShiftCи CtrlShiftV. (Если вы используете Xterm, те же самые ярлыки можно добавить вручную, используя Xresource XTerm * vt100 * translations . Rxvt не имеет такой опции.)

(Большинство наборов инструментов X11 также поддерживают клавиши «копировать» и «вставить» CUA, которые не конфликтуют с терминальными программами. К сожалению, реализации довольно противоречивы - CtrlInsкопии в «буфер обмена» в большинстве программ (GTK, Qt4, но игнорируются Xaw), однако, ShiftInsвставляет из "первичного выбора" в большинстве программ GTK и Qt4, но из "буфера обмена" в Firefox и из устаревших теперь буферов среза в устаревшем Xaw.)


Все , что сказал, некоторые терминалы или консоли (в частности, для Windows 10 консоли) сделать поддерживают эти ключи. Поскольку консоль Windows всегда имела отдельный режим «пометить / выбрать», CtrlCтеперь она также имеет два значения в зависимости от контекста - в обычном режиме она отправляет прерывание, в режиме выбора она копирует в буфер обмена (так же, как Enterраньше).

Между тем, инструменты командной строки Windows никогда не использовались CtrlV для чего-либо, поэтому он должен был «вставлять», ничего не мешая. Однако сделать то же самое на Unix-подобных терминалах было бы более проблематично.


10
Хм. В Vim «yank» означает копировать, а не вставлять. Кажется, в этом тоже есть смысл. Вы уверены в значении этого термина здесь?
Конрад Рудольф

11
Да, я уверен. Bash наследует ярлыки по умолчанию от их эквивалентов в Emacs .
grawity

4
@ Grawity: ваш последний комментарий немного обманут. Bash предлагает два режима редактирования командной строки: vim-mode и emacs-mode. Просто случается, что emacs-mode используется по умолчанию в большинстве установок. Это вызывает неоднозначность в использовании термина yank даже для bash.
Рахму

1
Ага! Я знал, что разработчики Vimperator допустили ошибку, когда они переключились <C-v>на iверсию 3, но я не мог понять, почему .
Изката

2
@Colin: Вы все еще пропустили различие между буфером обмена и выбором X. Существует несколько вариантов выбора (ПЕРВИЧНЫЙ, ВТОРИЧНЫЙ, КЛИПАТИЧЕСКАЯ), но только один из них обычно называется «буфером обмена» - выбор КЛИПОВОЙ ПЛАТЫ, потому что именно туда копирует Ctrl-C, и именно из него вставляется Ctrl-V. Основной выбор - не буфер обмена.
grawity

47

Используйте CtrlShiftVдля вставки.

Ctrl с другими символами обычно используется оболочка для специальных функций.


4
Так почему же Linux не регистрирует CTRL + SHIFT для специальных функций; Я думаю, что копирование-вставка является более типичным для некоторых пользователей, чем специальные функции, верно?
Ясир Замани

22
Оболочки существовали задолго до появления графических терминалов и графических интерфейсов с функциями вырезания и вставки, поэтому ваш аргумент не является действительным. @YasserZamani
slhck

9
Ctrl + Shift + V выполняется эмулятором терминала (при условии, что вы используете GNOME Terminal), а не bashсам по себе. Если вы когда-либо находитесь за пределами графического интерфейса или используете другой термин-эмулятор, это, вероятно, не сработает. Не думайте, что эта команда переносима.
Рахму

@rahmu О, понятия не имел об этом. Используйте только стандартные установки Ubuntu. Есть ли универсальная команда?
Акаш

2
Вероятно, нет доступа к буферу обмена (только Shift + Ins для основного выбора). Даже сам буфер обмена - вещь X11, недоступная у tty. Однако Ctrl + Shift + V поддерживается GNOME Terminal, Xfce4 Terminal, KDE Konsole; это охватывает наиболее популярные графические среды.
Гравитация

20

Вот ваши общие настройки копирования и вставки с популярными терминалами:

gnome-терминал (самый популярный в Linux)
Копировать : CtrlShiftC
Вставить : CtrlShiftV
Примечание : Выбор для копирования и middle-clickвставки также работает, но он использует альтернативный буфер обмена.

PuTTY (самый популярный терминал в Windows)
Копирование : (выберите с помощью мыши, без взаимодействия с клавиатурой)
Paste : Right-click (или более надежно: shiftRight-click)
Примечание : приложения , которые принимают ввод мышей (как vimи links) может украсть Right-click- shiftRight-clickвсегда будет работать в любом приложении.

OSX Terminal
Copy : AppleC
Вставить : AppleV
Примечание. Приложения, которые управляют мышью (например, vimи links), могут переопределять то, что означает выделение текста, и в этом случае копирование не будет работать так, как вы ожидаете. В этих случаях, удерживая нажатой Control, перетащите мышь, чтобы выбрать. Взаимодействие мыши с приложениями по умолчанию отключено в настройках вашего терминала, поэтому большинство людей даже не узнают об этом.


Разве не cmd.exeпопулярнее, чем PuTTY на Windows? :-)
Бен

@Ben Не как терминал SSH.
Тайлер

1
Нет, cmd.exeэто не терминал SSH. Это очень верно.
Бен

3
@Ben: Это вообще не терминал - только оболочка. Терминал по умолчанию в Windows - это компонент Windows Console в csrss.
Гравитация

@Ben, но щелчок правой кнопкой мыши для вставки также работает cmd.exe(и это единственный способ, если вы не хотите открывать меню> редактировать> вставить) в режиме быстрого редактирования . В командной строке pre-win10 нет ярлыка
phuclv

17

Существует глубокая традиция, согласно которой Ctrlключ вместе с буквой генерирует управляющие символы ASCII, найденные путем вычитания 64 из значения ASCII буквы верхнего регистра. Этот расчет карты Ctrl- Aдо 1 и так далее. Например Ctrl- Iэто Tabи Ctrl- Jэто перевод строки.

Там нет подобной традиции Ctrl- Shift. Ctrl- Shift- Vне будут производить какой - либо конкретный характер.

Эмуляторы терминала должны поддерживать традицию, прозрачно проходя через Ctrlсоглашение, позволяя ему отображаться как ввод символов для программ, работающих через это окно терминала. Терминальные программы отображают управляющие клавиши на команды. Например, Bash использует Ctrl- Vв качестве команды, которая означает «принять следующий символ буквально». Это позволяет встраивать управляющий символ в командную строку. Если терминал крадет управляющие клавиши для собственного использования, такие команды становятся недоступными. Таким образом, перехват Ctrl- Vдля мета-функции не может быть и речи (по крайней мере, в конфигурации по умолчанию).

Однако, эмуляторы терминала свободны для перехвата Ctrl- Shift- Vкоторый не ожидается , для создания персонажа. Ctrl- Shift- Vне является стандартом; это вещь Gnome Terminal (которая может быть в некоторых других терминалах).

На рабочих столах Unix на основе X принято, что для копирования не требуется никаких команд. Вы просто выбираете текст. И средняя кнопка вставляет этот текст в другом месте. Вы обнаружите, что он работает в Xterm, Gnome Terminal и Firefox.

Ctrl- Vэто соглашение , Microsoft Windows, которая является имитацией Apple- Vот Macintosh.


3
Это не совсем вычитание - традиционно Ctrl очищает 6-й и 7-й биты символа; из-за этого Ctrl + Shift + letter работает идентично Ctrl + Letter в большинстве терминалов (если только он явно не переопределен терминалом, как в случае сочетаний клавиш копирования / вставки).
Гравитация

1
Поскольку ключи по существу случайным образом упорядочены относительно стандарта ASCII, ПЗУ программы включает в себя несколько справочных таблиц, которые помогают в генерации кодов ASCII. ... Удержание клавиши CONTROL при нажатии другой клавиши вызывает поиск другой таблицы. [Техническое руководство серии VT100, 4.4.9.3, цифровое].
Каз

1
@ Linger спасибо за редактирование. Это хорошо выглядит, но я никак не могу напечатать все эти <kbd>теги в будущих постах.
Каз

Ctrl-Aесть 1. Как я могу попробовать это? Мой терминал Gnome ничего не делает, когда я нажимаю Ctrl-A.
Роберт

3

Для меня самый простой способ скопировать вставить в оболочке:

Выберите нужный код, а затем вставьте его, нажав mouse-middle-key


1
Пока у вас есть средняя клавиша мыши.
jpierson

1
@jpierson не то, чтобы я настоятельно рекомендовал это, но вы можете написать небольшой скрипт, который просто использует xdotool click 2для эмуляции нажатия третьей кнопки для вас. Затем в любой среде оконного менеджера / рабочего стола вы можете привязать этот скрипт к клавише - скажем mod i(для вставки) или к любым комбинациям клавиш, которые у вас могут быть доступны (или к тому, что может означать мод - что на самом деле зависит от того, где вы его связываете)
Dylnmc

2

Мы можем использовать кнопку вставки клавиатуры для копирования и вставки (в старых клавиатурах она может отсутствовать)

Копировать : CtrlInsert
Вставить :CtrlShiftInsert


1

Вы также можете использовать среднюю кнопку мыши и, если вам лень, и выбрать команду из текстового документа, сценария, веб-страницы или форума. Как только вы выбрали нужную команду, просто перейдите к своему терминалу и нажмите среднюю кнопку мыши. Я использую этот метод, поскольку я использую Puppy Linux, который, кажется, не поддерживает нормальное поведение щелчка правой кнопкой мыши и вставки. это происходит в окне обработчика файлов, но не в окне терминала. не знаю почему, но я тихо доволен, я узнал о методе средней кнопки, очень удобно! ;-)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.