Почему режим вставки в скобках время от времени включается на экране моего терминала?


23

Я использую Ubuntu 14.04, и у меня странная проблема с экраном моего терминала, которая меня сильно беспокоит. Может ли кто-нибудь помочь мне с этим или объяснить, если я делаю что-то неправильно или не в стиле Linux? У меня есть какое-то решение, но я хочу понять, почему это происходит снова и снова.

Я часто копирую команды bash из своих заметок или из Интернета, а иногда получаю странные символы 0 ~ и 1 ~, которые обертывают скопированные объекты. Это очень раздражает, и это происходит совершенно случайно.

После долгих поисков я обнаружил, что эта штука называется режимом вставки с трещинами, поэтому теперь я использую эту команду, printf "\e[?2004l"чтобы исправить свой терминал, если этот режим внезапно включился.

Можно ли как-то отключить эту функцию навсегда? Я сталкивался с этим на всех машинах Ubuntu, на которых я сейчас работаю. Ранее я использовал Ubuntu 10.10 и 12.04, и у меня никогда не было такой проблемы раньше.

Ответы:


11

Вы можете отключить режим вставки в скобках.

Чтобы попробовать это временно, в bash:

bind 'set enable-bracketed-paste off'

Затем, если вам нравится, как это ведет себя, вы можете поместить настройку в свой ~/.inputrcили для всей системы в /etc/inputrc(или где бы то ни было в Ubuntu).


4
Мне кажется, все, что мне нужно, это сделать так, чтобы я не мог набрать букву «p» (и только
говорит Брайан «Восстановить Монику

@BrianLeishman Из-за своеобразного способа bindразбора аргументов, которые он не распознает, это произойдет, если вы запустите эту команду, используя Readline до версии 7 или Bash до 4.4. Этот ответ не принесет пользы до следующего выпуска Ubuntu (17.04).
Энтони Дж - правосудие для Моники

В printfподход работает, но не работает , когда положил мне .bashrc, и эта функция как - то автоматически включается снова периодически. bindПодход разрушает мою клавиатуру ( pклавиша не работает , and putting that line in my ~ / .inputrc` работа, в течение 10 секунд, а затем начинает консоль ненадежно из -enaset-enaset-...навсегда после 10 секунд использования. В конце концов я просто вручную повышен до Баша 4.4 из источника , чтобы исправить глупые проблема.
Облако

1
Правильная команда bind 'set enable-bracketed-paste off'(с пробелом вместо первого `-``. Редактирование только одного символа кажется невозможным.
Стрелка

7

Вы можете поместить эту команду в свой bashrc. Тогда это будет применяться каждый раз, когда вы открываете свой терминал.

Просто введите vi ~/.bashrcи добавьте printf "\e[?2004l"в конце и сохраните файл с:wq


Да, я сделал это сначала на самом деле :) позже я просто отключил этот режим, как предложил @jwd.
Артемдевел

1
echo 'printf "\e[?2004l"' >> ~/.bashrcделает то же самое в одной строке, и вы можете проверить с помощью tail -n1 ~/.bashrc. Там нет необходимости использовать vi.
pzkpfw

6

Чтобы ответить на исходный вопрос о том, почему это происходит, вот возможный сценарий:

  • На моем домашнем компьютере была установлена ​​новая версия zsh, которая поддерживала вставку в скобках (назовем это оболочкой A)
  • Я зашел на компьютер с моей оболочкой, установленной на более старую версию bash, которая не поддерживает вставку в скобках (оболочка B)

Проблема в том, что моя терминальная программа все еще думает, что вставка в скобках включена при передаче из оболочки A в оболочку B, поэтому она продолжает добавлять символы вокруг вставленного содержимого (биты 0 ~ и 1 ~). Оболочка B не поддерживает их, поэтому просто пропускает их без изменений. Вы должны указать терминалу отключить вставку в скобках, напечатав в своей оболочке специальную escape-последовательность, что и printf "\e[?2004l"делает.

Есть несколько способов решить проблему:

  1. Если вам вообще не нужна вставка в скобках, отключите ее в оболочке A, чтобы она никогда не включалась (ответ @ jwd)

  2. Если вы хотите продолжать использовать вставку в скобках в оболочке A, но отключить в оболочке B, добавьте escape-последовательность к своему .bashrc(ответ @ MOHRE)

  3. Обновите оболочку B для поддержки вставки в скобках, чтобы она правильно интерпретировала символы 0 ~ и 1 ~.

Примечание: если вы используете экран GNU, вам нужно выполнить эту printfкоманду за пределами экрана. Кажется, он не работает внутри.


Спасибо @rjh :) Но я никогда не использовал zsh и не имел проблем с ssh, как вы описали. Похоже, что-то было неправильно настроено в Ubuntu много лет назад.
artemdevel
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.