aboutsummaryrefslogtreecommitdiffstats
path: root/Source/CMTextView.m
diff options
context:
space:
mode:
Diffstat (limited to 'Source/CMTextView.m')
-rw-r--r--Source/CMTextView.m77
1 files changed, 52 insertions, 25 deletions
diff --git a/Source/CMTextView.m b/Source/CMTextView.m
index 37b2ee13..c95d7d1f 100644
--- a/Source/CMTextView.m
+++ b/Source/CMTextView.m
@@ -1199,6 +1199,17 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse)
}
}
+ // If inside the snippet hint $(…) is defined run … as BASH command
+ // and replace the snippet hint by the return string of that command
+ if([theHintString isMatchedByRegex:@"(?s)(?<!\\\\)\\s*\\$\\(.*\\)\\s*"]) {
+ NSRange r = [theHintString rangeOfRegex:@"(?s)(?<!\\\\)\\s*\\$\\((.*)\\)\\s*" capture:1L];
+ if(r.length)
+ [theHintString setString:[self runBashCommand:[theHintString substringWithRange:r]]];
+ else
+ [theHintString setString:@""];
+ [theHintString flushCachedRegexData];
+ }
+
[snip replaceCharactersInRange:snipRange withString:theHintString];
[snip flushCachedRegexData];
@@ -1266,24 +1277,24 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse)
- (NSString *)runBashCommand:(NSString *)command
{
+ BOOL userTerminated = NO;
+
NSTask *bashTask = [[NSTask alloc] init];
[bashTask setLaunchPath: @"/bin/sh"];
+ [bashTask setArguments:[NSArray arrayWithObjects: @"-c", command, nil]];
- NSArray *arguments;
- arguments = [NSArray arrayWithObjects: @"-c", command, nil];
- [bashTask setArguments: arguments];
-
- NSPipe *pipe;
- pipe = [NSPipe pipe];
- [bashTask setStandardOutput: pipe];
+ NSPipe *stdout_pipe = [NSPipe pipe];
+ [bashTask setStandardOutput:stdout_pipe];
- NSFileHandle *file;
- file = [pipe fileHandleForReading];
+ NSFileHandle *stdout_file = [stdout_pipe fileHandleForReading];
[bashTask launch];
- while([bashTask isRunning]) {
- NSEvent* event = [NSApp nextEventMatchingMask:NSAnyEventMask
- untilDate:[NSDate distantFuture]
+
+ // Listen to ⌘. to terminate
+ while(1) {
+ if(![bashTask isRunning]) break;
+ NSEvent* event = [NSApp nextEventMatchingMask:NSKeyDownMask
+ untilDate:[NSDate distantPast]
inMode:NSDefaultRunLoopMode
dequeue:YES];
if(!event) continue;
@@ -1291,30 +1302,46 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse)
unichar key = [[event characters] length] == 1 ? [[event characters] characterAtIndex:0] : 0;
if (([event modifierFlags] & NSCommandKeyMask) && key == '.') {
[bashTask terminate];
+ userTerminated = YES;
break;
}
}
- usleep(10000);
}
- [bashTask waitUntilExit];
- NSInteger status = [bashTask terminationStatus];
- NSData *data;
- data = [file readDataToEndOfFile];
- NSString *string;
- string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
- [bashTask release];
+ if(userTerminated) {
+ if(bashTask) [bashTask release];
+ NSBeep();
+ NSLog(@"“%@” was terminated by user.", command);
+ return @"";
+ }
- if (status == 0) {
- return [string autorelease];
+ [bashTask waitUntilExit];
+ NSInteger status = [bashTask terminationStatus];
+ NSData *data = [stdout_file readDataToEndOfFile];
+
+ if(data != nil) {
+ NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ if(bashTask) [bashTask release];
+ if(string != nil) {
+ if (status == 0) {
+ return [string autorelease];
+ } else {
+ NSLog(@"Error for “%@”", command);
+ [string release];
+ NSBeep();
+ return @"";
+ }
+ } else {
+ if(string) [string release];
+ NSLog(@"Couldn't read return string from “%@” by using UTF-8 encoding.", command);
+ }
} else {
- NSLog(@"Error: %@", string);
- [string autorelease];
+ if(bashTask) [bashTask release];
+ NSLog(@"Couldn't read data from command “%@”.", command);
NSBeep();
return @"";
}
-
}
/*
* Checks whether the current caret position in inside of a defined snippet range