2012-12-17 13 views
5

Oto przykładowy tekst Próbuję formacie:M-x align-regexp usuwa tekst?

(9 12 19 38 0 -39 -20 -13 -10) 
(7 9 14 29 0 -30 -15 -10 -8) 
(4 6 9 19 0 -20 -10 -7 -5) 
(2 3 4 9 0 -10 -5 -4 -3) 
(0 0 0 0 0 0 0 0 0) 
(-3 -4 -5 -10 0 9 4 3 2) 
(-5 -7 -10 -20 0 19 9 6 4) 
(-8 -10 -15 -30 0 29 14 9 7) 
(-10 -13 -20 -39 0 38 19 12 9) 

chciałbym każdą kolumnę aby wyrównać na cyfr (czyli czy jest to znak minus, dodać dodatkową przestrzeń).

Jeśli mogę to zrobić tak: C-uM-xalign-regexpRET\([[:digit:]]+\)RETRETRETy

mam tego:

(9 12 19 38 0 -3 -2 -1 -1) 
(7 9 14 29 0 -3 -1 -1 -8) 
(4 6 9 19 0 -2 -1 -7 -5) 
(2 3 4 9 0 -1 -5 -4 -3) 
(0 0 0 0 0 0 0 0 0) 
(-3 -4 -5 -1 0 9 4 3 2) 
(-5 -7 -1 -2 0 19 9 6 4) 
(-8 -1 -1 -3 0 29 14 9 7) 
(-1 -1 -2 -3 0 38 19 12 9) 

który jest bardzo blisko, ale nie tego, co chcę.

A jeśli próbuję modyfikować ekspresję zawierać znak minus, tak: \(-?[[:digit:]]+\)

Potem uzyskać to:

(9 1 1 3 0 - - - -) 
(7 9 1 2 0 - - - -) 
(4 6 9 1 0 - - - -) 
(2 3 4 9 0 - - - -) 
(0 0 0 0 0 0 0 0 0) 
(- - - - 0 9 4 3 2) 
(- - - - 0 1 9 6 4) 
(- - - - 0 2 1 9 7) 
(- - - - 0 3 1 1 9) 

Jest to błąd, czy jest tam coś I don” nie wiem?

+1

Emacs modyfikuje (to znaczy dodaje spacje lub usuwa znaki) z pierwszej dopasowanej grupy w wyrażeniu regularnym, aby wyrównać kolumny. Jeśli zastąpiłeś proponowane '\ (\ s - * \)' regexp zamiast dołączać do niego, wyjaśnia to, dlaczego Emacs usunął znaki z twojego tekstu. – Francesco

Odpowiedz

3

Tekst dopasowany przez wyznaczoną grupę (zazwyczaj grupa 1) jest rozszerzany lub skurczony, więc znaki spoza białej spacji w grupie mogą zostać usunięte, jak widzieliśmy. Chyba, że ​​jest uzasadnienie jest włączona, to wskazuje dostarczanie ujemny numer grupy tO align-regexp:

CuMxalign-regexpret\(\s-*-?\)[0-9]+RET-1RETRETy

Jeśli chcesz, możesz wyrównać kolumny na wykopach jej każdego numeru poprzez włączenie cyfr w grupie mecz:

CuMxalign-regexpRET\(\s-*-?[0-9]+\)RET-1RETRETy

W obu przypadkach dodatkową przestrzeń zostanie wstawiony po każdym nawiasie otwierającym. Nie widzę sposobu, aby powstrzymać ten proces od align-regexp, ale jeśli robisz to często, możesz zawinąć go w polecenie, które robi align-regexp, a następnie zamienia wyrażenie regularne "^(" z "(" wszędzie w oryginalnym regionie.