Есть ли текстовый объект для всего буфера?

28

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

Random832
источник

Ответы:

36

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

:%yвосстановит весь буфер :%y+, восстановит его в +регистре (и, вероятно, в буфере обмена, при условии, что vim был скомпилирован с соответствующими параметрами).

:%dи :%d+сделает то же самое для удаления.

В каждом из этих случаев курсор остается на месте.

SnoringFrog
источник
Вау, все это время я использовал mmgg"+yG`mи никогда не думал об этом. Спасибо, это происходит прямо в .vimrc.
дверная ручка
@ Doorknob вместо установки и использования меток, которые вы могли бы просто C-oдважды использовать, чтобы вернуться.
Руслан
10

Другое решение - использовать плагин vim-textobj-whole . По умолчанию этот плагин предоставляет текстовый объект aeдля всего буфера, ieдля всего буфера, за исключением начальных и конечных пустых строк.

Этот плагин зависит от vim-textobj-user от того же автора, что позволяет пользователям удобно определять любые текстовые объекты. Есть много плагинов, которые хорошо используют это.

Зося
источник
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_:
Вечнозеленое дерево
источник
Есть ли способ сделать это, оставив курсор в покое?
Random832
@ Random832 Добавление a ``в конец вернет курсор в предыдущее место.
SnoringFrog
Я обеспокоен тем, что это не позволит применить выбор к команде yank. Я сегодня поэкспериментирую.
Random832
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 @=
Питер Ринкер
источник