Как вставить в новую строку с Vim?

144

Мне часто приходится вставлять некоторые вещи в новую строку в vim. Что я обычно делаю, это:

o<Esc>p

Который вставляет новую строку и переводит меня в режим вставки, затем выходит из режима вставки и, наконец, вставляет.

Три нажатия клавиш. Не очень эффективно. Есть идеи получше?

static_rtti
источник
8
3 нажатия клавиш не эффективны?
gtd
60
1 или 2 было бы лучше :) Зачем использовать vim, если не для максимальной эффективности?
static_rtti
2
Это также приводит к дополнительному переводу строки, если скопированный контент заканчивается переводом строки.
Джонатан У.
1
@gtd Обычный редактор работает с <Enter> <CV>. Два нажатия клавиш.
user4052054
1
@ user4052054 нет, это не делает то же самое, o / O работает, где бы вы ни находились, в обычном редакторе вы должны сначала добраться до начала или конца строки. Кроме того, если вы копируете целую строку, то все это становится одним нажатием клавиши для вставки строки, что является гораздо более распространенным предложением при кодировании.
gtd

Ответы:

71

Вскоре после :help p этого говорится:

:[line]pu[t] [x]    Put the text [from register x] after [line] (default
                    current line).  This always works |linewise|, thus
                    this command can be used to put a yanked block as
                    new lines.

:[line]pu[t]! [x]   Put the text [from register x] before [line]
                    (default current line).

К сожалению, оно не короче вашего текущего решения, если вы не объединили его с какой-то картой клавиатуры, как это предлагается в другом ответе. Например, вы можете сопоставить его с любым ключом (даже p):

:nmap p :pu<CR>
Бомбы
источник
2
Я знаю это, и я использую это, но это не то, что я спрашиваю, потому что иногда то, что вы копируете, просто не имеет LF. Если бы была команда «вставить в новую строку», она работала бы независимо от содержимого, которое вы собираетесь вставить, так что вам не пришлось бы об этом думать.
static_rtti
5
Хорошо, :pu[t]поместим текст в новую строку после текущей строки, :pu[t]!поместим текст в новую строку перед текущей строкой. Я буду редактировать свой ответ соответственно. (Ура для :help p.)
Бомба
2
Не совсем лучше моего нынешнего решения, но я думаю, что это лучший ответ на мой вопрос.
static_rtti
4
Хотя такое же количество нажатий клавиш, я считаю, что это более эффективно. o <Esc> p чувствует себя неуклюже, а это не так.
Марк Стори
2
Вы можете привязать команду к любой клавише, включая саму p: :nmap p :pu<CR>поместите ее в свой файл .vimrc и все
готово
55

Параметры:

1) Используйте, yyчтобы выдернуть всю строку (включая символ конца строки). pзатем вставит строку в новую строку после текущей и P( Shift- P) вставит над текущей строкой.

2) Сделайте сопоставление: тогда это только один или два ключа:

:nmap ,p o<ESC>p
:nmap <F4> o<ESC>p

3) Версия функции отображения (на самом деле ненужная, но только для полноты):

