vim: заменить строки на другие строки - PullRequest
0 голосов
/ 10 мая 2018

После прочтения Замените регулярное выражение Vim на n символов , я знал, как заменить табуляцию пробелами:

:%s/^\v(\t)*/\=repeat(repeat(' ',4),strlen(submatch(0)))/g

Приведенная выше команда позволяет мне заменить n вкладок в начале каждой строки на n четырех пробелов.

Теперь я хочу перевернуть его: заменить n четырех пробелов на n вкладок в начале каждой строки, я думаю, что команда должна быть :%s/^\v( )*/\=repeat("\t",strlen(submatch(0)))/g, но она не работает: если есть один четырех пробел, после выполнения команды она будет заменена четырьмя вкладками (но я хочу сделать это только одной вкладкой).

Кроме того, возможно ли получить длину табуляции vim, чтобы я мог сделать команду, как показано ниже?

:%s/^\v(\t)*/\=repeat(repeat(' ',getSizeOfTab()),strlen(submatch(0)))/g

1 Ответ

0 голосов
/ 10 мая 2018

Вы можете получить значение параметра в Vimscript, добавив &. Таким образом, размер вкладки составляет &tabstop или &ts. Также есть &softtabstop (&sts), выберите тот, который вам действительно нужен.

В то время как вам нужно было умножить количество пробелов на размер табуляции, вам нужно разделить количество табуляций. Тогда есть остаток, чтобы заботиться. Итак, сначала установите tabstop:

:set ts=4

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

:%s/^\v(\t)*/\=repeat(repeat(' ',&ts),strlen(submatch(0)))/g

:%s#^\v( )*#\=repeat("\t",strlen(submatch(0))/&ts).repeat(' ',strlen(submatch(0))%&ts)#g

(изменил разделитель с / на #, потому что мне нужно было / для деления: P)

Однако ... похоже, вы изобретаете колесо здесь. :help :retab! и :help 'expandtab'. Сначала установите tabstop, как указано выше, затем:

:set et | ret!

:set noet | ret!

Первый из них будет заменять табуляцию пробелами; второй, пробелы во вкладках, в соответствии с tabstop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...