Удаление в Vim, а затем вставка без новой строки

11

Много раз в vim я хотел бы полностью удалить строку, поэтому я использую dd. Однако затем мне нужно вставить эту строку в какую-то другую позицию в строке, но это вставляет новую строку перед вставкой, поэтому мне очень трудно получить желаемый результат. Например,

while( pasteInHere )
{
    cin >> n; // Delete this line completely with dd
}

когда я делаю это с кодом выше, я получаю:

while( pasteInHere )
cin >> n; // Delete this line completely with dd
{
}

что очень далеко от результата, который я хочу ... как я могу подавить это поведение новой строки или использовать другой метод, который делает это очень эффективно? Я не думаю, что d $ хорошо, потому что мне нужно не только перейти к началу строки, но и если я хочу удалить пустую строку, мне нужно удалить ее в другом регистре, я чувствую, что должен быть более простой способ! Спасибо.

Fyre
источник
1
это не дубликат, поскольку я сказал, что хочу более эффективный путь, чем переход к началу строки, а также я хочу удалить всю строку с символом новой строки .... не только содержимое строки
fYre
О, теперь я понимаю, что вы имеете в виду. Мне просто было не совсем понятно, чего вы пытались достичь.
EvergreenTree
1
0Dудалить строку, кроме разрыва строки. И чем gJвступать в ряды. Теперь вы можете поместить текст без строки разрыва и без пустой строки.
Алекс Кролл

Ответы:

9

Вы можете перейти куда угодно в строке выше строки, которую хотите удалить, затем нажать JDи вставить ее pв нужную точку.

  • Jобъединяет две строки и перемещает вас в начале текста, который вы хотите удалить. Это удаляет символ новой строки и отступ строки, которую вы хотите переместить.
  • D удаляет из текущей позиции курсора до конца строки, но сохраняет символ новой строки.

Подсказка: Вы можете использовать , :puесли вы удалили с Dили рывком с , y$и вы хотите , чтобы вставить с новой строки.

Хайо
источник
3

Не очень просто, но немного более эффективно, и вы также можете создавать карты в нормальном режиме для обеих последовательностей:

  • дергайте: перейдите на линию, которую вы хотите переместить, затем ^D"_dd
  • вставка: перейдите к слову, которое хотите заменить, затем viwp
lcd047
источник
2

Вы можете достичь чего-то, что хорошо работает с imap. Добавьте следующее к вашему vimrc:

inoremap <c-a> <c-r>1<esc>k$Jxi

Это создаст сопоставление для CTRL-aкоторого будет вставлен последний удаленный текст (с ddили аналогично). Если вы предпочитаете, вы можете использовать другой ключ для сопоставления.

Ссылки:

:h i_CTRL-R
:h quote1
:h J
Карл Ингве Лерваг
источник
1

Это тоже подходит для меня, никогда не думал, что оптимизирую его раньше, но это отображение работает:

nmap dil ^d$

dilявляется «удаление в строке», подобно тому diw, di"и т.д.

flukus
источник
1

Вставить без новой строки

Поместите это в ваш файл .vimrc:

" Paste yanked line without line breaks before/after cursor position
nnoremap gP i<CR><Esc>PkJxJx
nnoremap gp a<CR><Esc>PkJxJx

Пример:

<span style="color:">danger</span>

Теперь вы можете ввести gpтекст #D51B3Fпосле того, color:как мой курсор находится :в обычном режиме.

Янки без новой строки

Используйте ответ Флюкуса:

" Delete current line without yanking the line breaks
nnoremap dil ^d$

как аббревиатура удалить внутреннюю строку . Это также избавляет от ведущих отступов.

trebucherry
источник
0

Вы можете выбрать текст, который хотите скопировать, нажав, vа затем перенести его в буфер, нажав, yа затем вставить его где угодно p. Он не вставляет новую строку.

Варун Агарвал
источник
Правда, но это все еще оставляет пустую строку.
Муру