- Offizieller Beitrag
Es kann sein, dass das Thema mit der neuesten Version von SciTE gar nicht mehr aktuell ist.
Ich benutze noch die Version 3.4.4 - und in dieser ist keine Möglichkeit per Voreinstellung Dateien immer mit Kodierung "UTF8+BOM" zu erstellen.
Das läßt sich mit einem Lua-Skript beheben.
EDIT 2021-04-15
Da ich nicht nur AutoIt-Skript in SciTE bearbeite/erstelle, fand ich es nun lästig immer das BOM, wenn nicht erforderlich, zu entfernen.
Darum hier eine neue Version, die ausschliesslich au3-Dateien (Standard) und ggf. per Property festlegbare weiter Dateitypen mit dem BOM versieht.
Falls ihr die "new_as_utf8bom.lua" in der SciTEStartup.lua eingetragen habt, einfach mit der "CheckBOM.lua" ersetzen.
-- TIME_STAMP 2021-04-15 14:02:19
--[[
After a file was saved, the event OnSave will fired.
Now will checked:
- needs this file typ the BOM?
- If Yes: Has this file already the BOM?
- If No: Write the BOM sequence at the beginning of the file
If you want register other types as "au3" for set BOM use this property in SciTEUser.properties:
#~ File types, that needs byte order mark
#~ "au3" is predefined and does not need to be set here
BOM.File.Types=extension_1 extension_2
]]
CheckBOM = EventClass:new(Common)
CheckBOM.OnSave = function(self, _file)
if not self:NeedsBOM(props['FileExt']) then return nil end
if not self:StartsWithBOM(_file) then scite.MenuCommand(153) end
return nil
end
CheckBOM.StartsWithBOM = function(self, _file)
local ToHex = function(_s)
if _s == nil then return "DEAD" end
return (_s:gsub('.', function(_c) return ('%02X'):format(_c:byte()) end))
end
local fh = io.open(_file, "rb")
local read = fh:read(3)
fh:close()
return (ToHex(read) == "EFBBBF")
end
CheckBOM.NeedsBOM = function(self, _ext)
local extensions = props['BOM.File.Types']:lower()..' au3'
if extensions:find(_ext:lower()) then return true else return false end
end
Alles anzeigen
-- TIME_STAMP 2017-05-26 11:19:55
NewFile = EventClass:new(Common)
function NewFile:OnUpdateUI(filename)
if props["FileName"] == "" then
-- set to UTF-8 with BOM
scite.MenuCommand(153) -- 153 = IDM_ENCODING_UTF8
end
return nil -- default processing
end
Alles anzeigen
Als new_as_utf8bom.lua abspeichern und im Lua-Startup-Skript mit LoadLuaFile("new_as_utf8bom.lua", "..PFAD\\mit\\abschliessendem\\Doppelbackslash\\") eintragen.
Nach Neustart von SciTE, wird jede neue Datei als UTF8+BOM kodiert.
EDIT:
Dasselbe Problem besteht bei Erstellen einer au3-Datei über das Kontextmenü des Explorers.
Lösung
- Editor (SciTE oder NPP) als Administrator starten
- Datei öffnen: C:\Windows\ShellNew\Template.au3
- Kodierung ändern zu "UTF-8 mit BOM"
- Datei abspeichern (nochmal prüfen ob Kodierung auch übernommen wurde)
Jetzt werden auch über das Kontextmenü erstellte Dateien in der UTF-8+BOM Kodierung erzeugt.
EDIT2: PERSONAILISIERTES TEMPLATE
Mit dem folgenden Skript wird die Template-Datei personalisiert erstellt.
Die AutoItversion wird ausgelesen und im Template verwendet. (bisher fix)
Der User-Name wird aus der Property "UDFCreator" ausgelesen. Ist dort kein Wert gesetzt, wird der PC-Username verwendet.
Das Standard-Template wird dann überschrieben.
Wer mag, kann natürlich den Inhalt des Templates noch weiter nach eigenem Geschmack gestalten.
Dann einfach das Skript starten - fertig.
;-- TIME_STAMP 2017-05-27 13:57:52 v 0.1
#RequireAdmin
_FileCreateTemplate()
Func _FileCreateTemplate()
Local $sCreator = _GetAU3Property('UDFCreator', @UserName)
Local $sWrite = _
"#cs ----------------------------------------------------------------------------" & @CRLF & @CRLF & _
" AutoIt Version: " & @AutoItVersion & @CRLF & _
" Author: " & ($sCreator = "Your Name" ? @UserName : $sCreator) & @CRLF & @CRLF & _
" Script Function: AutoIt script." & @CRLF & @CRLF & _
"#ce ----------------------------------------------------------------------------" & @CRLF & @CRLF & _
"; Script Start - Add your code below here" & @CRLF
Local $sFileName = @WindowsDir & "\ShellNew\Template.au3"
If Not FileExists($sFileName) Then Exit MsgBox(262192, 'Fehler', 'Es ist keine Datei "Template.au3" installiert!')
Local $fH = FileOpen($sFileName, 2+128)
Local $iSucc = FileWrite($fH, $sWrite)
FileClose($fH)
Exit MsgBox(($iSucc = 1 ? 262208 : 262192), ($iSucc = 1 ? 'Fertig!' : 'Fehler!'), ($iSucc = 1 ? _
'Das personalisierte Template wurde erfolgreich geschrieben.' : 'Das Template konnte nicht geschrieben werden.'))
EndFunc
; #FUNCTION# ====================================================================================================================
; Name ..........: _GetAU3Property
; Description ...: Gets a property value (one-line entry only!). Ask order: 1. SciTEUser.properties 2. au3.properties
; Syntax ........: _GetAU3Property($sProperty[, $sDefault = ''])
; Parameters ....: $sProperty - The property name
; $sDefault - [optional] A value to use, if none property set. Default is ''.
; Return values .: The value of the property (or the default value)
; Author ........: BugFix
; ===============================================================================================================================
Func _GetAU3Property($sProperty, $sDefault='')
Local $sPathUserProp = @LocalAppDataDir & "\AutoIt v3\SciTE\SciTEUser.properties" ; C:\Users\[USER]\AppData\Local\AutoIt v3\SciTE\SciTEUser.properties
Local $sPathAU3Prop = StringTrimRight(@AutoItExe, 11) & "SciTE\properties\au3.properties" ; C:\Program Files (x86)\AutoIt3\SciTE\properties\au3.properties
Local $sRead = '', $sValueReturn = $sDefault, $aMatch
Local $sPattern = $sProperty & "=([^\r\n]+)"
If FileExists($sPathUserProp) Then $sRead = FileRead($sPathUserProp)
$aMatch = StringRegExp($sRead, $sPattern, 1)
If @error Then
If FileExists($sPathAU3Prop) Then $sRead = FileRead($sPathAU3Prop)
$aMatch = StringRegExp($sRead, $sPattern, 1)
If Not @error Then $sValueReturn = $aMatch[0]
Else
$sValueReturn = $aMatch[0]
EndIf
Return $sValueReturn
EndFunc
Alles anzeigen