Как вставить разрыв строки там, где находится курсор, не переходя в режим вставки в Vim?

88

Можно ли вставить разрыв строки в место, где находится курсор в Vim, не входя в режим вставки? Вот пример ( [x]означает, что курсор включен x):

if (some_condition) {[ ]return; }

Иногда мне может понадобиться ввести еще код. Поэтому я нажимал, iчтобы перейти в режим вставки, нажимал, Enterчтобы вставить разрыв строки, а затем удалять лишнее пространство. Затем я перехожу в обычный режим и помещаю курсор перед закрывающей фигурной скобкой, а затем делаю то же самое, чтобы поместить его в отдельную строку.

Я уже давно этим занимаюсь, но есть ли способ лучше?

Марк А. Николози
источник
Вы хотите что-то вставить, не переходя в режим INSERT?
Джереми Кантрелл,
26
@ jeremy-cantrell Да, точно так же, как "J" присоединяется к следующей строке и вставляет пробел, не переходя в режим INSERT!
awendt

Ответы:

107

В приведенном вами примере вы можете использовать rEnterдля замены одного символа (пробела) на Enter. Затем, fspace.чтобы перейти к следующему пробелу и повторить последнюю команду.

В зависимости от ваших настроек автоотступа, приведенное выше может или не может правильно сдвигать оператор return. Если нет, используйте sEnterTabEscвместо этого, чтобы заменить пробел новой строкой, сделать отступ строки и выйти из режима вставки. Вам придется заменить второй пробел другой командой, чтобы вы не могли использовать '.' в этом случае.

Грег Хьюгилл
источник
1
Думаю, это самое простое решение. Спасибо, Грег.
Марк А. Николози,
4
«f [пробел]» должен быть эквивалентен «W» (т. е. перейти к следующему whitepsace)
Натан Феллман
4
'W' перемещает один символ слишком далеко, он перемещается к следующему символу после следующего пробела.
Грег Хьюгилл,
1
Вы также можете использовать >>и <<для облегчения отступов, если не хотите переходить в режим вставки с помощью s.
Conner
12

Вот как создать макрос, который вставляет новую строку в курсор всякий раз, когда вы нажимаете 'g', не находясь в режиме вставки:

В vim введите:

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

Куда:

  • [Ctrl + V] означает, удерживая клавишу Ctrl, нажмите "v".
  • [Enter] означает нажатие клавиши Enter.
  • [Esc] означает нажатие клавиши Esc.

Вы будете видеть следующее в нижней части окна vim, пока не нажмете последний Enter:

:map g i^M^[

Пояснение:

[Ctrl + V] означает «заключить следующий символ в кавычки» - он позволяет вам вставлять символы новой строки и escape-символы в команду.

Итак, вы сопоставляете клавишу 'g' с последовательностью:

i [Enter] [Escape]

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

Твики:

  • Вы можете заменить букву "g" любым символом, который еще не связан с используемой вами командой.
  • Добавьте еще к команде, например f}i^M^[O - Это е Ind } и я nsert другого символа новой строки, а затем выйти из режима вставки и вывод пера пустой строки для ввода больше коды.
  • Вы можете добавить команду в файл .vimrc или .exrc, чтобы сделать его постоянным. Просто опустите двоеточие в начале, поэтому команда начинается с "map"

Наслаждайтесь!

Адам Лисс
источник
Вы ответили на плохо сформулированный вопрос в теме, а не на вопрос в сообщении. Он хочет знать, как легко избавиться от пробелов, которые были в точке разрыва линии, но больше не служат цели.
Аристотель Пагальцис,
Спасибо. Обновлен раздел «Твики», чтобы выполнить то, что (я думаю) автор просил. Когда я его протестировал, vi автоматически удалил для меня лишние пробелы; используйте 'x', чтобы удалить их, если ваш нет. И почему команды vi выглядят как шум модемной линии? :-)
Адам Лисс
11

Простое сопоставление для разрыва строки в месте курсора нажатием Ctrl + Enter:

:nmap <c-cr> i<cr><Esc>

по существу входит в режим «вставки», вставляет разрыв строки и возвращается в нормальный режим.

поместите его в свой файл .vimrc для использования в будущем.

Ярив
источник
5

Если вы обычно расширяете однострочный блок до трех строк, попробуйте подстановку. Измените открывающую скобу на скобку / возврат, а закрывающую скобку на возврат / скобу.

Команда замены скобки / возврата на скобку выглядит так:

