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


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

if (some_condition) {[ ]return; }

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

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

13 70

13 ответов:

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

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

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

из vim введите:

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

где:

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

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

:map g i^M^[

объяснение:

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

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

i [Enter] [Escape]

это vim для вставьте новую строку перед курсором, затем выйдите из insert режим.

Tweaks:

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

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

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

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

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

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

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

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

:s/{/{\r/

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

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

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

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

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

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

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

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

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

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

установите это ключевое сопоставление в вашем vimrc

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

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

ИМХО, встроенное отображение gs не является полезным отображением (put vim to sleep), можно было бы использовать это для разделения:

nmap gs i<CR><ESC>

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

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

теперь у вас есть прекрасная карта сестра ключ к .

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

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

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

aaa bbb ccc ddd

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

aaa
bbb
ccc
ddd

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

f r<ENTER>;.;.

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

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

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