[vim] abbreviations mit Parametern

promille

Aktives Mitglied
Thread Starter
Dabei seit
23.11.2004
Beiträge
1.305
Reaktionspunkte
36
Hallo.

Es soll eine xml-Datein mit (vereinfacht) folgender Struktur erstellt werden:

Code:
<d:entry id="[B]my_word[/B]" d:title="[B]My Word[/B]">
<d:index d:value="[B]My Word[/B]"/>
    <h1>[B]My Word[/B]</h1>
    Hier irgendein Text zu dem Wort.
</d:entry>

Nun will ich, dass die Eingabe ':entry My\ Word' gleich die oben gezeigte Struktur mit dem Parameter "My\ Word" vervollständigt.

Am liebsten wäre mir die Eingabe im normal mode, aber eine abbreviation im insert mode ist auch OK.

Zur Not können entry-id, title und value identisch sein (also ohne Umwandlung in Kleinbuchstaben und Ersetzung der Leerzeichen mit Unterstrich).

Wäre dankbar, wenn mir jemand weiterhelfen könnte.
 
Was hast Du schon versucht?
An welcher Stelle hängst Du?

Kleiner Hinweis.
Du kannst bei abbreviations auch die Modes wechseln. Das heißt, Du startest im normal mode, wechselst in den insert mode, schreibst, was zu schreiben ist und wechselst dann wieder in den normal mode zurück.

Auf den ersten Blick bin ich allerdings der Ansicht, dass Du für Deine Aufgabe mit einer function besser bedient bist.
 
Was hast Du schon versucht?
An welcher Stelle hängst Du?
Ehrlich gesagt, wusste ich nicht so recht, womit ich anfangen soll. Über Parameter/Argumente bei abbreviations war ich mir nicht gewiss und sonst viel mir auch kein Stichwort ein.

Auf den ersten Blick bin ich allerdings der Ansicht, dass Du für Deine Aufgabe mit einer function besser bedient bist.
Stimmt, die gibt's ja auch noch... (Bis Kapitel 27 hab ich's leider nicht geschafft ;))
Danke für den Hinweis!
 
Im Grunde lässt sich das sehr einfach und komfortabel umsetzen.
Vielleicht versuchst Du es mal und postest Dein Ergebnis.
Wenn Du hängst, kann ich Dir gerne auf die Sprünge helfen.:wq :D
 
Wenn Du hängst, kann ich Dir gerne auf die Sprünge helfen.
Danke, das ist sehr nett.

Dabei hab ich mich auch schon ertappt.

Hier ist die function:
Code:
function Entry(word)
       let word = a:word
       let line = line(".")
       let line1 = append(line, "[I]<d:entry id=\"[/I]".[B]word[/B]."\[I]">[/I]")
       let line2 = append(line+1, "[I] <d:index d:value=\"[/I]".[B]word[/B]."\"[I]/>[/I]")
       let line3 = append(line+2, " [I]<d:index d:value=\[/I]"$\"[I]/>[/I]")
       let line4 = append(line+3, " <h1>".[B]word[/B]."</h1>")
       let line9 = append(line+8, "[I]</d:entry>[/I]")
endfunction

(Zwecks der besseren Lesbarkeit sind die konstanten Strings kursiv und die Variablen fett dargestellt :)sy on :)))

Wahrscheinlich gibt es da einen eleganteren Weg, aber funktionieren tut es so auch.
 
]Hallo,

wenn ich Deine function ausführe, wird bei mir die letzte Zeile nicht ausgegeben (ist nur ein kleiner Fehler ;)).
Außerdem mach die Funktion nicht genau das, was Du im Eingangsposting beschreibst.

Hier ist mein Vorschlag. Kannst ja mal testen.
Code:
fun! Ins([B]var1[/B])
    let [B]entry_id[/B] = tolower(substitute([B]a:var1[/B]," ","_","g"))
    exe "normal o<d:entry id=\"" . [B]entry_id[/B] . "\" d:title=\"" . [B]a:var1[/B] . "\">^M<d:index d:value=\"" . [B]a:var1[/B] . "\"/>^M<h1>" . [B]a:var1[/B] . "</h1>^M^M</d:entry>^[OA"
endfun
Die Zeilenumbrüche und Cursorbewegungen erzeugst Du mit ctrl-v [Taste]
Das schöne ist, dass der Cursor beim Verlassen schon an der Position steht, an der man weiter schreiben muss/möchte.

Gruß
maceis
 
wenn ich Deine function ausführe, wird bei mir die letzte Zeile nicht ausgegeben (ist nur ein kleiner Fehler ;)).
Oops, da hab ich vergessen den 1. Parameter beim letzten Funktionsaufruf anzupassen.

Außerdem mach die Funktion nicht genau das, was Du im Eingangsposting beschreibst.
Nachdem ich nur etwas schleppend vorankam, habe ich die Substitution für den id-string weggelassen. Aber so ist es jetzt natürlich noch besser.

Vielen Dank für Deine Hilfe. Die Kombination aus Motivation zum Selbstversuch auf der einen Seite und Mitanpacken auf der anderen, war gut.
 
Zurück
Oben Unten