:s/{/{\r/

Поскольку вы хотите использовать это часто, вы можете сопоставить полную последовательность с неиспользуемым нажатием клавиши следующим образом:

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

Там, где вы видите ^ M в последовательности, введите [Ctrl-V] , затем нажмите Enter .

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

Ознакомьтесь :help map-which-keysс советами по выбору неиспользуемых клавиш для сопоставления.

ленивец
источник
Кстати: gне отображается, потому что он используется как ключ «пространства имен» для многих сопоставлений vim, состоящих из двух нажатий клавиш (см. :h g). Так что это сопоставление на самом деле недопустимо.
Hotschke
Есть ли хорошая команда, которая сообщает, что gуже используется в качестве ключа «пространства имен»?
slothbear
Не особо. Как я уже сказал, :help gэто один из способов увидеть список gсопоставлений по умолчанию + что-то. z, [ ]являются дополнительными ключами «пространства имен», см. например :help index. Вы можете вызвать, :verbose map gчтобы увидеть все текущие определенные сопоставления, начиная с g. Полезные webresources являются viemu.com/vi-vim-cheat-sheet.gif , vimcasts.org/blog/2014/02/follow-my-leader , vimeo.com/85343734 (слайды: speakerdeck.com/nelstrom/follow-my -leader )
Hotschke
3

Предполагая, что вы в порядке с сопоставлением Kс чем-то другим (выберите другой ключ по своему вкусу), и использование маркера 'в качестве временного маркера нормально, почему бы не сделать этого?

:nmap K m'a<CR><Esc>`'

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

Mondaugen
источник
1

Vim автоматически уничтожит все пробелы справа от курсора, если вы разорвете строку пополам, когда autoindent(или любое другое средство для отступов) включено.

Если вы не хотите использовать какой - либо из этих параметров, используйте sвместо iдля того , чтобы с ubstitute нового текста для заготовки , а не просто вставить. (Если имеется несколько пробелов, поместите курсор в крайнее левое положение и используйте cwвместо них.)

Аристотель Пагальцис
источник
1

По сути, когда вы разбиваете строку, вы либо хотите просто вставить возврат каретки, либо, если вы используете пробел, замените его на возврат каретки. Зачем довольствоваться тем или другим? Вот мое отображение для K:

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

Я использую тернарный оператор, чтобы объединить два действия в одну ключевую карту. Разбивка на части <expr>означает, что вывод ключевой карты может быть динамическим и в этом случае зависит от условия, getline('.')[col('.')-1]==' 'которое представляет собой длинный способ спросить vim, является ли символ под курсором пробелом. Наконец, знакомый тернарный оператор ? :либо заменяет пробел на linebreak ( r<CR>), либо вставляет новый ( i<CR><Esc>)

Теперь у вас есть прекрасная сестринская карта ключей для Jкоманды.

ctrl
источник
Это довольно красиво. Я не уверен, что я когда-либо намеренно использовал K, но, возможно, от него стоит избавиться или переназначить где-нибудь еще.
dragon788 07
0

Установите это сопоставление клавиш в вашем vimrc

:map <C-m> i<CR><Esc>h

Затем нажмите Ctrl + m, если хотите использовать его в своем vim.

Kiddo
источник
0

IMHO, встроенное отображение gsне является полезным отображением (поместите vim в спящий режим), его можно использовать для разделения:

nmap gs i<CR><ESC>
Hotschke
источник
0

В Vrapper вы можете использовать gql, который разделит строку без перехода в режим вставки, но не всегда может поддерживать отступы.

Янак Мина
источник
0

Фактически вам понадобятся следующие комбинированные операции:

  1. Нажмите, vчтобы войти в визуальный режим
  2. Выберите линию, которую хотите разделить
  3. Нажмите, :чтобы войти в командный режим
  4. s/\s/\r/g
  5. Выполнено
Натан
источник
0

Если у вас есть ввод:

aaa bbb ccc ddd

и хотите вывести

aaa
bbb
ccc
ddd

Вы можете использовать команду

f r<ENTER>;.;.
Ярден Акин
источник
0

Я обнаружил, что это наиболее точная реализация того, что я ожидал от противоположного поведения J

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

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

i <cr> <esc> - это одно из наиболее распространенных предлагаемых решений, оно не удаляет непробельные символы под курсором, но также оставляет вам конечные пробелы

^mw - перейти к началу новой строки и поставить отметку под w

gk - перейти на одну строку вверх

:silent! s/\v +$//<cr> - регулярное выражение заменяет любые пробелы в конце строки

:noh<cr> - Удалите все выделения при поиске, которые могли быть включены в регулярное выражение.

`w - вернуть отметку под w

По сути, сочетает в себе лучшее из обоих r<esc><cr>иi<cr><esc>

Примечание: у меня есть эта привязка, Sкоторая потенциально перезаписывает полезный ключ, но это синоним, ccи, поскольку я не использую его так часто, как разбиения, я могу перезаписать его.

Джаред МакАтир
источник
0

o ESC команда сделает это за вас.

logbasex
источник
-1

Это отображение разбивает любую имеющуюся у вас однострочную функцию. Просто поместите курсор на строку и нажмите "g" в обычном режиме:

:map g ^f{malr<CR>`a%hr<CR>`a

Предполагается, что у вас есть пробел после открывающей скобки и пробел перед закрывающей скобкой. Посмотрите, работает ли это для вас.

Лукас Оман
источник