Команда для окружения символа пробелами в vim

Я пытаюсь использовать vim правильно-чтобы помочь мне, я сопоставил свои клавиши со стрелками"", так что я вынужден использовать {hjlk} для перемещения.

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

"2+3" лучше отформатирован "2 + 3"

раньше я бы поставил курсор над + и набрал:

i[пробел][стрелка вправо][пробел][Esc]

Это 5 нажимает.

чтобы сделать это без стрелки, мне, кажется, нужно поместить курсор на + и перейти:

i[пробел] [Esc]lli[пробел][Esc]

Это 8 нажатий.

Я могу преобразовать " li " в "a", что уменьшает его до 7 нажатий:

i[пробел] [Esc]la[пробел][Esc]

Если не записывать это в макрос, есть ли лучший способ сделать это? Есть ли какая-то волшебная команда vim, которая позволит мне сделать это менее чем за 5 нажатий - и каким-то образом обобщить его, чтобы я мог сделать это с целыми словами или символами, например, если я хочу преобразовать 3==4 в 3 == 4?

9 ответов


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

c w "" ESC P

очевидно, вы можете заменить как объект, так и кавычки на то, что вам нравится. Чтобы изменить только один символ +, чтобы быть [пробел]+[пробел], вы сделали бы

s [space] [space] ESC P

на


первое, что приходит на ум после прочтения только названия, это объемный.ВИМ который является отличным скриптом, чтобы делать все виды полезных вещей в соответствии с тем, что вы описали.

, чтобы решить вашу конкретную проблему, я бы, наверное, наведите курсор на + и:

s[пробел]+[пробел][esc]

чтобы изменить 3==4 на 3 == 4, я мог бы поместить курсор на первый =, и:

i[пробел][esc] ww.


Хах! Я довольно долго пытался понять, как окружить блок пространствами, и наконец нашел правильную комбинацию.

используя окружают.vim вы говорите объемное пространство селектора пространства.

поэтому для этого конкретного случая я бы использовал визуальный режим (хороший трюк для работы с одиночными символами под курсором BTW) таким образом: "vs"

У меня тоже есть привычка печатать такие вещи, как списки аргументов без пробелов. С этим методом вы можете просто перейти ко второму аргументу с помощью w и сказать "vws", чтобы визуально выбрать слово и окружить пробелами.

Я предпочитаю режим визуального выбора в целом. Кроме того, альтернативный синтаксис объемного звучания " ysw "исключает слово final запятая, которая поймана"vw".


Я думал об этом. я попробовал с surround.vim, но наивный подход

S<space>

(после визуального выбора) не работает, так как пространство уже занято в качестве модификатора для добавления пространства к другим окружающим парам символов. S<space><cr> добавляет A ^M В вывод. Ss почти работает, но вставляет пробел только перед.

после запроса в tpope / surround.ВИМ на GitHub:

S<space><space>

in визуальный режим работы. альтернативно, из нормального режима,ysl<space><space> работает для одного символа


вы можете создать макрос с одним из описанных действий и вызывать его каждый раз, когда вам это нужно (например, амфетамин, предложенный во время написания), или вы можете просто найти и заменить:

:%s/\(\d\)\(+\|-\)\(\d\)/  /g

вероятно, вам придется выполнить эту команду два раза, потому что она будет находить только каждое второе появление +/-.

EDIT:

это заменит все без необходимости вызывать дважды:

:%s/\d\@<=+\|-\d\@=/  /g

попробуйте расположить курсор над " + " и введите следующее:

q1i[пробел][стрелка вправо][пробел][стрелка влево][esc]q

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

существует также более универсальный:

q1ea[пробел] [esc]bi[пробел][справа стрелка] [esc]q

который будет окружать слово под курсором ("=="считается словом) пробелами при нажатии @1.


вы можете настроить такое отображение (нажмите enter в визуальном режиме, чтобы обернуть пробелы):

:vnoremap <CR> <ESC>`<i<SPACE><ESC>`>la<SPACE><ESC>h

этот метод позволяет использовать . повторить команду на следующем +.

наведите курсор на + и введите:

s[SPACE][CTRL-R]"[SPACE][ESC]

Я знаю, что это и старый поток, но это может быть полезно кому-то. Я нашел, что карта (карта это все, что вы хотите!)

noremap <leader>ss diwi<SPACE><C-R>"<SPACE><ESC>B

работает нормально как для превращения "a+b" в "a + b" (при использовании над символом"+"), так и для превращения "a==b" в "a == b" (при использовании над первым или вторым знаком"=").

Я надеюсь, что это полезно кому-то.