Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Additional language options in config? #228

Open
tarensanders opened this issue Feb 5, 2022 · 11 comments
Open

Additional language options in config? #228

tarensanders opened this issue Feb 5, 2022 · 11 comments

Comments

@tarensanders
Copy link

Hi there,

I really like this extension, but I'm running into a problem not dissimilar to #98. In this case my issue is with R Markdown files. I can change the default language for .Rmd files (as described here), but the issue is then I lose any functionality related to R Markdown (for example, custom buttons for sending the .Rmd to Pandoc, automatic render in a side panel on save, etc).

My current workflow is to write with the language set to R Markdown, and then change it at the end to markdown and fix all the linting issues. I'm wondering if, as suggested in this comment if a language tag in the config file is possible?

@DavidAnson
Copy link
Owner

DavidAnson commented Feb 5, 2022

A bit of context first, apologies if you know all of this already...

Briefly, this extension acts on files that VS Code identifies as using the "markdown" language. It seems the files you are working with have a different language identifier, probably so they can be handled specially, possibly by a custom extension you've installed. It's possible for us to identify and include that language in the list of what this extension supports. HOWEVER, as with the MDX file type in the issue you link, that risks confusing or wrong behavior if the new file type doesn't play by all of the same rules that standard CommonMark Markdown does.

I had a quick look at the cheat sheet for R Markdown here: https://www.rstudio.com/wp-content/uploads/2015/03/rmarkdown-reference.pdf. It seems to be standard Markdown, but I'd like to be more sure of that before making an impactful change to the extension. Perhaps you are aware of a more formal specification or can find a more definite statement of what RMD files can do?

PS: As I write this, it occurs to me that I could add a setting for users to opt into additional languages. Unfortunately, some aspects of the way Code requires extensions to declare language support make it difficult/awkward to do so. I don't think this is the best path forward.

@nschonni
Copy link
Contributor

nschonni commented Feb 5, 2022

https://github.com/streetsidesoftware/vscode-spell-checker is an example of allowing users to enable the extension on different file types in Code. There is a difference though, since that then writes the config file to opt-in

@DavidAnson
Copy link
Owner

My lesser worry is having to update code action provider registration dynamically if language became configurable:

const documentSelector = {"language": markdownLanguageId};

My bigger worry is that configuring an extension to properly get loaded when its associated language is used as a declarative step, defined in a file that is statically included with the extension:

"onLanguage:markdown",

Maybe activation can be defined on the fly? Perhaps you know? I am not familiar with how that extension works yet.

@nschonni
Copy link
Contributor

nschonni commented Feb 5, 2022

@tarensanders
Copy link
Author

HOWEVER, as with the MDX file type in the issue you link, that risks confusing or wrong behavior if the new file type doesn't play by all of the same rules that standard CommonMark Markdown does.

Absolutely - I can see how this would be a problem. To be clear, I'm only suggesting that markdownlint allow users to add additional file extensions or languages to try to lint, but not to do so by default.

I had a quick look at the cheat sheet for R Markdown here: https://www.rstudio.com/wp-content/uploads/2015/03/rmarkdown-reference.pdf. It seems to be standard Markdown, but I'd like to be more sure of that before making an impactful change to the extension. Perhaps you are aware of a more formal specification or can find a more definite statement of what RMD files can do?

I couldn't find a formal specification, but in the preface to the book about the format, the author of the format gives some details that might help. RMD is really meant to be the same as MD, only that any R code in the file can be converted into raw markdown later. All of this code has to be tagged, and tagged in a way that conforms with markdown.

As a quick sanity check, I ran half a dozen of the most complex Rmd files I have on hand through markdownlint. There were no warnings that contradict Rmd requirements in any of them. MD025 does show up in all of them since typically Rmd gets translated in Pandoc, and the title is different from a first level heading. But, that already has a workaround.

