diff --git a/Mac/PythonLauncher/FileSettings.h b/Mac/PythonLauncher/FileSettings.h
index d807bae..7b74a9b 100755
--- a/Mac/PythonLauncher/FileSettings.h
+++ b/Mac/PythonLauncher/FileSettings.h
@@ -45,18 +45,13 @@
 + (id)getFactorySettingsForFileType: (NSString *)filetype;
 + (id)newSettingsForFileType: (NSString *)filetype;
 
-//- (id)init;
 - (id)initForFileType: (NSString *)filetype;
 - (id)initForFSDefaultFileType: (NSString *)filetype;
 - (id)initForDefaultFileType: (NSString *)filetype;
-//- (id)initWithFileSettings: (FileSettings *)source;
 
 - (void)updateFromSource: (id <FileSettingsSource>)source;
 - (NSString *)commandLineForScript: (NSString *)script;
 
-//- (void)applyFactorySettingsForFileType: (NSString *)filetype;
-//- (void)saveDefaults;
-//- (void)applyUserDefaults: (NSString *)filetype;
 - (void)applyValuesFromDict: (NSDictionary *)dict;
 - (void)reset;
 - (NSArray *) interpreters;
diff --git a/Mac/PythonLauncher/FileSettings.m b/Mac/PythonLauncher/FileSettings.m
index 66b4fdc..3438870 100755
--- a/Mac/PythonLauncher/FileSettings.m
+++ b/Mac/PythonLauncher/FileSettings.m
@@ -14,7 +14,7 @@
 {
     static FileSettings *fsdefault_py, *fsdefault_pyw, *fsdefault_pyc;
     FileSettings **curdefault;
-    
+
     if ([filetype isEqualToString: @"Python Script"]) {
         curdefault = &fsdefault_py;
     } else if ([filetype isEqualToString: @"Python GUI Script"]) {
@@ -36,7 +36,7 @@
 {
     static FileSettings *default_py, *default_pyw, *default_pyc;
     FileSettings **curdefault;
-    
+
     if ([filetype isEqualToString: @"Python Script"]) {
         curdefault = &default_py;
     } else if ([filetype isEqualToString: @"Python GUI Script"]) {
@@ -57,7 +57,7 @@
 + (id)newSettingsForFileType: (NSString *)filetype
 {
     FileSettings *cur;
-    
+
     cur = [FileSettings new];
     [cur initForFileType: filetype];
     return [cur retain];
@@ -67,7 +67,7 @@
 {
     self = [super init];
     if (!self) return self;
-    
+
     interpreter = [source->interpreter retain];
     honourhashbang = source->honourhashbang;
     debug = source->debug;
@@ -81,36 +81,30 @@
     with_terminal = source->with_terminal;
     prefskey = source->prefskey;
     if (prefskey) [prefskey retain];
-    
+
     return self;
 }
 
 - (id)initForFileType: (NSString *)filetype
 {
     FileSettings *defaults;
-    
+
     defaults = [FileSettings getDefaultsForFileType: filetype];
     self = [self initWithFileSettings: defaults];
     origsource = [defaults retain];
     return self;
 }
 
-//- (id)init
-//{
-//    self = [self initForFileType: @"Python Script"];
-//    return self;
-//}
-
 - (id)initForFSDefaultFileType: (NSString *)filetype
 {
     int i;
     NSString *filename;
     NSDictionary *dict;
     static NSDictionary *factorySettings;
-    
+
     self = [super init];
     if (!self) return self;
-    
+
     if (factorySettings == NULL) {
         NSBundle *bdl = [NSBundle mainBundle];
         NSString *path = [ bdl pathForResource: @"factorySettings"
@@ -149,18 +143,18 @@
 {
     NSUserDefaults *defaults;
     NSDictionary *dict;
-    
+
     defaults = [NSUserDefaults standardUserDefaults];
     dict = [defaults dictionaryForKey: filetype];
     if (!dict)
         return;
     [self applyValuesFromDict: dict];
 }
-    
+
 - (id)initForDefaultFileType: (NSString *)filetype
 {
     FileSettings *fsdefaults;
-    
+
     fsdefaults = [FileSettings getFactorySettingsForFileType: filetype];
     self = [self initWithFileSettings: fsdefaults];
     if (!self) return self;
@@ -220,7 +214,7 @@
 - (void)applyValuesFromDict: (NSDictionary *)dict
 {
     id value;
-    
+
     value = [dict objectForKey: @"interpreter"];
     if (value) interpreter = [value retain];
     value = [dict objectForKey: @"honourhashbang"];
@@ -247,12 +241,12 @@
 
 - (NSString*)_replaceSingleQuotes: (NSString*)string
 {
-	/* Replace all single-quotes by '"'"', that way shellquoting will
-	 * be correct when the result value is delimited  using single quotes.
-	 */
-	NSArray* components = [string componentsSeparatedByString:@"'"];
+    /* Replace all single-quotes by '"'"', that way shellquoting will
+     * be correct when the result value is delimited  using single quotes.
+     */
+    NSArray* components = [string componentsSeparatedByString:@"'"];
 
-	return [components componentsJoinedByString:@"'\"'\"'"];
+    return [components componentsJoinedByString:@"'\"'\"'"];
 }
 
 - (NSString *)commandLineForScript: (NSString *)script
@@ -265,7 +259,7 @@
 
     script_dir = [script substringToIndex:
 	    [script length]-[[script lastPathComponent] length]];
-    
+
     if (honourhashbang &&
        (fp=fopen([script fileSystemRepresentation], "r")) &&
        fgets(hashbangbuf, sizeof(hashbangbuf), fp) &&
@@ -278,7 +272,7 @@
     }
     if (!cur_interp)
         cur_interp = interpreter;
-        
+
     return [NSString stringWithFormat:
         @"cd '%@' && '%@'%s%s%s%s%s%s %@ '%@' %@ %s",
     	[self _replaceSingleQuotes:script_dir],
@@ -297,7 +291,7 @@
 
 - (NSArray *) interpreters { return interpreters;};
 
-// FileSettingsSource protocol 
+// FileSettingsSource protocol
 - (NSString *) interpreter { return interpreter;};
 - (BOOL) honourhashbang { return honourhashbang; };
 - (BOOL) debug { return debug;};
diff --git a/Mac/PythonLauncher/MyAppDelegate.m b/Mac/PythonLauncher/MyAppDelegate.m
index a5ba751..e75fb06 100644
--- a/Mac/PythonLauncher/MyAppDelegate.m
+++ b/Mac/PythonLauncher/MyAppDelegate.m
@@ -33,7 +33,7 @@
 
 - (BOOL)shouldShowUI
 {
-    // if this call comes before applicationDidFinishLaunching: we 
+    // if this call comes before applicationDidFinishLaunching: we
     // should terminate immedeately after starting the script.
     if (!initial_action_done)
         should_terminate = YES;
@@ -62,7 +62,7 @@
     static NSString *extensions[] = { @"py", @"pyw", @"pyc", NULL};
     NSString **ext_p;
     int i;
-    
+
     if ([[NSUserDefaults standardUserDefaults] boolForKey: @"SkipFileBindingTest"])
         return;
     ourUrl = [NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]];
@@ -92,5 +92,5 @@
         }
     }
 }
-        
+
 @end
diff --git a/Mac/PythonLauncher/MyDocument.m b/Mac/PythonLauncher/MyDocument.m
index 8f851e7..90c5db9 100755
--- a/Mac/PythonLauncher/MyDocument.m
+++ b/Mac/PythonLauncher/MyDocument.m
@@ -16,7 +16,7 @@
 {
     self = [super init];
     if (self) {
-    
+
         // Add your subclass-specific initialization here.
         // If an error occurs here, send a [self dealloc] message and return nil.
         script = [@"<no script>.py" retain];
@@ -37,20 +37,17 @@
 {
     NSApplication *app = [NSApplication sharedApplication];
     [super close];
-    if ([[app delegate] shouldTerminate])
+    if ([(MyAppDelegate*)[app delegate] shouldTerminate])
         [app terminate: self];
 }
 
 - (void)load_defaults
 {
-//    if (settings) [settings release];
     settings = [FileSettings newSettingsForFileType: filetype];
 }
 
 - (void)update_display
 {
-//    [[self window] setTitle: script];
-    
     [interpreter setStringValue: [settings interpreter]];
     [honourhashbang setState: [settings honourhashbang]];
     [debug setState: [settings debug]];
@@ -62,7 +59,7 @@
     [others setStringValue: [settings others]];
     [scriptargs setStringValue: [settings scriptargs]];
     [with_terminal setState: [settings with_terminal]];
-    
+
     [commandline setStringValue: [settings commandLineForScript: script]];
 }
 
@@ -75,7 +72,7 @@
 {
     const char *cmdline;
     int sts;
-    
+
      cmdline = [[settings commandLineForScript: script] UTF8String];
    if ([settings with_terminal]) {
         sts = doscript(cmdline);
@@ -107,14 +104,13 @@
 {
     // Insert code here to read your document from the given data.  You can also choose to override -loadFileWrapperRepresentation:ofType: or -readFromFile:ofType: instead.
     BOOL show_ui;
-    
-    // ask the app delegate whether we should show the UI or not. 
-    show_ui = [[[NSApplication sharedApplication] delegate] shouldShowUI];
+
+    // ask the app delegate whether we should show the UI or not.
+    show_ui = [(MyAppDelegate*)[[NSApplication sharedApplication] delegate] shouldShowUI];
     [script release];
     script = [fileName retain];
     [filetype release];
     filetype = [type retain];
-//    if (settings) [settings release];
     settings = [FileSettings newSettingsForFileType: filetype];
     if (show_ui) {
         [self update_display];
@@ -152,7 +148,7 @@
     [self update_display];
 }
 
-// FileSettingsSource protocol 
+// FileSettingsSource protocol
 - (NSString *) interpreter { return [interpreter stringValue];};
 - (BOOL) honourhashbang { return [honourhashbang state];};
 - (BOOL) debug { return [debug state];};
diff --git a/Mac/PythonLauncher/PreferencesWindowController.m b/Mac/PythonLauncher/PreferencesWindowController.m
index 311c375..ec5bbe8 100644
--- a/Mac/PythonLauncher/PreferencesWindowController.m
+++ b/Mac/PythonLauncher/PreferencesWindowController.m
@@ -5,7 +5,7 @@
 + getPreferencesWindow
 {
     static PreferencesWindowController *_singleton;
-    
+
     if (!_singleton)
         _singleton = [[PreferencesWindowController alloc] init];
     [_singleton showWindow: _singleton];
@@ -21,15 +21,13 @@
 - (void)load_defaults
 {
     NSString *title = [filetype titleOfSelectedItem];
-    
+
     settings = [FileSettings getDefaultsForFileType: title];
 }
 
 - (void)update_display
 {
-//    [[self window] setTitle: script];
-    
-	[interpreter reloadData];
+    [interpreter reloadData];
     [interpreter setStringValue: [settings interpreter]];
     [honourhashbang setState: [settings honourhashbang]];
     [debug setState: [settings debug]];
@@ -41,7 +39,6 @@
     [others setStringValue: [settings others]];
     [with_terminal setState: [settings with_terminal]];
     // Not scriptargs, it isn't for preferences
-    
     [commandline setStringValue: [settings commandLineForScript: @"<your script here>"]];
 }
 
@@ -75,7 +72,7 @@
     [self update_display];
 }
 
-// FileSettingsSource protocol 
+// FileSettingsSource protocol
 - (NSString *) interpreter { return [interpreter stringValue];};
 - (BOOL) honourhashbang { return [honourhashbang state]; };
 - (BOOL) debug { return [debug state];};
@@ -98,23 +95,23 @@
 // NSComboBoxDataSource protocol
 - (unsigned int)comboBox:(NSComboBox *)aComboBox indexOfItemWithStringValue:(NSString *)aString
 {
-	NSArray *interp_list = [settings interpreters];
+    NSArray *interp_list = [settings interpreters];
     unsigned int rv = [interp_list indexOfObjectIdenticalTo: aString];
-	return rv;
+    return rv;
 }
 
 - (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(int)index
 {
-	NSArray *interp_list = [settings interpreters];
+    NSArray *interp_list = [settings interpreters];
     id rv = [interp_list objectAtIndex: index];
-	return rv;
+    return rv;
 }
 
 - (int)numberOfItemsInComboBox:(NSComboBox *)aComboBox
 {
-	NSArray *interp_list = [settings interpreters];
+    NSArray *interp_list = [settings interpreters];
     int rv = [interp_list count];
-	return rv;
+    return rv;
 }
 
 
diff --git a/Mac/PythonLauncher/doscript.h b/Mac/PythonLauncher/doscript.h
index eef0b56..3fd3187 100644
--- a/Mac/PythonLauncher/doscript.h
+++ b/Mac/PythonLauncher/doscript.h
@@ -9,4 +9,4 @@
 
 #include <Carbon/Carbon.h>
 
-extern int doscript(const char *command);
\ No newline at end of file
+extern int doscript(const char *command);
diff --git a/Mac/PythonLauncher/doscript.m b/Mac/PythonLauncher/doscript.m
index 024b883..cbb783b 100644
--- a/Mac/PythonLauncher/doscript.m
+++ b/Mac/PythonLauncher/doscript.m
@@ -11,49 +11,49 @@
 #import <ApplicationServices/ApplicationServices.h>
 #import "doscript.h"
 
-extern int 
+extern int
 doscript(const char *command)
 {
-	char *bundleID = "com.apple.Terminal";
-	AppleEvent evt, res;
-	AEDesc desc;
-	OSStatus err;
+    char *bundleID = "com.apple.Terminal";
+    AppleEvent evt, res;
+    AEDesc desc;
+    OSStatus err;
 
-	[[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Utilities/Terminal.app/"];
+    [[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/Utilities/Terminal.app/"];
 
-	// Build event
-	err = AEBuildAppleEvent(kAECoreSuite, kAEDoScript,
-	                         typeApplicationBundleID,
-	                         bundleID, strlen(bundleID),
-	                         kAutoGenerateReturnID,
-	                         kAnyTransactionID,
-	                         &evt, NULL,
-	                         "'----':utf8(@)", strlen(command),
-	                         command);
-	if (err) {
-		NSLog(@"AEBuildAppleEvent failed: %d\n", err);
-		return err;
-	}
+    // Build event
+    err = AEBuildAppleEvent(kAECoreSuite, kAEDoScript,
+                             typeApplicationBundleID,
+                             bundleID, strlen(bundleID),
+                             kAutoGenerateReturnID,
+                             kAnyTransactionID,
+                             &evt, NULL,
+                             "'----':utf8(@)", strlen(command),
+                             command);
+    if (err) {
+        NSLog(@"AEBuildAppleEvent failed: %ld\n", (long)err);
+        return err;
+    }
 
-	// Send event and check for any Apple Event Manager errors
-	err = AESendMessage(&evt, &res, kAEWaitReply, kAEDefaultTimeout);
-	AEDisposeDesc(&evt);
-	if (err) {
-		NSLog(@"AESendMessage failed: %d\n", err);
-		return err;
-	}
-	// Check for any application errors
-	err = AEGetParamDesc(&res, keyErrorNumber, typeSInt32, &desc);
-	AEDisposeDesc(&res);
-	if (!err) {
-		AEGetDescData(&desc, &err, sizeof(err));
-		NSLog(@"Terminal returned an error: %d", err);
-		AEDisposeDesc(&desc);
-	} else if (err == errAEDescNotFound) {
-		err = noErr;
-	} else {
-		NSLog(@"AEGetPArmDesc returned an error: %d", err);
-	}
+    // Send event and check for any Apple Event Manager errors
+    err = AESendMessage(&evt, &res, kAEWaitReply, kAEDefaultTimeout);
+    AEDisposeDesc(&evt);
+    if (err) {
+        NSLog(@"AESendMessage failed: %ld\n", (long)err);
+        return err;
+    }
+    // Check for any application errors
+    err = AEGetParamDesc(&res, keyErrorNumber, typeSInt32, &desc);
+    AEDisposeDesc(&res);
+    if (!err) {
+        AEGetDescData(&desc, &err, sizeof(err));
+        NSLog(@"Terminal returned an error: %ld", (long)err);
+        AEDisposeDesc(&desc);
+    } else if (err == errAEDescNotFound) {
+        err = noErr;
+    } else {
+        NSLog(@"AEGetPArmDesc returned an error: %ld", (long)err);
+    }
 
-	return err;
+    return err;
 }
diff --git a/Mac/PythonLauncher/main.m b/Mac/PythonLauncher/main.m
index 6841433..04b4d73 100755
--- a/Mac/PythonLauncher/main.m
+++ b/Mac/PythonLauncher/main.m
@@ -11,7 +11,7 @@
 
 int main(int argc, const char *argv[])
 {
-	char *home = getenv("HOME");
-	if (home) chdir(home);
+    char *home = getenv("HOME");
+    if (home) chdir(home);
     return NSApplicationMain(argc, argv);
 }
