Skip to content

Add bare filename regex for link detection#17

Open
arigoldx wants to merge 8 commits intomanaflow-ai:mainfrom
arigoldx:add-bare-filename-regex
Open

Add bare filename regex for link detection#17
arigoldx wants to merge 8 commits intomanaflow-ai:mainfrom
arigoldx:add-bare-filename-regex

Conversation

@arigoldx
Copy link

@arigoldx arigoldx commented Mar 20, 2026

Brief Summary

I wanted the functionality from iTerm where you can command-click on a filename and it will open in your favorite editor.

Thorough Summary

  • Adds a new branch to the URL regex that matches bare filenames with common source code extensions (tsx, py, json, etc.)
  • Uses negative lookbehind (?<![/\w]) to match filenames not preceded by slash or word char
  • Enables detection in ls column output and git status

Test plan

  • Verified regex tests pass
  • Tested in cmux terminal with ls output - all columns underline
  • Tested with git status - bare filenames underline

Summary by cubic

Adds bare filename link detection and a cmux-integrated theme picker with live preview and apply/cancel. Improves build steps and CLI output reliability.

  • New Features
    • Link detection: new regex branch matches bare filenames (tsx, py, json, etc.) using negative lookbehind/lookahead; underlines in ls columns and git status.
    • Theme picker (cmux mode): live preview with target cycling (both/light/dark via 't'); Enter applies, q/ESC cancels and restores. Writes a managed override block to the config and posts a macOS distributed notification to reload.
    • Build/CLI: added cli-helper build step; buffered and flushed usage output in app_runtime=none.

Written for commit 8a9cbe9. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Introduced cmux theme picker with live preview capability and theme application support, enabled through environment configuration.
    • Extended URL pattern matching to recognize standalone source code and text files by extension.
  • Build

    • Added dedicated CLI helper build step.

lawrencecchen and others added 8 commits March 13, 2026 17:21
Adds a new branch to the URL regex that matches bare filenames
with common source code extensions (tsx, py, json, etc.). Uses
negative lookbehind (?<![/\w]) to match filenames not preceded
by slash or word char, enabling detection in ls column output.
@coderabbitai
Copy link

coderabbitai bot commented Mar 20, 2026

📝 Walkthrough

Walkthrough

Added a new build step for the CLI helper and enhanced theme preview functionality with cmux configuration support. Introduced live preview with environment-based overrides, improved terminal output buffering, and extended URL parsing to detect standalone filenames with extensions.

Changes

Cohort / File(s) Summary
Build Infrastructure
build.zig
Added new cli-helper build step that depends on the Ghostty executable installation step, ensuring proper build ordering.
CLI Feature - Cmux Theme Preview
src/cli/list_themes.zig, src/main_ghostty.zig
Introduced cmux "live preview/applied override" support gated by CMUX_THEME_PICKER_CONFIG environment variable. Enhanced Preview structure to track application outcomes and cmux state. Updated TUI control flow to apply cmux overrides on navigation/search/filter actions, with conditional Enter behavior and Darwin notification support. Improved CLI output buffering with explicit flush before exit.
URL Parsing Enhancement
src/config/url.zig
Added regex branch bare_filename_with_extension to match standalone filenames ending with whitelisted source-code/text extensions (e.g., .zig, .cpp), integrated into the exported regex pattern.

Sequence Diagram

sequenceDiagram
    participant TUI as Theme Picker TUI
    participant Env as Environment
    participant FS as Filesystem
    participant Darwin as Darwin Notifications
    
    TUI->>Env: Check for CMUX_THEME_PICKER_CONFIG
    alt Cmux mode enabled
        TUI->>FS: Read config file from env path
        FS-->>TUI: Config contents
        TUI->>TUI: Load cmux state (light/dark themes)
        Note over TUI: Display preview with current theme
        TUI->>TUI: User navigates/edits (up/down/search/filter)
        TUI->>TUI: Apply theme override to cmux state
        alt User presses Enter
            TUI->>FS: Write updated config with override block
            TUI->>Darwin: Post com.cmuxterm.themes.reload-config
            Note over TUI: Exit with apply outcome
        else User presses Escape
            TUI->>FS: Restore original config (remove override)
            Darwin->>TUI: Reload notification (implicit)
            Note over TUI: Exit with cancel outcome
        end
    else Cmux mode disabled
        Note over TUI: Display traditional save flow
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