Also, just wanted to note that I'm more than happy to help if I can. I have no real experience with JS though. You might decide that supporting other languages is outside of scope (a totally reasonable decision), but if you do pursue it I'm happy to write docs or provide example Rmd files for tests.

@DavidAnson
Copy link
Owner

@tarensanders What extension do you use to provide RMD support in VS Code? I have an idea how to do solve this by adding the .RMD extension to the markdown language via the languages contribution point, but I'm not sure that is supported and would need to experiment.

https://code.visualstudio.com/api/references/contribution-points#contributes.languages

@tarensanders
Copy link
Author

What extension do you use to provide RMD support in VS Code?

The R language extension also supports RMD. (You can see what's supported here if that's helpful).

@DavidAnson
Copy link
Owner

My idea above does not work; VS Code seems to require that an extension may only be associated with a single language ID.

diff --git a/package.json b/package.json
index fb4a7e9..057f89f 100644
--- a/package.json
+++ b/package.json
@@ -157,6 +157,14 @@
 				}
 			}
 		],
+		"languages": [
+			{
+				"id": "markdown",
+				"extensions": [
+					".rmd"
+				]
+			}
+		],
 		"snippets": [
 			{
 				"language": "markdown",

@DavidAnson
Copy link
Owner

Adding explicit support for the "rmd" language ID that's defined by the extension you link to does seem to work. I'm not sure how I feel about this, though, as it does not scale well and feels somewhat like a hack. For example, it will only work if that extension is also installed or else the "rmd" language ID won't be defined. And it would need to hardcode whatever language ID a different R extension chooses if there is one. My preference is for VS Code to allow language IDs to be inherited so R Markdown files could be defined as Markdown files with extra stuff and no changes would be needed to this extension.

diff --git a/extension.js b/extension.js
index a2dd969..e6a4726 100644
--- a/extension.js
+++ b/extension.js
@@ -505,7 +505,7 @@ function markdownlintWrapper (document) {
 // Returns if the document is Markdown
 function isMarkdownDocument (document) {
 	return (
-		(document.languageId === markdownLanguageId) &&
+		((document.languageId === markdownLanguageId) || (document.languageId === "rmd")) &&
 		!markdownSchemesToIgnore.has(document.uri.scheme)
 	);
 }
@@ -958,7 +958,10 @@ function activate (context) {
 	);
 
 	// Register CodeActionsProvider
-	const documentSelector = {"language": markdownLanguageId};
+	const documentSelector = [
+		{"language": markdownLanguageId},
+		{"language": "rmd"}
+	];
 	const codeActionProvider = {
 		provideCodeActions
 	};
diff --git a/package.json b/package.json
index fb4a7e9..a217230 100644
--- a/package.json
+++ b/package.json
@@ -66,6 +66,7 @@
 	],
 	"activationEvents": [
 		"onLanguage:markdown",
+		"onLanguage:rmd",
 		"onCommand:markdownlint.fixAll",
 		"onCommand:markdownlint.lintWorkspace",
 		"onCommand:markdownlint.openConfigFile",
@@ -104,7 +105,7 @@
 			"commandPalette": [
 				{
 					"command": "markdownlint.fixAll",
-					"when": "editorLangId == markdown"
+					"when": "editorLangId == markdown || editorLangId == rmd"
 				},
 				{
 					"command": "markdownlint.lintWorkspace",

andrew-1234 added a commit to andrew-1234/vscode-markdownlint that referenced this issue Dec 29, 2022
- based on comment from markdownlint package author David Anson here DavidAnson#228 (comment)
@mcanouil
Copy link

FYI, for Quarto, the language ID used is "quarto". The issue is the same as for Rmarkdown in this case.

Rather than modifying the extension and hardcode anything, could a new parameter to allow the users to set language ID be implemented?

@DavidAnson
Copy link
Owner

activationEvents shown above is a static configuration that is part of the extension package and so there is not an opportunity for extension code to read a setting and change that value (short of editing that file directly which is not supported as far as I know).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants