Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor search #357

Merged
merged 3 commits into from
Jun 26, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
168 changes: 26 additions & 142 deletions src/actions/actions.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { VimCommandActions, VimState } from './../mode/modeHandler';
import { VimCommandActions, VimState, SearchState } from './../mode/modeHandler';
import { ModeName } from './../mode/mode';
import { TextEditor } from './../textEditor';
import { Register, RegisterMode } from './../register/register';
Expand Down Expand Up @@ -363,87 +363,31 @@ class CommandInsertInSearchMode extends BaseCommand {
modes = [ModeName.SearchInProgressMode];
keys = ["<any>"];

public static GetNextSearchMatch(startPosition: Position, searchString: string): Position {
for (let line = startPosition.line; line < TextEditor.getLineCount(); line++) {
const text = TextEditor.getLineAt(new Position(line, 0)).text;

// TODO: Do better implementation!!!
for (let char = (line === startPosition.line ? startPosition.character + 1 : 0); char < text.length; char++) {
const index = text.indexOf(searchString, char);

if (index > -1) {
return new Position(line, index);
}
}
}

return undefined;
}

public static GetPreviousSearchMatch(startPosition: Position, searchString: string): Position {
for (let line = startPosition.line; line >= 0; line--) {
const text = TextEditor.getLineAt(new Position(line, 0)).text;

// TODO: Do better implementation!!!
for (let char = (line === startPosition.line ? startPosition.character - 1 : text.length - 1); char >= 0; char--) {
const index = text.lastIndexOf(searchString, char);

if (index > -1) {
return new Position(line, index);
}
}
}

return undefined;
}

public async exec(position: Position, vimState: VimState): Promise<VimState> {
const key = this.keysPressed[0];

const searchState = vimState.searchState;

// handle special keys first
if (key === "<backspace>") {
vimState.searchString = vimState.searchString.slice(0, -1);
searchState.searchString = searchState.searchString.slice(0, -1);
} else if (key === "\n") {
vimState.currentMode = ModeName.Normal;

if (vimState.nextSearchMatchPosition) {
vimState.cursorPosition = vimState.nextSearchMatchPosition;
} else {
vimState.cursorPosition = vimState.searchCursorStartPosition;
}
vimState.cursorPosition = vimState.searchState.getNextSearchMatchPosition(searchState.searchCursorStartPosition);

return vimState;
} else if (key === "<esc>") {
vimState.currentMode = ModeName.Normal;
vimState.searchString = "";
vimState.nextSearchMatchPosition = undefined;
vimState.cursorPosition = vimState.searchCursorStartPosition;
vimState.searchState = undefined;

return vimState;
} else {
vimState.searchString += this.keysPressed[0];
searchState.searchString += this.keysPressed[0];
}

// console.log(vimState.searchString); (TODO: Show somewhere!)
vimState.nextSearchMatchPosition = undefined;

const startPosition = vimState.searchCursorStartPosition;

if (vimState.searchDirection === 1) {
vimState.nextSearchMatchPosition = CommandInsertInSearchMode.GetNextSearchMatch(
startPosition,
vimState.searchString);
} else {
vimState.nextSearchMatchPosition = CommandInsertInSearchMode.GetPreviousSearchMatch(
startPosition,
vimState.searchString);
}

if (vimState.nextSearchMatchPosition) {
vimState.cursorPosition = vimState.nextSearchMatchPosition;
} else {
vimState.cursorPosition = vimState.searchCursorStartPosition;
}
vimState.cursorPosition = searchState.getNextSearchMatchPosition(searchState.searchCursorStartPosition);

return vimState;
}
Expand All @@ -455,27 +399,13 @@ class CommandNextSearchMatch extends BaseMovement {
keys = ["n"];

public async execAction(position: Position, vimState: VimState): Promise<Position> {
if (vimState.searchString === "") {
return position;
}

let nextPosition: Position;

if (vimState.searchDirection === 1) {
nextPosition = CommandInsertInSearchMode.GetNextSearchMatch(
position, vimState.searchString);
} else {
nextPosition = CommandInsertInSearchMode.GetPreviousSearchMatch(
position, vimState.searchString);
}

if (!nextPosition) {
// TODO(bell)
const searchState = vimState.searchState;

if (searchState.searchString === "") {
return position;
}

return nextPosition;
return vimState.searchState.getNextSearchMatchPosition(vimState.cursorPosition);
}
}

Expand All @@ -496,24 +426,11 @@ class CommandStar extends BaseCommand {
public async exec(position: Position, vimState: VimState): Promise<VimState> {
const currentWord = CommandStar.GetWordAtPosition(position);

vimState.searchString = currentWord;
vimState.searchDirection = 1;
vimState.searchState = new SearchState(+1, vimState.cursorPosition, currentWord);

let result: Position;

while (true) {
result = CommandInsertInSearchMode.GetNextSearchMatch(vimState.cursorPosition, currentWord);

if (result === undefined) {
break;
}

vimState.cursorPosition = result;

if (CommandStar.GetWordAtPosition(result) === currentWord) {
break;
}
}
do {
vimState.cursorPosition = vimState.searchState.getNextSearchMatchPosition(vimState.cursorPosition);
} while (CommandStar.GetWordAtPosition(vimState.cursorPosition) !== currentWord);

return vimState;
}
Expand All @@ -538,24 +455,11 @@ class CommandHash extends BaseCommand {
public async exec(position: Position, vimState: VimState): Promise<VimState> {
const currentWord = CommandStar.GetWordAtPosition(position);

vimState.searchString = currentWord;
vimState.searchDirection = -1;

let result: Position;
vimState.searchState = new SearchState(-1, vimState.cursorPosition, currentWord);

while (true) {
result = CommandInsertInSearchMode.GetPreviousSearchMatch(vimState.cursorPosition, currentWord);

if (result === undefined) {
break;
}

vimState.cursorPosition = result;

if (CommandStar.GetWordAtPosition(result) === currentWord) {
break;
}
}
do {
vimState.cursorPosition = vimState.searchState.getNextSearchMatchPosition(vimState.cursorPosition);
} while (CommandStar.GetWordAtPosition(vimState.cursorPosition) !== currentWord);

return vimState;
}
Expand All @@ -567,27 +471,13 @@ class CommandPreviousSearchMatch extends BaseMovement {
keys = ["N"];

public async execAction(position: Position, vimState: VimState): Promise<Position> {
if (vimState.searchString === "") {
return position;
}

let prevPosition: Position;

if (vimState.searchDirection === -1) {
prevPosition = CommandInsertInSearchMode.GetNextSearchMatch(
position, vimState.searchString);
} else {
prevPosition = CommandInsertInSearchMode.GetPreviousSearchMatch(
position, vimState.searchString);
}

if (!prevPosition) {
// TODO(bell)
const searchState = vimState.searchState;

if (searchState.searchString === "") {
return position;
}

return prevPosition;
return searchState.getNextSearchMatchPosition(vimState.cursorPosition, -1);
}
}

Expand Down Expand Up @@ -632,10 +522,7 @@ export class CommandSearchForwards extends BaseCommand {
isMotion = true;

public async exec(position: Position, vimState: VimState): Promise<VimState> {
vimState.searchString = "";
vimState.searchDirection = 1;
vimState.searchCursorStartPosition = position;
vimState.nextSearchMatchPosition = undefined;
vimState.searchState = new SearchState(+1, vimState.cursorPosition);
vimState.currentMode = ModeName.SearchInProgressMode;

return vimState;
Expand All @@ -650,10 +537,7 @@ export class CommandSearchBackwards extends BaseCommand {
isMotion = true;

public async exec(position: Position, vimState: VimState): Promise<VimState> {
vimState.searchString = "";
vimState.searchDirection = -1;
vimState.searchCursorStartPosition = position;
vimState.nextSearchMatchPosition = undefined;
vimState.searchState = new SearchState(-1, vimState.cursorPosition);
vimState.currentMode = ModeName.SearchInProgressMode;

return vimState;
Expand Down Expand Up @@ -1849,7 +1733,7 @@ class MovementAWordTextObject extends BaseMovement {
// visual mode if you JUST entered visual mode
// TODO TODO: I just looked at this again and omg this is awful what was I smoking plz get rid of this asap
return {
start: vimState.searchCursorStartPosition,
start: vimState.cursorStartPosition,
stop: await new MoveWordBegin().execAction(position, vimState),
};
}
Expand Down Expand Up @@ -1902,7 +1786,7 @@ class MovementIWordTextObject extends BaseMovement {
// TODO: This is kind of a bad way to do this, but text objects only work in
// visual mode if you JUST entered visual mode
return {
start: vimState.searchCursorStartPosition,
start: vimState.cursorStartPosition,
stop: await new MoveWordBegin().execAction(position, vimState),
};
}
Expand Down
Loading