#import @interface JNTextViewController : NSObject { } - (BOOL) textView: (NSTextView *) textView doCommandBySelector: (SEL) commandSelector; @end @implementation JNTextViewController - (NSRange) rangeOfCurrentLine: (NSTextView *) textView { NSRange rangeBeforeCursor; NSRange aRange; rangeBeforeCursor.location = 0; rangeBeforeCursor.length = [textView selectedRange].location; aRange = [[textView string] rangeOfString: @"\n" options: NSBackwardsSearch range: rangeBeforeCursor]; aRange.length = rangeBeforeCursor.length - aRange.location - 1; if(aRange.location == NSNotFound) { aRange.location = 0; aRange.length = [[textView string] length]; } else { ++aRange.location; } return aRange; } - (void) insertNewline: (NSTextView *) textView { NSString *currentLine; NSCharacterSet *nonWhitespaceCharacterSet; NSRange rangeOfCurrentLine; int firstNonWhitespaceIndex; rangeOfCurrentLine = [self rangeOfCurrentLine: textView]; currentLine = [[textView string] substringWithRange: rangeOfCurrentLine]; nonWhitespaceCharacterSet = [[NSCharacterSet whitespaceCharacterSet] invertedSet]; firstNonWhitespaceIndex = [currentLine rangeOfCharacterFromSet: nonWhitespaceCharacterSet].location; if(firstNonWhitespaceIndex == NSNotFound) firstNonWhitespaceIndex = [currentLine length]; [textView insertText: @"\n"]; [textView insertText: [currentLine substringToIndex: firstNonWhitespaceIndex]]; } - (BOOL) textView: (NSTextView *) textView doCommandBySelector: (SEL) commandSelector { if(commandSelector == @selector(insertNewline:)) { [self insertNewline: textView]; return YES; } else { return NO; } } @end