NSTextView paste: how to paste "bar" instead when "foo" is pasted?

cocoa, nstextview, objective-c

Solution

Try this. Subclass your text view, and override paste: this way:

@implementation RDTextView

-(void)paste:(id)sender {
    NSPasteboard *pb = [NSPasteboard generalPasteboard];
    NSString *pbItem = [pb readObjectsForClasses: @[[NSString class],[NSAttributedString class]] options:nil].lastObject;
    if ([pbItem isKindOfClass:[NSAttributedString class]]) 
        pbItem = [(NSAttributedString *)pbItem string];

    if ([pbItem isEqualToString:@"foo"]) {
        [self insertText:@"bar"];
    }else{
        [super paste:sender];
    }
}

@end

Problem

I have a NSTextView, where the user can paste plain text into. When the users has "foo" in the pasteboard I would like "bar" to be pasted. In other words, a user goes to, say, a web browser, selects "foo", cmd+c, switches to my NSTextView, cmd+v and "bar" appears at insertion point. Please, does anyone know how to approach this? Edit: is it possible to somehow use `readSelectionFromPasteboard:type:` for this? I just don't know what to put in the method body of my overridden textview..?

Original source