Могу ли я ускорить вставку в vim?

12

Я скопировал часть HTML-кода с веб-страницы и хотел сохранить его в файле. Для этого я начал новый vim сеанс в окне терминала, с (новым) именем файла, указанным в командной строке, нажал, iчтобы перейти в режим вставки, а затем CtrlShift+ Vи ждал, пока [-- INSERT --]отображается внизу, и ждал ...

Так vimкак через несколько секунд я не отвечал, я открыл «Текстовый редактор» из меню «Приложения» → «Дополнения», вставил текст (который появлялся в течение доли секунды, сохранил его под новым именем, закрыл и завершил сеанс Vim, который все еще не было сделано, через 1,5 минуты. Объем текста был 186K в 3200 строк, не слишком много, я бы сказал, ни с чрезмерно длинными строками.

Есть ли способ ускорить вставки такого рода в vimи / или есть объяснение, почему это так медленно по сравнению с использованием текстового редактора, который в других отношениях ужасен и ориентирован на мышь?

(% CPU согласно данным topне превышает 5%, хотя у меня есть несколько свободных процессоров в системе, так что это может быть некоторая проблема, связанная с вводом / выводом, которой нет при чтении того же текста из файла)

Информация о версии:
Ubuntu 12.04
Vim: 7.3, с исправлениями, поставляемыми Ubuntu 12.04
bash: 4.2.25
gnome-terminal: 3.4.1.1

Энтон
источник
1
Я думаю, что это медленно, потому что нужно проанализировать ввод и попытаться отформатировать его и т. Д. Я не уверен в том, что сделать это можно, но предположил бы, что вы можете временно отключить эту функцию vim, выполнить вставку, а затем включите его снова. Также попробуйте использовать :set pasteфункцию, чтобы увидеть, если она улучшается. Посмотрите, :help pasteкак описано, как не vimделает различий ч / б печатать и вставлять.
СЛМ
Я также хотел бы viпопытаться проанализировать файл при чтении (после сохранения, предложенного @ l0b0). Но это работает быстро.
Anthon
Да, но я представляю, что он должен повторно анализировать все, что уже проанализировано, + новый символ, когда вы вставляете его. Похоже, это то, что происходит, когда вы в некоторой степени редактируете файл.
СЛМ
:set paste, кажется, не реально изменить ситуацию (я не использую секундомер, просто стена-часы).
Энтон
ОК, была только мысль ...
SLM

Ответы:

14

Чтобы быстро сохранить много текста из буфера обмена в файл, вы можете запустить cat > file.txt, вставить содержимое и нажать Ctrl- d.

Если у вас установлен xsel , вы можете :r !xselвставить «основной» (он же «мышь») в Vim или :r !xsel -bвставить буфер «clipboard» ( Ctrl- c). Вы также можете сохранить выбор непосредственно в файл с помощью xsel >file.txtили xsel -b >file.txt. Это устраняет необходимость в отдельных действиях вставки + EOF и позволяет избежать печати всего буфера копирования в терминале.

Если у вас нет xsel, но есть xclip, соответствующие команды предназначены xclip -outдля первичного выбора или xclip -out -selection clipboardдля буфера буфера обмена.

l0b0
источник
1
Спасибо, по крайней мере, это работает без необходимости обращения к мыши, и вставка файла в vim (например, когда я не начинаю с пустого файла) происходит достаточно быстро.
Anthon
Я не понимаю, почему это не может быть связано с Ctrl + Shift + V, во всем этом нет абсолютно никакого смысла.
Мч
2

Это проблема сброса буфера на диск. Vim пытается защитить вашу работу и не предполагает, что вы можете набирать несколько тысяч символов в секунду. Прочитайте :help swap-fileнекоторые подробности о буферизации. Решение вашей проблемы заключается в следующем:

Выключите файл обмена vim либо с помощью:

vim -n <your file>

или из vim перед вставкой:

:set noswapfile

Смотрите :help swapfileдля более подробной информации.

Другой вариант - просто отключить синхронизацию на диске файла подкачки с помощью, :set swapsync=но эта опция требует больше нажатий клавиш, чтобы отменить, и я ленив. :)

Отключение свопа не безопасно для нормальной работы! Сразу после вставки используйте :set swapfileлибо, :set swapsync=fsyncчтобы вернуться к нормальному поведению (хотя технически нормальное поведение могло быть синхронизировано, а не fsync , :set swapsync?предварительно проверьте , хотите ли вы идти по этому пути).

linux_sa
источник
1
для меня это не
ускорило
1

Если у вас есть xterm_clipboardвозможность, вы можете использовать *и +регистры. Эти регистры взаимодействуют с основным буфером выбора X11 и буфером обмена (соответственно).

Таким образом, если вы скопировали что-то через CTRL+ c, вы можете вставить это в vim с помощью "+p.

Если вы просто выделили его без копирования, вы можете вставить его "*p.
Вы также можете сделать *буфер буфером по умолчанию, выполнив :set clipboard=unnamed. Тогда любой yank ( y), paste ( p) и т. Д., Которые не указывают регистр, будет использовать этот *регистр. Также добавлен Vim 7.3.74 clipboard=unnamedplus, который будет использовать +регистр по умолчанию.

Вы также можете копировать вещи в первичный отбор и буфера обмена буферов путем дергает, например: "+yy.

 

Обратите внимание, что, как уже упоминалось, все эти возможности нуждаются в этой xterm_clipboardфункции. Вы можете увидеть, есть ли у вас эта функция, выполнив :versionvim или vim --versionиз оболочки, и поищите +xterm_clipboard. Если он говорит -xterm_clipboard, у вас его нет и вам придется перекомпилировать vim.

Патрик
источник
У меня нет этой функции. Поможет ли перекомпиляция, даже если vim не работает под xterm? (Я использую гном-терминал).
Anthon
@Anthon Если вы используете GUI VIM, то я считаю, что регистры также включены. xterm_clipboardтолько если запущен vim из терминала.
Патрик
Это только текст, без графического интерфейса VIM, но не работает с xterm.
Anthon
Ой, прости, что я неправильно прочитал. Да, xterm_clipboardотносится к любому терминальному эмулятору, а не только к xterm. Я сам использую urxvt.
Патрик