A helper builds with steady hand,
While themes are picked and previewd grand,
Files by name now match with grace,
And buffers flush without a trace—
Ghostty hops through every change! 🐰✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Add bare filename regex for link detection' directly and specifically describes the main change in the changeset: a new regex branch for matching bare filenames with extensions in URL/link detection. This aligns with the primary modification shown in src/config/url.zig and is clearly related to the PR's stated objectives.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

Migrating from UI to YAML configuration.

Use the @coderabbitai configuration command in a PR comment to get a dump of all your UI settings in YAML format. You can then edit this YAML file and upload it to the root of your repository to configure CodeRabbit programmatically.

@greptile-apps
Copy link

greptile-apps bot commented Mar 20, 2026

Greptile Summary

This PR bundles two largely independent sets of changes under a single title: (1) a new Branch 4 to the URL/path regex that detects bare filenames with known source-code extensions (the stated purpose), and (2) a substantial cmux terminal integration into the theme-picker TUI that enables live-preview and config-file management for the external cmux terminal app. The buffered-writer update in src/main_ghostty.zig and the cli-helper build step in build.zig are small ancillary changes.

Key observations:

  • No new test cases for Branch 4 — the regex test suite in src/config/url.zig has no additions for the new branch, making regressions invisible.
  • Branch 4 won't match file.py:10 — the (?![:\w]) negative lookahead blocks filenames followed by :line numbers (common in compiler/linter output), whereas Branch 3 handles this for paths with directory separators.
  • (?<![/\w]) allows matches after .version.main.go would match main.go, a minor false-positive risk.
  • CmuxThemePicker.initialTheme is dead code — defined but never called anywhere in the codebase.
  • The cmux integration is sizable (~400 lines) and well-structured; memory ownership is handled correctly with errdefer chains and an atomic file write helper.

Confidence Score: 3/5

  • Safe to merge for the cmux and build changes; the regex branch works but has gaps in coverage and a known mismatch with the :line suffix pattern.
  • The main advertised feature (bare filename regex) has no dedicated test cases, contains a behavioral gap vs. Branch 3 for file:line syntax, and a minor false-positive edge case around dot-preceded filenames. These don't cause crashes or data loss but represent correctness and regression-safety concerns for the regex. The cmux integration is larger than the title suggests and is functionally solid, though the dead initialTheme method should be cleaned up.
  • src/config/url.zig needs new test cases for Branch 4 and a decision on whether file.py:10 patterns should be supported.

Important Files Changed

Filename Overview
src/config/url.zig Adds Branch 4 regex to detect bare filenames with known source code extensions. Core logic is sound but has no new test coverage, won't match the common file.py:10 pattern, and the .-char lookbehind gap may produce minor false positives.
src/cli/list_themes.zig Large addition of cmux terminal integration for live theme preview: reads env vars, writes managed config blocks atomically, posts Objective-C distributed notifications on macOS. Memory ownership is handled correctly; the only notable issue is the dead initialTheme method.
src/main_ghostty.zig Switches the CLI help output to a buffered writer with an explicit flush; straightforward and correct.
build.zig Adds a cli-helper build step that depends on the main exe install step; minimal and correct.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Terminal text line] --> B{Branch 1:\nscheme URL?}
    B -->|yes| Z[Highlight match]
    B -->|no| C{Branch 2:\nrooted/relative path?}
    C -->|yes| Z
    C -->|no| D{Branch 3:\nbare relative path\ne.g. src/foo.zig}
    D -->|yes| Z
    D -->|no| E{Branch 4 NEW:\nbare filename\nwith known extension}
    E -->|yes| Z
    E -->|no| F[No match]

    subgraph Branch4 [Branch 4 logic]
        E1["(?&lt;![/\\w]) — not preceded\nby slash or word char"]
        E2["[\\w][\\w\\-.]*\\. — word chars\nfollowed by dot"]
        E3["EXTENSION — known ext list\ne.g. py, ts, go, zig ..."]
        E4["(?![:\\w]) — not followed\nby colon or word char"]
        E1 --> E2 --> E3 --> E4
    end

    E --> Branch4
Loading

Comments Outside Diff (1)

  1. src/config/url.zig, line 747-539 (link)

    P2 No test cases added for Branch 4

    The PR description's test plan states "Verified regex tests pass," but no new entries are added to the cases or no_match_cases arrays in the test "url regex" block for the new bare_filename_with_extension branch.

    Minimal coverage that should be present:

    • Basic match: "file.py""file.py"
    • git status format: "modified: file.py""file.py"
    • ls column output: "file.ts file.go""file.ts" (first match only)
    • No match for mid-word: "somethingfile.py" (preceded by \w, should not match)
    • No match for /path/file.py (should be handled by Branch 1/2, but Branch 4 lookbehind should correctly avoid double-matching)
    • Single-char extensions: "main.c""main.c"

    Without these, regressions to the new branch will be invisible.

