Чи є текстовий об’єкт для всього буфера?


28

Мені часто доводиться набирати команди, як gg"+yGабо, ggdGі я хотів би зробити більш ефективний спосіб зробити це без необхідності переміщувати курсор двічі. Чи є якась команда, яку я можу використовувати, наприклад, y[movement]для копіювання всього буфера без переміщення курсору?

Відповіді:


36

Оскільки vim використовує знак відсотка для посилання на поточний буфер, ви можете використовувати його, щоб швидко отримати все.

:%yпотягне весь буфер :%y+, потягне його до +реєстру (і, імовірно, буфера обміну, за умови, що vim був зібраний з відповідними параметрами).

:%dі :%d+зробимо те саме для видалення.

У кожному з цих випадків курсор залишається на місці.


Ого, весь цей час я використовував mmgg"+yG`mі ніколи про це не думав. Дякую, це іде прямо у .vimrc.
Doorknob

@Doorknob замість встановлення та використання знаків, ви можете просто використати C-oдвічі для повернення назад.
Руслан

10

Ще одне рішення - використовувати плагін під назвою vim-textobj-whole . За замовчуванням цей плагін надає текстовий об’єкт aeдля всього буфера, ieдля всього буфера, за винятком провідних та кінцевих порожніх рядків.

Цей плагін залежить від користувача vim-textobj того самого автора, який дозволяє користувачам комфортно визначати будь-які текстові об’єкти. Є багато плагінів, які добре використовують це.


8

Не існує текстового об’єкта для всього файлу за замовчуванням, але їх можна створити за допомогою omap. У цьому випадку це виглядатиме приблизно так:

onoremap f :<c-u>normal! mzggVG<cr>`z

Ось розбивка того, як це працює:

onoremap f " make 'f' the text object name
:<c-u> " use <c-u> to prevent vim from inserting visual selection marker at the beginning of the command automatically.
normal! " use normal to make key presses ignoring any user mappings
mzggVG<cr>`z " make a marker in register z, select the entire file in visual line mode and enter the normal command, and go back to the z marker

Примітки:

Ctrluможна використовувати в режимі командного рядка для видалення всього зліва від позиції курсору. Причина, чому це робиться, полягає в тому, що якщо ввести командний рядок прямо з візуального режиму, він автоматично вставиться '<,'>в командний рядок, і це не те, що ми хочемо. Я б також запропонував вам використовувати щось інше f, тому що fзазвичай використовується для переходу до наступного шуканого символу в рядку. Наприклад, fiперейдемо до наступного iна поточному рядку.

Відповідні теми довідки:

:help omap-info
:help :normal
:help c_CTRL-U
:help v_:

Чи є спосіб це зробити, залишаючи курсор у спокої?
Випадково832

@ Random832 Якщо додати ``до кінця, курсор поверне попереднє місце.
ХропінняFrog

Мене хвилює, що це призведе до того, що це не застосує виділення до команди yank. Я сьогодні експериментую.
Випадково832

1
Я додав команду маркера до відображення, вона повинна залишити курсор там, де він є зараз.
EvergreenTree

2

Ось кілька швидких "брудних відображень для виконання завдання":

nnoremap yY :%yank <c-r>=v:register<cr><cr>
nnoremap dD :%delete <c-r>=v:register<cr><cr>

Тепер ви можете використовувати yYта dDвитягувати / видаляти відповідно. Це не так приємно, як використання повноцінного текстового об'єкта, але іноді найкращі рішення є найкращими.

Докладнішу інформацію див.

:h :y
:h :d
:h [range]
:h v:register
:h c_ctrl-r
:h @=
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.