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


88

Чи можна вставити розрив рядка там, де курсор знаходиться у Vim, не переходячи в режим вставки? Ось приклад ( [x]означає, що курсор увімкнено x):

if (some_condition) {[ ]return; }

Іноді я можу захотіти ввести ще якийсь код. Тому я натиснув, iщоб перейти в режим вставки, натиснув, Enterщоб вставити розрив рядка, а потім видалити зайвий пробіл. Далі я ввійшов би в звичайний режим і розташував курсор перед фігурною дужкою, а потім зробив те саме, щоб отримати його на своєму рядку.

Я роблю це деякий час, але, безсумнівно, є кращий спосіб це зробити?


Ви хочете вставити щось, не переходячи в режим ВСТАВКИ?
Джеремі Кантрелл

26
@ jeremy-cantrell Так, як "J" приєднується до наступного рядка і вставляє пробіли, не переходячи в режим ВСТАВКИ!
awendt

Відповіді:


107

У наведеному прикладі ви можете використати rEnterдля заміни одного символу (пробілу) на Enter. Потім, fspace.щоб перейти в наступний простір і повторити останню команду.

Залежно від налаштувань автовідступу, вищезазначене може, а може і не відставити правильний відступ. Якщо ні, то sEnterTabEscзамість цього використовуйте, щоб замінити пробіл новим рядком, відступити рядок та вийти з режиму вставки. Вам довелося б замінити другий пробіл іншою командою, щоб ви не могли використовувати '.' в цьому випадку.


1
Я думаю, що це найпростіший вихід. Дякую Грегу.
Марк А. Ніколосі

4
"f [пробіл]" має бути еквівалентно "W" (тобто перейти до наступного "білого місця")
Натан Феллман,

4
'W' переміщує один символ занадто далеко, він переходить до наступного символу після наступного пробілу.
Greg Hewgill

1
Ви також можете використовувати >>і, <<щоб допомогти з відступом, якщо ви не хочете переходити в режим вставки за допомогою s.
Коннер

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] означає "цитувати наступний символ" - це дозволяє вставляти новий рядок та символи екранування в команду.

Отже, ви зіставляєте ключ 'g' з послідовністю:

i [Enter] [Втеча]

Це 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вже використовується як ключ простору імен?
lethbear

Не особливо. Як я вже сказав, :help gце один із способів побачити список відображень за замовчуванням g+ щось подібне. z, [ ]є додатковими клавішами простору імен, див :help index. Ви можете викликати, :verbose map gщоб переглянути всі поточні визначені зіставлення, що починаються з g. Корисними веб- ресурсами є 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 у звичайному режимі над символом, після якого ви хочете, щоб стався розрив рядка, розділить рядок і залишить курсор там, де він був.


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команди.


Це досить гладко. Я не впевнений, що коли-небудь навмисно використовував K, але це може змусити вас позбутися або переназначити в інше місце.
dragon788

0

Встановіть це відображення ключів у своєму vimrc

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

Потім натисніть Ctrl + m, якщо хочете використовувати його у своєму vim.


0

IMHO, вбудоване відображення gsне є корисним відображенням (перевести vim в режим сну), можна використовувати це для розділення:

nmap gs i<CR><ESC>

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



-1

Це відображення розіб’є будь-яку однорядкову функцію, яку ви маєте. Просто наведіть курсор на рядок і натисніть "g" у звичайному режимі:

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

Це передбачає, що у вас є пробіл після відкриваючої дужки та пробіл перед закриваючою дужкою. Подивіться, чи це вам підходить.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.