Można użyć polecenia :s
z \=
jako dodatkiem zastępującym wyrażenie.
:s#\v^\s*\S+\zs(\s+)(.{-})(\s+)\ze\S+\s*$#\=substitute(submatch(1).submatch(3),'\v^(\s*)(\1\s=)$','\1'.escape(submatch(2),'~&\').'\2','')#
Przegląd
przechwytywania tekstu (włącznie z białą przestrzeń) między >>>
i <<<
znaków. Podzielić białą przestrzeń po obu stronach tekstu na pół i zastąpić ją tekstem, który nie jest spacją białą. Ta operacja równoważenia białych przestrzeni odbywa się za pomocą mechanizmu powrotnego silnika regex, ponieważ matematyka jest trudna. Chodźmy na zakupy!
Uwagi:
- wykorzystujące
\v
lub very magic
tryb zmniejszyć ucieczkę ta komenda jest wystarczająco długi już
- użycie
#
jako alternatywny separatora zamiast zwykłego /
dla :s/pat/sub/
w nadziei, aby go lekko bardziej czytelny
Pasujący wzór
:s#\v^\s*\S+\zs(\s+)(.{-})(\s+)\ze\S+\s*$#...
:s
bez dostarczonej zakresie zrobić tylko podstawienie bieżącej linii.
^\s*\S+
Dopasuj początkową białą przestrzeń, a następnie inną niż biała. >>>
w tym przypadku.
(\s+)(.{-})(\s+)
mecz białego spację „text”, a następnie biały przestrzeni grupy
- 3 rejestracji: 1), co prowadzi spacje, 2) „text” i 3) końcowe białe przestrzeni. Zostaną one później odwołuje
submatch(1)
, submatch(2)
i submatch(3)
odpowiednio
.{-}
jest vim-mówić za nie chciwy dopasowania lub .*?
w Perl-mówić
- bez spoza chciwy dopasowania drugą grupę przechwytywania obejmowałyby zbyt dużo bieli -kosmiczna na jej końcu
\S+\s*$
dopasować non-white-space (tj <<<
) oraz wszelkie końcowe white-space
- Zastosowanie
\zs
i ze
wyznaczyć początek i koniec meczu zastępuje
Wymiana
\=substitute(submatch(1).submatch(3),'\v^(\s*)(\1\s=)$','\1'.escape(submatch(2),'~&\').'\2','')
\=
mówi vim, że wymiana będzie wyrażenie Vima. Umożliwia także stosowanie submatch()
funkcji
substitute({str}, {pat}, {sub}, {flags})
Nasz ekspresyjne będą zagnieżdżonej substytucyjnego
substitute(submatch(1).submatch(3), ...)
do substytutu nad łączeniem przednich oraz tylnych white-odstępy zrobione w submatch(1)
i submatch(3)
{pat}
jest ^(\s*)(\1\s=)$
. Dopasuj trochę odstępu, a następnie spacji o tej samej długości, co dłuższy lub pierwszy znak. Złap obie połówki.
escape(submatch(2),'~&\')
Ucieknij za pod kątem wszelkich znaków specjalnych. na przykład ~
, &
, \1
, ...
- Numer
{sub}
to '\1'.escape(submatch(2),'~&\').'\2'
. Zastąp symbolami ewidencjonowanymi submatch(2)
(tj."Tekst" chcemy środku) pomiędzy połówkami white-space, \1
i \2
z {pat}
- Brak
{flag}
„s potrzebne są więc ''
Usage
Jeśli używaj tego często sugeruję stworzenie polecenia i umieszczenie go w ~/.vimrc
.
command! -range -bar -nargs=0 CenterBetween <line1>,<line2>s#\v^\s*\S+\zs(\s+)(.{-})(\s+)\ze\S+\s*$#\=substitute(submatch(1).submatch(3),'\v^(\s*)(\1\s=)$','\1'.submatch(2).'\2','')#`
Inaczej użyć tego raz, a następnie powtórzyć ostatni zastąpienie poprzez &
na każdej potrzebnej linii.
Aby uzyskać więcej pomocy zobacz
:h :s/
:h :s/\=
:h sub-replace-\=
:h submatch(
:h substitute(
:h escape(
:h /\v
:h /\S
:h /\{-
:h /\zs
:h &
EDIT przez Kent
Nie bądź zazdrosny, odpowiedź ma go zbyt.^_^
Nie zmieniłem polecenia, po prostu cp/wklej do mojego vima. na końcu dodaj tylko |noh
, aby wyłączyć podświetlanie.
Jeśli wykonać to polecenie, to wygląda:

Czy istnieje stałej szerokości? – jcbwlkr
Co próbowałeś? – romainl
@ jacobwalker0814 Brak stałej szerokości. romainl: Próbowałem ': help center' i szukałem wtyczek, ale dla tak prostego zadania wtyczka wydaje się być przesadna. – Jens