Почему терминал автоматически вводит мою команду после вставки текста?

9

Это происходит независимо от того, использую ли я Ctrl + Shift + V или вставить из контекстного меню.

Как мне остановить это поведение?

Потерянная душа
источник
Требуется больше объяснений, чтобы понять ваш вопрос
SHW
Может быть, ConEmu в Windows делает то, что вы хотите - когда вы пытаетесь вставить что-то, содержащее переводы строк, оно предупредит вас перед продолжением. Это отчасти приятное прикосновение. Может быть, есть эмулятор терминала Linux, который имеет эту функцию?
Брандин
4
Держу пари, что вы копируете завершающий символ "\ n" (символ новой строки, который вы не увидите в своем тексте, но он присутствует, если у вас есть разрыв строки), когда вы копируете свой текст, который будет эмулировать нажатие клавиши ВВОД, следовательно, выполнение команда.
Герберт
Возможный дубликат этого - unix.stackexchange.com/questions/202732/… Я не знал о "пасте в скобках", упомянутой в этом вопросе. Я обычно использую текстовый редактор в сочетании с терминалом, а затем осторожно копирую / вставляю нужные части в терминал.
Брандин

Ответы:

6

Не копируйте несколько строк текста, чтобы вставить. Я почти гарантирую, что вы просто копируете последнюю часть строки. Если вы нажмете три раза, чтобы скопировать вставляемую строку кода, вы получите новую строку в конце строки. Если вы хотите быть уверенным, что это действительно проблема, скопируйте всю строку, кроме последней буквы / цифры, и посмотрите, вставляет ли это также новую строку.

WormFood
источник
Это произошло только тогда, когда я скопировал несколько строк кода. Теперь я понимаю почему.
LostSoul
7

Вставляемый текст включает в себя завершающий перевод строки. Когда вы вставляете новую строку, оболочка, запущенная в терминале, видит это как нажатие Enter, поэтому она выполняет команду.

Операция вставки выполняется эмулятором терминала; он передает вставленный текст приложению, запущенному в терминале, так же, как передает текст, набранный пользователем. См. Как работают ввод с клавиатуры и вывод текста? для получения дополнительной информации о том, как работает ввод. Приложение (в данном случае оболочка) не может различить нажатия клавиш и операцию вставки.

В наши дни многие терминальные эмуляторы поддерживают вставку в скобках . В режиме вставки в скобках приложение может отличить операцию вставки от нажатия клавиши. Вставка в скобках полезна только в том случае, если приложение делает что-то другое со вставленным текстом, поэтому оно включено поддержкой приложений, это не то, что настраивается пользователем эмулятора терминала.

В Zsh 5.1 (который вышел несколько недель назад, но пока недоступен в большинстве дистрибутивов) добавлена ​​поддержка режима вставки в скобках. Когда вы вставляете текст, он просто вставляется в командную строку, и вы можете отредактировать его перед нажатием Enterдля запуска командной строки.

Пользователи oh-my-zsh могут использовать плагин safe-paste даже в более ранних версиях zsh.

Еще одна вещь, которую вы можете сделать в zsh - это вставить выделение в виде строки с кавычками (в виде обратной косой черты перед каждым специальным символом оболочки, таким как пробел). Введите, `xsel`чтобы получить основной выбор (автоматический выбор мыши) или `xsel -b`получить содержимое буфера обмена (текст, скопированный с помощью Ctrl+ C), затем нажмите Tab.

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

function zle_insert_x_selection {
  LBUFFER+=$(xsel ${NUMERIC+-b} -o </dev/null)
}
zle -N zle_insert_x_selection
bindkey '\e\C-v' zle_insert_x_selection

Имея это в вашем .zshrc, вы можете нажать Ctrl+ Alt+, Vчтобы вставить основной выбор, или Ctrl+ U Ctrl+ Alt+, Vчтобы вставить содержимое буфера обмена. Они вставляются перед курсором, без изменений, кроме завершающего символа новой строки. См. Раздел «Использование буфера обмена между bash и X11», чтобы узнать что-то похожее в bash.

Жиль "ТАК - перестань быть злым"
источник
7

Если вы используете bash в качестве оболочки, вы можете нажать, Ctrl-X Ctrl-Eчтобы вызвать редактор (определяется $ VISUAL или $ EDITOR, например viили возможно nano).

Затем вы можете вставить в него свои команды точно так же, как если бы вы редактировали файл. Они будут выполнены, если вы сохраните и выйдите. Или отменен, если вы вышли без сохранения.

саз
источник
Этот метод не работает для меня.
LostSoul
3

Чтобы выполнить многострочную вставку в командную строку, откройте одинарные или двойные кавычки перед вставкой.

$ echo 'paste
...
... '

Затем вы можете нажать Return, чтобы повторить его. Когда вы нажимаете стрелку вверх, все вставленные вами строки будут на одной редактируемой строке.

Это работает до тех пор, пока в вставляемом вами тексте нет ни одной кавычки.

Питер Кордес
источник
1

В окне текстового редактора используйте следующие сочетания клавиш для копирования текста без \ n (перевод строки):

  • Shift+ Home, Ctrl+ Insert- копирует часть строки перед курсором.
  • Shift+ End, Ctrl+ Insert- копирует часть строки после курсора.
  • Home, Shift+ End, Ctrl+ Insert- копирует все строки без \ n.

В окне браузера или в другом месте, где текст недоступен для редактирования, используйте один из двух методов:

  • Сначала скопируйте в текстовый редактор (желательно, так как дает вам возможность редактировать команды).
  • Выделите только текст в строке (не расширяя зону выделения вправо за пределы последнего символа), затем Ctrl+ Insertи вставьте в окно терминала.

Как выглядит правильный выбор (без \ n):

ls -al

Как выглядит неправильный выбор (с \ n):

ls -al
Incnis Mrsi
источник