Фоновое задание
Чтобы устранить проблемы X-Y, я скажу, что я делаю: я пытаюсь использовать :perldo
в VIM 7.2 для выполнения двух задач:
- Очистить все конечные пробелы, включая (очистка, но не удаление) строки, которые только имеют пробелы
- Удалите пробелы без табуляции, которые существуют перед первым непробельным символом
s/^ (\s*) (?=\S) / s#[^\t]##g;$_ /xe;
Я бы хотел сделать все это за один проход. В настоящее время, используя :perldo
, я могу заставить это работать с двумя проходами. (используя: perldo дважды)
Команда должна выглядеть так:
:perldo s/\s+$//; s/^ (\s*) (?=\S) / s#[^\t]##g;$_ /xe;
фон Perl
Чтобы понять эту проблему, вы должны немного знать о Perl s///
, автоматически связывающем переменную по умолчанию $_
, которую регулярное выражение может свободно изменять. Большинство основных функций по умолчанию работают на $_
.
perl -e'$_="foo"; s/foo/bar/; s/bar/baz/; print'
# напечатает baz
Предполагается, что вы можете связывать выражения, используя :perldo
в VIM, и это будет работать логически.
VIM нехорошо
Теперь моя проблема с VIM лучше демонстрируется с помощью кода - я сократил ее до простого теста. Откройте новый буфер и поместите в него следующий текст:
aa bb
aa
bb
Теперь запустите это :perldo s/a/z/; s/b/z/;
В буфере теперь есть:
za zb
aa
zb
Почему первое регулярное выражение оказалось неудачным во втором ряду, и все же второе регулярное выражение было успешным само по себе и в первом ряду?