Skip to content

Commit

Permalink
editor cmd+e find with selection.
Browse files Browse the repository at this point in the history
  • Loading branch information
rebornix committed Nov 2, 2020
1 parent 90b17ed commit 6acc9ff
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 20 deletions.
31 changes: 19 additions & 12 deletions src/vs/editor/contrib/find/findController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,16 @@ import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common

const SEARCH_STRING_MAX_LENGTH = 524288;

export function getSelectionSearchString(editor: ICodeEditor): string | null {
export function getSelectionSearchString(editor: ICodeEditor, seedSearchStringFromSelection: 'single' | 'multiple' = 'single'): string | null {
if (!editor.hasModel()) {
return null;
}

const selection = editor.getSelection();
// if selection spans multiple lines, default search string to empty
if (selection.startLineNumber === selection.endLineNumber) {

if ((seedSearchStringFromSelection === 'single' && selection.startLineNumber === selection.endLineNumber)
|| seedSearchStringFromSelection === 'multiple') {
if (selection.isEmpty()) {
const wordAtPosition = editor.getConfiguredWordAtPosition(selection.getStartPosition());
if (wordAtPosition) {
Expand All @@ -61,7 +63,7 @@ export const enum FindStartFocusAction {

export interface IFindStartOptions {
forceRevealReplace: boolean;
seedSearchStringFromSelection: boolean;
seedSearchStringFromSelection: 'none' | 'single' | 'multiple';
seedSearchStringFromGlobalClipboard: boolean;
shouldFocus: FindStartFocusAction;
shouldAnimate: boolean;
Expand Down Expand Up @@ -122,7 +124,7 @@ export class CommonFindController extends Disposable implements IEditorContribut
if (shouldRestartFind) {
this._start({
forceRevealReplace: false,
seedSearchStringFromSelection: false && this._editor.getOption(EditorOption.find).seedSearchStringFromSelection,
seedSearchStringFromSelection: 'none',
seedSearchStringFromGlobalClipboard: false,
shouldFocus: FindStartFocusAction.NoFocusChange,
shouldAnimate: false,
Expand Down Expand Up @@ -278,15 +280,20 @@ export class CommonFindController extends Disposable implements IEditorContribut
isRevealed: true
};

if (opts.seedSearchStringFromSelection) {
let selectionSearchString = getSelectionSearchString(this._editor);
if (opts.seedSearchStringFromSelection === 'single') {
let selectionSearchString = getSelectionSearchString(this._editor, opts.seedSearchStringFromSelection);
if (selectionSearchString) {
if (this._state.isRegex) {
stateChanges.searchString = strings.escapeRegExpCharacters(selectionSearchString);
} else {
stateChanges.searchString = selectionSearchString;
}
}
} else if (opts.seedSearchStringFromSelection === 'multiple' && !opts.updateSearchScope) {
let selectionSearchString = getSelectionSearchString(this._editor, opts.seedSearchStringFromSelection);
if (selectionSearchString) {
stateChanges.searchString = selectionSearchString;
}
}

if (!stateChanges.searchString && opts.seedSearchStringFromGlobalClipboard) {
Expand Down Expand Up @@ -493,7 +500,7 @@ export class StartFindAction extends MultiEditorAction {
if (controller) {
await controller.start({
forceRevealReplace: false,
seedSearchStringFromSelection: editor.getOption(EditorOption.find).seedSearchStringFromSelection,
seedSearchStringFromSelection: editor.getOption(EditorOption.find).seedSearchStringFromSelection ? 'single' : 'none',
seedSearchStringFromGlobalClipboard: editor.getOption(EditorOption.find).globalFindClipboard,
shouldFocus: FindStartFocusAction.FocusFindInput,
shouldAnimate: true,
Expand Down Expand Up @@ -523,12 +530,12 @@ export class StartFindWithSelectionAction extends EditorAction {
});
}

public async run(accessor: ServicesAccessor, editor: ICodeEditor): Promise<void> {
public async run(accessor: ServicesAccessor | null, editor: ICodeEditor): Promise<void> {
let controller = CommonFindController.get(editor);
if (controller) {
await controller.start({
forceRevealReplace: false,
seedSearchStringFromSelection: true,
seedSearchStringFromSelection: 'multiple',
seedSearchStringFromGlobalClipboard: false,
shouldFocus: FindStartFocusAction.NoFocusChange,
shouldAnimate: true,
Expand All @@ -546,7 +553,7 @@ export abstract class MatchFindAction extends EditorAction {
if (controller && !this._run(controller)) {
await controller.start({
forceRevealReplace: false,
seedSearchStringFromSelection: (controller.getState().searchString.length === 0) && editor.getOption(EditorOption.find).seedSearchStringFromSelection,
seedSearchStringFromSelection: (controller.getState().searchString.length === 0) && editor.getOption(EditorOption.find).seedSearchStringFromSelection ? 'single' : 'none',
seedSearchStringFromGlobalClipboard: true,
shouldFocus: FindStartFocusAction.NoFocusChange,
shouldAnimate: true,
Expand Down Expand Up @@ -659,7 +666,7 @@ export abstract class SelectionMatchFindAction extends EditorAction {
if (!this._run(controller)) {
await controller.start({
forceRevealReplace: false,
seedSearchStringFromSelection: editor.getOption(EditorOption.find).seedSearchStringFromSelection,
seedSearchStringFromSelection: editor.getOption(EditorOption.find).seedSearchStringFromSelection ? 'single' : 'none',
seedSearchStringFromGlobalClipboard: false,
shouldFocus: FindStartFocusAction.NoFocusChange,
shouldAnimate: true,
Expand Down Expand Up @@ -765,7 +772,7 @@ export class StartFindReplaceAction extends MultiEditorAction {
if (controller) {
await controller.start({
forceRevealReplace: true,
seedSearchStringFromSelection: seedSearchStringFromSelection,
seedSearchStringFromSelection: seedSearchStringFromSelection ? 'single' : 'none',
seedSearchStringFromGlobalClipboard: editor.getOption(EditorOption.find).seedSearchStringFromSelection,
shouldFocus: shouldFocus,
shouldAnimate: true,
Expand Down
69 changes: 61 additions & 8 deletions src/vs/editor/contrib/find/test/findController.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { EditOperation } from 'vs/editor/common/core/editOperation';
import { Position } from 'vs/editor/common/core/position';
import { Range } from 'vs/editor/common/core/range';
import { Selection } from 'vs/editor/common/core/selection';
import { CommonFindController, FindStartFocusAction, IFindStartOptions, NextMatchFindAction, NextSelectionMatchFindAction, StartFindAction, StartFindReplaceAction } from 'vs/editor/contrib/find/findController';
import { CommonFindController, FindStartFocusAction, IFindStartOptions, NextMatchFindAction, NextSelectionMatchFindAction, StartFindAction, StartFindReplaceAction, StartFindWithSelectionAction } from 'vs/editor/contrib/find/findController';
import { CONTEXT_FIND_INPUT_FOCUSED } from 'vs/editor/contrib/find/findModel';
import { withAsyncTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
Expand Down Expand Up @@ -272,7 +272,7 @@ suite('FindController', async () => {
findController.setSearchString(testRegexString);
await findController.start({
forceRevealReplace: false,
seedSearchStringFromSelection: false,
seedSearchStringFromSelection: 'none',
seedSearchStringFromGlobalClipboard: false,
shouldFocus: FindStartFocusAction.FocusFindInput,
shouldAnimate: false,
Expand All @@ -298,7 +298,7 @@ suite('FindController', async () => {
let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController);
await findController.start({
forceRevealReplace: false,
seedSearchStringFromSelection: false,
seedSearchStringFromSelection: 'none',
seedSearchStringFromGlobalClipboard: false,
shouldFocus: FindStartFocusAction.NoFocusChange,
shouldAnimate: false,
Expand Down Expand Up @@ -428,6 +428,59 @@ suite('FindController', async () => {
findController.dispose();
});
});

test('issue #47400, CMD+E supports feeding multiple line of text into the find widget', async () => {
await withAsyncTestCodeEditor([
'ABC',
'ABC',
'XYZ',
'ABC',
'ABC'
], { serviceCollection: serviceCollection }, async (editor) => {
clipboardState = '';
let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController);
let startFindAction = new StartFindAction();

// change selection
editor.setSelection(new Selection(1, 1, 1, 1));

// cmd+f - open find widget
await startFindAction.run(null, editor);

editor.setSelection(new Selection(1, 1, 2, 4));
let startFindWithSelectionAction = new StartFindWithSelectionAction();
await startFindWithSelectionAction.run(null, editor);
let findState = findController.getState();

assert.deepEqual(findState.searchString.split(/\r\n|\r|\n/g), ['ABC', 'ABC']);

editor.setSelection(new Selection(3, 1, 3, 1));
await startFindWithSelectionAction.run(null, editor);

findController.dispose();
});
});

test('issue #109756, CMD+E with empty cursor should always work', async () => {
await withAsyncTestCodeEditor([
'ABC',
'ABC',
'XYZ',
'ABC',
'ABC'
], { serviceCollection: serviceCollection }, async (editor) => {
clipboardState = '';
let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController);
editor.setSelection(new Selection(1, 2, 1, 2));

let startFindWithSelectionAction = new StartFindWithSelectionAction();
startFindWithSelectionAction.run(null, editor);

let findState = findController.getState();
assert.deepEqual(findState.searchString, 'ABC');
findController.dispose();
});
});
});

suite('FindController query options persistence', async () => {
Expand Down Expand Up @@ -524,9 +577,9 @@ suite('FindController query options persistence', async () => {
], { serviceCollection: serviceCollection, find: { autoFindInSelection: 'always', globalFindClipboard: false } }, async (editor) => {
// clipboardState = '';
let findController = editor.registerAndInstantiateContribution(TestFindController.ID, TestFindController);
const findConfig = {
const findConfig: IFindStartOptions = {
forceRevealReplace: false,
seedSearchStringFromSelection: false,
seedSearchStringFromSelection: 'none',
seedSearchStringFromGlobalClipboard: false,
shouldFocus: FindStartFocusAction.NoFocusChange,
shouldAnimate: false,
Expand Down Expand Up @@ -558,7 +611,7 @@ suite('FindController query options persistence', async () => {

await findController.start({
forceRevealReplace: false,
seedSearchStringFromSelection: false,
seedSearchStringFromSelection: 'none',
seedSearchStringFromGlobalClipboard: false,
shouldFocus: FindStartFocusAction.NoFocusChange,
shouldAnimate: false,
Expand All @@ -582,7 +635,7 @@ suite('FindController query options persistence', async () => {

await findController.start({
forceRevealReplace: false,
seedSearchStringFromSelection: false,
seedSearchStringFromSelection: 'none',
seedSearchStringFromGlobalClipboard: false,
shouldFocus: FindStartFocusAction.NoFocusChange,
shouldAnimate: false,
Expand All @@ -607,7 +660,7 @@ suite('FindController query options persistence', async () => {

await findController.start({
forceRevealReplace: false,
seedSearchStringFromSelection: false,
seedSearchStringFromSelection: 'none',
seedSearchStringFromGlobalClipboard: false,
shouldFocus: FindStartFocusAction.NoFocusChange,
shouldAnimate: false,
Expand Down

0 comments on commit 6acc9ff

Please sign in to comment.