Hi David! On Sun, 17 Aug 2008, David Haller wrote:
Am Son, 17 Aug 2008, Christian Brabandt schrieb:
On Sat, 09 Aug 2008, David Haller wrote:
Kurz: das ganze Muster passt von <p bis zu _nächsten_ >. Alles relevante steht in 'man 7 regex', vim verwendet soweit ich weiß die "extended regular expressions" wie egrep.
Nein, Vim verwendet eine Syntax, die sich an Perl anlehnt. *seufz*
Aber die sind (fast) so mächtig wie Perl's RE. :h pattern.txt beschreibt alles ziemlich umfassend, inklusive Beispiele.
Ah. Bin halt emacser, keiner vimser ;)
Sakrileg, er hat Jehova gesagt ;)
Ach ja, :h perl-patterns: [..] | Finally, these constructs are unique to Perl: | - execution of arbitrary code in the regex: (?{perl code})
"(?{ code })" WARNING: This extended regular expression fea ture is considered highly experimental, and may be changed or deleted without notice.
| - conditional expressions: (?(condition)true-expr|false-expr)
"(?(condition)yes-pattern|no-pattern)" "(?(condition)yes-pattern)" WARNING: This extended regular expression fea ture is considered highly experimental, and may be changed or deleted without notice.
Beides sollte man also eher vermeiden.
Ach ja, ich erinnere mich. Wobei ich zumindest die conditional expressions ziemlich praktisch finde. Das mit dem Code hab ich noch nie gebraucht, weil das Flag /e ja existiert.
| ...and these are unique to Vim: | - changing the magic-ness of a pattern: \v \V \m \M | (very useful for avoiding backslashitis)
\E end case modification (think vi) \Q quote (disable) pattern metacharacters till \E
Ah, gut zu wissen (So gut kenne ich die Perl REs nicht. Da muß ich jedesmal nachschlagen, weil ich ständig mit Vim REs komme¹). Sollte man mal als Bugreport melden. Ich kann mir auch nie merken, ob ich \v oder \V brauche. Aber ich glaube \v macht ein Pattern für einen Perl User lesbarer.
| - sequence of optionally matching atoms: \%[atoms]
Das kapiere ich nicht. Meinen die sowas wie (foo|bar baz)?
Hm, :h /\%[] sagt folgendes: \%[] A sequence of optionally matched atoms. This always matches. It matches as much of the list of atoms it contains as possible. Thus it stops at the first atom that doesn't match. For example: /r\%[ead] matches "r", "re", "rea" or "read". The longest that matches is used. To match the Ex command "function", where "fu" is required and "nction" is optional, this would work: /\<fu\%[nction]\> The end-of-word atom "\>" is used to avoid matching "fu" in "full". It gets more complicated when the atoms are not ordinary characters. You don't often have to use it, but it is possible. Example: /\<r\%[[eo]ad]\> Matches the words "r", "re", "ro", "rea", "roa", "read" and "road". There can be no \(\), \%(\) or \z(\) items inside the [] and \%[] does not nest. {not available when compiled without the +syntax feature} Mir erschließt sich gerade der Sinn nicht. Wenn wir beim Beispiel road bleiben, dann funktioniert ja auch /\<r\(e\|o\)\?a\?d\?\> (vim, \< und \> heißt hier word boundary) Naja, es sieht simpler aus und man versteht es auch schneller, wenn man diese Syntax beherrscht.
| - \& (which is to \| what "and" is to "or"; it forces several branches | to match at one spot)
Das kann ich auch nicht nachvollziehen. (foo\&bar) was soll das bringen?
:h /\& 2. A branch is one or more concats, separated by "\&". It matches the last concat, but only if all the preceding concats also match at the same position. Examples: "foobeep\&..." matches "foo" in "foobeep". ".*Peter\&.*Bob" matches in a line containing both "Peter" and "Bob" Wozu man das braucht, weiß ich aber auch nicht.
| - matching lines/columns by number: \%5l \%5c \%5v
Das könnte praktisch sein, und das scheint's nicht in perl REs zu geben.
Für einen Editor auf jeden Fall ;)
| - setting the start and end of the match: \zs \ze
Das versteh ich auch wieder nicht ;)
Das ist ziemlich praktisch. Angenommen ich habe eine komplexes Pattern, von dem ich einen Teil ersetzen will, dann kann ich den Match mithilfe von \zs und \ze auf den relevanten Teil einschränken. Zum Beispiel ich habe in einem langen Text mehrmals die Zeile: foo bar baz John foobar Dann kann ich mit :%s/foo bar baz \zsJohn\ze foobar/Alex/g nur den Namen austauschen, ohne im Ersetzungsteil foo bar baz Alex foobar schreiben zu müssen. Oder im Vimsprech: :h /\zs \zs Matches at any position, and sets the start of the match there: The next char is the first char of the whole match. |/zero-width| Example: /^\s*\zsif matches an "if" at the start of a line, ignoring white space. Can be used multiple times, the last one encountered in a matching branch is used. Example: /\(.\{-}\zsFab\)\{3} Finds the third occurrence of "Fab". {not in Vi} {not available when compiled without the +syntax feature} */\ze* \ze Matches at any position, and sets the end of the match there: The previous char is the last char of the whole match. |/zero-width| Can be used multiple times, the last one encountered in a matching branch is used. Example: "end\ze\(if\|for\)" matches the "end" in "endif" and "endfor". {not in Vi} {not available when compiled without the +syntax feature} Ich bin durchaus ein Vim Poweruser, aber ich benötige selten diese Advanced Regular Expressions. Ich muß dann auch immer nachschlagen², wie das funktioniert. Wenn man eine Zeitlang auf der Vim Mailingliste mitliest, dann versteht man aber einiges besser. ¹)Erwähnte ich schon, dass die verschiedenen RE Dialekte ziemlich nerven? Ständig nehme ich die falschen und ich muß immer überlegen, ob das aktuelle Tool jetzt dieses Feature kennt oder nicht. ²)Wie gesagt, die Doku ist mit das Beste was es beim Vim gibt. Für Reguläre Ausdrücke empfiehlt es sich :h pattern.txt zu überfliegen oder mal im User Manual :h usr_27.txt nachzuschlagen. Mit freundlichen Grüßen Christian -- hundred-and-one symptoms of being an internet addict: 225. You sign up for free subscriptions for all the computer magazines -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org