Хватит вставлять выделенные фрагменты как текст!


10

Я использую VI и VIM в течение многих лет (30 или более) (в xterms, а не в своем собственном окне, gvim), и у меня есть огромная библиотека команд vim, которые я даю vim, используя в качестве выделения среднюю кнопку мыши.

Например, я часто делал такие вещи, как ...

 vi {many_hundreds_of_files}
   paste vim commands using mouse - one paste per file.

Выбор будет включать в себя множество команд VIM для выполнения таких вещей, как замена теста, форматирование, перемещение строк и т. Д. И т. Д. И т. П., И обычно заканчивается: w и: next VIM-командами в конце выбора, поэтому Vim готов для меня снова вставить в следующий файл. Это позволяет мне обновлять огромное количество файлов ОЧЕНЬ сложными способами, не требуя специальных сценариев (таких как perl-редактирование на месте) для этого.

Некоторые из этих командных вставок vim имеют длину более 200 строк (хранятся в текстовых файлах, которые я выскакиваю на экране, и «копировать все»! Они вносят МНОГО изменений в набор из тысяч файлов, которые я переформатирую. Но только для определенного набора файлов, а не для моей повседневной работы с vim. EG: Массовое переформатирование для файлов текста / данных.

Проблема...

Во время моего последнего системного патча (Fedora 25) vim теперь вставляет выделение мыши как текст, а не как команды vim, и я не могу остановить его!

Он все еще отлично работает в другой системе (Fedora 24).

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

Я попытался датировать записи terminfo (xterm-256color) с машины, которая этого не делает (особенно запись terminfo «kmous»). Я также посмотрел на настройку vim ": set mouse =" (которая является нулевой!). Я не знаю, если это Xterm (сомнительно), или что-то, что изменилось в VIM (вероятно), и журналы изменений и Google были бесполезны.

Ничто, однако, не кажется мне прежним поведением.


Найден другой пользователь с той же проблемой, с меньшей детализацией, без решения unix.stackexchange.com/questions/346293/…
Энтони

1
Я сомневаюсь, что это скорее vimизменение: как vimвнутри xtermзнать, что что-то вводится через клавиатуру или вставляется через кнопку мыши? Я не знаю такого механизма. С другой стороны, xtermзнает, что он выполняется, vimпоэтому он может решить окружить вставку с помощью iи <esc>. Попробуйте (а) с окном терминала другого типа и (б) копию vimс другим именем. Это должно помочь сузить причину проблемы.
Филиппос

Я согласен с @philippos. Может быть, что-то другое, чем vimугон вашего метода вставки. Может быть, попробуйте ssh'ing или telneting в вашу машину и вставьте таким образом. Если у вас есть Windows box, используйте putty для ssh на вашем компьютере Fedora25 и вставьте его таким образом.
Джим У

Не имеет прямого отношения, но Gvim на Windows ведет себя так в течение многих лет. Когда вы устанавливаете gvim, вы получаете два исполняемых файла gvim.exe(graphic-vim) и командную строку vim.exe. Вставьте "itext" в gvim.exe, и вы получите itext. Вставьте его в vim.exe, и вы получитеtext
Джим U

1
@Philippos Этот механизм может быть вставлен в скобки . Я не знаю, как Vim может это поддержать, возможно, pastetoggleвариант?
Жиль "ТАК - перестань быть злым"

Ответы:


12

Хорошо пройдя МНОЖЕСТВО веб-страниц, многие из которых давали некоторые подсказки, которые, похоже, не работали, я нашел подсказку (дополнительный текст вокруг вставки), которая приводит меня к причине и решению проблемы.

Кажется, что vim встроил в него несколько «поддельных» записей termcap, которые он использует, когда распознает определенные терминалы (и иногда ошибается, хотя в данном случае это не так).

Параметры Termcap в vim - это многочисленные добавления, поэтому они НЕ отображаются в обычном списке настроек ": установить все". Чтобы увидеть их, вам нужно использовать ": set termcap". Конкретной «нестандартной» настройкой termcap является «t_BE» (см. Vim «: help t_BE»). Встроенная справка "xterm-bracketed-paste" объясняет эту настройку termcap для внутреннего использования.

В основном, если этот параметр определен (в данном случае Vim не termcap / terminfo), тогда vim отправит его в xterm при запуске, что говорит xterm добавлять специальные коды вокруг любого текста, который пользователь вставляет из внешнего источника. Когда vim видит их, он автоматически переходит не только в режим вставки, но также устанавливает режим вставки, чтобы не форматировать текст.

Более поздний (режим вставки), я думаю, ОЧЕНЬ полезен! Первое - это то, что доставляет мне все неприятности.

Решение проблемы грубой силы - отключить вставку в скобках, добавив это в ".vimrc"

:set t_BE=

Альтернативное решение ....

Вместо того, чтобы полностью отключить вставку в скобках, остановите vim, когда он видит начальную последовательность вставки терминала (с помощью мыши), находясь в командном или обычном режиме.

:nmap <PasteStart>  <NOP>
:nmap <PasteEnd>    <NOP>
:cmap <PasteStart>  <NOP>
:cmap <PasteEnd>    <NOP>

Использование этого означает, что если вы вставите текст в режиме вставки, vim не будет пытаться отформатировать (отступ) текст, который, скорее всего, уже имеет отступ.

Это не означает, что мне больше не нужно переключать режим вставки, так как я также использую переключатель режима вставки (сопоставленный с F2), чтобы отключить «showbreak» и «listchars» (отображение обернутых строк, вкладок, пробелов без пробелов и лишние пробелы в конце строк). Мне все еще нужно было бы включить Vim в этом режиме, когда я хочу сделать выбор мыши для вставки в другом месте.

Комментарии и предложения по решениям приветствуются.


Это также, кажется, работает в Cygwin Vm, но, к сожалению, не решает проблему в VS Vim
Джеймс Робинсон

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