Last reviewed commit: "Add bare filename re..."

Comment on lines +84 to +93
fn initialTheme(self: *const CmuxThemePicker) ?[]const u8 {
return switch (self.target_mode) {
.both => if (eqlOptionalTheme(self.initial_light, self.initial_dark))
self.initial_light orelse self.initial_dark
else
self.initial_dark orelse self.initial_light,
.light => self.initial_light orelse self.initial_dark,
.dark => self.initial_dark orelse self.initial_light,
};
}
Copy link

Choose a reason for hiding this comment

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

P2 Dead code: initialTheme is never called

CmuxThemePicker.initialTheme is defined here but is never invoked anywhere in the codebase. A search across all of src/ confirms the only occurrence of initialTheme is this definition. If this method is intended for a future feature, it should be documented with a // TODO comment; otherwise it should be removed to avoid confusion and to keep the dead-code surface small.

Comment on lines +124 to +128
const bare_filename_with_extension =
\\(?<![/\w])[\w][\w\-.]*\.
++ common_extensions ++
\\(?![:\w])
;
Copy link

Choose a reason for hiding this comment

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

P1 Branch 4 won't match filenames followed by :line numbers

The negative lookahead (?![:\w]) prevents matching when a : immediately follows the extension. This means file.py:10 and file.py:10:5 (typical compiler/linter error output formats) will not be detected as links by this branch.

Branch 3 (bare relative paths) handles this correctly — e.g. app/folder/file.rb:1 matches with the :1 included because path_chars contains :. For bare filenames without a directory component, there is no fallback. Consider whether the lookahead should be relaxed to permit an optional :digits suffix, e.g.:

(?![:\w])

→ replaced with something that still blocks file.pyx (word char) but allows file.py:10:

(?![\w])

or handle a (:[\d]+)* optional suffix inside the match. As written, a bare error.py:42 from a compiler won't be clickable.

Comment on lines +124 to +128
const bare_filename_with_extension =
\\(?<![/\w])[\w][\w\-.]*\.
++ common_extensions ++
\\(?![:\w])
;
Copy link

Choose a reason for hiding this comment

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

P2 Lookbehind allows matches after . — potential false positives

(?<![/\w]) only prevents a match when preceded by / or a word character ([A-Za-z0-9_]). A dot (.) is not excluded. This means version.file.py would produce a match of file.py starting at the f (the preceding . satisfies the lookbehind). Similarly v1.main.go would match main.go.

While this may be acceptable in practice (such strings rarely appear in terminal output without a preceding path separator), it is worth being aware of when triaging false-positive reports.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/cli/list_themes.zig (1)

871-882: ⚠️ Potential issue | 🟡 Minor

Add bounds check before clipboard operations.

The clipboard copy operations access self.filtered.items[self.current] without verifying the list is non-empty, which could cause an out-of-bounds access.

🐛 Proposed fix
-                        if (key.matches('c', .{}))
+                        if (key.matches('c', .{}) and self.filtered.items.len > 0)
                             try self.vx.copyToSystemClipboard(
                                 self.tty.writer(),
                                 self.themes[self.filtered.items[self.current]].theme,
                                 alloc,
                             )
-                        else if (key.matches('c', .{ .shift = true }))
+                        else if (key.matches('c', .{ .shift = true }) and self.filtered.items.len > 0)
                             try self.vx.copyToSystemClipboard(
                                 self.tty.writer(),
                                 self.themes[self.filtered.items[self.current]].path,
                                 alloc,
                             );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/cli/list_themes.zig` around lines 871 - 882, Before calling
self.vx.copyToSystemClipboard, ensure the index is valid by checking
self.filtered.items.len > 0 and that self.current < self.filtered.items.len; if
the check fails, skip the clipboard call (or return/emit an error) to avoid
out‑of‑bounds access when reading self.filtered.items[self.current] and then
indexing into self.themes; apply this guard in both branches where
self.vx.copyToSystemClipboard is invoked (the branch copying .theme and the
branch copying .path) and reuse the same validation to keep behavior consistent.
🧹 Nitpick comments (2)
src/config/url.zig (2)

121-123: Consider case-insensitive extension matching.

The extension list is case-sensitive, so README.MD, Config.JSON, or Makefile.PY won't match. While lowercase extensions are more common, some systems or users may use uppercase.

If case-insensitive matching is desired, the Oniguruma (?i:...) syntax could be used for the extension part. However, this may be an intentional design choice to avoid false positives.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/config/url.zig` around lines 121 - 123, The current regex constant
common_extensions only lists lowercase extensions so it won't match uppercase
extensions; update common_extensions to perform case-insensitive matching for
the extension group (e.g., wrap the alternation in an Oniguruma case-insensitive
group like (?i:... ) or add the inline (?i) flag scoped to the extension part)
or alternatively normalize the input filename to lowercase before matching;
locate and modify the common_extensions definition to apply the chosen fix.

