Skip to content

Commit

Permalink
Fix XVimProject#629 Support recoding register.
Browse files Browse the repository at this point in the history
  • Loading branch information
hmuronaka committed Dec 10, 2015
1 parent 7fe1115 commit 4da3ed3
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 13 deletions.
33 changes: 21 additions & 12 deletions XVim/DVTTextCompletionListWindowController+XVim.m
Original file line number Diff line number Diff line change
Expand Up @@ -9,47 +9,56 @@
#import "IDEKit.h"
#import "DVTTextCompletionListWindowController+XVim.h"
#import "XVim.h"
#import "XVimRegister.h"

@implementation DVTTextCompletionListWindowController (XVim)

- (BOOL)tryExpandingCompletion
{
IDEIndexCompletionItem *item = [self _selectedCompletionItem];

[self expandCompletionItem:item];

return NO;
}



-(void)expandCompletionItem:(IDEIndexCompletionItem*)completionItem {
NSMutableString* tempRepeatRegister = [XVim instance].tempRepeatRegister;
unichar lastChar = [tempRepeatRegister characterAtIndex:tempRepeatRegister.length - 1];

[self expandCompletionItem:completionItem targetRegister:tempRepeatRegister];

XVimRegisterManager* registerManager = [XVim instance].registerManager;
if( [registerManager isRecording ] ) {
NSMutableString* registerString = [NSMutableString stringWithString:registerManager.recordingRegister.string];
[self expandCompletionItem:completionItem targetRegister:registerString];
[registerManager.recordingRegister setXVimString:registerString];
}
}

-(void)expandCompletionItem:(IDEIndexCompletionItem*)completionItem targetRegister:(NSMutableString*)targetRegister {

unichar lastChar = [targetRegister characterAtIndex:targetRegister.length - 1];
if( [[NSCharacterSet whitespaceAndNewlineCharacterSet] characterIsMember:lastChar] ) {
[tempRepeatRegister deleteCharactersInRange:NSMakeRange(tempRepeatRegister.length - 1, 1)];
[targetRegister deleteCharactersInRange:NSMakeRange(targetRegister.length - 1, 1)];
}

// This is a little better if completionText contains "< # code # >".
// NSRange range = [self rangeOfExpandFromItemName:completionItem.name tempRegister:tempRepeatRegister];
// NSRange range = [self rangeOfExpandFromItemName:completionItem.name tempRegister:targetRegister];
// if( range.location != NSNotFound ) {
// [tempRepeatRegister replaceCharactersInRange:range withString:completionItem.completionText];
// [targetRegister replaceCharactersInRange:range withString:completionItem.completionText];
// return;
// }
//

DVTSourceTextView *textView = (DVTSourceTextView *)self.session.textView;
if(self.session.wordStartLocation == NSNotFound) {
return;
}


NSRange wordRange = NSMakeRange(self.session.wordStartLocation, self.session.cursorLocation - self.session.wordStartLocation);
NSString* word = [textView.string substringWithRange:wordRange];
NSRange range = [self rangeOfExpandWord:word tempRegister:tempRepeatRegister];
NSRange range = [self rangeOfExpandWord:word tempRegister:targetRegister];

if( range.location != NSNotFound ) {
[tempRepeatRegister replaceCharactersInRange:range withString:completionItem.completionText];
[targetRegister replaceCharactersInRange:range withString:completionItem.completionText];
}
}

Expand Down
2 changes: 1 addition & 1 deletion XVim/XVim.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ extern NSString * const XVimDocumentPathKey;
@property (copy) NSString* document;
@property (nonatomic) BOOL isExecuting; // For @x command executing
@property (nonatomic) BOOL foundRangesHidden;
@property (strong,nonatomic) XVimMutableString* tempRepeatRegister;
@property (strong, nonatomic) XVimMutableString* tempRepeatRegister;

// XVimKeymapProvider protocol
- (XVimKeymap*)keymapForMode:(XVIM_MODE)mode;
Expand Down
1 change: 1 addition & 0 deletions XVim/XVimRegister.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ typedef enum{
// XVimRegisterManager must handle all the requests.
@interface XVimRegisterManager : NSObject
@property (strong) NSString* lastExecutedRegister;
@property(readonly) XVimRegister* recordingRegister;
/**
* Returns XVimRegister object for the registry "name".
* The register may be invalid after a few key input because
Expand Down

0 comments on commit 4da3ed3

Please sign in to comment.