vim-Skripting
-
- Beiträge: 3022
- Registriert: 03.11.2009 13:45:23
- Lizenz eigener Beiträge: Artistic Lizenz
-
Kontaktdaten:
vim-Skripting
Hi Leute!
Kennt sich hier zufällig jemand mit Vim-Skripting aus?
Ich stehe vor der Aufgabe, dass ich 400 Files bearbeiten muss. Die Arbeitsschritte sind immer die selben. Ich muss an einer Stelle einen Text einfüllen und danach den Inhalt einer Datei.
im Text ist der Variable Anteil der Dateiname, deren Inhalt danach einfügt wird.
Leider hab ich vom Skripting in VIM überhaupt keine Ahnung. Die "Aufnahme" und das Abspielen von Records mit qa und @a sind nicht die richtigen Werkzeuge, da ich den Dateinamen nicht angeben kann.
Mir wär am Liebsten, wenn ich den Dateinamen der Datei die eingefügt wird als Umgebunsvariable speichern kann, dann ein Makro/Skript aufrufe, welches mir den Text entsprechend einfügt und dann den Inhalt der Datei an vordefinierter Stelle einfügt.
Und das Skript startet mit dem Einfügen dort, wo ich gerade mit dem Cursor stehe... Denn dieser Punkt ist immer unterschiedlich...
Derzeit hab ich einen Textbaustein im Puffer, den füge ich ein, der hat eine definierte Textsequenz die ich dann mit s/SEQ/Dateiname/g ersetze und dann mit :!r cat /definierter/Pfad/zur/Datei/mit /Dateiname einlese und dabei bei beiden Befehlen aus der History "Dateiname" durch den tatsächlich aktuellen Dateinamen manuell ersetzen muss...
Das muss doch schöner gehen?
lg scientific
Kennt sich hier zufällig jemand mit Vim-Skripting aus?
Ich stehe vor der Aufgabe, dass ich 400 Files bearbeiten muss. Die Arbeitsschritte sind immer die selben. Ich muss an einer Stelle einen Text einfüllen und danach den Inhalt einer Datei.
im Text ist der Variable Anteil der Dateiname, deren Inhalt danach einfügt wird.
Leider hab ich vom Skripting in VIM überhaupt keine Ahnung. Die "Aufnahme" und das Abspielen von Records mit qa und @a sind nicht die richtigen Werkzeuge, da ich den Dateinamen nicht angeben kann.
Mir wär am Liebsten, wenn ich den Dateinamen der Datei die eingefügt wird als Umgebunsvariable speichern kann, dann ein Makro/Skript aufrufe, welches mir den Text entsprechend einfügt und dann den Inhalt der Datei an vordefinierter Stelle einfügt.
Und das Skript startet mit dem Einfügen dort, wo ich gerade mit dem Cursor stehe... Denn dieser Punkt ist immer unterschiedlich...
Derzeit hab ich einen Textbaustein im Puffer, den füge ich ein, der hat eine definierte Textsequenz die ich dann mit s/SEQ/Dateiname/g ersetze und dann mit :!r cat /definierter/Pfad/zur/Datei/mit /Dateiname einlese und dabei bei beiden Befehlen aus der History "Dateiname" durch den tatsächlich aktuellen Dateinamen manuell ersetzen muss...
Das muss doch schöner gehen?
lg scientific
dann putze ich hier mal nur...
Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie
auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main
Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie
auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main
Re: vim-Skripting
Verstehe ich das richtig?
$TEXT ist z.b. "foo bar <dateiname> baz" und du moechtest an der aktuellen Cursorposition $TEXT einfuegen und danach/darunter den Inhalt von /vorgegebener/pfad/<dateiname>?
Koenntest du ein Beispiel fuer $TEXT liefern?
$TEXT ist z.b. "foo bar <dateiname> baz" und du moechtest an der aktuellen Cursorposition $TEXT einfuegen und danach/darunter den Inhalt von /vorgegebener/pfad/<dateiname>?
Koenntest du ein Beispiel fuer $TEXT liefern?
Re: vim-Skripting
Will heißen, dass du 400 Datei händisch aufrufen willst? Dieser Punkt ist vielleicht immer unterschiedlich, aber mit irgendeiner Vorschrift (im Kopf) findest du den ja. Wenn du das umschreiben könntest, dann könntest du z.B. sowas direkt über alle 400 Dateien in einem Rutsch laufen lassen:scientific hat geschrieben:04.07.2018 15:40:14Und das Skript startet mit dem Einfügen dort, wo ich gerade mit dem Cursor stehe... Denn dieser Punkt ist immer unterschiedlich...
Code: Alles auswählen
#!/bin/sh
TEXT="My Text"
DATEI=/My/File/append.txt
for file in ./*; do
ex - "$file" <<EOF
/SEARCH_ME
a
$TEXT
.
r $DATEI
x! %.BAK
EOF
done
Zuletzt geändert von tobo am 07.07.2018 23:36:52, insgesamt 1-mal geändert.
-
- Beiträge: 3022
- Registriert: 03.11.2009 13:45:23
- Lizenz eigener Beiträge: Artistic Lizenz
-
Kontaktdaten:
Re: vim-Skripting
Ich muss die leider wirklich hàndisch aufrufen, da diese Skripte alle ein bisserl anders aufgebaut sind, und der Einfùgepunkt weder an einem Textmarker oder einer Zeilennummer festzumachen ist...
Und jedes Skript hat ein eigenes File, dessen Inhalt dann da rein muss. Manchmal sind es zwei oder 3 Skripte, die den selben Inhalt ergänzt bekommen.
Und jedes Skript hat ein eigenes File, dessen Inhalt dann da rein muss. Manchmal sind es zwei oder 3 Skripte, die den selben Inhalt ergänzt bekommen.
dann putze ich hier mal nur...
Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie
auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main
Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie
auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main
- heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: vim-Skripting
Ist das nicht ein Fall für sed, awk, perl oder ${deine_lieblings_scriptsprache} ?
Ansonsten hört sich das nach Optimierungsbedarf aufgrund extremer Redundanz an, wenn man in jedes Sch*** Script den gleichen Code reinhämmern muss.
Ansonsten hört sich das nach Optimierungsbedarf aufgrund extremer Redundanz an, wenn man in jedes Sch*** Script den gleichen Code reinhämmern muss.
-
- Beiträge: 3022
- Registriert: 03.11.2009 13:45:23
- Lizenz eigener Beiträge: Artistic Lizenz
-
Kontaktdaten:
Re: vim-Skripting
Nicht ganz.
Derzeit sind das Skripte die in àußerst heterogener Hardwarelandschaft (Debian, Redhat, Sun, Aix...) laufen, und für unterschiedliche User mittels Ini-Files ihre Initialisierung bekommen.
Diese sind aber in den allermeisten Fällen die selben.
Derzeit müssen 9x400 Inifiles gepflegt werden, und in Zukunft nur mehr diese 400 Skripte, die sich dann das Iniskript selbst schreiben.
Zwegen der Verwirrung... Diese Skripte rufen selbst weitere Programne auf, welche diese Inifiles benötigen...
Is sehr komplex und über Jahrzehnte gewachsen...
Und Optimierungsbedarf enorm. Das ist ja nur ein erster Schritt. Den Wartungsaufwand auf 1/9 reduzieren.
Lg scientific
Derzeit sind das Skripte die in àußerst heterogener Hardwarelandschaft (Debian, Redhat, Sun, Aix...) laufen, und für unterschiedliche User mittels Ini-Files ihre Initialisierung bekommen.
Diese sind aber in den allermeisten Fällen die selben.
Derzeit müssen 9x400 Inifiles gepflegt werden, und in Zukunft nur mehr diese 400 Skripte, die sich dann das Iniskript selbst schreiben.
Zwegen der Verwirrung... Diese Skripte rufen selbst weitere Programne auf, welche diese Inifiles benötigen...
Is sehr komplex und über Jahrzehnte gewachsen...
Und Optimierungsbedarf enorm. Das ist ja nur ein erster Schritt. Den Wartungsaufwand auf 1/9 reduzieren.
Lg scientific
dann putze ich hier mal nur...
Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie
auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main
Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie
auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main
Re: vim-Skripting
Die entsprechende Datei, die nach TEXT eingefügt werden soll, steht also als Dateiname irgendwo in TEXT. Die Frage, die sich mir stellt, was ist TEXT und in welcher Beziehung steht er zu seiner referenzierten Datei, aus diesen 400 Dateien. Da muss es ja irgendeine Beziehungsliste (DATEI[1-400]->TEXT[1-400]) geben?!
Als nächstbeste Automatisierung vielleicht sowas: Du schreibst dir ein Script, das in einer Schleife über alle 400 Dateien iteriert. Darin wird als erstes die Beziehung 400erDatei<->TEXT hergestellt, dann erzeugt das Script eine Datei xyz.ex, die folgenden Inhalt hat:
Das Script muss natürlich entsprechend der 400erDatei TEXT mit dem Fließtext und File mit dem Dateinamen ersetzen, in Abhängigkeit, wie halt TEXT aufgebaut ist. Danach ruft das Script vi 400erDatei auf, du navigierst zur Stelle und setzt ein :source xyz.ex ab. Danach geht die Schleife automatisch zur nächsten 400erDatei...
Als nächstbeste Automatisierung vielleicht sowas: Du schreibst dir ein Script, das in einer Schleife über alle 400 Dateien iteriert. Darin wird als erstes die Beziehung 400erDatei<->TEXT hergestellt, dann erzeugt das Script eine Datei xyz.ex, die folgenden Inhalt hat:
Code: Alles auswählen
a
TEXT
.
r FILE
x! %.BAK
Re: vim-Skripting
Hier mal ein Versuch in vimscript:
Folgendes innerhalb vim mit :source % laden oder einfach (temporaer in ~/.vim/plugin/scientific.vim speichern:
Danach Cursor im betreffenden Buffer auf der Zeile positionieren nach der die Ausgabe erfolgen soll und aufrufen mit
Edit:
Die letzte Zeile folgendermassen abaendern, damit die Shell-Variable $SCIENTIFIC anstatt <datei> genommen wird:
Liese sich der Name der <datei> irgendwie aus Dateiname oder Verzeichnis von der Datei im Buffer herleiten...
Folgendes innerhalb vim mit :source % laden oder einfach (temporaer in ~/.vim/plugin/scientific.vim speichern:
Code: Alles auswählen
function! s:function_name(datei)
let b:text='hier der text mit ' . a:datei . ' und etwas mehr text'
put=b:text
execute ":r /pfad/zur/" . a:datei
endfunction
command! -nargs=1 SCI call s:function_name(<f-args>)
Code: Alles auswählen
:SCI <datei>
Die letzte Zeile folgendermassen abaendern, damit die Shell-Variable $SCIENTIFIC anstatt <datei> genommen wird:
Code: Alles auswählen
command! SCI call s:function_name('$SCIENTIFIC')