Skip to content

Commit de643b4

Browse files
committed
Format pasted text as-you-type
1 parent 21a76be commit de643b4

File tree

4 files changed

+21
-8
lines changed

4 files changed

+21
-8
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
"editor.autoClosingQuotes": "always",
115115
"editor.formatOnType": true,
116116
"editor.autoIndent": "full",
117-
"editor.formatOnPaste": true,
117+
"editor.formatOnPaste": false,
118118
"files.trimTrailingWhitespace": false,
119119
"editor.matchBrackets": "never",
120120
"editor.guides.indentation": false,

src/calva-fmt/src/format.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export function formatRangeEdits(document: vscode.TextDocument, range: vscode.Ra
6565
const cursor = mirroredDoc.getTokenCursor(startIndex);
6666
if (!cursor.withinString()) {
6767
const rangeTuple: number[] = [startIndex, endIndex];
68-
const newText: string = _formatRange(text, document.getText(), rangeTuple, document.eol == 2 ? "\r\n" : "\n");
68+
const newText: string = _formatRange(text, document.getText(), rangeTuple, document.eol == 2 ? "\r\n" : "\n")['range-text'];
6969
if (newText) {
7070
return [vscode.TextEdit.replace(range, newText)];
7171
}
@@ -122,17 +122,18 @@ export function formatPositionInfoEditableDoc(document: docModel.EditableDocumen
122122
}
123123

124124
export function formatRangeEditableDoc(document: docModel.EditableDocument, range: [number, number], onType: boolean = false, extraConfig = {}): Thenable<boolean> {
125-
const formattedInfo = formatRangeInfoEditableDoc(document, range, onType, extraConfig);
125+
const formattedInfo = formatRangeInfoEditableDoc(document, range, onType, { performFormatAsYouType: false, ...extraConfig });
126126
return performFormatEditableDoc(document, formattedInfo, onType, extraConfig);
127127
}
128128

129129
export function formatPositionEditableDoc(document: docModel.EditableDocument, onType: boolean = false, extraConfig = {}): Thenable<boolean> {
130-
const formattedInfo = formatPositionInfoEditableDoc(document, onType, extraConfig);
130+
const formattedInfo = formatPositionInfoEditableDoc(document, onType, { performFormatAsYouType: true, ...extraConfig });
131131
return performFormatEditableDoc(document, formattedInfo, onType, extraConfig);
132132
}
133133

134134
function performFormatEditableDoc(document: docModel.EditableDocument, formattedInfo, onType: boolean, extraConfig = {}): Thenable<boolean> {
135135
const adjustSelection = extraConfig['adjustSelection'] === undefined || extraConfig['adjustSelection'];
136+
const performFormatAsYouType = extraConfig['performFormatAsYouType'] === undefined || extraConfig['performFormatAsYouType'];
136137
if (formattedInfo) {
137138
const newSelectionConfig = adjustSelection ? { selection: new docModel.ModelEditSelection(formattedInfo.newIndex) } : {};
138139
if (formattedInfo.previousText != formattedInfo.formattedText) {
@@ -210,7 +211,7 @@ function _formatIndex(allText: string, range: [number, number], index: number, e
210211
}
211212

212213

213-
function _formatRange(rangeText: string, allText: string, range: number[], eol: string): string {
214+
function _formatRange(rangeText: string, allText: string, range: number[], eol: string): { "range-text": string, "range": [number, number], "new-index": number } {
214215
const d = {
215216
"range-text": rangeText,
216217
"all-text": allText,
@@ -221,6 +222,6 @@ function _formatRange(rangeText: string, allText: string, range: number[], eol:
221222
const cljData = cljify(d);
222223
const result = jsify(formatTextAtRange(cljData));
223224
if (!result["error"]) {
224-
return result["range-text"];
225+
return result;
225226
}
226227
}

src/doc-mirror/index.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,15 @@ function processChanges(event: vscode.TextDocumentChangeEvent) {
193193
}).then(async _v => {
194194
if (event.document === vscode.window.activeTextEditor?.document) {
195195
if (performFormatAsYouType) {
196-
await formatter.formatForward(mirroredDoc);
196+
if (event.contentChanges.length === 1 && event.contentChanges[0].text.match(/[\[\](){}]/)) {
197+
const change = event.contentChanges[0];
198+
const start = event.document.offsetAt(change.range.start);
199+
const formatForwardIndex = formatter.indexForFormatForward(mirroredDoc);
200+
const end = formatForwardIndex !== mirroredDoc.selection.active ? formatForwardIndex + 1 : mirroredDoc.selection.active;
201+
await formatter.formatRangeEditableDoc(mirroredDoc, [start, end], true);
202+
} else {
203+
await formatter.formatForward(mirroredDoc);
204+
}
197205
performHealthCheck = true;
198206
}
199207
if ((mirroredDoc.model.parinferReadiness.isIndentationHealthy || performHealthCheck) && performInferParens) {
@@ -217,7 +225,7 @@ function processChanges(event: vscode.TextDocumentChangeEvent) {
217225
model.lineInputModel.dirtyLines = []
218226
model.lineInputModel.insertedLines.clear()
219227
model.lineInputModel.deletedLines.clear();
220-
}
228+
}
221229
//else {
222230
// model.performInferParens = !vscode.TextDocumentChangeReason.Undo;
223231
//}

test-data/parinfer/formatter_sandbox.clj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
{:pirate-char pirate-char
2222
:pirates pirates}))
2323

24+
(map (fn [line]
25+
(if (re-matches #"^ *$" line))
26+
(str indent-before line)))
27+
2428
(reg-event-fx
2529
::foo
2630
(fn []

0 commit comments

Comments
 (0)