Как вставить новую строку, не выходя из обычного режима


24

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

this is line one
this is line two

И курсор находится на первой строке. Теперь я хочу новую строку между первой и второй строкой, вот так:

this is line one

this is line two

Я знаю, что когда я нахожусь в нормальном режиме, я могу просто нажать o. Но это войдет в режим вставки.

Как я могу вставить новую строку, как и остаться в обычном режиме?


Ответы:


10

Я использую отображение для этого:

" Quickly insert an empty new line without entering insert mode
    nnoremap <Leader>o o<Esc>
    nnoremap <Leader>O O<Esc>

Таким образом, вы можете вставить строку под курсором <Leader>oи одну на предыдущей строке с <Leader>O.

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


8

Решение, которое не проходит через режим вставки, не перемещает курсор и позволяет использовать счетчик для добавления нескольких строк одновременно ( 3\oи т. Д.):

nnoremap <silent> <leader>o :<C-u>call append(line("."),   repeat([""], v:count1))<CR>
nnoremap <silent> <leader>O :<C-u>call append(line(".")-1, repeat([""], v:count1))<CR>

6

Если вы не хотите добавлять сопоставления, вы можете yyвставить пустую строку, а затем вставить pдля курсора ниже и Pдля курсора выше.


Это, вероятно, лучший ответ без сопоставления.
Виллем ван Кетвич

Или сохраните его в oреестре с помощью "oyyи вставьте его оттуда при необходимости с помощью "op.
mike23

5

Я лично рекомендую использовать плагин Тима Поупа Unimpaired . Он предоставляет множество отображений , но те , что вы будете ищет это [<space>и ]<space>которые создают пустые строки выше и ниже текущей строки соответственно. Unimpaired также предоставляет удобные сопоставления для перемещения по списку быстрых исправлений, списку буферов, переключению параметров и многим другим. Смотрите :h unimpairedбольше.

Если вы не хотите использовать неповрежденный плагин, но, как показано ниже, приведите несколько быстрых сопоставлений в вашем ~/.vimrcфайле:

nnoremap <silent> [<space>  :<c-u>put!=repeat([''],v:count)<bar>']+1<cr>
nnoremap <silent> ]<space>  :<c-u>put =repeat([''],v:count)<bar>'[-1<cr>

4

Мое картирование использует Shift-Enter. Он отличается от других тем, что курсор возвращается к той же строке и столбцу с помощью знака o.

" Insert new line above without going into insert mode
" (uses mark o to return to the previous cursor column)
nnoremap <S-Enter> moO<Esc>`o

5
Обратите внимание, что отображение <S-Enter>не работает в эмуляторах терминала (оно работает только в gVim). Так что вам нужно будет выбрать другую комбинацию клавиш, чтобы сопоставить ее ;-)
Мартин Турной

2

Этот ответ Максима Кима изменил жизнь:

noremap <silent> <space> :exe "normal i".nr2char(getchar())<CR>

и мой рифф на нем:

noremap <silent> <s-space> :exe "normal a".nr2char(getchar())<CR>

Поместите эти строки в свой vimrc. Затем перейдите в начало второй строки файла и хит Space, Enterили идти до конца первой строки и хита Shift+Space, Enter. Либо добавит пустую строку между первой и второй строками и оставит вас в обычном режиме.

Вы также можете использовать их для любого другого нажатия клавиши - Spaceили Shift+Spaceпосле нужной клавиши, и он вставит или добавит ее соответственно.


2

Эти сопоставления будут делать именно то, что вы ищете.

nnoremap <c-n> @="m`o\eg``"<cr>
nnoremap <c-p> @="m`O\eg``"<cr>   

Они вставляют n строк новой строки до или после курсора; удерживая курсор точно там, где он есть, без изменения списка переходов.

Другое решение - просто создать ярлык, который заполняет неназванный регистр новой строкой. Затем вы можете просто использовать команды put, p или P, чтобы вставить новые строки. Например:

nnoremap "<cr> :let @@="\n"<cr>

1

Мое картирование для этого

 " Create Blank Newlines and stay in Normal mode
nnoremap <silent> zj o<Esc>k
nnoremap <silent> zk O<Esc>j

Отличается от statox, так как держит курсор в том же месте.


что <silent>значит?
Алекс

Это предотвращает отображение чего-либо в строке состояния. Я почти уверен, что в этом конкретном случае он ничего не делает, он был просто там, откуда я его изначально скопировал, давно. См :h map-silent.
Кевин

-1

Мое личное решение вставляет символ новой строки в регистр выражений и вставляет его после текущей строки, а затем возвращается в исходное положение:

nnoremap K m`"="\n"<CR>p``
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.