vim-Skripting

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

vim-Skripting

Beitrag von scientific » 04.07.2018 15:40:14

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
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

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: vim-Skripting

Beitrag von rodney » 04.07.2018 16:04:58

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?

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: vim-Skripting

Beitrag von tobo » 04.07.2018 17:05:08

scientific hat geschrieben: ↑ zum Beitrag ↑
04.07.2018 15:40:14
Und das Skript startet mit dem Einfügen dort, wo ich gerade mit dem Cursor stehe... Denn dieser Punkt ist immer unterschiedlich...
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:

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
EDIT: Falsches global in der Suche entfernt.
Zuletzt geändert von tobo am 07.07.2018 23:36:52, insgesamt 1-mal geändert.

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: vim-Skripting

Beitrag von scientific » 04.07.2018 17:13:27

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.
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

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: vim-Skripting

Beitrag von heisenberg » 04.07.2018 17:14:05

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.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: vim-Skripting

Beitrag von scientific » 04.07.2018 19:32:06

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
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

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: vim-Skripting

Beitrag von tobo » 04.07.2018 19:35:38

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:

Code: Alles auswählen

a
TEXT
.
r FILE
x! %.BAK
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...

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: vim-Skripting

Beitrag von rodney » 04.07.2018 23:00:20

Hier mal ein Versuch in vimscript:

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>)
Danach Cursor im betreffenden Buffer auf der Zeile positionieren nach der die Ausgabe erfolgen soll und aufrufen mit

Code: Alles auswählen

:SCI <datei>
Edit:

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')
Liese sich der Name der <datei> irgendwie aus Dateiname oder Verzeichnis von der Datei im Buffer herleiten...

Antworten