vi - "neue Zeile einfügen und bis zur aktuellen Cursorposition einrücken" als Makro?



  • Der Titel ist ja fast schon aussagekräftig 🙂

    Ich möchte gerne im VIM editor folgendes (am liebsten natürlich über ein mapping, alternativ über ein Makro) realisieren:

    abcde = say_hello ("Hi", 5, 15,
                            25, 12, OFF);
    

    wird zu =>

    _____abcde = say_hello ("Hi", 5, 15,
    ________________________
    ________________________25, 12, OFF);
    

    wobei die "_" für Leerzeichen stehen sollen.
    Wofür ich das brauche? Ich möchte in der "neu eingefügten" Zeile später ohne "lästiges" manuelles Einrücken weiter codieren können.

    Ich habe kurz experimentiert und das mit Makros lösen wollen:

    Startpunkt war das " vor "Hi"
    Tastenfolge: q o (record macro named o)
    Y p (yank & paste)
    space D (EOL setzen)

    Allerdings sitzt der Cursor vorm EOL setzen in der neuen Zeile an der Spalte von abcde ... Verschiedene Versionen mit visual und dann yank & paste haben auch nicht zum Erfolg geführt.

    Logischerweise soll das mapping bzw. das Makro dann immer relativ gesehen von der aktuellen Cursorposition die neue Zeile einrücken und nicht so weit, wie es beim recorden des Makros passiert ist.

    Weiß jemand was ich meine und wie man das hinbekommen könnte?



  • Habs ... Jetzt brauch ich das ganze nur am besten noch als mapping - kapiere aber irgendwie die Syntax nicht wirklich...

    Das Makro tut nun folgendes:
    ma Y P + :s/[[:print:]]/g `a l D

    mark auf a setzen an der Cursorposition
    Ganze Zeile Copy & paste before
    nächste Zeile komplett mit leerzeichen ersetzen
    zum mark a springen, 1 Zeichen nach rechts
    EOL setzen...

    Damit bin ich genau da wo ich hinwollte, nur hätte ichs gern auf "einen Tastendruck verfügbar"



  • Habs so weit gelöst ;o)

    Die Syntax ist lustigerweise zu einfach, um draufzukommen... Einfach die Tastatureingaben nacheinander exakt aufreihen.

    Falls die Lösung irgendwann jemand haben möchte oder noch Fragen offen sind, meldet Euch unter bittean(at)arcor.de

    ansonsten hier meine mapping-Zeile dafür:

    Variante a):

    map Z maYP`ak+0v$r<space>`aDI
    

    geht an besagter Spalte in der neuen Zeile in den Einfügemodus

    alternativ b):

    map Z maYP`ak+0v$r<space>`alD
    

    fügt eine neue Zeile mit entsprechender Einrückung bis zur besagten Spalte ein und positioniert den Cursor auf dieser Spalte in der neuen Zeile

    alternativ c):

    map Z maYP`akmb+0v$r<space>`aDa<space><esc>`b
    

    fügt die neue eingerückte Zeile ein, ohne die Cursorposition zu verändern

    alternativ d):

    map Z @="maYP`akmb+0v$r<space>`aDa<C-V><space><esc>`b"<cr>
    

    erweitert die Variante c) um die Möglichkeit über ein Register die Version c) mehfach auszuführen (z.B. 3Z fügt 3 eingerückte Zeilen ein)

    mir wird dieses kleine Mapping und viele bald folgende die Arbeit im vim sehr erleichtern und ich hoffe, Ihr könnt mir folgen und habt auch was davon 🙂



  • Dieser vi, von dem du sprichst, ist verdammt umständlich. Emacs kann das viel einfacher. Brauchst nur ein replace-regexp .



  • Och nö bitte kein vi(m) vs emacs Flamewar
    (Und JA vim ist was anderes als vi)



  • 1. ich meinte vim, als ich fälschlicherweise von vi schrieb
    2. vim kann natürlich auch alle möglichen search & replace gedönse. Der Grund, weshalb ich an vim festhalte ist, dass ich hier anderen Entwicklern teilweise zuarbeite und so "Werkzeuge" mal eben ausgetauscht werden können, wie z.B. diese mappings

    Danke trotzdem für den Hinweis


Anmelden zum Antworten