Skip to content

Commit b6081a2

Browse files
Fit interior range to content (#715)
* Fit interior range to content * Updated shrink range to fit content * Added a lfcr test * Added dock string * Added argument full interior range to interior target * Updated test * Cleanup * Update src/util/selectionUtils.ts Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com> * Update src/processTargets/targets/InteriorTarget.ts Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com> * Updated comment * Added tests for empty and whitespace core * Updated comment * Empty commit Co-authored-by: Pokey Rule <755842+pokey@users.noreply.github.com>
1 parent a5cc7a8 commit b6081a2

File tree

16 files changed

+269
-50
lines changed

16 files changed

+269
-50
lines changed

src/processTargets/modifiers/HeadTailStage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Range, TextEditor } from "vscode";
1+
import { Range } from "vscode";
22
import { Target } from "../../typings/target.types";
33
import {
44
HeadTailModifier,

src/processTargets/targets/BaseTarget.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
createContinuousRangeWeakTarget,
1212
} from "../targetUtil/createContinuousRange";
1313

14-
/** Parameters supported by all target classes */
14+
/** Parameters supported by most target classes */
1515
export interface CommonTargetParameters {
1616
readonly editor: TextEditor;
1717
readonly isReversed: boolean;
Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { Range, TextEditor } from "vscode";
2-
import { fitRangeToLineContent } from "../modifiers/scopeTypeStages/LineStage";
1+
import { Range } from "vscode";
2+
import { shrinkRangeToFitContent } from "../../util/selectionUtils";
33
import BaseTarget, { CommonTargetParameters } from "./BaseTarget";
4-
import WeakTarget from "./WeakTarget";
4+
import PlainTarget from "./PlainTarget";
55

66
export default class DocumentTarget extends BaseTarget {
77
insertionDelimiter = "\n";
@@ -23,10 +23,11 @@ export default class DocumentTarget extends BaseTarget {
2323

2424
getInteriorStrict() {
2525
return [
26-
new WeakTarget({
26+
// Use plain target instead of interior target since we want the same content and removal range for a document interior.
27+
new PlainTarget({
2728
editor: this.editor,
2829
isReversed: this.isReversed,
29-
contentRange: getDocumentContentRange(this.editor),
30+
contentRange: shrinkRangeToFitContent(this.editor, this.contentRange),
3031
}),
3132
];
3233
}
@@ -35,31 +36,3 @@ export default class DocumentTarget extends BaseTarget {
3536
return this.state;
3637
}
3738
}
38-
39-
function getDocumentContentRange(editor: TextEditor) {
40-
const { document } = editor;
41-
let firstLineNum = 0;
42-
let lastLineNum = document.lineCount - 1;
43-
44-
for (let i = firstLineNum; i < document.lineCount; ++i) {
45-
if (!document.lineAt(i).isEmptyOrWhitespace) {
46-
firstLineNum = i;
47-
break;
48-
}
49-
}
50-
51-
for (let i = lastLineNum; i > -1; --i) {
52-
if (!document.lineAt(i).isEmptyOrWhitespace) {
53-
lastLineNum = i;
54-
break;
55-
}
56-
}
57-
58-
const firstLine = document.lineAt(firstLineNum);
59-
const lastLine = document.lineAt(lastLineNum);
60-
61-
return fitRangeToLineContent(
62-
editor,
63-
new Range(firstLine.range.start, lastLine.range.end)
64-
);
65-
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { Range } from "vscode";
2+
import { shrinkRangeToFitContent } from "../../util/selectionUtils";
3+
import BaseTarget, { CommonTargetParameters } from "./BaseTarget";
4+
5+
export interface InteriorTargetParameters
6+
extends Omit<CommonTargetParameters, "contentRange"> {
7+
readonly fullInteriorRange: Range;
8+
}
9+
10+
export default class InteriorTarget extends BaseTarget {
11+
insertionDelimiter = " ";
12+
private readonly fullInteriorRange: Range;
13+
14+
constructor(parameters: InteriorTargetParameters) {
15+
super({
16+
...parameters,
17+
contentRange: shrinkRangeToFitContent(
18+
parameters.editor,
19+
parameters.fullInteriorRange
20+
),
21+
});
22+
this.fullInteriorRange = parameters.fullInteriorRange;
23+
}
24+
25+
getLeadingDelimiterTarget = () => undefined;
26+
getTrailingDelimiterTarget = () => undefined;
27+
getRemovalRange = () => this.fullInteriorRange;
28+
29+
protected getCloneParameters() {
30+
return {
31+
...this.state,
32+
fullInteriorRange: this.fullInteriorRange,
33+
};
34+
}
35+
}

src/processTargets/targets/SurroundingPairTarget.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import {
66
getTokenTrailingDelimiterTarget,
77
} from "../targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior";
88
import BaseTarget, { CommonTargetParameters } from "./BaseTarget";
9+
import InteriorTarget from "./InteriorTarget";
910
import TokenTarget from "./TokenTarget";
10-
import WeakTarget from "./WeakTarget";
1111

1212
interface SurroundingPairTargetParameters extends CommonTargetParameters {
1313
/**
@@ -48,10 +48,10 @@ export default class SurroundingPairTarget extends BaseTarget {
4848

4949
getInteriorStrict() {
5050
return [
51-
new WeakTarget({
51+
new InteriorTarget({
5252
editor: this.editor,
5353
isReversed: this.isReversed,
54-
contentRange: this.interiorRange_,
54+
fullInteriorRange: this.interiorRange_,
5555
}),
5656
];
5757
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
languageId: plaintext
2+
command:
3+
spokenForm: clear core file
4+
version: 2
5+
targets:
6+
- type: primitive
7+
modifiers:
8+
- {type: interiorOnly}
9+
- type: containingScope
10+
scopeType: {type: document}
11+
usePrePhraseSnapshot: true
12+
action: {name: clearAndSetSelection}
13+
initialState:
14+
documentContents: "\r\n abc \r\n"
15+
selections:
16+
- anchor: {line: 0, character: 0}
17+
active: {line: 0, character: 0}
18+
marks: {}
19+
finalState:
20+
documentContents: "\r\n \r\n"
21+
selections:
22+
- anchor: {line: 1, character: 1}
23+
active: {line: 1, character: 1}
24+
thatMark:
25+
- anchor: {line: 1, character: 1}
26+
active: {line: 1, character: 1}
27+
fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}, {type: containingScope, scopeType: {type: document}}]}]
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
languageId: plaintext
2+
command:
3+
spokenForm: clear core
4+
version: 2
5+
targets:
6+
- type: primitive
7+
modifiers:
8+
- {type: interiorOnly}
9+
usePrePhraseSnapshot: true
10+
action: {name: clearAndSetSelection}
11+
initialState:
12+
documentContents: ( )
13+
selections:
14+
- anchor: {line: 0, character: 0}
15+
active: {line: 0, character: 0}
16+
marks: {}
17+
finalState:
18+
documentContents: ()
19+
selections:
20+
- anchor: {line: 0, character: 1}
21+
active: {line: 0, character: 1}
22+
thatMark:
23+
- anchor: {line: 0, character: 1}
24+
active: {line: 0, character: 1}
25+
fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}]
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
languageId: plaintext
2+
command:
3+
spokenForm: clear core
4+
version: 2
5+
targets:
6+
- type: primitive
7+
modifiers:
8+
- {type: interiorOnly}
9+
usePrePhraseSnapshot: true
10+
action: {name: clearAndSetSelection}
11+
initialState:
12+
documentContents: ()
13+
selections:
14+
- anchor: {line: 0, character: 0}
15+
active: {line: 0, character: 0}
16+
marks: {}
17+
finalState:
18+
documentContents: ()
19+
selections:
20+
- anchor: {line: 0, character: 1}
21+
active: {line: 0, character: 1}
22+
thatMark:
23+
- anchor: {line: 0, character: 1}
24+
active: {line: 0, character: 1}
25+
fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}]

src/test/suite/fixtures/recorded/selectionTypes/clearHeadCoreCurly.yml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ initialState:
2323
marks: {}
2424
finalState:
2525
documentContents: |-
26-
{z)
26+
{
27+
z)
2728
}
2829
selections:
29-
- anchor: {line: 0, character: 1}
30-
active: {line: 0, character: 1}
30+
- anchor: {line: 1, character: 4}
31+
active: {line: 1, character: 4}
3132
thatMark:
32-
- anchor: {line: 0, character: 1}
33-
active: {line: 0, character: 1}
33+
- anchor: {line: 1, character: 4}
34+
active: {line: 1, character: 4}
3435
fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: extendThroughStartOf, modifiers: [{type: interiorOnly}, {type: containingScope, scopeType: {type: surroundingPair, delimiter: curlyBrackets}}]}]}]
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
languageId: typescript
2+
command:
3+
spokenForm: chuck core
4+
version: 2
5+
targets:
6+
- type: primitive
7+
modifiers:
8+
- {type: interiorOnly}
9+
usePrePhraseSnapshot: true
10+
action: {name: remove}
11+
initialState:
12+
documentContents: |-
13+
[
14+
"foo",
15+
"bar"
16+
]
17+
selections:
18+
- anchor: {line: 1, character: 10}
19+
active: {line: 1, character: 10}
20+
marks: {}
21+
finalState:
22+
documentContents: "[]"
23+
selections:
24+
- anchor: {line: 0, character: 1}
25+
active: {line: 0, character: 1}
26+
thatMark:
27+
- anchor: {line: 0, character: 1}
28+
active: {line: 0, character: 1}
29+
fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}]
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
languageId: plaintext
2+
command:
3+
spokenForm: chuck core
4+
version: 2
5+
targets:
6+
- type: primitive
7+
modifiers:
8+
- {type: interiorOnly}
9+
usePrePhraseSnapshot: true
10+
action: {name: remove}
11+
initialState:
12+
documentContents: ( hello )
13+
selections:
14+
- anchor: {line: 0, character: 6}
15+
active: {line: 0, character: 6}
16+
marks: {}
17+
finalState:
18+
documentContents: ()
19+
selections:
20+
- anchor: {line: 0, character: 1}
21+
active: {line: 0, character: 1}
22+
thatMark:
23+
- anchor: {line: 0, character: 1}
24+
active: {line: 0, character: 1}
25+
fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}]

src/test/suite/fixtures/recorded/surroundingPair/parseTree/python/clearMatching9.yml renamed to src/test/suite/fixtures/recorded/surroundingPair/parseTree/python/clearInside.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
languageId: python
22
command:
33
version: 1
4-
spokenForm: clear matching
4+
spokenForm: clear inside
55
action: clearAndSetSelection
66
targets:
77
- type: primitive
@@ -17,7 +17,9 @@ initialState:
1717
active: {line: 1, character: 0}
1818
marks: {}
1919
finalState:
20-
documentContents: "\"\"\"\"\"\""
20+
documentContents: |-
21+
"""
22+
"""
2123
selections:
2224
- anchor: {line: 0, character: 3}
2325
active: {line: 0, character: 3}

src/test/suite/fixtures/recorded/surroundingPair/parseTree/typescript/takeCore.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ finalState:
2929
)
3030
}
3131
selections:
32-
- anchor: {line: 1, character: 45}
33-
active: {line: 3, character: 4}
32+
- anchor: {line: 2, character: 4}
33+
active: {line: 2, character: 30}
3434
thatMark:
35-
- anchor: {line: 1, character: 45}
36-
active: {line: 3, character: 4}
35+
- anchor: {line: 2, character: 4}
36+
active: {line: 2, character: 30}
3737
fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: containingScope, scopeType: {type: surroundingPair, delimiter: any}}, {type: interiorOnly}]}]
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
languageId: typescript
2+
command:
3+
spokenForm: take core
4+
version: 2
5+
targets:
6+
- type: primitive
7+
modifiers:
8+
- {type: interiorOnly}
9+
usePrePhraseSnapshot: true
10+
action: {name: setSelection}
11+
initialState:
12+
documentContents: |-
13+
[
14+
"foo",
15+
"bar"
16+
]
17+
selections:
18+
- anchor: {line: 1, character: 10}
19+
active: {line: 1, character: 10}
20+
marks: {}
21+
finalState:
22+
documentContents: |-
23+
[
24+
"foo",
25+
"bar"
26+
]
27+
selections:
28+
- anchor: {line: 1, character: 4}
29+
active: {line: 2, character: 9}
30+
thatMark:
31+
- anchor: {line: 1, character: 4}
32+
active: {line: 2, character: 9}
33+
fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}]
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
languageId: plaintext
2+
command:
3+
spokenForm: take core
4+
version: 2
5+
targets:
6+
- type: primitive
7+
modifiers:
8+
- {type: interiorOnly}
9+
usePrePhraseSnapshot: true
10+
action: {name: setSelection}
11+
initialState:
12+
documentContents: ( hello )
13+
selections:
14+
- anchor: {line: 0, character: 6}
15+
active: {line: 0, character: 6}
16+
marks: {}
17+
finalState:
18+
documentContents: ( hello )
19+
selections:
20+
- anchor: {line: 0, character: 2}
21+
active: {line: 0, character: 7}
22+
thatMark:
23+
- anchor: {line: 0, character: 2}
24+
active: {line: 0, character: 7}
25+
fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: interiorOnly}]}]

0 commit comments

Comments
 (0)