Syntax: Don't highlight the LHS of type decl as types - #81

Open
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs
Open

Syntax: Don't highlight the LHS of type decl as types#81
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs

Conversation

@Julow

Copy link
Copy Markdown
Contributor

I would expect ocamlTypeConstr to apply only to type constructors
within type expressions, not to the identifier after type in:

typefoo = 'abarlist

foo is not highlighted with:

hilinkocamlTypeConstrType

This makes the LHS of types, exceptions and constraints be matched as
ocamlTypedef, which is not highlighted by default.

Variance and type variables on the LHS remain highlighted as before.

@Julow

Copy link
Copy Markdown
ContributorAuthor

Ping @Maelan

@Maelan

Copy link
Copy Markdown
Contributor

Thanks @Julow! I’m fine either way. I’m just slightly concerned by adding complexity to that already complex piece, but I let our maintainers judge.

You’d also have to deal with type t = ... and u = ..., though.

Comment threadsyntax/ocaml.vim Outdated
Comment threadsyntax/ocaml.vim
\ matchgroup=ocamlTypedef end="\<\(\w\|'\)*\>"
\ contains=@ocamlAllErrs,ocamlComment,ocamlTypeVariance,ocamlTypeVar
\ skipwhite skipempty
\ nextgroup=ocamlTypeDefImpl

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I note that with this technique, there must be no comment (* *) between the defined type name and the equal sign =, which may be acceptable (we already have that limitation elsewhere).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this. Perhaps because the end regex don't contain \@= ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven’t actually tested your code, but from what I understand about nextgroup= and contained, the ocamlTypeDefImpl group will never be tried except immediately after the end of the ocamlTypeDef group.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is what skipwhite is doing, from the :h:

These arguments are only used in combination with "nextgroup".	They can be
used to allow the next group to match after skipping some text:
skipwhite	skip over space and tab characters
skipnl skip over the end of a line
skipempty	skip over empty lines (implies a "skipnl")

I took thought this was doing something between start and end and nothing outside but it's actually the opposite, they take effect after end and do nothing inside the region (whitespace are skipped by default it seems).

@rgrinberg
rgrinberg requested a review from copyJuly 20, 2022 02:15
@Julow

Copy link
Copy Markdown
ContributorAuthor

I fixed the problems with and and restored the highlighting of exception. module-rec-and (which are broken on master) and let-and are not altered.

Comparison before/after with hi link ocamlTypeConstr Type:

image

@copy

copy commented Jul 20, 2022

Copy link
Copy Markdown
Collaborator

Fundamentally this change is fine, but I think we leave the current behavior configurable (personally, I prefer the current behavior).

This seems to break some things, in particular (from type-linter-test.ml):

type('a, 'b) t = 'alist* ('a, 'b) result(* the left pair of parenthesis *)typenonrec 'a o = 'aoption=privateNone | Someof'a(* the second equal sign *)typet += Cofint(* the of *)

The module-rec-and find is interesting, would you mind adding it to type-linter-test.ml with a fixme?

Comment threadsyntax/ocaml.vim
@Julow

Copy link
Copy Markdown
ContributorAuthor

I missed type-linter-test.ml, thanks.

I've added a way to get back the current behavior, what should be the default ? This is governed by hi link ocamlTypeIdentifier x which could be ocamlLCIdentifier (new) or ocamlTypeConstr (previous).

I've fixed the bugs with type params and equal signs but I introduced new bugs around let-bindings, which are matched as type decl. I would like ocamlTypeDefImpl to take effect only when invoked with nextgroup, is here a way to do that ? Otherwise, we need stronger rules for let-bindings.

