Antwort an den gVim-Spezialisten

In den letzten Tagen hat jemand zwei ziemlich umfangreiche Kommentare an einen Beitrag gehängt in dem ich mich letzten Oktober über den Vim gewundert habe. Vielleicht hat jemand mehr Zeit sich das anzusehen, deshalb antworte ich ihm mal nicht im Kommentar sondern in einem separaten Artikel.

Hallo, Peter…

Keine Ahnung warum Du mir das hier rein schreibst, ich bin kein vim-Entwickler. Ich habe im Moment auch nicht die Zeit allem nachzugehen was Du schriebst, aber nach Deinem letzten Absatz („…eines der am liederlichsten programmierten Programme… Software-Verhau… eines der am blödesten zu bedienendsten Programme…“) habe ich doch mal einen Blick auf einige Deiner Beispiele geworfen.

Meine Testdatei:

Bahnfahrer
bahnfahrer
Autofahrer
Autobusfahrer
Autobahnfahrer

Zunächst: Eine Suche mit /Auto(bahn)[0}fahrer ergibt tatsächlich nichts. Wie auch? Das ist syntaktischer Humbug. Nehmen wir an dass Du /Auto(bahn){0}fahrer meintest. Das findet bei mir (vim 7.1.267) genau den Autofahrer, und das ist meiner Meinung nach absolut richtig. Ich suche nach etwas das mit ‚Auto‘ anfängt, danach soll null mal ‚bahn‘ stehen, danach ‚fahrer‘. Das kommt genau ein mal vor. Autobusfahrer wird natürlich nicht gefunden weil in dem Ausdruck kein ‚bus‘ erlaubt wurde.

Nächster Versuch: Ich suche nach /(Bahn){0}fahrer. Nein, ich suche lieber nach /(Bahn){0}fahrer. Damit kriege ich fünf Fundstellen, nämlich jeweils das ‚fahrer‘ am Ende der Zeile. Klar, ich suche ja nicht nach kompletten Worten, sondern nur nach Stellen an denen ‚fahrer‘ steht. Meinetwegen nach Stellen an denen null mal ‚Bahn‘ steht, gefolgt von ‚fahrer‘. Ob vor dem Nicht-Auftreten von ‚Bahn‘ nicht noch ein ‚Bahn‘ stehen darf ist nicht gesagt. Ich hoffe ich konnte mich klar ausdrücken?

Von weiteren Versuchen sehe ich einfach mal ab, vielleicht hat ja jemand anderes Lust sich da durchzuquälen. Du solltest Dich vielleicht tatsächlich einfach mit Deinem Windows 98 SE und dem mitgelieferten Notepad zufrieden geben. Dazu hätte ich dann auch nochmal einen lustigen Beitrag für Dich…

Noch ein Tip am Rande: wenn Du mit einer Software rumspielst von der Du keine Ahnung hast, die aber gerade von Profis sehr gerne benutzt wird, und Du stößt dabei auf Ungereimtheiten die Du Dir nicht erklären kannst… Erst RTFM beherzigen, dann nochmal probieren. Dann im Netz nach Lösungen suchen, oder nach Leuten die die gleichen Probleme haben. Wenn das nix bringt in entsprechende Foren und Mail-Archive sehen. Ist auch das ohne Erfolg, frage an geeigneter Stelle nach. Wenn Du mit dem Problem absolut nicht leben kannst, und sich rausstellt dass das wirklich ein Bug ist der in den aktuellen Versionen noch nicht behoben ist… DANN reichst Du einen Bug-Report bei dem Projekt ein. Und zwar wirklich bei dem Projekt, nicht als Kommentar auf einen Blog-Eintrag von vor einem halben Jahr…

Ach, noch was: Danke für den Link auf Deine Homepage. Sehr aufschlussreich. :-D

