indent
for the C mode. But we can do better! It takes only a little more effort to install a general system for code reformatting into SubEthaEdit. First, we create a suitable AppleScript that calls out to a formatter:
property prettyPrinter: "${PRETTYPRINTER}"
if not documentIsAvailable() then
return
end
if (modeSetting for "PRETTYPRINTER") is missing value then
display alert "Unable to re-indent." message "You need to define PRETTYPRINTER for the mode."
return
end
if selectionIsEmpty() then
setDocumentText to (beautifulCode from documentText())
else
extendSelection with extendingFront and extendingEnd
setSelectionText to (beautifulCode from selectionText())
end if
on beautifulCode from sourceText
shellTransform of sourceText for modeEnvironment() through prettyPrinter without alteringLineEndings
end beautifulCode
on seescriptsettings()
{displayName:"Re-Indent Lines", shortDisplayName:"Re-Indent", keyboardShortcut:"^@i", toolbarIcon:"ToolbarIconRun", inDefaultToolbar:"no", toolbarTooltip:"Automatically re-indents lines", inContextMenu:"yes"}
end seescriptsettings
include(`SubEthaEditTools.applescript')
if not documentIsAvailable() then
return
end
if (modeSetting for "PRETTYPRINTER") is missing value then
display alert "Unable to re-indent." message "You need to define PRETTYPRINTER for the mode."
return
end
if selectionIsEmpty() then
setDocumentText to (beautifulCode from documentText())
else
extendSelection with extendingFront and extendingEnd
setSelectionText to (beautifulCode from selectionText())
end if
on beautifulCode from sourceText
shellTransform of sourceText for modeEnvironment() through prettyPrinter without alteringLineEndings
end beautifulCode
on seescriptsettings()
{displayName:"Re-Indent Lines", shortDisplayName:"Re-Indent", keyboardShortcut:"^@i", toolbarIcon:"ToolbarIconRun", inDefaultToolbar:"no", toolbarTooltip:"Automatically re-indents lines", inContextMenu:"yes"}
end seescriptsettings
include(`SubEthaEditTools.applescript')
The formatter is stored as a
PRETTYPRINTER
environment variable. The include
at the very end is an m4
command, not AppleScript; if you don't know what it's for, you can either just cut and paste the contents of SubEthaEditTools into the script at that point, or read about it here.The logic of the AppleScript is pretty straightforward. I first check to make sure a document is open, then check to see if a formatter is defined for the mode through a
PRETTYPRINTER
environment variable. I didn't do these sorts of checks in other scripts for SubEthaEdit, because those were always for just one mode, so I could assume that there was an open document and provide a sensible default for the mode. Here, we're going to put the script into the general scripts folder ~/Library/Application Support/SubEthaEdit/Scripts
, so we can't make those assumptions anymore.At this point, I've made all the safety checks needed, so I can proceed to do the reformatting. If no text is selected, I pass all the text to the
beautifulCode
handler, otherwise I extend the selection to full lines and pass the new contents to beautifulCode
. All that happens in beautifulCode
is that the text is handed off to the shell for formatting, with a suitable environment obtained from the mode. The results of beautifulCode
are then substituted for the original text. Finally,
seescriptsettings
are defined. I set a keyboard shortcut of Command-Control-i; it was available, and allows a mnemonic of i for indent. I defined a toolbar item for it, with the run icon, which is pretty arbitrary; I didn't see anything better from the standard list. It can also be invoked within a document using the contextual menu. Remember, this goes into the general scripts, so appears under the scripts menu, not the Mode menu. I saved mine as PrettyPrint.scpt.One thing remains: how do we define the
PRETTYPRINTER
for a mode? It's remarkably easy. The script I used for setting the LaTeX mode environment doesn't actually depend on the LaTeX mode in any way, so it can be used directly by just putting it in the general scripts folder instead of within a mode. Actually, it is probably a good idea to also check that a document is open so that a mode can be identified. With SubEthaEditTools, there's almost nothing to it:if not documentIsAvailable() then
return
end
openEnvironmentSettings()
on seescriptsettings()
return {displayName:"Customize Mode...", shortDisplayName:"Environment", inContextMenu:"no"}
end seescriptsettings
include(`SubEthaEditTools.applescript')
return
end
openEnvironmentSettings()
on seescriptsettings()
return {displayName:"Customize Mode...", shortDisplayName:"Environment", inContextMenu:"no"}
end seescriptsettings
include(`SubEthaEditTools.applescript')
This script, too, goes into the general scripts folder for SubEthaEdit; I named mine OpenEnvironment.scpt. Although this second script is quite simple, it has a very profound effect, adding a preferences system for all the SubEthaEdit modes. I wonder what else it could be used for?
And that's it. Install the two scripts, define some appropriate
PRETTYPRINTER
values (being sure to quote the shell command appropriately!), and reformat away. For your convenience, you can download compiled scripts for the formatter and the mode environment settings.