SciTE - Leerzeichen statt Tabs, Tab Ersetzen in SciTE und Dateien

  • Tabs im Editor sind recht nützlich, um das Skript schön strukturiert darzustellen.

    Aber genaugenommen interessieren uns dabei nicht die Tabs selbst, sondern die Funktionalität fehlende Zeichen bis zur nächsten Tabposition aufzufüllen. Daraus resultiert aber auch der (m.M.n.) große Nachteil von Tabs: Obwohl sie nur ein Zeichen darstellen, können sie den Platz von 1...tab.size Zeichen einnehmen.

    Z.B. hat man etwas geschrieben, was mit (nicht vollem) Tab ausgerichtet wurde. Später ergänzt man vor dem Tab noch etwas und möchte von der Tabposition rückwärts eine Tabweite löschen. Der Tab hat nun evtl. nur noch 1 Zeichen Breite und ich muss also den Tab und anschliessend die davor befindlichen Leerzeichen extra löschen. Das ganze Tab-Handling gefällt mir persönlich nicht.

    SciTE bietet die Möglichkeit, statt des Tabs Leerzeichen einzufügen. Dazu muss die Property use.tabs=0 gesetzt sein.

    Es werden dann statt eines Tabs die Leerzeichen bis zur nächsten Tabposition eingefügt. Optisch ist das Verhalten soweit analog. Der Vorteil von Leerzeichen ist auch, dass die Darstellung in unterschiedlichen Editoren identisch ist. Man sieht ja schon, dass bei Skriptdarstellung hier im Forum die Formatierung ziemlich zerrissen wird, wenn Textbereiche enthalten sind.

    Wer also auf Leerzeichen statt Tabs umsatteln möchte, dem kann ich hiermit noch weitere Funktionalität mitgeben:

    • Löschen aller Zeichen vom Cursor bis zur nächsten/vorigen Tabposition in der aktuellen Zeile <Shift+Delete> / <Shift+Backspace>
    • Löschen aller Zeichen bei Rectangular Selection bis zur nächsten/vorigen Tabposition in allen ausgewählten Zeilen. Die Selection bleibt nach der Operation erhalten, sodass Folgeoperationen über den Markierungsbereich möglich sind. <Shift+Delete> / <Shift+Backspace> **nur gültig, wenn kein Text markiert ist
    • Springen zur nächsten/vorigen Tabposition in der aktuellen Zeile <Alt+Arrow_Right> / <Alt+Arrow_Left>

    Die Datei über die SciTEStartup.lua laden. Erforderlich ist auch die CommonTools.lua

    EDIT zu TabReplace

    Ich habe noch ergänzt um ein Lua-Skript, mit dem in der aktuell in SciTE geöffneten Datei on-the-fly die Tab-Ersetzung durchgeführt wird.

    • TabReplaceSciTE.lua abspeichern
    • in der SciTEUser.properties einem Shortcut zuweisen:
      command.name.20.*=Replace TAB in current file
      command.20.*=dofile ("DEIN_PFAD/TabReplaceSciTE.lua")
      command.mode.20.*=subsystem:lua,savebefore:no
      command.shortcut.20.*=Ctrl+Alt+F10
      Die Angaben in ROT anpassen!
    • Als Standard wird TAB-Size=4 verwendet. Falls andere Größe erforderlich, muss in der TabReplaceSciTE.lua die letzte Zeile angepasst werden:
      TabReplace_FileInSciTE(4) -- If required: Change the TAB size here

    EDIT

    Als Ergänzung (AutoIt- und Lua-Skript):

    In vorhandenen Dateien alle TAB durch die der Position (und der vorgegebenen TAB-Weite) entsprechende Anzahl von Leerzeichen ersetzen.

    Dazu muss zeilenweise durch die Datei iteriert werden, da der Zeilenanfang als "Position 0" zur Berechnung der TAB-Positionen erforderlich ist.

    Mein Grundgedanke war, in AutoIt die Datei mit _FileReadToArray einlesen, durchiterieren und ggf. TAB ersetzen, mit _FileWriteFromArray zurückschreiben. Aber _FileWriteFromArray hat den Dateiinhalt verändert, plötzlich stimmten bei einigen Zeilen die eingefügten Ersetzungsstrings nicht mehr, obwohl diese korrekt berechnet und gespeichert wurden. Somit stelle ich nun den Schreibstring aus dem Array selbst zusammen - und es geht.

    Aber auch die Lua-Version (die hatte ich zuerst erstellt) hat mich Schweiß gekostet. Das zeilenweise Einlesen einer Datei scheint zu einer Manipulation des Zeilenendes zu führen, was wiederum zu falschen Tabpositionen und somit falscher Länge der Ersetzungsstrings führte. Beim Zusammenstellen des Schreibstrings aus den eingelesenen Zeilen wurden MAC-Zeilenumbrüche (CR) eingefügt, gleich zwei hintereinander. Aber das in Kombination mit meinem angehängten CRLF führte dann wenigstens zur korrekten Ersetzung der TAB. Die CR-CR zu entfernen war dann das kleinste Übel. :whistling:

    TabReplace


    EDIT v 0.2

    SCRIPT BREAKING CHANCE - Um mit unterschiedlichen Tabweiten arbeiten zu können, wird jetzt ausschließlich die dateispezifische Property ("use.tabs.$(file.pattern.EXT)=0" oder "use.tabs.EXT=0") genutzt! use.tabs=0 ist allgemeingültig und wird deshalb nicht weiter unterstützt. Deshalb ist auch die Version 0.6 der CommonTools.lua erforderlich. Die erforderlichen Anpassungen in der Properties-Datei sind im Skriptkopf erläutert.

  • BugFix 17. März 2022 um 11:10

    Hat den Titel des Themas von „SciTE - Leerzeichen statt Tabs mit Zusatzfunktionen“ zu „SciTE - Leerzeichen statt Tabs, Tab Ersetzen in SciTE und Dateien“ geändert.