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

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

if (some_condition) {[ ]return; }

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

Я делал это некоторое время, но, конечно, лучший способ сделать это?

Ответ 1

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

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

Ответ 2

Здесь, как создать макрос, который вставляет новую строку под курсором всякий раз, когда вы нажимаете '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 для вставки новой строки перед курсором, затем выход из режима вставки.

Tweaks:

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

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

Ответ 3

Простой сопоставление, чтобы разбить строку на курсор, нажав Ctrl + Enter:

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

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

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

Ответ 4

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

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

:s/{/{\r/

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

nmap gs i<CR><ESC>

Ответ 9

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

Ответ 10

В принципе, когда вы разделяете строку, вы либо хотите просто вставить возврат каретки, либо в том случае, если вы находитесь на пробеле, замените его на возврат каретки. Ну, зачем соглашаться на то или другое? Здесь мое отображение для 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.

Ответ 11

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

  • Нажмите v, чтобы войти в визуальный режим
  • Выберите строку, которую вы хотите разделить.
  • Нажмите :, чтобы войти в командный режим
  • s/\s/\r/g
  • Готово

Ответ 12

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

aaa bbb ccc ddd

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

aaa
bbb
ccc
ddd

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

f r<ENTER>;.;.

Ответ 13

Я обнаружил, что это самая верная реализация того, что я ожидал от поведения, противоположного 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

Ответ 14

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

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

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