:nmap <F4> :call append(line('.'), @")<CR>

" This one may be a little better (strip the ending new-line before pasting)
:nmap <F4> :call append(line('.'), substitute(@", '\n$', '', ''))<CR>

:help let-register
:help :call
:help append()
:help line()
:help nmap
Dral
источник
2
Ну, я думаю, я составлю карту. Я просто надеялся, что может быть стандартное решение: - / Спасибо за ваш ответ!
static_rtti
2
@AI: Использование ', p' (',' отображается как мой <Leader>) - лучшее решение, на мой взгляд. Вы даже предоставили простую в использовании функцию. :) Отлично!
Кто-то все еще использует тебя MS-DOS
30

Вы можете вставить буфер в режиме вставки, используя <C-R>имя буфера для вставки. Буфер по умолчанию ", так что вы бы сделали

o<C-R>"

Я обнаружил, что использую это <C-R>"очень часто, и связал это с <C-F>моим vimrc:

inoremap <C-F> <C-R>"
soulmerge
источник
2
Это здорово, потому что он сохраняет правильные отступы, если скопированная строка не была с отступом.
CornSmith
24

Это все еще использует три нажатия клавиши, но я считаю, что это проще, чем Esc:

o<Alt-p>

Поскольку после нажатия o вы находитесь в режиме вставки, модификатор Alt позволит вам использовать команду, как если бы вы ее не использовали.

Ник
источник
2
Весьма удобный способ, когда вы пытаетесь использовать yank, что вы режете внутри строки с помощью «d $» в новой строке
Serhat Cevikel
Извините, но отступ не сохраняется, вместо этого он вставляется в начало строки.
Михаил Гольдштейн
Кто-нибудь может разработать этот метод для Mac (не alt)?
Ли Хаонан
@Lihaonan Ваш вопрос от 8 месяцев назад, надеюсь, вы уже видели stackoverflow.com/q/7501092/5407634
m_mlvx
12

Используя этот плагин: https://github.com/tpope/vim-unimpaired

]pпасты на линии ниже

[pпасты на линии выше

преимущества:

  • работает со всеми набранными текстами (слова, строки, символы и т. д.)
  • выравнивает вставленный текст, чтобы соответствовать отступу текста вокруг него
  • 2 нажатия клавиш вместо 3 и гораздо более «легкие» удары
  • быстро
crogers
источник
1
Мой любимый тоже. Стоит упомянуть, что tpope/vim-unimpairedдля этого нужно работать 😉.
Алекс
1
ах я установил это так давно я забыл об этом Спасибо за напоминание!
Crogers
9

Лично я nmapped Enter (CR), как это:

nmap <CR> o<Esc>k

... на основе этой статьи Vim Wikia.

Таким образом, я могу создавать новые строки непосредственно из обычного режима, и в сочетании с желанием вставить новую строку ниже, я бы сделал:

<CR>jp

Вы также можете пропустить k в nmap выше, в зависимости от того, какие функции вы предпочитаете от Enter , так что это будет просто <CR>p.

Я также изобразил jj для Esc , который также помог бы в этом случае. Esc слишком далеко от домашнего ряда, чтобы понять, насколько он важен для vim.

Не короче, чем другие решения, но я думаю, что он кажется менее неуклюжим, чем некоторые из них, и у него тоже есть другие применения.

miyalys
источник
5

Если вы копируете целую строку, а затем вставляете целую строку, используйте, Yчтобы сначала восстановить строку или строки, включая разрыв строки, и pвставить. Вы также можете использовать режим Vвизуальной линии , в отличие от обычного vдля визуального режима.

Питер
источник
3
Проблема в том, что иногда вы просто не хотите копировать целую строку ... Мне бы хотелось, чтобы решение работало, скопировал ли я десять строк или два слова.
static_rtti
3

У меня есть картография inoremap jj <ESC>. Так что легко вставить новую строку с ojjи, Ojjа затем p.

так что ojjpвставьте новую строку. тогда есть еще один удар, o<esc>pно ojjpдля меня это легко.

Натвар Сингх
источник
2

Я нашел элегантное решение для этого. Если вы помещаете регистр янки в буфер обмена вашей ОС (что в любом случае здорово), с

set clipboard+=unnamed

чем ты можешь сделать o<Ctl-v>.

Помимо меньшего количества штрихов, это улучшает оба o<Esc>pи :puпотому, что сохраняет отступы: оба других параметра начинаются с нулевого символа в новой строке.

Предостережение заключается в том, что это может зависеть от ОС. Все, что я знаю, это то, что он работает на последней версии OS X, но буфер обмена - это только один из многих способов получить рывок в буфере обмена OS.

enfascination
источник
1

Если вы также хотите завершить в режиме вставки, можно вставить в режиме вставки, используя CTRL-R ".https://stackoverflow.com/a/2861909/461834

Все еще три нажатия клавиш, но без выхода, и вы сохраняете нажатие клавиш, если хотите все равно завершить вставку.

jtpereyda
источник
1

Я использую следующее сопоставление в моей конфигурации Neovim:

nnoremap <leader>p m`o<ESC>p``
nnoremap <leader>P m`O<ESC>p``

Небольшое объяснение:

  • m`: установить отметку в текущей позиции курсора.
  • o<Esc>p: создайте новую строку ниже и вставьте текст в эту строку
  • O<Esc>P: создайте новую строку выше и вставьте текст в эту строку
  • ``: установить курсор в исходное положение

Смотрите :h markдля получения дополнительной информации о знаках в Vim.

jdhao
источник
1

Если вы хотите остаться в режиме вставки, вы можете сделать o ctrl+o p

  • o - вставить режим и перейти на новую строку
  • ctrl+o - запустить одну команду, как в обычном режиме
  • p - вставить

Это три нажатия клавиш, но вы остаетесь в режиме вставки, а также o ctrl+oдовольно быстро, поэтому я лично отношусь к нему как к 2,5 нажатиям клавиш.

reconn
источник
0

Это решение, кажется, применимо только тогда, когда блок скопированного текста начинается с новой строки (в отличие от захвата фрагмента текста где-то внутри строки), но вы всегда можете начать копирование с последнего символа, который хотите захватить, и затем перейти до последнего символа в конце строки перед началом нужного вам блока копирования. Затем, когда вы хотите вставить его, поместите курсор в конец строки, под которой вы хотите вставить текст, и нажмите p. Если я не облажался с объяснением, это должно обеспечить тот эффект, который вы ищете.

unbrokenrabbit
источник