116-137: Add test cases for the new bare filename regex branch.

The new bare_filename_with_extension branch looks correct for matching standalone filenames in ls and git status output. However, no test cases were added to verify its behavior.

Consider adding test cases to test "url regex" for:

  1. Positive matches: "main.zig", "README.md", "config.json"
  2. Negative matches (should not match): filenames preceded by / or word chars like "path/file.py" (should match the path branch instead), "wordfile.txt" (preceded by word char)

This would ensure the lookbehind/lookahead assertions work as expected.

📝 Suggested test cases
         .input = "./Downloads: Operation not permitted",
         .expect = "./Downloads",
     },
+    // Bare filenames with common extensions (Branch 4)
+    .{
+        .input = "main.zig",
+        .expect = "main.zig",
+    },
+    .{
+        .input = "README.md is the documentation",
+        .expect = "README.md",
+    },
+    .{
+        .input = "check config.json for settings",
+        .expect = "config.json",
+    },
+    .{
+        .input = "file.tsx  another.py  third.rs",
+        .expect = "file.tsx",
+    },
 };

And for no-match cases, verify that filenames preceded by word characters don't match incorrectly.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/config/url.zig` around lines 116 - 137, Add unit tests to the existing
test "url regex" that exercise the new bare_filename_with_extension branch and
the combined regex: assert positive matches for standalone filenames like
"main.zig", "README.md", and "config.json" (ensure they are matched by regex)
and assert negative/no-match or alternative-branch behavior for inputs that
should not hit this branch such as paths like "path/file.py" (should be matched
by the path branch instead) and tokens preceded by word characters like
"wordfile.txt" (should not be matched as a bare filename); locate tests using
the regex symbol named regex and the branch symbol bare_filename_with_extension
to verify lookbehind/lookahead behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/cli/list_themes.zig`:
- Around line 839-842: The End key handler can underflow when
self.filtered.items.len == 0 because it sets self.current =
self.filtered.items.len - 1 without checking; update the branch that checks
key.matchesAny(&.{ vaxis.Key.end, vaxis.Key.kp_end }, .{}) to first guard that
self.filtered.items.len > 0 and only then set self.current =
self.filtered.items.len - 1 and call try
self.applyCmuxSelectionForCurrentTheme(); keep the rest of the End key logic
unchanged and use the same symbols (self.current, self.filtered.items.len,
applyCmuxSelectionForCurrentTheme, key.matchesAny) so behavior matches
up()/down() handling of empty lists.

---

Outside diff comments:
In `@src/cli/list_themes.zig`:
- Around line 871-882: Before calling self.vx.copyToSystemClipboard, ensure the
index is valid by checking self.filtered.items.len > 0 and that self.current <
self.filtered.items.len; if the check fails, skip the clipboard call (or
return/emit an error) to avoid out‑of‑bounds access when reading
self.filtered.items[self.current] and then indexing into self.themes; apply this
guard in both branches where self.vx.copyToSystemClipboard is invoked (the
branch copying .theme and the branch copying .path) and reuse the same
validation to keep behavior consistent.

---

Nitpick comments:
In `@src/config/url.zig`:
- Around line 121-123: The current regex constant common_extensions only lists
lowercase extensions so it won't match uppercase extensions; update
common_extensions to perform case-insensitive matching for the extension group
(e.g., wrap the alternation in an Oniguruma case-insensitive group like (?i:...
) or add the inline (?i) flag scoped to the extension part) or alternatively
normalize the input filename to lowercase before matching; locate and modify the
common_extensions definition to apply the chosen fix.
- Around line 116-137: Add unit tests to the existing test "url regex" that
exercise the new bare_filename_with_extension branch and the combined regex:
assert positive matches for standalone filenames like "main.zig", "README.md",
and "config.json" (ensure they are matched by regex) and assert
negative/no-match or alternative-branch behavior for inputs that should not hit
this branch such as paths like "path/file.py" (should be matched by the path
branch instead) and tokens preceded by word characters like "wordfile.txt"
(should not be matched as a bare filename); locate tests using the regex symbol
named regex and the branch symbol bare_filename_with_extension to verify
lookbehind/lookahead behavior.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: caa545e4-7830-4486-bd04-43db32802989

📥 Commits

Reviewing files that changed from the base of the PR and between b9989c1 and 8a9cbe9.

📒 Files selected for processing (4)
  • build.zig
  • src/cli/list_themes.zig
  • src/config/url.zig
  • src/main_ghostty.zig

Comment on lines +839 to +842
if (key.matchesAny(&.{ vaxis.Key.end, vaxis.Key.kp_end }, .{})) {
self.current = self.filtered.items.len - 1;
if (key.matchesAny(&.{ 'j', '+', vaxis.Key.down, vaxis.Key.kp_down, vaxis.Key.kp_add }, .{}))
try self.applyCmuxSelectionForCurrentTheme();
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Potential underflow when pressing End key with empty filtered list.

If self.filtered.items.len == 0, the expression self.filtered.items.len - 1 will underflow (wrap to maxInt(usize)). The up() and down() methods handle empty lists, but the End key handler does not.

🐛 Proposed fix
                        if (key.matchesAny(&.{ vaxis.Key.end, vaxis.Key.kp_end }, .{})) {
-                            self.current = self.filtered.items.len - 1;
+                            if (self.filtered.items.len > 0) {
+                                self.current = self.filtered.items.len - 1;
+                            }
                            try self.applyCmuxSelectionForCurrentTheme();
                        }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (key.matchesAny(&.{ vaxis.Key.end, vaxis.Key.kp_end }, .{})) {
self.current = self.filtered.items.len - 1;
if (key.matchesAny(&.{ 'j', '+', vaxis.Key.down, vaxis.Key.kp_down, vaxis.Key.kp_add }, .{}))
try self.applyCmuxSelectionForCurrentTheme();
}
if (key.matchesAny(&.{ vaxis.Key.end, vaxis.Key.kp_end }, .{})) {
if (self.filtered.items.len > 0) {
self.current = self.filtered.items.len - 1;
}
try self.applyCmuxSelectionForCurrentTheme();
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/cli/list_themes.zig` around lines 839 - 842, The End key handler can
underflow when self.filtered.items.len == 0 because it sets self.current =
self.filtered.items.len - 1 without checking; update the branch that checks
key.matchesAny(&.{ vaxis.Key.end, vaxis.Key.kp_end }, .{}) to first guard that
self.filtered.items.len > 0 and only then set self.current =
self.filtered.items.len - 1 and call try
self.applyCmuxSelectionForCurrentTheme(); keep the rest of the End key logic
unchanged and use the same symbols (self.current, self.filtered.items.len,
applyCmuxSelectionForCurrentTheme, key.matchesAny) so behavior matches
up()/down() handling of empty lists.

