Как вставить разрыв строки, когда курсор находится без входа в режим вставки в Vim? - PullRequest
73 голосов
/ 26 октября 2008

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

if (some_condition) {[ ]return; }

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

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

Ответы [ 14 ]

94 голосов
/ 26 октября 2008

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

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

11 голосов
/ 26 октября 2008

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

Из vim введите:

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

Где:

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

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

:map g i^M^[

Пояснение:

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

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

i [Enter] [Escape]

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

Tweaks:

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

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

10 голосов
/ 03 июня 2009

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

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

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

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

4 голосов
/ 26 октября 2008

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

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

:s/{/{\r/

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

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

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

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

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

2 голосов
/ 15 ноября 2016

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

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

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

1 голос
/ 26 октября 2008

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

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

0 голосов
/ 14 декабря 2018

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

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

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

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

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

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

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

: noh - Очистить любой поиск, выделяющий, что регулярное выражение могло включить

& # x60; w - вернуть отметку под w

По существу сочетает в себе лучшее из обоих r и i

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

0 голосов
/ 01 мая 2017

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

aaa bbb ccc ddd

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

aaa
bbb
ccc
ddd

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

f r<ENTER>;.;.
0 голосов
/ 25 марта 2017

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

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

Как правило, когда вы разбиваете строку, вы либо просто хотите вставить возврат каретки, либо, если вы находитесь в пробеле, замените ее на возврат каретки. Ну и зачем соглашаться на одно или другое? Вот мое отображение для 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, является ли символ под курсором пробелом. Наконец, знакомый троичный оператор ? : либо заменяет пробел переводом строки (r<CR>), либо вставляет новый (i<CR><Esc>)

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

...