Julow added 6 commits June 8, 2023 16:20
I would expect 'ocamlTypeConstr' to apply only to type constructors
within type expressions, not to the identifier after 'type' in:
type foo = 'a bar list
This makes the LHS of types, exceptions and constraints be matched as
'ocamlTypedef', which is not highlighted by default.
Variance and type variables on the LHS remain highlighted as before.
Have stricter rules for the identifiers and allow exception constructors
to be highlighted as before.
A new region is used to avoid matching the 'and' keyword too often (that
would interfere with let-and and module-rec-and.
Fix tupled type params, += and whitespaces around keywords.
Add examples to the test file.
Using the commit date instead of the author date.
@Julow
Julowforce-pushed the syn_type_decl_lhs branch from cebc78e to 921eed7CompareJune 8, 2023 14:27
@Julow

Julow commented Jun 8, 2023

Copy link
Copy Markdown
ContributorAuthor

Any opinion on this ?

Here's how it can be used:

hilinkocamlTypeConstrTypehilinkocamlTypeIdentifierIdentifier

The first line is both before and after this PR. The second line is with the two line above applied:

vimocamlshot

@rgrinberg

Copy link
Copy Markdown
Member

@copy do you want to make the call on this?

@copy

copy commented Jun 9, 2023

Copy link
Copy Markdown
Collaborator

This change and the mechanism to configure it looks good.

However, it causes some problems with the highlighting of number literals (highlighted as error across the type-linter-test.ml file), the fun keyword (highlighted like a type on line 332 and 338) and comments (a correct type highlighting is removed from line 349). You can use vim's :TOhtml followed by diff (or vimdiff, patdiff, ...) to check.

Julow added 2 commits June 20, 2023 11:37
It's a `contained` region but was not added to `ocamlContained`.
This is a styling change.
@Julow

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I fixed this issue, it was a missing ocamlContained declaration. I also changed my editor setup to use this patch everyday to be sure to test it well.

@copy

copy commented Jun 26, 2023

Copy link
Copy Markdown
Collaborator

Thanks! Super-minor, but it still removes the type highlighting from the following (on the int):

typet (*c*) = int

@Julow

Copy link
Copy Markdown
ContributorAuthor

Good catch! I'm failing to fix it.

The ocamlTypeDef region ends at t and jump into the ocamlTypeDefImpl region, which starts at = using nextgroup. I couldn't find a way to accept the comment without interfering with nextgroup, which is very handy to handle types without RHS and and types.
Any idea ?

@copy

copy commented Jun 27, 2023

Copy link
Copy Markdown
Collaborator

This comment from @Maelan looks relevant: #81 (comment)

@Julow

Julow commented Jul 3, 2023

Copy link
Copy Markdown
ContributorAuthor

Sorry for the slow reply. I managed to handle the comment at this location while keeping nextgroup working for and types.

@copy

copy commented Jul 4, 2023

Copy link
Copy Markdown
Collaborator

The latest commit seems to have broken the highlighting of identifiers in some places (e.g. the f in line 49 is recognized as a type). You can use :TOhtml and diff to find any differences between this branch and master.

@Julow

Julow commented Jul 5, 2023

Copy link
Copy Markdown
ContributorAuthor

I think I managed to fix the identifier issue. The TOhtml diff seems fine now. The added Error class is due to a newly added test case.

@copy

copy commented Jul 6, 2023

Copy link
Copy Markdown
Collaborator

On the last commit (817e8f7), some highlights are still incorrect (e.g. the let f on line 49), and show up in the diff.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Julow@Maelan@copy@rgrinberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Syntax: Don't highlight the LHS of type decl as types - #81

Open
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs
Open

Syntax: Don't highlight the LHS of type decl as types#81
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs

Conversation

@Julow

Copy link
Copy Markdown
Contributor

I would expect ocamlTypeConstr to apply only to type constructors
within type expressions, not to the identifier after type in:

typefoo = 'abarlist

foo is not highlighted with:

hilinkocamlTypeConstrType

This makes the LHS of types, exceptions and constraints be matched as
ocamlTypedef, which is not highlighted by default.

Variance and type variables on the LHS remain highlighted as before.

@Julow

Copy link
Copy Markdown
ContributorAuthor

Ping @Maelan

@Maelan

Copy link
Copy Markdown
Contributor

Thanks @Julow! I’m fine either way. I’m just slightly concerned by adding complexity to that already complex piece, but I let our maintainers judge.

You’d also have to deal with type t = ... and u = ..., though.

Comment threadsyntax/ocaml.vim Outdated
Comment threadsyntax/ocaml.vim
\ matchgroup=ocamlTypedef end="\<\(\w\|'\)*\>"
\ contains=@ocamlAllErrs,ocamlComment,ocamlTypeVariance,ocamlTypeVar
\ skipwhite skipempty
\ nextgroup=ocamlTypeDefImpl

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I note that with this technique, there must be no comment (* *) between the defined type name and the equal sign =, which may be acceptable (we already have that limitation elsewhere).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this. Perhaps because the end regex don't contain \@= ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven’t actually tested your code, but from what I understand about nextgroup= and contained, the ocamlTypeDefImpl group will never be tried except immediately after the end of the ocamlTypeDef group.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is what skipwhite is doing, from the :h:

These arguments are only used in combination with "nextgroup".	They can be
used to allow the next group to match after skipping some text:
skipwhite	skip over space and tab characters
skipnl skip over the end of a line
skipempty	skip over empty lines (implies a "skipnl")

I took thought this was doing something between start and end and nothing outside but it's actually the opposite, they take effect after end and do nothing inside the region (whitespace are skipped by default it seems).

@rgrinberg
rgrinberg requested a review from copyJuly 20, 2022 02:15
@Julow

Copy link
Copy Markdown
ContributorAuthor

I fixed the problems with and and restored the highlighting of exception. module-rec-and (which are broken on master) and let-and are not altered.

Comparison before/after with hi link ocamlTypeConstr Type:

image

@copy

copy commented Jul 20, 2022

Copy link
Copy Markdown
Collaborator

Fundamentally this change is fine, but I think we leave the current behavior configurable (personally, I prefer the current behavior).

This seems to break some things, in particular (from type-linter-test.ml):

type('a, 'b) t = 'alist* ('a, 'b) result(* the left pair of parenthesis *)typenonrec 'a o = 'aoption=privateNone | Someof'a(* the second equal sign *)typet += Cofint(* the of *)

The module-rec-and find is interesting, would you mind adding it to type-linter-test.ml with a fixme?

Comment threadsyntax/ocaml.vim
@Julow

Copy link
Copy Markdown
ContributorAuthor

I missed type-linter-test.ml, thanks.

I've added a way to get back the current behavior, what should be the default ? This is governed by hi link ocamlTypeIdentifier x which could be ocamlLCIdentifier (new) or ocamlTypeConstr (previous).

I've fixed the bugs with type params and equal signs but I introduced new bugs around let-bindings, which are matched as type decl. I would like ocamlTypeDefImpl to take effect only when invoked with nextgroup, is here a way to do that ? Otherwise, we need stronger rules for let-bindings.

Julow added 6 commits June 8, 2023 16:20
I would expect 'ocamlTypeConstr' to apply only to type constructors
within type expressions, not to the identifier after 'type' in:
type foo = 'a bar list
This makes the LHS of types, exceptions and constraints be matched as
'ocamlTypedef', which is not highlighted by default.
Variance and type variables on the LHS remain highlighted as before.
Have stricter rules for the identifiers and allow exception constructors
to be highlighted as before.
A new region is used to avoid matching the 'and' keyword too often (that
would interfere with let-and and module-rec-and.
Fix tupled type params, += and whitespaces around keywords.
Add examples to the test file.
Using the commit date instead of the author date.
@Julow
Julowforce-pushed the syn_type_decl_lhs branch from cebc78e to 921eed7CompareJune 8, 2023 14:27
@Julow

Julow commented Jun 8, 2023

Copy link
Copy Markdown
ContributorAuthor

Any opinion on this ?

Here's how it can be used:

hilinkocamlTypeConstrTypehilinkocamlTypeIdentifierIdentifier

The first line is both before and after this PR. The second line is with the two line above applied:

vimocamlshot

@rgrinberg

Copy link
Copy Markdown
Member

@copy do you want to make the call on this?

@copy

copy commented Jun 9, 2023

Copy link
Copy Markdown
Collaborator

This change and the mechanism to configure it looks good.

However, it causes some problems with the highlighting of number literals (highlighted as error across the type-linter-test.ml file), the fun keyword (highlighted like a type on line 332 and 338) and comments (a correct type highlighting is removed from line 349). You can use vim's :TOhtml followed by diff (or vimdiff, patdiff, ...) to check.

Julow added 2 commits June 20, 2023 11:37
It's a `contained` region but was not added to `ocamlContained`.
This is a styling change.
@Julow

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I fixed this issue, it was a missing ocamlContained declaration. I also changed my editor setup to use this patch everyday to be sure to test it well.

@copy

copy commented Jun 26, 2023

Copy link
Copy Markdown
Collaborator

Thanks! Super-minor, but it still removes the type highlighting from the following (on the int):

typet (*c*) = int

@Julow

Copy link
Copy Markdown
ContributorAuthor

Good catch! I'm failing to fix it.

The ocamlTypeDef region ends at t and jump into the ocamlTypeDefImpl region, which starts at = using nextgroup. I couldn't find a way to accept the comment without interfering with nextgroup, which is very handy to handle types without RHS and and types.
Any idea ?

@copy

copy commented Jun 27, 2023

Copy link
Copy Markdown
Collaborator

This comment from @Maelan looks relevant: #81 (comment)

@Julow

Julow commented Jul 3, 2023

Copy link
Copy Markdown
ContributorAuthor

Sorry for the slow reply. I managed to handle the comment at this location while keeping nextgroup working for and types.

@copy

copy commented Jul 4, 2023

Copy link
Copy Markdown
Collaborator

The latest commit seems to have broken the highlighting of identifiers in some places (e.g. the f in line 49 is recognized as a type). You can use :TOhtml and diff to find any differences between this branch and master.

@Julow

Julow commented Jul 5, 2023

Copy link
Copy Markdown
ContributorAuthor

I think I managed to fix the identifier issue. The TOhtml diff seems fine now. The added Error class is due to a newly added test case.

@copy

copy commented Jul 6, 2023

Copy link
Copy Markdown
Collaborator

On the last commit (817e8f7), some highlights are still incorrect (e.g. the let f on line 49), and show up in the diff.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Julow@Maelan@copy@rgrinberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Syntax: Don't highlight the LHS of type decl as types - #81

Open
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs
Open

Syntax: Don't highlight the LHS of type decl as types#81
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs

Conversation

@Julow

Copy link
Copy Markdown
Contributor

I would expect ocamlTypeConstr to apply only to type constructors
within type expressions, not to the identifier after type in:

typefoo = 'abarlist

foo is not highlighted with:

hilinkocamlTypeConstrType

This makes the LHS of types, exceptions and constraints be matched as
ocamlTypedef, which is not highlighted by default.

Variance and type variables on the LHS remain highlighted as before.

@Julow

Copy link
Copy Markdown
ContributorAuthor

Ping @Maelan

@Maelan

Copy link
Copy Markdown
Contributor

Thanks @Julow! I’m fine either way. I’m just slightly concerned by adding complexity to that already complex piece, but I let our maintainers judge.

You’d also have to deal with type t = ... and u = ..., though.

Comment threadsyntax/ocaml.vim Outdated
Comment threadsyntax/ocaml.vim
\ matchgroup=ocamlTypedef end="\<\(\w\|'\)*\>"
\ contains=@ocamlAllErrs,ocamlComment,ocamlTypeVariance,ocamlTypeVar
\ skipwhite skipempty
\ nextgroup=ocamlTypeDefImpl

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I note that with this technique, there must be no comment (* *) between the defined type name and the equal sign =, which may be acceptable (we already have that limitation elsewhere).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this. Perhaps because the end regex don't contain \@= ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven’t actually tested your code, but from what I understand about nextgroup= and contained, the ocamlTypeDefImpl group will never be tried except immediately after the end of the ocamlTypeDef group.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is what skipwhite is doing, from the :h:

These arguments are only used in combination with "nextgroup".	They can be
used to allow the next group to match after skipping some text:
skipwhite	skip over space and tab characters
skipnl skip over the end of a line
skipempty	skip over empty lines (implies a "skipnl")

I took thought this was doing something between start and end and nothing outside but it's actually the opposite, they take effect after end and do nothing inside the region (whitespace are skipped by default it seems).

@rgrinberg
rgrinberg requested a review from copyJuly 20, 2022 02:15
@Julow

Copy link
Copy Markdown
ContributorAuthor

I fixed the problems with and and restored the highlighting of exception. module-rec-and (which are broken on master) and let-and are not altered.

Comparison before/after with hi link ocamlTypeConstr Type:

image

@copy

copy commented Jul 20, 2022

Copy link
Copy Markdown
Collaborator

Fundamentally this change is fine, but I think we leave the current behavior configurable (personally, I prefer the current behavior).

This seems to break some things, in particular (from type-linter-test.ml):

type('a, 'b) t = 'alist* ('a, 'b) result(* the left pair of parenthesis *)typenonrec 'a o = 'aoption=privateNone | Someof'a(* the second equal sign *)typet += Cofint(* the of *)

The module-rec-and find is interesting, would you mind adding it to type-linter-test.ml with a fixme?

Comment threadsyntax/ocaml.vim
@Julow

Copy link
Copy Markdown
ContributorAuthor

I missed type-linter-test.ml, thanks.

I've added a way to get back the current behavior, what should be the default ? This is governed by hi link ocamlTypeIdentifier x which could be ocamlLCIdentifier (new) or ocamlTypeConstr (previous).

I've fixed the bugs with type params and equal signs but I introduced new bugs around let-bindings, which are matched as type decl. I would like ocamlTypeDefImpl to take effect only when invoked with nextgroup, is here a way to do that ? Otherwise, we need stronger rules for let-bindings.

Julow added 6 commits June 8, 2023 16:20
I would expect 'ocamlTypeConstr' to apply only to type constructors
within type expressions, not to the identifier after 'type' in:
type foo = 'a bar list
This makes the LHS of types, exceptions and constraints be matched as
'ocamlTypedef', which is not highlighted by default.
Variance and type variables on the LHS remain highlighted as before.
Have stricter rules for the identifiers and allow exception constructors
to be highlighted as before.
A new region is used to avoid matching the 'and' keyword too often (that
would interfere with let-and and module-rec-and.
Fix tupled type params, += and whitespaces around keywords.
Add examples to the test file.
Using the commit date instead of the author date.
@Julow
Julowforce-pushed the syn_type_decl_lhs branch from cebc78e to 921eed7CompareJune 8, 2023 14:27
@Julow

Julow commented Jun 8, 2023

Copy link
Copy Markdown
ContributorAuthor

Any opinion on this ?

Here's how it can be used:

hilinkocamlTypeConstrTypehilinkocamlTypeIdentifierIdentifier

The first line is both before and after this PR. The second line is with the two line above applied:

vimocamlshot

@rgrinberg

Copy link
Copy Markdown
Member

@copy do you want to make the call on this?

@copy

copy commented Jun 9, 2023

Copy link
Copy Markdown
Collaborator

This change and the mechanism to configure it looks good.

However, it causes some problems with the highlighting of number literals (highlighted as error across the type-linter-test.ml file), the fun keyword (highlighted like a type on line 332 and 338) and comments (a correct type highlighting is removed from line 349). You can use vim's :TOhtml followed by diff (or vimdiff, patdiff, ...) to check.

Julow added 2 commits June 20, 2023 11:37
It's a `contained` region but was not added to `ocamlContained`.
This is a styling change.
@Julow

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I fixed this issue, it was a missing ocamlContained declaration. I also changed my editor setup to use this patch everyday to be sure to test it well.

@copy

copy commented Jun 26, 2023

Copy link
Copy Markdown
Collaborator

Thanks! Super-minor, but it still removes the type highlighting from the following (on the int):

typet (*c*) = int

@Julow

Copy link
Copy Markdown
ContributorAuthor

Good catch! I'm failing to fix it.

The ocamlTypeDef region ends at t and jump into the ocamlTypeDefImpl region, which starts at = using nextgroup. I couldn't find a way to accept the comment without interfering with nextgroup, which is very handy to handle types without RHS and and types.
Any idea ?

@copy

copy commented Jun 27, 2023

Copy link
Copy Markdown
Collaborator

This comment from @Maelan looks relevant: #81 (comment)

@Julow

Julow commented Jul 3, 2023

Copy link
Copy Markdown
ContributorAuthor

Sorry for the slow reply. I managed to handle the comment at this location while keeping nextgroup working for and types.

@copy

copy commented Jul 4, 2023

Copy link
Copy Markdown
Collaborator

The latest commit seems to have broken the highlighting of identifiers in some places (e.g. the f in line 49 is recognized as a type). You can use :TOhtml and diff to find any differences between this branch and master.

@Julow

Julow commented Jul 5, 2023

Copy link
Copy Markdown
ContributorAuthor

I think I managed to fix the identifier issue. The TOhtml diff seems fine now. The added Error class is due to a newly added test case.

@copy

copy commented Jul 6, 2023

Copy link
Copy Markdown
Collaborator

On the last commit (817e8f7), some highlights are still incorrect (e.g. the let f on line 49), and show up in the diff.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Julow@Maelan@copy@rgrinberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Syntax: Don't highlight the LHS of type decl as types - #81

Open
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs
Open

Syntax: Don't highlight the LHS of type decl as types#81
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs

Conversation

@Julow

Copy link
Copy Markdown
Contributor

I would expect ocamlTypeConstr to apply only to type constructors
within type expressions, not to the identifier after type in:

typefoo = 'abarlist

foo is not highlighted with:

hilinkocamlTypeConstrType

This makes the LHS of types, exceptions and constraints be matched as
ocamlTypedef, which is not highlighted by default.

Variance and type variables on the LHS remain highlighted as before.

@Julow

Copy link
Copy Markdown
ContributorAuthor

Ping @Maelan

@Maelan

Copy link
Copy Markdown
Contributor

Thanks @Julow! I’m fine either way. I’m just slightly concerned by adding complexity to that already complex piece, but I let our maintainers judge.

You’d also have to deal with type t = ... and u = ..., though.

Comment threadsyntax/ocaml.vim Outdated
Comment threadsyntax/ocaml.vim
\ matchgroup=ocamlTypedef end="\<\(\w\|'\)*\>"
\ contains=@ocamlAllErrs,ocamlComment,ocamlTypeVariance,ocamlTypeVar
\ skipwhite skipempty
\ nextgroup=ocamlTypeDefImpl

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I note that with this technique, there must be no comment (* *) between the defined type name and the equal sign =, which may be acceptable (we already have that limitation elsewhere).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this. Perhaps because the end regex don't contain \@= ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven’t actually tested your code, but from what I understand about nextgroup= and contained, the ocamlTypeDefImpl group will never be tried except immediately after the end of the ocamlTypeDef group.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is what skipwhite is doing, from the :h:

These arguments are only used in combination with "nextgroup".	They can be
used to allow the next group to match after skipping some text:
skipwhite	skip over space and tab characters
skipnl skip over the end of a line
skipempty	skip over empty lines (implies a "skipnl")

I took thought this was doing something between start and end and nothing outside but it's actually the opposite, they take effect after end and do nothing inside the region (whitespace are skipped by default it seems).

@rgrinberg
rgrinberg requested a review from copyJuly 20, 2022 02:15
@Julow

Copy link
Copy Markdown
ContributorAuthor

I fixed the problems with and and restored the highlighting of exception. module-rec-and (which are broken on master) and let-and are not altered.

Comparison before/after with hi link ocamlTypeConstr Type:

image

@copy

copy commented Jul 20, 2022

Copy link
Copy Markdown
Collaborator

Fundamentally this change is fine, but I think we leave the current behavior configurable (personally, I prefer the current behavior).

This seems to break some things, in particular (from type-linter-test.ml):

type('a, 'b) t = 'alist* ('a, 'b) result(* the left pair of parenthesis *)typenonrec 'a o = 'aoption=privateNone | Someof'a(* the second equal sign *)typet += Cofint(* the of *)

The module-rec-and find is interesting, would you mind adding it to type-linter-test.ml with a fixme?

Comment threadsyntax/ocaml.vim
@Julow

Copy link
Copy Markdown
ContributorAuthor

I missed type-linter-test.ml, thanks.

I've added a way to get back the current behavior, what should be the default ? This is governed by hi link ocamlTypeIdentifier x which could be ocamlLCIdentifier (new) or ocamlTypeConstr (previous).

I've fixed the bugs with type params and equal signs but I introduced new bugs around let-bindings, which are matched as type decl. I would like ocamlTypeDefImpl to take effect only when invoked with nextgroup, is here a way to do that ? Otherwise, we need stronger rules for let-bindings.

Julow added 6 commits June 8, 2023 16:20
I would expect 'ocamlTypeConstr' to apply only to type constructors
within type expressions, not to the identifier after 'type' in:
type foo = 'a bar list
This makes the LHS of types, exceptions and constraints be matched as
'ocamlTypedef', which is not highlighted by default.
Variance and type variables on the LHS remain highlighted as before.
Have stricter rules for the identifiers and allow exception constructors
to be highlighted as before.
A new region is used to avoid matching the 'and' keyword too often (that
would interfere with let-and and module-rec-and.
Fix tupled type params, += and whitespaces around keywords.
Add examples to the test file.
Using the commit date instead of the author date.
@Julow
Julowforce-pushed the syn_type_decl_lhs branch from cebc78e to 921eed7CompareJune 8, 2023 14:27
@Julow

Julow commented Jun 8, 2023

Copy link
Copy Markdown
ContributorAuthor

Any opinion on this ?

Here's how it can be used:

hilinkocamlTypeConstrTypehilinkocamlTypeIdentifierIdentifier

The first line is both before and after this PR. The second line is with the two line above applied:

vimocamlshot

@rgrinberg

Copy link
Copy Markdown
Member

@copy do you want to make the call on this?

@copy

copy commented Jun 9, 2023

Copy link
Copy Markdown
Collaborator

This change and the mechanism to configure it looks good.

However, it causes some problems with the highlighting of number literals (highlighted as error across the type-linter-test.ml file), the fun keyword (highlighted like a type on line 332 and 338) and comments (a correct type highlighting is removed from line 349). You can use vim's :TOhtml followed by diff (or vimdiff, patdiff, ...) to check.

Julow added 2 commits June 20, 2023 11:37
It's a `contained` region but was not added to `ocamlContained`.
This is a styling change.
@Julow

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I fixed this issue, it was a missing ocamlContained declaration. I also changed my editor setup to use this patch everyday to be sure to test it well.

@copy

copy commented Jun 26, 2023

Copy link
Copy Markdown
Collaborator

Thanks! Super-minor, but it still removes the type highlighting from the following (on the int):

typet (*c*) = int

@Julow

Copy link
Copy Markdown
ContributorAuthor

Good catch! I'm failing to fix it.

The ocamlTypeDef region ends at t and jump into the ocamlTypeDefImpl region, which starts at = using nextgroup. I couldn't find a way to accept the comment without interfering with nextgroup, which is very handy to handle types without RHS and and types.
Any idea ?

@copy

copy commented Jun 27, 2023

Copy link
Copy Markdown
Collaborator

This comment from @Maelan looks relevant: #81 (comment)

@Julow

Julow commented Jul 3, 2023

Copy link
Copy Markdown
ContributorAuthor

Sorry for the slow reply. I managed to handle the comment at this location while keeping nextgroup working for and types.

@copy

copy commented Jul 4, 2023

Copy link
Copy Markdown
Collaborator

The latest commit seems to have broken the highlighting of identifiers in some places (e.g. the f in line 49 is recognized as a type). You can use :TOhtml and diff to find any differences between this branch and master.

@Julow

Julow commented Jul 5, 2023

Copy link
Copy Markdown
ContributorAuthor

I think I managed to fix the identifier issue. The TOhtml diff seems fine now. The added Error class is due to a newly added test case.

@copy

copy commented Jul 6, 2023

Copy link
Copy Markdown
Collaborator

On the last commit (817e8f7), some highlights are still incorrect (e.g. the let f on line 49), and show up in the diff.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Julow@Maelan@copy@rgrinberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Syntax: Don't highlight the LHS of type decl as types - #81

Open
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs
Open

Syntax: Don't highlight the LHS of type decl as types#81
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs

Conversation

@Julow

Copy link
Copy Markdown
Contributor

I would expect ocamlTypeConstr to apply only to type constructors
within type expressions, not to the identifier after type in:

typefoo = 'abarlist

foo is not highlighted with:

hilinkocamlTypeConstrType

This makes the LHS of types, exceptions and constraints be matched as
ocamlTypedef, which is not highlighted by default.

Variance and type variables on the LHS remain highlighted as before.

@Julow

Copy link
Copy Markdown
ContributorAuthor

Ping @Maelan

@Maelan

Copy link
Copy Markdown
Contributor

Thanks @Julow! I’m fine either way. I’m just slightly concerned by adding complexity to that already complex piece, but I let our maintainers judge.

You’d also have to deal with type t = ... and u = ..., though.

Comment threadsyntax/ocaml.vim Outdated
Comment threadsyntax/ocaml.vim
\ matchgroup=ocamlTypedef end="\<\(\w\|'\)*\>"
\ contains=@ocamlAllErrs,ocamlComment,ocamlTypeVariance,ocamlTypeVar
\ skipwhite skipempty
\ nextgroup=ocamlTypeDefImpl

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I note that with this technique, there must be no comment (* *) between the defined type name and the equal sign =, which may be acceptable (we already have that limitation elsewhere).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this. Perhaps because the end regex don't contain \@= ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven’t actually tested your code, but from what I understand about nextgroup= and contained, the ocamlTypeDefImpl group will never be tried except immediately after the end of the ocamlTypeDef group.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is what skipwhite is doing, from the :h:

These arguments are only used in combination with "nextgroup".	They can be
used to allow the next group to match after skipping some text:
skipwhite	skip over space and tab characters
skipnl skip over the end of a line
skipempty	skip over empty lines (implies a "skipnl")

I took thought this was doing something between start and end and nothing outside but it's actually the opposite, they take effect after end and do nothing inside the region (whitespace are skipped by default it seems).

@rgrinberg
rgrinberg requested a review from copyJuly 20, 2022 02:15
@Julow

Copy link
Copy Markdown
ContributorAuthor

I fixed the problems with and and restored the highlighting of exception. module-rec-and (which are broken on master) and let-and are not altered.

Comparison before/after with hi link ocamlTypeConstr Type:

image

@copy

copy commented Jul 20, 2022

Copy link
Copy Markdown
Collaborator

Fundamentally this change is fine, but I think we leave the current behavior configurable (personally, I prefer the current behavior).

This seems to break some things, in particular (from type-linter-test.ml):

type('a, 'b) t = 'alist* ('a, 'b) result(* the left pair of parenthesis *)typenonrec 'a o = 'aoption=privateNone | Someof'a(* the second equal sign *)typet += Cofint(* the of *)

The module-rec-and find is interesting, would you mind adding it to type-linter-test.ml with a fixme?

Comment threadsyntax/ocaml.vim
@Julow

Copy link
Copy Markdown
ContributorAuthor

I missed type-linter-test.ml, thanks.

I've added a way to get back the current behavior, what should be the default ? This is governed by hi link ocamlTypeIdentifier x which could be ocamlLCIdentifier (new) or ocamlTypeConstr (previous).

I've fixed the bugs with type params and equal signs but I introduced new bugs around let-bindings, which are matched as type decl. I would like ocamlTypeDefImpl to take effect only when invoked with nextgroup, is here a way to do that ? Otherwise, we need stronger rules for let-bindings.

Julow added 6 commits June 8, 2023 16:20
I would expect 'ocamlTypeConstr' to apply only to type constructors
within type expressions, not to the identifier after 'type' in:
type foo = 'a bar list
This makes the LHS of types, exceptions and constraints be matched as
'ocamlTypedef', which is not highlighted by default.
Variance and type variables on the LHS remain highlighted as before.
Have stricter rules for the identifiers and allow exception constructors
to be highlighted as before.
A new region is used to avoid matching the 'and' keyword too often (that
would interfere with let-and and module-rec-and.
Fix tupled type params, += and whitespaces around keywords.
Add examples to the test file.
Using the commit date instead of the author date.
@Julow
Julowforce-pushed the syn_type_decl_lhs branch from cebc78e to 921eed7CompareJune 8, 2023 14:27
@Julow

Julow commented Jun 8, 2023

Copy link
Copy Markdown
ContributorAuthor

Any opinion on this ?

Here's how it can be used:

hilinkocamlTypeConstrTypehilinkocamlTypeIdentifierIdentifier

The first line is both before and after this PR. The second line is with the two line above applied:

vimocamlshot

@rgrinberg

Copy link
Copy Markdown
Member

@copy do you want to make the call on this?

@copy

copy commented Jun 9, 2023

Copy link
Copy Markdown
Collaborator

This change and the mechanism to configure it looks good.

However, it causes some problems with the highlighting of number literals (highlighted as error across the type-linter-test.ml file), the fun keyword (highlighted like a type on line 332 and 338) and comments (a correct type highlighting is removed from line 349). You can use vim's :TOhtml followed by diff (or vimdiff, patdiff, ...) to check.

Julow added 2 commits June 20, 2023 11:37
It's a `contained` region but was not added to `ocamlContained`.
This is a styling change.
@Julow

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I fixed this issue, it was a missing ocamlContained declaration. I also changed my editor setup to use this patch everyday to be sure to test it well.

@copy

copy commented Jun 26, 2023

Copy link
Copy Markdown
Collaborator

Thanks! Super-minor, but it still removes the type highlighting from the following (on the int):

typet (*c*) = int

@Julow

Copy link
Copy Markdown
ContributorAuthor

Good catch! I'm failing to fix it.

The ocamlTypeDef region ends at t and jump into the ocamlTypeDefImpl region, which starts at = using nextgroup. I couldn't find a way to accept the comment without interfering with nextgroup, which is very handy to handle types without RHS and and types.
Any idea ?

@copy

copy commented Jun 27, 2023

Copy link
Copy Markdown
Collaborator

This comment from @Maelan looks relevant: #81 (comment)

@Julow

Julow commented Jul 3, 2023

Copy link
Copy Markdown
ContributorAuthor

Sorry for the slow reply. I managed to handle the comment at this location while keeping nextgroup working for and types.

@copy

copy commented Jul 4, 2023

Copy link
Copy Markdown
Collaborator

The latest commit seems to have broken the highlighting of identifiers in some places (e.g. the f in line 49 is recognized as a type). You can use :TOhtml and diff to find any differences between this branch and master.

@Julow

Julow commented Jul 5, 2023

Copy link
Copy Markdown
ContributorAuthor

I think I managed to fix the identifier issue. The TOhtml diff seems fine now. The added Error class is due to a newly added test case.

@copy

copy commented Jul 6, 2023

Copy link
Copy Markdown
Collaborator

On the last commit (817e8f7), some highlights are still incorrect (e.g. the let f on line 49), and show up in the diff.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Julow@Maelan@copy@rgrinberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Syntax: Don't highlight the LHS of type decl as types - #81

Open
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs
Open

Syntax: Don't highlight the LHS of type decl as types#81
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs

Conversation

@Julow

Copy link
Copy Markdown
Contributor

I would expect ocamlTypeConstr to apply only to type constructors
within type expressions, not to the identifier after type in:

typefoo = 'abarlist

foo is not highlighted with:

hilinkocamlTypeConstrType

This makes the LHS of types, exceptions and constraints be matched as
ocamlTypedef, which is not highlighted by default.

Variance and type variables on the LHS remain highlighted as before.

@Julow

Copy link
Copy Markdown
ContributorAuthor

Ping @Maelan

@Maelan

Copy link
Copy Markdown
Contributor

Thanks @Julow! I’m fine either way. I’m just slightly concerned by adding complexity to that already complex piece, but I let our maintainers judge.

You’d also have to deal with type t = ... and u = ..., though.

Comment threadsyntax/ocaml.vim Outdated
Comment threadsyntax/ocaml.vim
\ matchgroup=ocamlTypedef end="\<\(\w\|'\)*\>"
\ contains=@ocamlAllErrs,ocamlComment,ocamlTypeVariance,ocamlTypeVar
\ skipwhite skipempty
\ nextgroup=ocamlTypeDefImpl

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I note that with this technique, there must be no comment (* *) between the defined type name and the equal sign =, which may be acceptable (we already have that limitation elsewhere).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this. Perhaps because the end regex don't contain \@= ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven’t actually tested your code, but from what I understand about nextgroup= and contained, the ocamlTypeDefImpl group will never be tried except immediately after the end of the ocamlTypeDef group.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is what skipwhite is doing, from the :h:

These arguments are only used in combination with "nextgroup".	They can be
used to allow the next group to match after skipping some text:
skipwhite	skip over space and tab characters
skipnl skip over the end of a line
skipempty	skip over empty lines (implies a "skipnl")

I took thought this was doing something between start and end and nothing outside but it's actually the opposite, they take effect after end and do nothing inside the region (whitespace are skipped by default it seems).

@rgrinberg
rgrinberg requested a review from copyJuly 20, 2022 02:15
@Julow

Copy link
Copy Markdown
ContributorAuthor

I fixed the problems with and and restored the highlighting of exception. module-rec-and (which are broken on master) and let-and are not altered.

Comparison before/after with hi link ocamlTypeConstr Type:

image

@copy

copy commented Jul 20, 2022

Copy link
Copy Markdown
Collaborator

Fundamentally this change is fine, but I think we leave the current behavior configurable (personally, I prefer the current behavior).

This seems to break some things, in particular (from type-linter-test.ml):

type('a, 'b) t = 'alist* ('a, 'b) result(* the left pair of parenthesis *)typenonrec 'a o = 'aoption=privateNone | Someof'a(* the second equal sign *)typet += Cofint(* the of *)

The module-rec-and find is interesting, would you mind adding it to type-linter-test.ml with a fixme?

Comment threadsyntax/ocaml.vim
@Julow

Copy link
Copy Markdown
ContributorAuthor

I missed type-linter-test.ml, thanks.

I've added a way to get back the current behavior, what should be the default ? This is governed by hi link ocamlTypeIdentifier x which could be ocamlLCIdentifier (new) or ocamlTypeConstr (previous).

I've fixed the bugs with type params and equal signs but I introduced new bugs around let-bindings, which are matched as type decl. I would like ocamlTypeDefImpl to take effect only when invoked with nextgroup, is here a way to do that ? Otherwise, we need stronger rules for let-bindings.

Julow added 6 commits June 8, 2023 16:20
I would expect 'ocamlTypeConstr' to apply only to type constructors
within type expressions, not to the identifier after 'type' in:
type foo = 'a bar list
This makes the LHS of types, exceptions and constraints be matched as
'ocamlTypedef', which is not highlighted by default.
Variance and type variables on the LHS remain highlighted as before.
Have stricter rules for the identifiers and allow exception constructors
to be highlighted as before.
A new region is used to avoid matching the 'and' keyword too often (that
would interfere with let-and and module-rec-and.
Fix tupled type params, += and whitespaces around keywords.
Add examples to the test file.
Using the commit date instead of the author date.
@Julow
Julowforce-pushed the syn_type_decl_lhs branch from cebc78e to 921eed7CompareJune 8, 2023 14:27
@Julow

Julow commented Jun 8, 2023

Copy link
Copy Markdown
ContributorAuthor

Any opinion on this ?

Here's how it can be used:

hilinkocamlTypeConstrTypehilinkocamlTypeIdentifierIdentifier

The first line is both before and after this PR. The second line is with the two line above applied:

vimocamlshot

@rgrinberg

Copy link
Copy Markdown
Member

@copy do you want to make the call on this?

@copy

copy commented Jun 9, 2023

Copy link
Copy Markdown
Collaborator

This change and the mechanism to configure it looks good.

However, it causes some problems with the highlighting of number literals (highlighted as error across the type-linter-test.ml file), the fun keyword (highlighted like a type on line 332 and 338) and comments (a correct type highlighting is removed from line 349). You can use vim's :TOhtml followed by diff (or vimdiff, patdiff, ...) to check.

Julow added 2 commits June 20, 2023 11:37
It's a `contained` region but was not added to `ocamlContained`.
This is a styling change.
@Julow

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I fixed this issue, it was a missing ocamlContained declaration. I also changed my editor setup to use this patch everyday to be sure to test it well.

@copy

copy commented Jun 26, 2023

Copy link
Copy Markdown
Collaborator

Thanks! Super-minor, but it still removes the type highlighting from the following (on the int):

typet (*c*) = int

@Julow

Copy link
Copy Markdown
ContributorAuthor

Good catch! I'm failing to fix it.

The ocamlTypeDef region ends at t and jump into the ocamlTypeDefImpl region, which starts at = using nextgroup. I couldn't find a way to accept the comment without interfering with nextgroup, which is very handy to handle types without RHS and and types.
Any idea ?

@copy

copy commented Jun 27, 2023

Copy link
Copy Markdown
Collaborator

This comment from @Maelan looks relevant: #81 (comment)

@Julow

Julow commented Jul 3, 2023

Copy link
Copy Markdown
ContributorAuthor

Sorry for the slow reply. I managed to handle the comment at this location while keeping nextgroup working for and types.

@copy

copy commented Jul 4, 2023

Copy link
Copy Markdown
Collaborator

The latest commit seems to have broken the highlighting of identifiers in some places (e.g. the f in line 49 is recognized as a type). You can use :TOhtml and diff to find any differences between this branch and master.

@Julow

Julow commented Jul 5, 2023

Copy link
Copy Markdown
ContributorAuthor

I think I managed to fix the identifier issue. The TOhtml diff seems fine now. The added Error class is due to a newly added test case.

@copy

copy commented Jul 6, 2023

Copy link
Copy Markdown
Collaborator

On the last commit (817e8f7), some highlights are still incorrect (e.g. the let f on line 49), and show up in the diff.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Julow@Maelan@copy@rgrinberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Syntax: Don't highlight the LHS of type decl as types - #81

Open
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs
Open

Syntax: Don't highlight the LHS of type decl as types#81
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs

Conversation

@Julow

Copy link
Copy Markdown
Contributor

I would expect ocamlTypeConstr to apply only to type constructors
within type expressions, not to the identifier after type in:

typefoo = 'abarlist

foo is not highlighted with:

hilinkocamlTypeConstrType

This makes the LHS of types, exceptions and constraints be matched as
ocamlTypedef, which is not highlighted by default.

Variance and type variables on the LHS remain highlighted as before.

@Julow

Copy link
Copy Markdown
ContributorAuthor

Ping @Maelan

@Maelan

Copy link
Copy Markdown
Contributor

Thanks @Julow! I’m fine either way. I’m just slightly concerned by adding complexity to that already complex piece, but I let our maintainers judge.

You’d also have to deal with type t = ... and u = ..., though.

Comment threadsyntax/ocaml.vim Outdated
Comment threadsyntax/ocaml.vim
\ matchgroup=ocamlTypedef end="\<\(\w\|'\)*\>"
\ contains=@ocamlAllErrs,ocamlComment,ocamlTypeVariance,ocamlTypeVar
\ skipwhite skipempty
\ nextgroup=ocamlTypeDefImpl

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I note that with this technique, there must be no comment (* *) between the defined type name and the equal sign =, which may be acceptable (we already have that limitation elsewhere).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this. Perhaps because the end regex don't contain \@= ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven’t actually tested your code, but from what I understand about nextgroup= and contained, the ocamlTypeDefImpl group will never be tried except immediately after the end of the ocamlTypeDef group.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is what skipwhite is doing, from the :h:

These arguments are only used in combination with "nextgroup".	They can be
used to allow the next group to match after skipping some text:
skipwhite	skip over space and tab characters
skipnl skip over the end of a line
skipempty	skip over empty lines (implies a "skipnl")

I took thought this was doing something between start and end and nothing outside but it's actually the opposite, they take effect after end and do nothing inside the region (whitespace are skipped by default it seems).

@rgrinberg
rgrinberg requested a review from copyJuly 20, 2022 02:15
@Julow

Copy link
Copy Markdown
ContributorAuthor

I fixed the problems with and and restored the highlighting of exception. module-rec-and (which are broken on master) and let-and are not altered.

Comparison before/after with hi link ocamlTypeConstr Type:

image

@copy

copy commented Jul 20, 2022

Copy link
Copy Markdown
Collaborator

Fundamentally this change is fine, but I think we leave the current behavior configurable (personally, I prefer the current behavior).

This seems to break some things, in particular (from type-linter-test.ml):

type('a, 'b) t = 'alist* ('a, 'b) result(* the left pair of parenthesis *)typenonrec 'a o = 'aoption=privateNone | Someof'a(* the second equal sign *)typet += Cofint(* the of *)

The module-rec-and find is interesting, would you mind adding it to type-linter-test.ml with a fixme?

Comment threadsyntax/ocaml.vim
@Julow

Copy link
Copy Markdown
ContributorAuthor

I missed type-linter-test.ml, thanks.

I've added a way to get back the current behavior, what should be the default ? This is governed by hi link ocamlTypeIdentifier x which could be ocamlLCIdentifier (new) or ocamlTypeConstr (previous).

I've fixed the bugs with type params and equal signs but I introduced new bugs around let-bindings, which are matched as type decl. I would like ocamlTypeDefImpl to take effect only when invoked with nextgroup, is here a way to do that ? Otherwise, we need stronger rules for let-bindings.

Julow added 6 commits June 8, 2023 16:20
I would expect 'ocamlTypeConstr' to apply only to type constructors
within type expressions, not to the identifier after 'type' in:
type foo = 'a bar list
This makes the LHS of types, exceptions and constraints be matched as
'ocamlTypedef', which is not highlighted by default.
Variance and type variables on the LHS remain highlighted as before.
Have stricter rules for the identifiers and allow exception constructors
to be highlighted as before.
A new region is used to avoid matching the 'and' keyword too often (that
would interfere with let-and and module-rec-and.
Fix tupled type params, += and whitespaces around keywords.
Add examples to the test file.
Using the commit date instead of the author date.
@Julow
Julowforce-pushed the syn_type_decl_lhs branch from cebc78e to 921eed7CompareJune 8, 2023 14:27
@Julow

Julow commented Jun 8, 2023

Copy link
Copy Markdown
ContributorAuthor

Any opinion on this ?

Here's how it can be used:

hilinkocamlTypeConstrTypehilinkocamlTypeIdentifierIdentifier

The first line is both before and after this PR. The second line is with the two line above applied:

vimocamlshot

@rgrinberg

Copy link
Copy Markdown
Member

@copy do you want to make the call on this?

@copy

copy commented Jun 9, 2023

Copy link
Copy Markdown
Collaborator

This change and the mechanism to configure it looks good.

However, it causes some problems with the highlighting of number literals (highlighted as error across the type-linter-test.ml file), the fun keyword (highlighted like a type on line 332 and 338) and comments (a correct type highlighting is removed from line 349). You can use vim's :TOhtml followed by diff (or vimdiff, patdiff, ...) to check.

Julow added 2 commits June 20, 2023 11:37
It's a `contained` region but was not added to `ocamlContained`.
This is a styling change.
@Julow

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I fixed this issue, it was a missing ocamlContained declaration. I also changed my editor setup to use this patch everyday to be sure to test it well.

@copy

copy commented Jun 26, 2023

Copy link
Copy Markdown
Collaborator

Thanks! Super-minor, but it still removes the type highlighting from the following (on the int):

typet (*c*) = int

@Julow

Copy link
Copy Markdown
ContributorAuthor

Good catch! I'm failing to fix it.

The ocamlTypeDef region ends at t and jump into the ocamlTypeDefImpl region, which starts at = using nextgroup. I couldn't find a way to accept the comment without interfering with nextgroup, which is very handy to handle types without RHS and and types.
Any idea ?

@copy

copy commented Jun 27, 2023

Copy link
Copy Markdown
Collaborator

This comment from @Maelan looks relevant: #81 (comment)

@Julow

Julow commented Jul 3, 2023

Copy link
Copy Markdown
ContributorAuthor

Sorry for the slow reply. I managed to handle the comment at this location while keeping nextgroup working for and types.

@copy

copy commented Jul 4, 2023

Copy link
Copy Markdown
Collaborator

The latest commit seems to have broken the highlighting of identifiers in some places (e.g. the f in line 49 is recognized as a type). You can use :TOhtml and diff to find any differences between this branch and master.

@Julow

Julow commented Jul 5, 2023

Copy link
Copy Markdown
ContributorAuthor

I think I managed to fix the identifier issue. The TOhtml diff seems fine now. The added Error class is due to a newly added test case.

@copy

copy commented Jul 6, 2023

Copy link
Copy Markdown
Collaborator

On the last commit (817e8f7), some highlights are still incorrect (e.g. the let f on line 49), and show up in the diff.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Julow@Maelan@copy@rgrinberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Syntax: Don't highlight the LHS of type decl as types - #81

Open
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs
Open

Syntax: Don't highlight the LHS of type decl as types#81
Julow wants to merge 11 commits into
ocaml:masterfrom
Julow:syn_type_decl_lhs

Conversation

@Julow

Copy link
Copy Markdown
Contributor

I would expect ocamlTypeConstr to apply only to type constructors
within type expressions, not to the identifier after type in:

typefoo = 'abarlist

foo is not highlighted with:

hilinkocamlTypeConstrType

This makes the LHS of types, exceptions and constraints be matched as
ocamlTypedef, which is not highlighted by default.

Variance and type variables on the LHS remain highlighted as before.

@Julow

Copy link
Copy Markdown
ContributorAuthor

Ping @Maelan

@Maelan

Copy link
Copy Markdown
Contributor

Thanks @Julow! I’m fine either way. I’m just slightly concerned by adding complexity to that already complex piece, but I let our maintainers judge.

You’d also have to deal with type t = ... and u = ..., though.

Comment threadsyntax/ocaml.vim Outdated
Comment threadsyntax/ocaml.vim
\ matchgroup=ocamlTypedef end="\<\(\w\|'\)*\>"
\ contains=@ocamlAllErrs,ocamlComment,ocamlTypeVariance,ocamlTypeVar
\ skipwhite skipempty
\ nextgroup=ocamlTypeDefImpl

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I note that with this technique, there must be no comment (* *) between the defined type name and the equal sign =, which may be acceptable (we already have that limitation elsewhere).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this. Perhaps because the end regex don't contain \@= ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven’t actually tested your code, but from what I understand about nextgroup= and contained, the ocamlTypeDefImpl group will never be tried except immediately after the end of the ocamlTypeDef group.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is what skipwhite is doing, from the :h:

These arguments are only used in combination with "nextgroup".	They can be
used to allow the next group to match after skipping some text:
skipwhite	skip over space and tab characters
skipnl skip over the end of a line
skipempty	skip over empty lines (implies a "skipnl")

I took thought this was doing something between start and end and nothing outside but it's actually the opposite, they take effect after end and do nothing inside the region (whitespace are skipped by default it seems).

@rgrinberg
rgrinberg requested a review from copyJuly 20, 2022 02:15
@Julow

Copy link
Copy Markdown
ContributorAuthor

I fixed the problems with and and restored the highlighting of exception. module-rec-and (which are broken on master) and let-and are not altered.

Comparison before/after with hi link ocamlTypeConstr Type:

image

@copy

copy commented Jul 20, 2022

Copy link
Copy Markdown
Collaborator

Fundamentally this change is fine, but I think we leave the current behavior configurable (personally, I prefer the current behavior).

This seems to break some things, in particular (from type-linter-test.ml):

type('a, 'b) t = 'alist* ('a, 'b) result(* the left pair of parenthesis *)typenonrec 'a o = 'aoption=privateNone | Someof'a(* the second equal sign *)typet += Cofint(* the of *)

The module-rec-and find is interesting, would you mind adding it to type-linter-test.ml with a fixme?

Comment threadsyntax/ocaml.vim
@Julow

Copy link
Copy Markdown
ContributorAuthor

I missed type-linter-test.ml, thanks.

I've added a way to get back the current behavior, what should be the default ? This is governed by hi link ocamlTypeIdentifier x which could be ocamlLCIdentifier (new) or ocamlTypeConstr (previous).

I've fixed the bugs with type params and equal signs but I introduced new bugs around let-bindings, which are matched as type decl. I would like ocamlTypeDefImpl to take effect only when invoked with nextgroup, is here a way to do that ? Otherwise, we need stronger rules for let-bindings.

Julow added 6 commits June 8, 2023 16:20
I would expect 'ocamlTypeConstr' to apply only to type constructors
within type expressions, not to the identifier after 'type' in:
type foo = 'a bar list
This makes the LHS of types, exceptions and constraints be matched as
'ocamlTypedef', which is not highlighted by default.
Variance and type variables on the LHS remain highlighted as before.
Have stricter rules for the identifiers and allow exception constructors
to be highlighted as before.
A new region is used to avoid matching the 'and' keyword too often (that
would interfere with let-and and module-rec-and.
Fix tupled type params, += and whitespaces around keywords.
Add examples to the test file.
Using the commit date instead of the author date.
@Julow
Julowforce-pushed the syn_type_decl_lhs branch from cebc78e to 921eed7CompareJune 8, 2023 14:27
@Julow

Julow commented Jun 8, 2023

Copy link
Copy Markdown
ContributorAuthor

Any opinion on this ?

Here's how it can be used:

hilinkocamlTypeConstrTypehilinkocamlTypeIdentifierIdentifier

The first line is both before and after this PR. The second line is with the two line above applied:

vimocamlshot

@rgrinberg

Copy link
Copy Markdown
Member

@copy do you want to make the call on this?

@copy

copy commented Jun 9, 2023

Copy link
Copy Markdown
Collaborator

This change and the mechanism to configure it looks good.

However, it causes some problems with the highlighting of number literals (highlighted as error across the type-linter-test.ml file), the fun keyword (highlighted like a type on line 332 and 338) and comments (a correct type highlighting is removed from line 349). You can use vim's :TOhtml followed by diff (or vimdiff, patdiff, ...) to check.

Julow added 2 commits June 20, 2023 11:37
It's a `contained` region but was not added to `ocamlContained`.
This is a styling change.
@Julow

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I fixed this issue, it was a missing ocamlContained declaration. I also changed my editor setup to use this patch everyday to be sure to test it well.

@copy

copy commented Jun 26, 2023

Copy link
Copy Markdown
Collaborator

Thanks! Super-minor, but it still removes the type highlighting from the following (on the int):

typet (*c*) = int

@Julow

Copy link
Copy Markdown
ContributorAuthor

Good catch! I'm failing to fix it.

The ocamlTypeDef region ends at t and jump into the ocamlTypeDefImpl region, which starts at = using nextgroup. I couldn't find a way to accept the comment without interfering with nextgroup, which is very handy to handle types without RHS and and types.
Any idea ?

@copy

copy commented Jun 27, 2023

Copy link
Copy Markdown
Collaborator

This comment from @Maelan looks relevant: #81 (comment)

@Julow

Julow commented Jul 3, 2023

Copy link
Copy Markdown
ContributorAuthor

Sorry for the slow reply. I managed to handle the comment at this location while keeping nextgroup working for and types.

@copy

copy commented Jul 4, 2023

Copy link
Copy Markdown
Collaborator

The latest commit seems to have broken the highlighting of identifiers in some places (e.g. the f in line 49 is recognized as a type). You can use :TOhtml and diff to find any differences between this branch and master.

@Julow

Julow commented Jul 5, 2023

Copy link
Copy Markdown
ContributorAuthor

I think I managed to fix the identifier issue. The TOhtml diff seems fine now. The added Error class is due to a newly added test case.

@copy

copy commented Jul 6, 2023

Copy link
Copy Markdown
Collaborator

On the last commit (817e8f7), some highlights are still incorrect (e.g. the let f on line 49), and show up in the diff.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Julow@Maelan@copy@rgrinberg