Copy link

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

1 issue found across 4 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/config/url.zig">

<violation number="1" location="src/config/url.zig:127">
P2: The trailing lookahead currently blocks `:` so bare compiler-style references like `error.py:42` are not linkified. Allow an optional `:line[:column]` suffix while still rejecting trailing word characters.</violation>
</file>

Since this is your first cubic review, here's how it works:

  • cubic automatically reviews your code and comments on bugs and improvements
  • Teach cubic by replying to its comments. cubic learns from your replies and gets better over time
  • Add one-off context when rerunning by tagging @cubic-dev-ai with guidance or docs links (including llms.txt)
  • Ask questions if you need clarification on any suggestion

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

const bare_filename_with_extension =
\\(?<![/\w])[\w][\w\-.]*\.
++ common_extensions ++
\\(?![:\w])
Copy link

@cubic-dev-ai cubic-dev-ai bot Mar 20, 2026

Choose a reason for hiding this comment

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

P2: The trailing lookahead currently blocks : so bare compiler-style references like error.py:42 are not linkified. Allow an optional :line[:column] suffix while still rejecting trailing word characters.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/config/url.zig, line 127:

<comment>The trailing lookahead currently blocks `:` so bare compiler-style references like `error.py:42` are not linkified. Allow an optional `:line[:column]` suffix while still rejecting trailing word characters.</comment>

<file context>
@@ -113,12 +113,28 @@ const bare_relative_path_branch =
+const bare_filename_with_extension =
+    \\(?<![/\w])[\w][\w\-.]*\.
+++ common_extensions ++
+    \\(?![:\w])
+;
+
</file context>
Suggested change
\\(?![:\w])
\\(?::\d+(?::\d+)?)?(?![:\w])
Fix with Cubic

Sign up for free to 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.

2 participants