6 Kommentare

  1. Mir syntaktischen Humbug vorzuwerfen ist einfach. Aber zu sagen, wie das Suchmuster aussehen müsste, damit Wörter wie Autofahrer, Autobusfahrer und Autoreisefahrer gefunden werden; nicht aber Autobahnfahrer; das ist schon schwerer. Beim allseits ach so hochgelobten gVim ist das aber schier unmöglich. Aber fangen wir mal mit was ganz einfachem an:

    Angenommen Du schickst Deine Frau zum Einkauf und schreibst ihr eine Einkaufsliste:

    1 Brot, 2 Brötchen und Null Päckchen Zigaretten,

    damit sie weiß, was sie für Dich mitbringen soll, und was sie nicht für Dich mitbringen soll. Deine Frau käme zurück mit der Bemerkung, dass diese Einkaufsliste syntaktischer Blödsinn sei, weil Du mit dieser (angeblich) nicht die Zigaretten ausgeschlossen hattest. Dann würdest Du vielleicht ein wenig an ihrem Intellekt zweifeln und argumentieren, dass 0 Päckchen Zigaretten eben nun mal zweifelsfrei und eindeutig bedeuten, dass sie eben nun mal keine Zigaretten für Dich mitbringen soll.

    Zurück zu Vim: Wenn Du bspw. angibst, dass Auto, gefolgt von einem Zeichen, das nicht das Zeichen x sein soll und dann bahn folgen soll, so wird gVim brav bspw. Auto-fahrer, Autofahrer und Auto Fahrer als Treffer ausgeben; nicht aber Autoxfahrer. Der Befehl sieht so aus:

    /Auto[^x]fahrer

    Man kann auch ganze Wörter angeben, die zwischen Auto und bahn sein sollen oder nicht sein sollen. Bspw.

    /Auto\(bahn\)\{2,4}fahrer

    findet Wörter, die zwischen Auto und Fahrer zwei bis 4 mal das Wort bahn haben dürfen. Gibt man aber als Menge für das Wort bahn 0 an, so hat das System das syntaktisch entsprechend umzusetzen und das Wort Autobahnfahrer als Treffer nicht zuzulassen. Ein Suchmuster ist dazu da, dass das System das entsprechend umsetzt; und nicht, dass einfach was ignoriert wird.

    Hey, wenn Du es genau wissen willst: Die Mengenabgabe 0 für bahn schließt sehr wohl das Wort bahn aus, auch wenn Du Dir das anscheinend logisch nicht vorstellen kannst. Überlege doch mal! Wenn ich für bahn 0 angebe, wiese sollte ich dann das Wort bahn nicht damit ausgeschlossen haben. Tut mir leid, aber mit Deiner „Logik“ komme ich nicht zurecht.

    Im Prinzip ist das auch so, wenn ich jeweils vor und nach bahn beliebige Zeichen erlaube. Bspw. Autorennbilligfahrer wäre möglich als Treffer. Aber bspw. Autorennbahnbilligfahrer natürlich nicht. Die Entwickler von Vim scheinen das anscheinend auch noch nicht verstanden zu haben.

    Übrigens ist der Vim gar nicht so schlecht. Es ist schon erstaunlich, was man mit diesem programm alles machen kann. Inzwischen habe ich mich an dieses Programm gewöhnt und nutze die vielseitigen Möglichkeiten aus. Und die Angaben >so viel oder so wenig wie möglich

  2. Ich habe immer mehr den Eindruck dass Du kein Problem mit dem Editor hast sondern mit regulaeren Ausdruecken im allgemeinen. Dein Autobahnbeispiel wird von Perl, sed, awk oder regexp() sicher nicht anders behandelt als vom vi, vim oder gvim.

    Deine beiden Beispiele hier in dem Kommentar sind korrekt. [^x] repraesentiert genau ein Zeichen das kein x ist. Und \(bahn\)\{2,4\} ist tatsaechlich eine Kette von zwei bis vier mal ‚bahn‘, also eine Kette von acht bis 16 Zeichen. Dagegen ist \(bahn\)\{0\} eine leere Menge. Also kein einziges Zeichen lang.

    /Auto\(bahn\)\{0\}fahrer sucht also nach einem String der mit Auto anfaengt, danach steht ein beliebiger String der null (!) Zeichen lang ist, danach fahrer. Ergo kann nur der Autofahrer gefunden werden.

    Zumindest ist das _mein_ Verstaendnis der Sachlage, und der Vim reagiert hier exakt wie ich es erwarten wuerde.

    Fuer weitere Fragen und Kommentare zu dem Thema solltest Du entsprechende Quellen konsultieren, ich bin da nicht der richtige.

  3. ach verdammt, wenn das nicht klappt, das halt nicht.
    Also für nicht matches gibt es die Pattern
    \@! und \@<!
    D.h. das folgende Pattern sollte passen (ugetestet)
    Auto\(\w\{-}\(bahn\)\@<!\)fahrer

    Generell kann man sagen, steht das alles ganz gut in der Hilfe erklärt:
    :h /\@!
    :h /\@<!
    und natürlich
    :h pattern.txt

    Bei komplexen Fragen zu regulären Ausdrücken hilft die Vim-Mailingliste eigentlich recht
    schnell und kompetent.

    PS: Bitte lösch doch die alten unvollständigen Antworten.

  4. @christian: Cool, da haette ich auch eine Weile nach suchen muessen (nie gebraucht). Schoen zu wissen dass es doch geht.

    Den original-Fragesteller wird das hier aber wohl nicht mehr erreichen, da er wie ich ja schon schrieb hier wahrscheinlich nicht mehr reinsieht. :-)

    PS: Die unvollstaendigen Antworten hab ich umweltgerecht entsorgt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

;-) :-) :-D :-| :-/ :-( :-P more »