Чи можна пришвидшити вставку у vim?


12

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

Оскільки vimчерез кілька секунд не реагував, я відкрив «Текстовий редактор» у меню «Програми → Додатки», вставив текст (який з’явився за частку секунди, зберег під новим ім’ям, закрив і вбив сеанс Vim, який все ще не було зроблено, через 1,5 хвилини. Кількість тексту склала 186 К 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
Я думаю, що це повільно b / c, йому потрібно проаналізувати вхід і спробувати його відформатувати і т. Д. Я не впевнений у варіанті зробити це, але я б припустив, що ви можете тимчасово відключити цю функцію в / в vim, зробити вставку, а потім знову включити його. Спробуйте також скористатися :set pasteфункцією, щоб побачити, чи покращує вона. Дивіться, :help pasteяк описано, як vimне робити відмінностей під час набору тексту та вставки.
slm

Я би сподівався viспробувати розібрати файл під час читання (після збереження запропонованого способу @ l0b0). Але це працює швидко.
Антон

Щоправда, але я уявляю, що він повинен переробляти все, що вже було проаналізовано + новий символ, коли ви його вставляєте. Це, здається, те, що відбувається, коли ви редагуєте файл теж до певної міри.
slm

:set paste, Здається, не реально змінити ситуацію (я не використовую секундомір, просто стіна-годинник).
Антон

Гаразд, була лише думка ...
slm

Відповіді:


14

Щоб швидко зберегти багато тексту буфера обміну, ви можете запустити cat > file.txt, вставити вміст і натиснути Ctrl- d.

Якщо у вас встановлений xsel , ви можете зробити, :r !xselщоб вставити в Vim вибір "основного" (ака. "Миші") або :r !xsel -bвставити буфер "буфер обміну" ( Ctrl- c). Ви також можете зберегти вибір безпосередньо у файл за допомогою xsel >file.txtабо xsel -b >file.txt. Це знімає потребу в окремих вставках + EOF-дії та уникає друку всього буфера копіювання в терміналі.

Якщо у вас немає xsel, а xclip, відповідні команди призначені xclip -outдля основного вибору або xclip -out -selection clipboardдля буфера буфера обміну.


1
Дякую, що принаймні працює без повернення до миші, а вставлення файлу у vim (наприклад, коли я не починаю із порожнього файлу) досить швидко.
Антон

Я не розумію, чому це не можна прив’язати до ctrl + shift + v, у всьому цьому немає сенсу.
mchid

2

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

Вимкніть своп-файл vim або за допомогою:

vim -n <your file>

або зсередини vim перед пастою:

:set noswapfile

Дивіться :help swapfileдокладнішу інформацію.

Інший варіант - просто вимкнути синхронізацію на диск файлу swap, :set swapsync=але ця опція вимагає скасувати більше натискань клавіш, і я лінивий. :)

Відключення swap не є безпечним для звичайних операцій! Відразу ж після вставки, або використання :set swapfileабо :set swapsync=fsyncповернутися до нормальної поведінки (хоча технічно, нормальна поведінка може бути синхронізація і не FSYNC , перевірка з :set swapsync?заздалегідь , якщо ви хочете йти по цьому шляху).


1
це не пришвидшило справи для мене ...
elig

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функції. Ви можете побачити, чи є у вас ця функція, виконуючи :versionвсередині vim або vim --versionз оболонки, і шукайте +xterm_clipboard. Якщо він говорить -xterm_clipboard, у вас його немає, і вам доведеться перекомпілювати vim.


У мене немає такої особливості. Чи допоможе перекомпіляція навіть vim не працює під xterm? (Я використовую gnome-terminal).
Антон

@Anthon Якщо ви використовуєте GUI VIM, я вважаю, що регістри також включені. xterm_clipboardє лише якщо запускається vim з терміналу.
Патрік

Це лише текст, без GUI VIM, але не працює xterm.
Антон

О, вибачте, що я неправильно прочитав. Так, xterm_clipboardстосується будь-якого термінального емулятора, а не лише xterm. Я сам використовую urxvt.
Патрік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.