Используя Vim, я часто хочу заменить блок кода блоком, который я только что дернул.
Но когда я удаляю блок кода, который должен быть заменен, этот блок сам попадает в регистр, который стирает блок, который я только что дернул. Таким образом, у меня есть привычка дергать, затем вставлять, затем удалять то, что я не хотел, но с большими блоками кода это становится беспорядочным, пытаясь сохранить вставленный блок и блок для удаления отдельно.
Так какой же самый простой и быстрый способ заменить текст в Vim?
- Есть ли способ удалить текст без внесения его в реестр?
- Есть ли способ сказать, например, «заменить следующее слово» или «заменить до следующего абзаца»
- или это лучший способ как-то использовать функцию мультирегистрации?
vim
replace
vim-registers
Эдвард Тангей
источник
источник
viwp
(дляw
ord).Ответы:
Чтобы удалить что-то без сохранения в реестре, вы можете использовать «регистр черной дыры»:
Конечно, вы также можете использовать любые другие регистры, которые не содержат ничего, что вас интересует.
источник
"<space>_d
. Пространство необходимо, чтобы на самом деле набрать ".dd
на пустой строке, то он уходит в черную дыру, в противном случае этоdd
как обычно)."_x
yy
или '3yy' (или что-то еще), что помещает это в неназванный регистр, но также и в 0. Вы можете затем продолжить вставлять это"0p
, несмотря на то, что использовалиd
после этого.Ага. Это немного сложнее, чем сначала удалить «старый» текст, но:
Я начинаю с ..
Я shift+ vвыбираю строку 1, строку 2, 3 и 4 и удаляю их dкомандой
Затем я удаляю старые 1-4 строки таким же образом.
Затем сделать
Это вставит вторую последнюю строчку (строки 1-4).
"3p
будет делать третий из последних, и так далее ..Так что я в конечном итоге
Справка: Vim документация по нумерованному регистру
источник
Документы VIM: пронумерованный регистр 0 содержит текст самой последней команды yank, если в команде не указан другой регистр с ["x].
Например, мы дергаем «foo» и удаляем «bar» - реестр 0 по-прежнему содержит «foo»! Следовательно, «foo» можно вставить с помощью
"0p
источник
Удобно иметь простое сопоставление, которое позволяет заменить текущий выбор буфером.
Например, когда вы положите это в свой .vimrc
затем, после копирования чего-либо в регистр (то есть с помощью «y»), вы можете просто выбрать текст, который вы хотите заменить, и просто нажать «r» на клавиатуре. Выбор будет заменен вашим текущим регистром.
Объяснение:
источник
vmap <C-P> "_dP
Vp
заменяет вашу текущую строку на выдернутую сразу.d
, которая часто используется для удаления.Я вставил следующее в мой vimrc:
Теперь я возвращаюсь к регистру буфера обмена и вставляю его, и мне нет дела до того, что происходит с регистром по умолчанию. Дополнительным преимуществом является то, что я могу вставлять из других приложений с минимальными хлопотами. Я теряю некоторые функциональные возможности, я знаю, но я все равно не могу отслеживать более одного регистра / буфера обмена.
источник
set clipboard=unnamed
илиset clipboard=unnamedplus
, что изменяет буфер обмена по умолчанию на*
или+
, соответственно.Для конкретного примера, который вы привели, если я понимаю вопрос, тогда это может сработать:
источник
Все операции удаления и удаления по умолчанию записываются в безымянный регистр. Тем не менее, самые последние янки и самые последние удаления всегда сохраняются (отдельно) в пронумерованных регистрах. В реестре
0
хранятся самые последние янки. Регистры1-9
содержат 9 самых последних удалений (1
причем самые последние).Другими словами, удаление перезаписывает самый последний рывок в неназванном регистре, но он все еще там в
0
регистре. Уловка blackhole-register ("_dd
), упомянутая в других ответах, работает, потому что она предотвращает перезапись безымянного регистра, но это не обязательно.Вы ссылаетесь на регистр, используя двойные кавычки, поэтому вставка последнего набранного текста может быть выполнена следующим образом:
Это отличная ссылка:
источник
Чтобы подчеркнуть, что EBGreen сказал :
Если вы вставляете текст при выделении текста, выделенный текст заменяется вставленным текстом.
Если вы хотите скопировать текст, а затем вставить его в нескольких местах, используйте
"0p
для вставки. Нумерованный регистр 0 содержит текст самой последней команды yank.Также вы можете перечислить содержимое всех ваших регистров:
Эта команда облегчает определение того, какой регистр вы хотите, когда делаете что-то вроде ответа dbr . Вы также увидите регистры /,%, #. (См. Также
:help registers
)И, наконец, проверить
cW
иcW
изменить слово, включая и не включая завершающий пробел. (Использование заглавныхW
букв включает пунктуацию.)источник
Если вы используете Vim, то у вас будет визуальный режим, который подобен выбору, но с разделением режимов, который является основой vi / vim.
То, что вы хотите сделать, это использовать визуальный режим, чтобы выбрать источник, затем нажать, затем снова использовать визуальный режим, чтобы выбрать область назначения, а затем вставить текст в буфер по умолчанию.
Пример:
В текстовом файле с:
со следующей последовательностью:
ggVjyGVkp
вы закончите с:Разъяснение:
gg
: перейти к первой строкеV
: запустить визуальный режим с целыми строкамиj
: перейти на одну строку вниз (при выборе, начатом на предыдущих строках, это увеличивает выделение на одну строку вниз)y
: вернуть в буфер по умолчанию (две выбранные строки, и он автоматически выходит из визуального режима)G
: перейти к последней строкеV
: запустить визуальный режим (как и раньше)k
: перейти на одну строку вверх (как и раньше, при включенном визуальном режиме выделение увеличивается на одну строку вверх)p
: paste (с выделением на двух последних строках, он заменит эти строки тем, что есть в буфере - в этом случае 2 первые строки)Это немного неудобно, так как последний блок помещается в буфер, так что он как-то нежелателен для повторных вставок одной и той же вещи, поэтому вы захотите сохранить источник в именованный буфер с чем-то вроде
"ay
(в буфер, называемый "a ") и вставьте что-то вроде"ap
(но тогда, если вы программируете, вы, вероятно, не хотите вставлять несколько раз, но создаете функцию и вызываете ее, верно? ВПРАВО ?).Если вы используете только vi, тогда вам придется использовать невидимые метки вместо визуального режима, но
:he mark
об этом, извините, но я не очень хорош в этом невидимом знаке, я довольно загрязнен визуальным режимом.источник
Для «заменить слово», попробуйте
cw
в обычном режиме.Для «замены абзаца» попробуйте
cap
в обычном режиме.источник
c}
в обычном режиме.Минимально инвазивное решение для ленивых:
Регистр
0
всегда содержит последний янки (как уже упоминали Рафаэль , alex2k8 и idbrii ). К сожалению, выбор регистрации0
все время может быть довольно раздражающим, поэтому было бы неплохо, если бы онp
использовался"0
по умолчанию. Это может быть достигнуто путем добавления следующих строк в ваш.vimrc
:Первая строка отображает каждый
p
штрих"0p
. Однако это предотвращаетp
доступ к любым другим регистрам. Поэтому всеp
штрихи с явно выбранным регистром отображаются в эквивалентное выражение командной строки внутри цикла for. То же самое сделано дляP
.Таким образом стандартное поведение сохраняется, за исключением неявного
p
иP
штрихов, которые теперь используют регистр0
по умолчанию.Подсказка 1: команда cut теперь
"0d
вместо justd
. Но так как я ленив, это слишком долго для меня;) Поэтому я использую следующее отображение:Клавиша-лидер
\
по умолчанию, поэтому вы можете легко вырезать текст, набрав\d
или\D
.Подсказка 2: время ожидания по умолчанию для многоключевых сопоставлений довольно короткое. Возможно, вы захотите увеличить его, чтобы иметь больше времени при выборе регистра. Подробности
:help timeoutlen
смотрите, я использую:источник
Ну, сначала выполните эту команду:
Тогда вы поймете, что можете удалить в конкретный реестр. Таким образом, вы не будете изменять то, что находится в вашем регистре по умолчанию.
источник
["x]d{motion} Delete text that {motion} moves over [into register x]
- Вим:h d
Моя ситуация: в
Normal
режиме, когда я удаляю символы с помощьюx
нажатия клавиши, эти удаления перезаписывают мой последний регистр - затрудняет редактирование, когда я хочу удалить символы, используяx
и вставляя что-то, что у меня есть в моем последнем регистре (например, вставляя один и тот же текст в два или больше мест).Я попробовал предложение в принятом ответе (
"_d
), но оно не сработало.Однако из принятого ответа / комментариев по адресу /vi/122/performing-
~/.vimrc
sure-operations-without-clearing-register я добавил это в свой список , который работает (возможно, вам придется перезапустить Vim ):То есть теперь я могу выполнять свои обычные команды yank (
y
), delete (d
) и paste (p
) - и символы, которые я удаляю,x
больше не заполняют самые последние регистры.источник
Текст, удаленный в режиме вставки, не попадает в регистр по умолчанию.
источник
Два решения, которые я использую в правильном контексте:
VISUAL
режиме Vims, затем вставьте регистр.Я использую это в основном по привычке, так как я нашел второе решение намного позже, например
<ctrl>+<p>
чтобы заменить предыдущий пронумерованный регистр на тот, который вы только что вставили.По сути, вы продолжаете вставлять как обычно, но когда вы понимаете, что с тех пор вы перезаписали регистр по умолчанию, теряя то, что вы на самом деле хотели вставить, вы можете
<C-P>
найти и заменить из истории YankRing!Один из них должен иметь плагины ...
источник
Я нашел очень полезное отображение для вашей цели:
Удаленный текст помещается в «регистр черной дыры», а полученный текст остается.
Источник: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text
источник
В версии для Windows (возможно, и в Linux) вы можете войти в системный буфер копирования / вставки, используя
"*y
(т.е. перед вашей командой yank двойные кавычки и звездочку).Затем вы можете удалить заменяемые строки как обычно и вставить скопированный текст, используя
"*p
.источник
Я часто ошибаюсь, когда следую командам 'y'ank затем' '_d' удалить в черную дыру, а затем 'p'aste. Я предпочитаю' y'ank, затем удалить, как мне нравится, затем '' 0p 'из регистр 0, куда помещается последний скопированный текст.
источник
Для злых пользователей emacs эта функция
(evil-paste-pop)
может быть запущена после вставки и циклически повторять предыдущие записи в kill-ring. Предполагая, что вы привязали его к<C-p>
(по умолчанию в Spacemacs), вы должны нажатьp
столько,<C-p>
сколько вам нужно.источник
Для пользователей Dvorak, один очень удобный способ - просто удалить ненужный текст в регистр «1» вместо «_ регистр черной дыры», хотя бы потому, что вы можете нажать «+ 1 с тем же нажатием Shift и быстрым движением мизинца, поскольку ключ сразу над "в Двораке" (плюс d в другой руке, что делает всю команду быстрой, как ад).
Тогда, конечно, регистр "1" может использоваться для других целей из-за его удобства, но если у вас нет более общей цели, чем замена текста, я бы сказал, что это довольно хорошее использование регистра.
источник
Для тех из вас, кто в первую очередь заинтересован в том, чтобы не перезаписывать безымянный регистр при замене текста с помощью виртуального выделения и вставки.
Вы можете использовать следующее решение, которое легко и лучше всего работает для меня:
xnoremap <expr> p 'pgv"'.v:register.'y'
Это из ответов (и комментариев) здесь: Как вставить без перезаписи регистра
Сначала он проходит после выделения, затем снова выбирается выделение с новым текстом (gv). Теперь регистр, который последний раз использовался в визуальном режиме (обычно это неназванный регистр, но он работает также без побочных эффектов, если вы используете другой регистр для вставки). А затем снова введите новое значение в регистр.
PS: Если вам нужен более простой вариант, который работает также с vim-имитацией плагина intellj idea, вы можете воспользоваться этим (недостаток: перезаписать безымянный регистр, даже если для вставки был задан другой регистр):
vnoremap p pgvy
источник
Для тех, кто использует JetBrans IDE (PhpStorm, WebStorm, IntelliJ IDEA) с IdeaVim. Возможно, у вас возникли проблемы с переназначением, например,
nnoremap d "_d
с использованием его для удаления строкиdd
. Возможное решение для вас:nnoremap dd "_dd
Есть проблемы на вашем треке, пожалуйста, проголосуйте за них: https://youtrack.jetbrains.com/issue/VIM-1189 https://youtrack.jetbrains.com/issue/VIM-1363
источник
Случайное предпочтение Vim сложности по сравнению с практичностью обременяет пользователя применением регистров для копирования / удаления действий - когда чаще всего нужно просто вставить то, что было скопировано, и «забыть», что было удалено.
Однако вместо того, чтобы бороться со сложными регистрами vim, сделайте их более удобными: выберите регистр «по умолчанию» для хранения вашего последнего удаления. Например, отправьте удаления в регистр d (оставив переменную открытой для специального использования; d - хорошая мнемоника):
Этот подход предотвращает удаление удалений янки, НО не теряет регистрацию удаления - можно вставить (вернуть) то, что было удалено, вместо того, чтобы потерять его в черной дыре (как в принятом ответе). В приведенном выше примере это повторение выполняется с помощью двух отображений лидера p. Преимущество этого подхода заключается в том, что он дает вам возможность выбрать, что вставлять: (a) что было только что выдернуто или (b) что было только что удалено.
источник
регистр от 0 до 9 - это последние события, которые вы ударили или вырезали и т. д., НЕ включайте удаленные элементы и т. д. Поэтому, если вы что-то дергаете / вырезаете, это также входит в регистр 0, даже если вы говорите, что удалили весь день после этого, зарегистрируйте 0 все еще последний материал, который вы дернули
yiw # идет как в регистр по умолчанию, так и в регистр 0
он дергает слово, в котором находится курсор
удаленные вещи и т. д. будут идти в регистр по умолчанию, но НЕ регистрироваться 0
в стандартном режиме:
"0p # введите содержимое регистра 0
в режиме вставки:
ctrl-r 0 # вывести содержимое регистра 0
У меня также был друг, который всегда дергал / разрезал, чтобы зарегистрировать х лол.
источник