TextEdit Menüs

S

SelKai

Mitglied
Thread Starter
Dabei seit
10.07.2005
Beiträge
81
Reaktionspunkte
0
Hallo

Ich wollte zum Testen mal was mit einer Textdatei machen lassen. In etwa so:
1. öffne Datei a
2. suche wort b

Das öffnen ist ja nun gar kein Problem, nur wie steuere ich die TextEdit-eigenen Menüs an? In der Bibliothek habe ich nichts passendes gefunden.

Vielen Dank.

Kai.
 
Nicht ganz Dein Ansatz, aber vielleicht auch brauchbar:

do shell script "fgrep SUCHSTRING /voller/Posixpfad/zur/gewünschten/Datei"

Mit Anzeige der Fundstücke:
set info to (do shell script "fgrep SUCHSTRING /voller/Posixpfad/zur/gewünschten/Datei")
display dialog (info)

Nachteil: Die Fundstellen geben immer die komplette Zeile aus in der SUCHSTRING gefunden wird.

Grüße,
Flo
 
Vielen Dank für die Antwort. Da ich noch ganz am Anfang von AS stehe, kann ich nur teilweise was mit Deinem Vorschlag anfangen. Ich muss wohl noch ein wenig lesen. Eigentlich bräuchte ich mal eine "anfängersichere" Erklärung zur Steuerung von anderen Programmen. Aus der Bibliothek des ScriptEditors werde ich noch nicht so recht schlau.

Gruß Kai.
 
SelKai schrieb:
...Eigentlich bräuchte ich mal eine "anfängersichere" Erklärung zur Steuerung von anderen Programmen...

Dann poste diese doch einfach mal konkret, so wird sich am ehesten jemand finden der helfen kann. An konkreten Problemen lernt man meist auch besser, zumindest geht das mir so.

Grüße,
Flo
 
Eigentlich will ich "nur" sowas wie Suche&Ersetzen machen. Z.B. Suche in Datei Test.txt Wort A, ersetze durch Wort B, speichern als Test2.txt. Dabei muss es natürlich nicht Textedit sein.
Aus diversen schon gelesenen Vorschlägen zu diesem Problem bin ich leider nicht so schlau geworden. Kann aber auch daran liegen, dass ich mich eben erst seit kurzem mit AS beschäftige :)

Kai.
 
SelKai schrieb:
Eigentlich will ich "nur" sowas wie Suche&Ersetzen machen. Z.B. Suche in Datei Test.txt Wort A, ersetze durch Wort B, speichern als Test2.txt. Dabei muss es natürlich nicht Textedit sein.
Aus diversen schon gelesenen Vorschlägen zu diesem Problem bin ich leider nicht so schlau geworden. Kann aber auch daran liegen, dass ich mich eben erst seit kurzem mit AS beschäftige :)

Nur mal eben etwas suchen und durch etwas anderes ersetzen ist einfach, wenn man eine Funktion des Programms benutzt. Will man diese Funktion ersetzen, ist es schon nicht mehr so einfach.

Du kannst den gesamten Text in einer Variablen ablegen, danach setzt man AppleScript's text item delimiters (ein Zeichen oder eine Zeichenkette, die Textobjekte voneinander trennt - im normalen Text wird das wohl immer ein Leerzeichen sein) auf den Text, der gesucht werden soll.

Im folgenden Schritt wird der Text in eine Liste umgewandelt, die aus den einzelnen Textobjekten besteht. Der gesuchte Text taucht nun nicht mehr in dieser Liste auf, da er ja nun als "Trennobjekt" dient.

Nun setzt man die Text item delimiters auf den "Ersatztext" und wandelt die Liste wieder in einen Textwert um. Die, in der Liste gespeicherten Textwerte werden nun durch den Ersatztext getrennt, was dem Einfügen gleichkommt.

Nun sollte man die Text item delimiters wieder auf ihren ursprünglichen Wert zurück setzen. Das ist ein leerer Textwert "".

Der geänderte Text befindet sich im Beispiel in der neuen Variablen "neuerText", diesen schreibt man nun in das Dokument zurück, wodurch der bisherige Text überschrieben wird.

Code:
set Suche to "diesen Text suchen"
set Ersatz to "durch diesen Text ersetzen"

tell application "TextEdit"
	set derText to text of document 1
end tell

set AppleScript's text item delimiters to Suche
set TextListe to text items of derText
set AppleScript's text item delimiters to Ersatz
set neuerText to TextListe as text
set AppleScript's text item delimiters to ""

tell application "TextEdit"
	set text of document 1 to neuerText
end tell
 
Vielen Dank Snow!

Ich habe trotzdem noch eine dumme Frage:
Ich habe also im Code das "document 1" durch den Verweis auf meine Datei ersetzt. Das war sicher so gemeint, oder? Dann kam aber folgender Fehler: "Every Text of "Pfad zu meiner Datei:test.txt" kann nicht als "Pfad zu meiner Datei:test.txt" gesetzt werden.
Sicher hat sich ein grober Denkfehler bei mir eingeschlichen. Obwohl sich der Code ja nahezu selbst erklärt...

Kai.
 
SelKai schrieb:
...Ich habe also im Code das "document 1" durch den Verweis auf meine Datei ersetzt. Das war sicher so gemeint, oder?...

Nein, document 1 ist das (zuvor geöffnete) Dokument.

Grüße,
Flo
 
Oh, das wars also! Also doch so einfach! Vielen Dank! Ich werde mich sicherlich noch das ein oder andere Mal hier melden.

