2013-04-05 10 views
7

Czy istnieje prosty sposób użycia makra lub ~ 10 funkcji liniowej (bez wtyczki!) Do wyśrodkowania tekstu na pierwszym i ostatnim słowie (= ciąg niepustych znaków) na linii? Na przykład. aby włączyćŁatwy sposób wyśrodkować tekst między pierwszym i ostatnim nie-białym słowem w vim?

 >>> No user serviceable parts below.    <<< 

do

 >>>  No user serviceable parts below.   <<< 

poprzez zrównoważenie przestrzenie +/- 1? Nie można zakładać żadnych zakładek, a wynik nie powinien zawierać zakładek, ale należy pamiętać, że pierwsze słowo może nie zaczynać się w kolumnie 1. (EDYTOWANIE: ... w rzeczywistości oba separatory słów oraz początek i koniec tekstu do środka może być na arbitralnych kolumnach.)

+0

Czy istnieje stałej szerokości? – jcbwlkr

+0

Co próbowałeś? – romainl

+0

@ 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

Odpowiedz

7

źródło tej funkcji:

fun! CenterInSpaces() 
    let l = getline('.') 
    let lre = '\v^\s*\S+\zs\s*\ze' 
    let rre = '\v\zs\s*\ze\S+\s*$' 
    let sp = matchstr(l,lre) 
    let sp = sp.matchstr(l,rre) 
    let ln = len(sp) 
    let l = substitute(l,lre,sp[:ln/2-1],'') 
    let l = substitute(l,rre,sp[ln/2:],'') 
    call setline('.',l) 
endf 

uwaga

  • funkcja ta może NIE praca we wszystkich przypadkach. Napisałem to szybko w zwykłym przypadku. nie jest to wtyczka, ale linie kodów można zmniejszyć, łącząc wywołania funkcji. ale myślę, że jest to jasne w ten sposób, więc po prostu tak to pozostawiam.

  • jeśli pracował dla ciebie, można utworzyć mapę

  • to działa tak: (ostatnie dwie linie Wpisałem @: powtórzyć cmd połączenia)

enter image description here

+0

Awesome. Jak wygenerowałeś gif? – jcbwlkr

+0

Znakomity, a to tylko * dziewięć * linii :-) – Jens

+0

Czy dwa 'getline ('.')' Wywoła w przypisaniach do 'sp' zostaną zastąpione' l'? – Jens

1

Nie znam żadnej dobrej drogi. Zwykle robię to w sposób półautomatyczny, używając :center w linii tekstu, która zawiera tylko części, które mają być wyśrodkowane, a następnie przenieść wynik do linii zawierającej otaczające części.

Jeśli nikt inny nie ma lepszej odpowiedzi, być może boxes może pomóc, jeśli musisz robić tego rodzaju rzeczy.

3

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:

enter image description here

+1

+1 Nie zauważyłem tej odpowiedzi. miła substytucja. btw, zrobiłem dla ciebie gif .. edytuje twoją odpowiedź i doda ją wkrótce, usuń ją, jeśli nie lubisz. :) – Kent

+1

Dziękuję. Będę musiał nauczyć się tworzyć te gify. –

+0

nie musisz się uczyć, tylko małe narzędzie. google byzanz, zobaczysz, to naprawdę łatwe w użyciu. – Kent