From 8eb28b6501bf6a17061e12405edccd4dc638d91e Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Wed, 9 Apr 2025 09:27:30 -0600 Subject: [PATCH 1/5] Display title on action bar for "Preview" --- apps/vscode/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/vscode/package.json b/apps/vscode/package.json index c7d86c75..898911c9 100644 --- a/apps/vscode/package.json +++ b/apps/vscode/package.json @@ -253,7 +253,8 @@ "command": "quarto.preview", "title": "Preview", "icon": "$(preview)", - "category": "Quarto" + "category": "Quarto", + "displayTitleOnActionBar": true }, { "command": "quarto.previewScript", From 306602e59aaa547c5d8d5e74e896f2d4868a77fa Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Mon, 14 Apr 2025 17:28:02 -0600 Subject: [PATCH 2/5] First draft of command to toggle render on save --- apps/vscode/package.json | 20 +++++++- apps/vscode/src/providers/preview/commands.ts | 49 ++++++++++++++----- .../src/providers/preview/preview-util.ts | 11 ++++- apps/vscode/src/providers/preview/preview.ts | 4 +- 4 files changed, 66 insertions(+), 18 deletions(-) diff --git a/apps/vscode/package.json b/apps/vscode/package.json index 898911c9..2e7208d9 100644 --- a/apps/vscode/package.json +++ b/apps/vscode/package.json @@ -254,7 +254,10 @@ "title": "Preview", "icon": "$(preview)", "category": "Quarto", - "displayTitleOnActionBar": true + "actionBarOptions": { + "controlType": "button", + "displayTitle": true + } }, { "command": "quarto.previewScript", @@ -426,6 +429,15 @@ "category": "Quarto", "enablement": "editorTextFocus && !editorReadonly && editorLangId == quarto" }, + { + "command": "quarto.toggleRenderOnSave", + "title": "Render on Save", + "enablement": "isPositron", + "actionBarOptions": { + "controlType": "checkbox", + "checked": "quarto.renderOnSave == true" + } + }, { "command": "quarto.zoteroConfigureLibrary", "category": "Quarto", @@ -679,6 +691,12 @@ "when": "editorLangId == mermaid || editorLangId == dot" } ], + "editor/actions/right": [ + { + "command": "quarto.toggleRenderOnSave", + "group": "navigation@101" + } + ], "notebook/toolbar": [ { "command": "quarto.preview", diff --git a/apps/vscode/src/providers/preview/commands.ts b/apps/vscode/src/providers/preview/commands.ts index 5117263b..c023dd67 100644 --- a/apps/vscode/src/providers/preview/commands.ts +++ b/apps/vscode/src/providers/preview/commands.ts @@ -16,7 +16,15 @@ import * as path from "path"; import * as fs from "fs"; -import { TextDocument, window, Uri, workspace, commands, QuickPickItem } from "vscode"; +import { + TextDocument, + window, + Uri, + workspace, + commands, + QuickPickItemKind, + ExtensionContext +} from "vscode"; import { QuartoContext, QuartoFormatInfo, quartoDocumentFormats } from "quarto-core"; import { Command } from "../../core/command"; @@ -29,18 +37,19 @@ import { canPreviewDoc, findQuartoEditor, isNotebook } from "../../core/doc"; import { renderOnSave } from "./preview-util"; import { documentFrontMatterYaml } from "../../markdown/document"; import { FormatQuickPickItem, RenderCommand } from "../render"; -import { QuickPickItemKind } from "vscode"; export function previewCommands( quartoContext: QuartoContext, + context: ExtensionContext, engine: MarkdownEngine ): Command[] { return [ - new PreviewCommand(quartoContext, engine), - new PreviewScriptCommand(quartoContext, engine), - new PreviewFormatCommand(quartoContext, engine), - new WalkthroughPreviewCommand(quartoContext, engine), + new PreviewCommand(quartoContext, context, engine), + new PreviewScriptCommand(quartoContext, context, engine), + new PreviewFormatCommand(quartoContext, context, engine), + new WalkthroughPreviewCommand(quartoContext, context, engine), new ClearCacheCommand(quartoContext, engine), + new ToggleRenderOnSaveCommand(context), ]; } const kChooseFormat = "EB451697-D09E-48F5-AA40-4DAE7E1D31B8"; @@ -49,6 +58,7 @@ const kChooseFormat = "EB451697-D09E-48F5-AA40-4DAE7E1D31B8"; abstract class PreviewDocumentCommandBase extends RenderCommand { constructor( quartoContext: QuartoContext, + private readonly context_: ExtensionContext, private readonly engine_: MarkdownEngine ) { super(quartoContext); @@ -56,7 +66,7 @@ abstract class PreviewDocumentCommandBase extends RenderCommand { protected async renderFormat(format?: string | null, onShow?: () => void) { const targetEditor = findQuartoEditor(this.engine_, this.quartoContext(), canPreviewDoc); if (targetEditor) { - const hasRenderOnSave = await renderOnSave(this.engine_, targetEditor.document); + const hasRenderOnSave = await renderOnSave(this.engine_, targetEditor.document, this.context_); const render = !hasRenderOnSave || (hasRenderOnSave && format) || @@ -127,8 +137,8 @@ abstract class PreviewDocumentCommandBase extends RenderCommand { class PreviewCommand extends PreviewDocumentCommandBase implements Command { - constructor(quartoContext: QuartoContext, engine: MarkdownEngine) { - super(quartoContext, engine); + constructor(quartoContext: QuartoContext, context: ExtensionContext, engine: MarkdownEngine) { + super(quartoContext, context, engine); } private static readonly id = "quarto.preview"; public readonly id = PreviewCommand.id; @@ -141,8 +151,8 @@ class PreviewCommand class PreviewScriptCommand extends PreviewDocumentCommandBase implements Command { - constructor(quartoContext: QuartoContext, engine: MarkdownEngine) { - super(quartoContext, engine); + constructor(quartoContext: QuartoContext, context: ExtensionContext, engine: MarkdownEngine) { + super(quartoContext, context, engine); } private static readonly id = "quarto.previewScript"; public readonly id = PreviewScriptCommand.id; @@ -155,8 +165,8 @@ class PreviewScriptCommand class PreviewFormatCommand extends PreviewDocumentCommandBase implements Command { - constructor(quartoContext: QuartoContext, engine: MarkdownEngine) { - super(quartoContext, engine); + constructor(quartoContext: QuartoContext, context: ExtensionContext, engine: MarkdownEngine) { + super(quartoContext, context, engine); } private static readonly id = "quarto.previewFormat"; public readonly id = PreviewFormatCommand.id; @@ -238,3 +248,16 @@ function cacheDirForDocument(doc: TextDocument) { return undefined; } + +class ToggleRenderOnSaveCommand implements Command { + constructor(private readonly context_: ExtensionContext) { } + private static readonly id = "quarto.toggleRenderOnSave"; + public readonly id = ToggleRenderOnSaveCommand.id; + + async execute() { + let renderOnSave = this.context_.workspaceState.get('positron.quarto.toggleRenderOnSave') === true; + renderOnSave = !renderOnSave; + this.context_.workspaceState.update('positron.quarto.toggleRenderOnSave', renderOnSave); + commands.executeCommand('setContext', 'quarto.renderOnSave', renderOnSave); + } +} diff --git a/apps/vscode/src/providers/preview/preview-util.ts b/apps/vscode/src/providers/preview/preview-util.ts index 491919cc..76b6afe0 100644 --- a/apps/vscode/src/providers/preview/preview-util.ts +++ b/apps/vscode/src/providers/preview/preview-util.ts @@ -28,6 +28,7 @@ import { isNotebook } from "../../core/doc"; import { MarkdownEngine } from "../../markdown/engine"; import { documentFrontMatter } from "../../markdown/document"; import { isKnitrDocument } from "../../host/executors"; +import { ExtensionContext } from "vscode"; export function isQuartoShinyDoc( @@ -87,7 +88,7 @@ async function parseRPackageDescription(): Promise { return ['']; } -export async function renderOnSave(engine: MarkdownEngine, document: TextDocument) { +export async function renderOnSave(engine: MarkdownEngine, document: TextDocument, context: ExtensionContext) { // if its a notebook and we don't have a save hook for notebooks then don't // allow renderOnSave (b/c we can't detect the saves) if (isNotebook(document) && !haveNotebookSaveEvents()) { @@ -99,7 +100,13 @@ export async function renderOnSave(engine: MarkdownEngine, document: TextDocumen return true; } - // first look for document level editor setting + // first look at workspace state for toggle value in Positron + const toggleRenderOnSave = context.workspaceState.get('positron.quarto.toggleRenderOnSave') === true; + if (toggleRenderOnSave) { + return toggleRenderOnSave; + } + + // next look for document level editor setting const docYaml = documentFrontMatter(engine, document); const docSetting = readRenderOnSave(docYaml); if (docSetting !== undefined) { diff --git a/apps/vscode/src/providers/preview/preview.ts b/apps/vscode/src/providers/preview/preview.ts index 5c8d93ea..25bfd8c5 100644 --- a/apps/vscode/src/providers/preview/preview.ts +++ b/apps/vscode/src/providers/preview/preview.ts @@ -120,7 +120,7 @@ export function activatePreview( if (editor) { if ( canPreviewDoc(editor.document) && - (await renderOnSave(engine, editor.document)) && + (await renderOnSave(engine, editor.document, context)) && (await previewManager.isPreviewRunningForDoc(editor.document)) ) { await previewDoc(editor, undefined, true, engine, quartoContext); @@ -172,7 +172,7 @@ export function activatePreview( ); // preview commands - return previewCommands(quartoContext, engine); + return previewCommands(quartoContext, context, engine); } From fbb5158094ed3096ab45544adeaed374c9c62a3d Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Mon, 14 Apr 2025 18:48:11 -0600 Subject: [PATCH 3/5] Link up toggle to setting --- apps/vscode/src/providers/preview/commands.ts | 33 +++++++++---------- .../src/providers/preview/preview-util.ts | 10 ++---- apps/vscode/src/providers/preview/preview.ts | 13 ++++++-- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/apps/vscode/src/providers/preview/commands.ts b/apps/vscode/src/providers/preview/commands.ts index c023dd67..e036cf36 100644 --- a/apps/vscode/src/providers/preview/commands.ts +++ b/apps/vscode/src/providers/preview/commands.ts @@ -40,16 +40,15 @@ import { FormatQuickPickItem, RenderCommand } from "../render"; export function previewCommands( quartoContext: QuartoContext, - context: ExtensionContext, engine: MarkdownEngine ): Command[] { return [ - new PreviewCommand(quartoContext, context, engine), - new PreviewScriptCommand(quartoContext, context, engine), - new PreviewFormatCommand(quartoContext, context, engine), - new WalkthroughPreviewCommand(quartoContext, context, engine), + new PreviewCommand(quartoContext, engine), + new PreviewScriptCommand(quartoContext, engine), + new PreviewFormatCommand(quartoContext, engine), + new WalkthroughPreviewCommand(quartoContext, engine), new ClearCacheCommand(quartoContext, engine), - new ToggleRenderOnSaveCommand(context), + new ToggleRenderOnSaveCommand(), ]; } const kChooseFormat = "EB451697-D09E-48F5-AA40-4DAE7E1D31B8"; @@ -58,7 +57,6 @@ const kChooseFormat = "EB451697-D09E-48F5-AA40-4DAE7E1D31B8"; abstract class PreviewDocumentCommandBase extends RenderCommand { constructor( quartoContext: QuartoContext, - private readonly context_: ExtensionContext, private readonly engine_: MarkdownEngine ) { super(quartoContext); @@ -66,7 +64,7 @@ abstract class PreviewDocumentCommandBase extends RenderCommand { protected async renderFormat(format?: string | null, onShow?: () => void) { const targetEditor = findQuartoEditor(this.engine_, this.quartoContext(), canPreviewDoc); if (targetEditor) { - const hasRenderOnSave = await renderOnSave(this.engine_, targetEditor.document, this.context_); + const hasRenderOnSave = await renderOnSave(this.engine_, targetEditor.document); const render = !hasRenderOnSave || (hasRenderOnSave && format) || @@ -137,8 +135,8 @@ abstract class PreviewDocumentCommandBase extends RenderCommand { class PreviewCommand extends PreviewDocumentCommandBase implements Command { - constructor(quartoContext: QuartoContext, context: ExtensionContext, engine: MarkdownEngine) { - super(quartoContext, context, engine); + constructor(quartoContext: QuartoContext, engine: MarkdownEngine) { + super(quartoContext, engine); } private static readonly id = "quarto.preview"; public readonly id = PreviewCommand.id; @@ -151,8 +149,8 @@ class PreviewCommand class PreviewScriptCommand extends PreviewDocumentCommandBase implements Command { - constructor(quartoContext: QuartoContext, context: ExtensionContext, engine: MarkdownEngine) { - super(quartoContext, context, engine); + constructor(quartoContext: QuartoContext, engine: MarkdownEngine) { + super(quartoContext, engine); } private static readonly id = "quarto.previewScript"; public readonly id = PreviewScriptCommand.id; @@ -165,8 +163,8 @@ class PreviewScriptCommand class PreviewFormatCommand extends PreviewDocumentCommandBase implements Command { - constructor(quartoContext: QuartoContext, context: ExtensionContext, engine: MarkdownEngine) { - super(quartoContext, context, engine); + constructor(quartoContext: QuartoContext, engine: MarkdownEngine) { + super(quartoContext, engine); } private static readonly id = "quarto.previewFormat"; public readonly id = PreviewFormatCommand.id; @@ -250,14 +248,15 @@ function cacheDirForDocument(doc: TextDocument) { } class ToggleRenderOnSaveCommand implements Command { - constructor(private readonly context_: ExtensionContext) { } + constructor() { } private static readonly id = "quarto.toggleRenderOnSave"; public readonly id = ToggleRenderOnSaveCommand.id; async execute() { - let renderOnSave = this.context_.workspaceState.get('positron.quarto.toggleRenderOnSave') === true; + const config = workspace.getConfiguration("quarto"); + let renderOnSave = config.get("render.renderOnSave", false); renderOnSave = !renderOnSave; - this.context_.workspaceState.update('positron.quarto.toggleRenderOnSave', renderOnSave); + config.update("render.renderOnSave", renderOnSave, true); commands.executeCommand('setContext', 'quarto.renderOnSave', renderOnSave); } } diff --git a/apps/vscode/src/providers/preview/preview-util.ts b/apps/vscode/src/providers/preview/preview-util.ts index 76b6afe0..13c005f9 100644 --- a/apps/vscode/src/providers/preview/preview-util.ts +++ b/apps/vscode/src/providers/preview/preview-util.ts @@ -88,7 +88,7 @@ async function parseRPackageDescription(): Promise { return ['']; } -export async function renderOnSave(engine: MarkdownEngine, document: TextDocument, context: ExtensionContext) { +export async function renderOnSave(engine: MarkdownEngine, document: TextDocument) { // if its a notebook and we don't have a save hook for notebooks then don't // allow renderOnSave (b/c we can't detect the saves) if (isNotebook(document) && !haveNotebookSaveEvents()) { @@ -100,13 +100,7 @@ export async function renderOnSave(engine: MarkdownEngine, document: TextDocumen return true; } - // first look at workspace state for toggle value in Positron - const toggleRenderOnSave = context.workspaceState.get('positron.quarto.toggleRenderOnSave') === true; - if (toggleRenderOnSave) { - return toggleRenderOnSave; - } - - // next look for document level editor setting + // first look for document level editor setting const docYaml = documentFrontMatter(engine, document); const docSetting = readRenderOnSave(docYaml); if (docSetting !== undefined) { diff --git a/apps/vscode/src/providers/preview/preview.ts b/apps/vscode/src/providers/preview/preview.ts index 25bfd8c5..159fde73 100644 --- a/apps/vscode/src/providers/preview/preview.ts +++ b/apps/vscode/src/providers/preview/preview.ts @@ -22,6 +22,7 @@ import * as semver from "semver"; import vscode, { commands, env, + workspace, ExtensionContext, MessageItem, Terminal, @@ -88,6 +89,7 @@ import { yamlErrorLocation, } from "./preview-errors"; import { ExtensionHost } from "../../host"; +import { hasHooks } from "../../host/hooks"; tmp.setGracefulCleanup(); @@ -110,6 +112,13 @@ export function activatePreview( context.subscriptions.push(previewManager); } + // initialize Positron toggle from setting + if (hasHooks()) { + const config = workspace.getConfiguration("quarto"); + const renderOnSave = config.get("render.renderOnSave", false); + commands.executeCommand("setContext", "quarto.renderOnSave", renderOnSave); + } + // render on save const onSave = async (docUri: Uri) => { const editor = findQuartoEditor( @@ -120,7 +129,7 @@ export function activatePreview( if (editor) { if ( canPreviewDoc(editor.document) && - (await renderOnSave(engine, editor.document, context)) && + (await renderOnSave(engine, editor.document)) && (await previewManager.isPreviewRunningForDoc(editor.document)) ) { await previewDoc(editor, undefined, true, engine, quartoContext); @@ -172,7 +181,7 @@ export function activatePreview( ); // preview commands - return previewCommands(quartoContext, context, engine); + return previewCommands(quartoContext, engine); } From 79e44ea94fa331ac374a0d7bbcd31f5e06093e57 Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Mon, 14 Apr 2025 20:56:56 -0600 Subject: [PATCH 4/5] Remove extra imports --- apps/vscode/src/providers/preview/commands.ts | 1 - apps/vscode/src/providers/preview/preview-util.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/apps/vscode/src/providers/preview/commands.ts b/apps/vscode/src/providers/preview/commands.ts index e036cf36..002592c9 100644 --- a/apps/vscode/src/providers/preview/commands.ts +++ b/apps/vscode/src/providers/preview/commands.ts @@ -23,7 +23,6 @@ import { workspace, commands, QuickPickItemKind, - ExtensionContext } from "vscode"; import { QuartoContext, QuartoFormatInfo, quartoDocumentFormats } from "quarto-core"; diff --git a/apps/vscode/src/providers/preview/preview-util.ts b/apps/vscode/src/providers/preview/preview-util.ts index 13c005f9..491919cc 100644 --- a/apps/vscode/src/providers/preview/preview-util.ts +++ b/apps/vscode/src/providers/preview/preview-util.ts @@ -28,7 +28,6 @@ import { isNotebook } from "../../core/doc"; import { MarkdownEngine } from "../../markdown/engine"; import { documentFrontMatter } from "../../markdown/document"; import { isKnitrDocument } from "../../host/executors"; -import { ExtensionContext } from "vscode"; export function isQuartoShinyDoc( From b6fd6f5cf927e50983dea2047b899f2c55854f65 Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Tue, 15 Apr 2025 09:45:32 -0600 Subject: [PATCH 5/5] Try to read from setting to initialize, then store in workspace settings --- apps/vscode/src/providers/preview/commands.ts | 34 ++++++++++--------- .../src/providers/preview/preview-util.ts | 12 +++++-- apps/vscode/src/providers/preview/preview.ts | 7 ++-- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/apps/vscode/src/providers/preview/commands.ts b/apps/vscode/src/providers/preview/commands.ts index 002592c9..7f1dd0d2 100644 --- a/apps/vscode/src/providers/preview/commands.ts +++ b/apps/vscode/src/providers/preview/commands.ts @@ -23,6 +23,7 @@ import { workspace, commands, QuickPickItemKind, + ExtensionContext, } from "vscode"; import { QuartoContext, QuartoFormatInfo, quartoDocumentFormats } from "quarto-core"; @@ -39,15 +40,16 @@ import { FormatQuickPickItem, RenderCommand } from "../render"; export function previewCommands( quartoContext: QuartoContext, + context: ExtensionContext, engine: MarkdownEngine ): Command[] { return [ - new PreviewCommand(quartoContext, engine), - new PreviewScriptCommand(quartoContext, engine), - new PreviewFormatCommand(quartoContext, engine), - new WalkthroughPreviewCommand(quartoContext, engine), + new PreviewCommand(quartoContext, context, engine), + new PreviewScriptCommand(quartoContext, context, engine), + new PreviewFormatCommand(quartoContext, context, engine), + new WalkthroughPreviewCommand(quartoContext, context, engine), new ClearCacheCommand(quartoContext, engine), - new ToggleRenderOnSaveCommand(), + new ToggleRenderOnSaveCommand(context), ]; } const kChooseFormat = "EB451697-D09E-48F5-AA40-4DAE7E1D31B8"; @@ -56,6 +58,7 @@ const kChooseFormat = "EB451697-D09E-48F5-AA40-4DAE7E1D31B8"; abstract class PreviewDocumentCommandBase extends RenderCommand { constructor( quartoContext: QuartoContext, + private readonly context_: ExtensionContext, private readonly engine_: MarkdownEngine ) { super(quartoContext); @@ -63,7 +66,7 @@ abstract class PreviewDocumentCommandBase extends RenderCommand { protected async renderFormat(format?: string | null, onShow?: () => void) { const targetEditor = findQuartoEditor(this.engine_, this.quartoContext(), canPreviewDoc); if (targetEditor) { - const hasRenderOnSave = await renderOnSave(this.engine_, targetEditor.document); + const hasRenderOnSave = await renderOnSave(this.engine_, targetEditor.document, this.context_); const render = !hasRenderOnSave || (hasRenderOnSave && format) || @@ -134,8 +137,8 @@ abstract class PreviewDocumentCommandBase extends RenderCommand { class PreviewCommand extends PreviewDocumentCommandBase implements Command { - constructor(quartoContext: QuartoContext, engine: MarkdownEngine) { - super(quartoContext, engine); + constructor(quartoContext: QuartoContext, context: ExtensionContext, engine: MarkdownEngine) { + super(quartoContext, context, engine); } private static readonly id = "quarto.preview"; public readonly id = PreviewCommand.id; @@ -148,8 +151,8 @@ class PreviewCommand class PreviewScriptCommand extends PreviewDocumentCommandBase implements Command { - constructor(quartoContext: QuartoContext, engine: MarkdownEngine) { - super(quartoContext, engine); + constructor(quartoContext: QuartoContext, context: ExtensionContext, engine: MarkdownEngine) { + super(quartoContext, context, engine); } private static readonly id = "quarto.previewScript"; public readonly id = PreviewScriptCommand.id; @@ -162,8 +165,8 @@ class PreviewScriptCommand class PreviewFormatCommand extends PreviewDocumentCommandBase implements Command { - constructor(quartoContext: QuartoContext, engine: MarkdownEngine) { - super(quartoContext, engine); + constructor(quartoContext: QuartoContext, context: ExtensionContext, engine: MarkdownEngine) { + super(quartoContext, context, engine); } private static readonly id = "quarto.previewFormat"; public readonly id = PreviewFormatCommand.id; @@ -247,15 +250,14 @@ function cacheDirForDocument(doc: TextDocument) { } class ToggleRenderOnSaveCommand implements Command { - constructor() { } + constructor(private readonly context_: ExtensionContext) { } private static readonly id = "quarto.toggleRenderOnSave"; public readonly id = ToggleRenderOnSaveCommand.id; async execute() { - const config = workspace.getConfiguration("quarto"); - let renderOnSave = config.get("render.renderOnSave", false); + let renderOnSave = this.context_.workspaceState.get('positron.quarto.toggleRenderOnSave') === true; renderOnSave = !renderOnSave; - config.update("render.renderOnSave", renderOnSave, true); + this.context_.workspaceState.update('positron.quarto.toggleRenderOnSave', renderOnSave); commands.executeCommand('setContext', 'quarto.renderOnSave', renderOnSave); } } diff --git a/apps/vscode/src/providers/preview/preview-util.ts b/apps/vscode/src/providers/preview/preview-util.ts index 491919cc..fd30f2e8 100644 --- a/apps/vscode/src/providers/preview/preview-util.ts +++ b/apps/vscode/src/providers/preview/preview-util.ts @@ -16,7 +16,7 @@ import semver from "semver"; import vscode from "vscode"; -import { TextDocument, Uri, workspace } from "vscode"; +import { TextDocument, ExtensionContext, workspace } from "vscode"; import { projectDirForDocument, @@ -87,7 +87,7 @@ async function parseRPackageDescription(): Promise { return ['']; } -export async function renderOnSave(engine: MarkdownEngine, document: TextDocument) { +export async function renderOnSave(engine: MarkdownEngine, document: TextDocument, context: ExtensionContext) { // if its a notebook and we don't have a save hook for notebooks then don't // allow renderOnSave (b/c we can't detect the saves) if (isNotebook(document) && !haveNotebookSaveEvents()) { @@ -99,7 +99,13 @@ export async function renderOnSave(engine: MarkdownEngine, document: TextDocumen return true; } - // first look for document level editor setting + // first look at workspace state for toggle value in Positron + const toggleRenderOnSave = context.workspaceState.get('positron.quarto.toggleRenderOnSave') === true; + if (toggleRenderOnSave) { + return toggleRenderOnSave; + } + + // next look for document level editor setting const docYaml = documentFrontMatter(engine, document); const docSetting = readRenderOnSave(docYaml); if (docSetting !== undefined) { diff --git a/apps/vscode/src/providers/preview/preview.ts b/apps/vscode/src/providers/preview/preview.ts index 159fde73..47a3ff24 100644 --- a/apps/vscode/src/providers/preview/preview.ts +++ b/apps/vscode/src/providers/preview/preview.ts @@ -112,11 +112,12 @@ export function activatePreview( context.subscriptions.push(previewManager); } - // initialize Positron toggle from setting + // initialize Positron toggle from setting, store in workspace storage if (hasHooks()) { const config = workspace.getConfiguration("quarto"); const renderOnSave = config.get("render.renderOnSave", false); commands.executeCommand("setContext", "quarto.renderOnSave", renderOnSave); + context.workspaceState.update('positron.quarto.toggleRenderOnSave', renderOnSave); } // render on save @@ -129,7 +130,7 @@ export function activatePreview( if (editor) { if ( canPreviewDoc(editor.document) && - (await renderOnSave(engine, editor.document)) && + (await renderOnSave(engine, editor.document, context)) && (await previewManager.isPreviewRunningForDoc(editor.document)) ) { await previewDoc(editor, undefined, true, engine, quartoContext); @@ -181,7 +182,7 @@ export function activatePreview( ); // preview commands - return previewCommands(quartoContext, engine); + return previewCommands(quartoContext, context, engine); }