Kai.
 
Hallo Snow,

den Ansatz finde ich sehr interessant.
Um es vorweg zu sagen: ich arbeite kaum mit AS, schau aber öfter mal hier rein und probiere das eine oder andere aus.

Ich hab da nun noch einige Fragen zu Deinem Skript.
Angenommen die ersten beiden Zeilen lauten:
Code:
set Suche to "Bau"
set Ersatz to "Ersatz"
, weil ich das Wort "Bau" durch das Wort "Ersatz" ersetzen möchte.
Gehe ich Recht in der Annahme, dass dann in dem Text das Wort "Bauen" ersetzt werden würde zu "Ersatzen" oder "Baumaschine" zu "Ersatzmaschine"?
Nun könnte man das Skript vermulich so ändern, dass man eben schreibt:
Code:
set Suche to "Bau "
...
Blöd nur, wenn das Wort dann am Ende eines Satzes vorkommt (Wir arbeiten am Bau.)
Dann wird´s nämlich wiederum nicht erkannt.

Ich weiss, das Beispiel ist blöd, aber ich denke man erkennt, worauf ich hinaus möchte.
Wie wird AS mit sowas fertig?
 
maceis schrieb:
Blöd nur, wenn das Wort dann am Ende eines Satzes vorkommt (Wir arbeiten am Bau.)
Dann wird´s nämlich wiederum nicht erkannt.

Ich weiss, das Beispiel ist blöd, aber ich denke man erkennt, worauf ich hinaus möchte.
Wie wird AS mit sowas fertig?

Hier wird's schwieriger. Man kann sich aber aus dem vorgegebenen Suchwort und dem Ersatzwort jeweils eine Liste erstellen und dann diese Liste abarbeiten:

Code:
set Suche to "Bau"
set Ersatz to "Ersatz"

set SearchList to {Suche & " ", Suche & ".", Suche & ",", Suche & ";", Suche & "!", Suche & "?"}
set ErsatZListe to {Ersatz & " ", Ersatz & ".", Ersatz & ",", Ersatz & ";", Ersatz & "!", Ersatz & "?"}

tell application "TextEdit"
	set derText to text of document 1
	copy derText to neuerText
end tell

repeat with i from 1 to count of SearchList
	set sW to item i of SearchList
	set eW to item i of ErsatZListe
	set neuerText to Ersetzen(neuerText, sW, eW)
end repeat

tell application "TextEdit"
	set text of document 1 to neuerText
end tell

on Ersetzen(gesamterText, Suchwort, Ersatzwort)
	considering case
		set AppleScript's text item delimiters to Suchwort
		set TextListe to text items of gesamterText
		set AppleScript's text item delimiters to Ersatzwort
		set neuerText to TextListe as text
		set AppleScript's text item delimiters to ""
		return neuerText
	end considering
end Ersetzen

Nehmen wir also an, der Suchbegriff und der Ersatzwert werden per Dialog abgefragt. Es wäre nicht praktikabel, sämtliche Kombinationen abzufragen - der User würde fluchend vor der Kiste sitzen. Also werden diese Such- und Ersatzliste innerhalb des Skripts erstellt - ausgehend von den gelieferten Werten. Damit die Groß-/Kleinschreibung noch berücksichtigt wird, habe ich im Ersetzen-Handler 'considering case' verwendet.

Jetzt funktioniert die Sache schon wesentlich zuverlässiger.

Wem das zu kompliziert wird, der kann aber auch eine Scripting Addition verwenden, die eine Suchen-/Ersetzen-Funktion bietet. Hier gibt es z.B. kostenlos die Satimage OSAX. (http://www.satimage.fr/software/en/downloads_osaxen.html)
Nachteil: Diese Scripting Addition muss natürlich auf jedem Rechner installiert sein, auf dem das Skript laufen soll.

Das entsprechende Skript sieht dann so aus:

Code:
set Suche to "Bau"
set Ersatz to "ERSATZ"

tell application "TextEdit"
	set derText to text of document 1
end tell

set neuerText to change Suche into Ersatz in derText with whole word

tell application "TextEdit"
	set text of document 1 to neuerText
end tell

Die Funktion 'change' arbeitet per default unter Berücksichtigung der Groß-/Kleinschreibung. Durch den Zusatz 'with whole word' wird sicher gestellt, dass der Suchbegriff als einzelnes Wort behandelt wird.
 
hallo Snow,

vielen dank für Dein Feedback.
Das ist sehr interessant und ich habe mir auch gedacht, dass das so ähnlich wohl gehen muss.

Wie Du selbst schreibst, ist das in der Tat ein wenig kompliziert.

Den Ansatz von lengsel finde ich daher grundsätzlich auch nicht verkehrt, weil es Werkzeuge gibt, die auf solche Aufgaben spezialisiert sind (z. B. ein Perl Einzeiler).

Interesant finde ich dabei vor allem die Kombination AS-GUI und spezialisierte Systemkommandos.

Darum noch eine Frage: Wie könnte man mit AS die zu ändernde Datei (mit Pfad), den Suchbegriff und die Ersetzung in einem Fenster vom Benutzer abfragen?
Ich würde dann mal versuchen was Schickes zu basteln ;).
 
Benutzerabfrage prinzipiell in etwa so:

set theResult to display dialog "Suche nach" default answer ""
set Such to text returned of theResult

display dialog Such

Grüße,
Flo
 
Zurück
Oben Unten