From 11d18302b19ce2c20d2ed9fca4f86f21a90c854f Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Thu, 21 Nov 2024 20:41:34 -0700 Subject: [PATCH 1/6] Set context keys for cell language when background is painted --- apps/vscode/src/providers/background.ts | 5 +++++ apps/vscode/src/vdoc/vdoc.ts | 8 ++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/vscode/src/providers/background.ts b/apps/vscode/src/providers/background.ts index 2aae39d7..45ada799 100644 --- a/apps/vscode/src/providers/background.ts +++ b/apps/vscode/src/providers/background.ts @@ -22,6 +22,7 @@ import { isQuartoDoc, kQuartoDocSelector } from "../core/doc"; import { MarkdownEngine } from "../markdown/engine"; import { isExecutableLanguageBlock } from "quarto-core"; import { vscRange } from "../core/range"; +import { mainLanguage } from "../vdoc/vdoc"; export function activateBackgroundHighlighter( context: vscode.ExtensionContext, @@ -162,6 +163,10 @@ async function setEditorHighlightDecorations( blockRanges.push(vscRange(block.range)); } + // expose cell language for use in keybindings, etc + const language = mainLanguage(tokens); + vscode.commands.executeCommand('setContext', 'quartoLangId', language?.ids[0]); + // find inline executable code for (let i = 0; i < editor.document.lineCount; i++) { const line = editor.document.lineAt(i); diff --git a/apps/vscode/src/vdoc/vdoc.ts b/apps/vscode/src/vdoc/vdoc.ts index 4e011fd6..bfe942a9 100644 --- a/apps/vscode/src/vdoc/vdoc.ts +++ b/apps/vscode/src/vdoc/vdoc.ts @@ -13,7 +13,7 @@ * */ -import { Position, TextDocument, Uri, Range, commands } from "vscode"; +import { Position, TextDocument, Uri, Range } from "vscode"; import { Token, isExecutableLanguageBlock, languageBlockAtPosition, languageNameFromBlock } from "quarto-core"; import { isQuartoDoc } from "../core/doc"; @@ -157,12 +157,8 @@ export async function virtualDocUri( export function languageAtPosition(tokens: Token[], position: Position) { const block = languageBlockAtPosition(tokens, position); if (block) { - const language = languageFromBlock(block); - // expose cell language for use in keybindings, etc - commands.executeCommand('setContext', 'quarto.cellLangId', language?.ids[0]); - return language; + return languageFromBlock(block); } else { - commands.executeCommand('setContext', 'quarto.cellLangId', undefined); return undefined; } } From 35ad78a81b8ef9459b3c8582309d7ae30ac72c4f Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Thu, 21 Nov 2024 20:47:43 -0700 Subject: [PATCH 2/6] Update changelog --- apps/vscode/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/vscode/CHANGELOG.md b/apps/vscode/CHANGELOG.md index 5a979c7d..b361dc59 100644 --- a/apps/vscode/CHANGELOG.md +++ b/apps/vscode/CHANGELOG.md @@ -3,7 +3,7 @@ ## 1.118.0 (unreleased) - Provide F1 help at cursor in Positron () -- Expose new context keys for the language of a specific cell () +- Expose new context keys for the main language of a document () ## 1.117.0 (Release on 2024-11-07) From 4a34c1fcf441948e5b8ed1c80cb08dba4b9dcd54 Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Tue, 26 Nov 2024 11:58:45 -0700 Subject: [PATCH 3/6] Do not set context keys along with painting background --- apps/vscode/src/providers/background.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/vscode/src/providers/background.ts b/apps/vscode/src/providers/background.ts index 45ada799..2aae39d7 100644 --- a/apps/vscode/src/providers/background.ts +++ b/apps/vscode/src/providers/background.ts @@ -22,7 +22,6 @@ import { isQuartoDoc, kQuartoDocSelector } from "../core/doc"; import { MarkdownEngine } from "../markdown/engine"; import { isExecutableLanguageBlock } from "quarto-core"; import { vscRange } from "../core/range"; -import { mainLanguage } from "../vdoc/vdoc"; export function activateBackgroundHighlighter( context: vscode.ExtensionContext, @@ -163,10 +162,6 @@ async function setEditorHighlightDecorations( blockRanges.push(vscRange(block.range)); } - // expose cell language for use in keybindings, etc - const language = mainLanguage(tokens); - vscode.commands.executeCommand('setContext', 'quartoLangId', language?.ids[0]); - // find inline executable code for (let i = 0; i < editor.document.lineCount; i++) { const line = editor.document.lineAt(i); From c6f28f8673d712ba7d430fd6ee48e2e38fb39970 Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Tue, 26 Nov 2024 11:59:08 -0700 Subject: [PATCH 4/6] Add new `activateContextKeySetter()` --- apps/vscode/src/extension.ts | 4 + apps/vscode/src/providers/context-keys.ts | 93 +++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 apps/vscode/src/providers/context-keys.ts diff --git a/apps/vscode/src/extension.ts b/apps/vscode/src/extension.ts index 251db7b9..b85e7e2b 100644 --- a/apps/vscode/src/extension.ts +++ b/apps/vscode/src/extension.ts @@ -23,6 +23,7 @@ import { activateDiagram } from "./providers/diagram/diagram"; import { activateOptionEnterProvider } from "./providers/option"; import { textFormattingCommands } from "./providers/text-format"; import { activateCodeFormatting } from "./providers/format"; +import { activateContextKeySetter } from "./providers/context-keys"; import { ExtensionHost } from "./host"; export function activateCommon( @@ -37,6 +38,9 @@ export function activateCommon( // background highlighter activateBackgroundHighlighter(context, engine); + // context setter + activateContextKeySetter(context, engine); + // diagramming const diagramCommands = activateDiagram(context, host, engine); diff --git a/apps/vscode/src/providers/context-keys.ts b/apps/vscode/src/providers/context-keys.ts new file mode 100644 index 00000000..f639c6a1 --- /dev/null +++ b/apps/vscode/src/providers/context-keys.ts @@ -0,0 +1,93 @@ +/* + * context-keys.ts + * + * Copyright (C) 2024 by Posit Software, PBC + * + * Unless you have received this program directly from Posit Software pursuant + * to the terms of a commercial license agreement with Posit Software, then + * this program is licensed to you under the terms of version 3 of the + * GNU Affero General Public License. This program is distributed WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the + * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. + * + */ + + +import * as vscode from "vscode"; +import debounce from "lodash.debounce"; + +import { isQuartoDoc } from "../core/doc"; +import { MarkdownEngine } from "../markdown/engine"; +import { mainLanguage } from "../vdoc/vdoc"; + +const debounceOnDidChangeDocumentMs = 250; + +export function activateContextKeySetter( + context: vscode.ExtensionContext, + engine: MarkdownEngine +) { + + // set context keys when docs are opened + vscode.workspace.onDidOpenTextDocument( + (doc) => { + if (doc === vscode.window.activeTextEditor?.document) { + if (isQuartoDoc(doc)) { + setContextKeys(vscode.window.activeTextEditor, engine); + } + } + }, + null, + context.subscriptions + ); + + // set context keys when visible text editors change + vscode.window.onDidChangeVisibleTextEditors( + (_editors) => { + triggerUpdateContextKeys(engine); + }, + null, + context.subscriptions + ); + + // set context keys on changes to the document (if its visible) + vscode.workspace.onDidChangeTextDocument( + (event) => { + const visibleEditor = vscode.window.visibleTextEditors.find(editor => { + return editor.document.uri.toString() === event.document.uri.toString(); + }); + if (visibleEditor) { + debounce( + () => setContextKeys(visibleEditor, engine), + debounceOnDidChangeDocumentMs + )(); + } + }, + null, + context.subscriptions + ); + + // set context keys at activation time + triggerUpdateContextKeys(engine); + +} + +function triggerUpdateContextKeys(engine: MarkdownEngine) { + for (const editor of vscode.window.visibleTextEditors) { + setContextKeys(editor, engine); + } +} + +function setContextKeys(editor: vscode.TextEditor, engine: MarkdownEngine) { + if (!editor || !isQuartoDoc(editor.document)) { + return; + } + + // expose main language for use in keybindings, etc + const tokens = engine.parse(editor.document); + const language = mainLanguage(tokens); + vscode.commands.executeCommand( + 'setContext', + 'quarto.document.languageId', + language?.ids[0]); +} From 8d00a51d44519ed9d4e47abdc47122e3c8e07151 Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Tue, 26 Nov 2024 13:47:09 -0700 Subject: [PATCH 5/6] Context keys only apply to *active* documents --- apps/vscode/src/providers/context-keys.ts | 31 ++++++++--------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/apps/vscode/src/providers/context-keys.ts b/apps/vscode/src/providers/context-keys.ts index f639c6a1..f10ac7ef 100644 --- a/apps/vscode/src/providers/context-keys.ts +++ b/apps/vscode/src/providers/context-keys.ts @@ -13,7 +13,6 @@ * */ - import * as vscode from "vscode"; import debounce from "lodash.debounce"; @@ -41,24 +40,24 @@ export function activateContextKeySetter( context.subscriptions ); - // set context keys when visible text editors change - vscode.window.onDidChangeVisibleTextEditors( - (_editors) => { - triggerUpdateContextKeys(engine); + // set context keys when active text editor changes + vscode.window.onDidChangeActiveTextEditor( + (editor) => { + if (editor) { + setContextKeys(editor, engine); + } }, null, context.subscriptions ); - // set context keys on changes to the document (if its visible) + // set context keys on changes to the document (if it's active) vscode.workspace.onDidChangeTextDocument( (event) => { - const visibleEditor = vscode.window.visibleTextEditors.find(editor => { - return editor.document.uri.toString() === event.document.uri.toString(); - }); - if (visibleEditor) { + const activeEditor = vscode.window.activeTextEditor; + if (activeEditor) { debounce( - () => setContextKeys(visibleEditor, engine), + () => setContextKeys(activeEditor, engine), debounceOnDidChangeDocumentMs )(); } @@ -66,16 +65,6 @@ export function activateContextKeySetter( null, context.subscriptions ); - - // set context keys at activation time - triggerUpdateContextKeys(engine); - -} - -function triggerUpdateContextKeys(engine: MarkdownEngine) { - for (const editor of vscode.window.visibleTextEditors) { - setContextKeys(editor, engine); - } } function setContextKeys(editor: vscode.TextEditor, engine: MarkdownEngine) { From a3535e0d159bbafdd45f48e35057f5833e20c463 Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Tue, 26 Nov 2024 13:54:09 -0700 Subject: [PATCH 6/6] We don't need `onDidOpenTextDocument()` because we have `onDidChangeActiveTextEditor()` --- apps/vscode/src/providers/context-keys.ts | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/apps/vscode/src/providers/context-keys.ts b/apps/vscode/src/providers/context-keys.ts index f10ac7ef..7b7dca6b 100644 --- a/apps/vscode/src/providers/context-keys.ts +++ b/apps/vscode/src/providers/context-keys.ts @@ -27,19 +27,6 @@ export function activateContextKeySetter( engine: MarkdownEngine ) { - // set context keys when docs are opened - vscode.workspace.onDidOpenTextDocument( - (doc) => { - if (doc === vscode.window.activeTextEditor?.document) { - if (isQuartoDoc(doc)) { - setContextKeys(vscode.window.activeTextEditor, engine); - } - } - }, - null, - context.subscriptions - ); - // set context keys when active text editor changes vscode.window.onDidChangeActiveTextEditor( (editor) => {