├── .gitattributes
├── images
├── icon.png
├── generate-demo.gif
├── todonukem-dark.png
├── todonukem-light.png
├── todonukem-mono.svg
└── todonukem-dark.svg
├── .vscodeignore
├── .gitignore
├── .vscode
├── tasks.json
└── launch.json
├── tsconfig.json
├── .npmignore
├── package.nls.json
├── package.nls.de.json
├── todonukem.example.json
├── .all-contributorsrc
├── src
├── extension.ts
├── shared
│ ├── utils.ts
│ ├── constants.ts
│ └── config.ts
├── generator.ts
├── decorators.ts
└── viewer.ts
├── LICENSE.md
├── snippets
├── snippets-line-comment.json
└── snippets-block-comment.json
├── l10n
├── bundle.l10n.json
└── bundle.l10n.de.json
├── package.json
└── README.md
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Set default behavior to automatically normalize line endings.
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jolution/todo-nukem-snippet-vscode/HEAD/images/icon.png
--------------------------------------------------------------------------------
/images/generate-demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jolution/todo-nukem-snippet-vscode/HEAD/images/generate-demo.gif
--------------------------------------------------------------------------------
/images/todonukem-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jolution/todo-nukem-snippet-vscode/HEAD/images/todonukem-dark.png
--------------------------------------------------------------------------------
/images/todonukem-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jolution/todo-nukem-snippet-vscode/HEAD/images/todonukem-light.png
--------------------------------------------------------------------------------
/.vscodeignore:
--------------------------------------------------------------------------------
1 | .vscode/**
2 | .vscode-test/**
3 | .history/**
4 | .gitattributes
5 | .gitignore
6 | node_modules/**
7 | *.vsix
8 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | todonukem.json
2 |
3 | # Default ignore
4 | node_modules
5 | *.vsix
6 | .history
7 | .idea
8 | .DS_Store
9 | out
10 | *.log
11 | .vscode-test
12 | .vscode-test-web
13 | dist
14 |
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.0.0",
3 | "tasks": [
4 | {
5 | "label": "compile",
6 | "type": "shell",
7 | "command": "npm run compile",
8 | "problemMatcher": [
9 | "$tsc"
10 | ]
11 | }
12 | ]
13 | }
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "target": "ES2020",
5 | "outDir": "out",
6 | "lib": ["ES2020"],
7 | "sourceMap": false,
8 | "rootDir": "src",
9 | "strict": true,
10 | "skipLibCheck": true
11 | },
12 | "exclude": ["node_modules", ".vscode-test"]
13 | }
14 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "0.2.0",
3 | "configurations": [
4 | {
5 | "name": "Run Extension",
6 | "type": "extensionHost",
7 | "request": "launch",
8 | "args": ["--extensionDevelopmentPath=${workspaceFolder}"],
9 | "outFiles": ["${workspaceFolder}/out/**/*.js"],
10 | "preLaunchTask": "compile"
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | # Source files
2 | src/
3 | tsconfig.json
4 | .vscode/
5 | .vscode-test/
6 | .vscode-test-web/
7 |
8 | # Git files
9 | .git/
10 | .gitignore
11 | .gitattributes
12 |
13 | # Development files
14 | node_modules/
15 | *.log
16 | .DS_Store
17 | .history/
18 | .idea/
19 |
20 | # CI/CD
21 | .github/
22 |
23 | # Testing
24 | test/
25 | *.test.ts
26 | *.spec.ts
27 |
28 | # Misc
29 | *.vsix
--------------------------------------------------------------------------------
/package.nls.json:
--------------------------------------------------------------------------------
1 | {
2 | "snippetTodoDescription": "Emmet Snippet for TODO with key-based tags",
3 | "snippetFixmeDescription": "Emmet Snippet for FIXME with key-based tags",
4 | "snippetScopeDescription": "Emmet Snippet for TODO NUKEM Convention: Scoping",
5 | "snippetTbdDescription": "This block is used when a task needs further discussion",
6 | "snippetMhdDescription": "This block is used to specify a deadline for a task",
7 | "openTicketInBrowser": "Open {0} in browser",
8 | "enabled": "Enabled",
9 | "disabled": "Disabled",
10 | "decorationsStatus": "TODO NUKEM Decorations: {0}",
11 | "configReloaded": "TODO NUKEM: Config reloaded"
12 | }
13 |
--------------------------------------------------------------------------------
/package.nls.de.json:
--------------------------------------------------------------------------------
1 | {
2 | "snippetTodoDescription": "Emmet Snippet für TODO mit schlüsselbasierten Tags",
3 | "snippetFixmeDescription": "Emmet Snippet für FIXME mit schlüsselbasierten Tags",
4 | "snippetScopeDescription": "Emmet Snippet für TODO NUKEM Konvention: Geltungsbereich",
5 | "snippetTbdDescription": "Dieser Block wird verwendet, wenn eine Aufgabe weitere Diskussion benötigt",
6 | "snippetMhdDescription": "Dieser Block wird verwendet, um eine Frist für eine Aufgabe anzugeben",
7 | "openTicketInBrowser": "Ticket {0} im Browser öffnen",
8 | "enabled": "Aktiviert",
9 | "disabled": "Deaktiviert",
10 | "decorationsStatus": "TODO NUKEM Dekorationen: {0}",
11 | "configReloaded": "TODO NUKEM: Konfiguration neu geladen"
12 | }
13 |
--------------------------------------------------------------------------------
/images/todonukem-mono.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/todonukem.example.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://json-schema.org/draft-07/schema#",
3 | "description": "TODO NUKEM Configuration - Copy this to 'todonukem.json' in your workspace root to customize",
4 | "displayMode": "emoji",
5 | "ticketBaseUrl": "https://your-jira-instance.atlassian.net/browse",
6 | "emojis": {
7 | "priority": {
8 | "low": "🟩",
9 | "medium": "🔶",
10 | "high": "🔴"
11 | },
12 | "type": {
13 | "feature": "✨",
14 | "fix": "🐛"
15 | },
16 | "context": {
17 | "design": "🎨",
18 | "doc": "📚",
19 | "test": "🧪",
20 | "perf": "⚡",
21 | "lang": "🌐",
22 | "sec": "🔒",
23 | "update": "🔄",
24 | "optimize": "🛠️",
25 | "review": "👀"
26 | },
27 | "meta": {
28 | "tbd": "💬",
29 | "scope": "🎯",
30 | "ticket": "🎫",
31 | "until": "📅",
32 | "assignee": "👤",
33 | "author": "✍️",
34 | "version": "🔖",
35 | "docs": "📚",
36 | "blockCommit": "🛑"
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/.all-contributorsrc:
--------------------------------------------------------------------------------
1 | {
2 | "files": [
3 | "README.md"
4 | ],
5 | "imageSize": 100,
6 | "commit": false,
7 | "commitType": "docs",
8 | "commitConvention": "angular",
9 | "contributors": [
10 | {
11 | "login": "pimmok",
12 | "name": "Jochen Simon",
13 | "avatar_url": "https://avatars.githubusercontent.com/u/17846993?v=4",
14 | "profile": "https://jochensimon.com/",
15 | "contributions": [
16 | "design"
17 | ]
18 | },{
19 | "login": "juliankasimir",
20 | "name": "Julian Kasimir",
21 | "avatar_url": "https://avatars.githubusercontent.com/u/120172350?v=4",
22 | "profile": "https://github.com/juliankasimir",
23 | "contributions": [
24 | "ideas",
25 | "code"
26 | ]
27 | }
28 | ],
29 | "contributorsPerLine": 7,
30 | "skipCi": true,
31 | "repoType": "github",
32 | "repoHost": "https://github.com",
33 | "projectName": "todo-nukem-snippet-vscode",
34 | "projectOwner": "jolution"
35 | }
36 |
--------------------------------------------------------------------------------
/src/extension.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * TODO NUKEM Extension Entry Point
3 | * Coordinates Generator and Viewer Modules
4 | */
5 | import * as vscode from 'vscode';
6 | import * as generator from './generator';
7 | import * as viewer from './viewer';
8 | import * as decorators from './decorators';
9 |
10 | export function activate(context: vscode.ExtensionContext) {
11 | try {
12 | // Activate Generator module (command for TODO creation)
13 | generator.activate(context);
14 |
15 | // Activate Viewer module (TreeView with filters)
16 | viewer.activate(context);
17 |
18 | // Activate Decorators module (visual emoji display for keys)
19 | decorators.activate(context);
20 | } catch (error) {
21 | vscode.window.showErrorMessage(`TODO NUKEM activation failed: ${error}`);
22 | }
23 | }
24 |
25 | export function deactivate() {
26 | try {
27 | generator.deactivate();
28 | viewer.deactivate();
29 | decorators.deactivate();
30 | } catch (error) {
31 | // Silent error handling
32 | }
33 | }
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Jolution
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/snippets/snippets-line-comment.json:
--------------------------------------------------------------------------------
1 | {
2 | "TODO NUKEM Emmet Snippets": {
3 | "prefix": ["todo"],
4 | "body": "$LINE_COMMENT TODO: ${1|[low],[medium],[high]|} ${2|[feature],[fix]|} ${3|[design],[doc],[test],[perf],[lang],[sec],[update],[optimize],[review]|} ${0}",
5 | "description": "%snippetTodoDescription%"
6 | },
7 | "TODO NUKEM Fixme": {
8 | "prefix": ["fixme"],
9 | "body": "$LINE_COMMENT FIXME: ${1|[low],[medium],[high]|} [fix] ${3|[design],[doc],[test],[perf],[lang],[sec],[update],[optimize],[review]|} ${0}",
10 | "description": "%snippetFixmeDescription%"
11 | },
12 | "TODO NUKEM Scope": {
13 | "prefix": ["todo-scope"],
14 | "body": "[scope: ${TM_FILENAME_BASE/(^|-)([a-z])/${2:/capitalize}/g}]",
15 | "description": "%snippetScopeDescription%"
16 | },
17 | "TODO NUKEM TBD": {
18 | "prefix": ["todo-tbd"],
19 | "body": "[tbd]",
20 | "description": "%snippetTbdDescription%"
21 | },
22 | "TODO NUKEM MHD": {
23 | "prefix": ["todo-mhd"],
24 | "body": "[until: ${1:${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}}${0}]",
25 | "description": "%snippetMhdDescription%"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/snippets/snippets-block-comment.json:
--------------------------------------------------------------------------------
1 | {
2 | "TODO NUKEM Emmet Snippets": {
3 | "prefix": ["todo"],
4 | "body": "$BLOCK_COMMENT_START TODO: ${1|[low],[medium],[high]|} ${2|[feature],[fix]|} ${3|[design],[doc],[test],[perf],[lang],[sec],[update],[optimize],[review]|} ${0} $BLOCK_COMMENT_END",
5 | "description": "%snippetTodoDescription%"
6 | },
7 | "TODO NUKEM Fixme": {
8 | "prefix": ["fixme"],
9 | "body": "$BLOCK_COMMENT_START FIXME: ${1|[low],[medium],[high]|} [fix] ${3|[design],[doc],[test],[perf],[lang],[sec],[update],[optimize],[review]|} ${0} $BLOCK_COMMENT_END",
10 | "description": "%snippetFixmeDescription%"
11 | },
12 | "TODO NUKEM Scope": {
13 | "prefix": ["todo-scope"],
14 | "body": "[scope: ${TM_FILENAME_BASE/(^|-)([a-z])/${2:/capitalize}/g}]",
15 | "description": "%snippetScopeDescription%"
16 | },
17 | "TODO NUKEM TBD": {
18 | "prefix": ["todo-tbd"],
19 | "body": "[tbd]",
20 | "description": "%snippetTbdDescription%"
21 | },
22 | "TODO NUKEM MHD": {
23 | "prefix": ["todo-mhd"],
24 | "body": "[until: ${1:${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}}${0}]",
25 | "description": "%snippetMhdDescription%"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/l10n/bundle.l10n.json:
--------------------------------------------------------------------------------
1 | {
2 | "lowPrio": "Low Prio",
3 | "mediumPrio": "Medium Prio",
4 | "highPrio": "High Prio",
5 | "selectPriority": "Select priority",
6 | "feature": "Feature",
7 | "fix": "Fix",
8 | "selectType": "Select type",
9 | "design": "Design",
10 | "doc": "Doc",
11 | "test": "Test",
12 | "perf": "Perf",
13 | "lang": "Lang",
14 | "sec": "Sec",
15 | "update": "Update",
16 | "optimize": "Optimize",
17 | "review": "Review",
18 | "selectContext": "Select context",
19 | "enterTodoMessage": "Enter your TODO message",
20 | "whatNeedsToBeDone": "What needs to be done?",
21 | "tbd": "TBD",
22 | "scope": "Scope",
23 | "ticket": "Ticket",
24 | "until": "Until",
25 | "assignee": "Assignee",
26 | "selfAssignee": "Self Assign",
27 | "author": "Author",
28 | "selfAuthor": "Self Author",
29 | "version": "Version",
30 | "docs": "Docs",
31 | "blockCommit": "Block-Commit",
32 | "unknown": "Unknown",
33 | "optionalMetaBlocks": "Optional meta blocks",
34 | "enterValueFor": "Enter value for {0}",
35 | "valueLabel": "{0} value",
36 | "selectPriorityFilter": "Select priority to filter",
37 | "selectTypeFilter": "Select type to filter",
38 | "selectContextFilter": "Select context to filter",
39 | "enterAssigneeName": "Enter assignee name (or leave empty for all)",
40 | "enterAuthorName": "Enter author name (or leave empty for all)",
41 | "all": "All",
42 | "exampleName": "e.g. Duke Nukem",
43 | "openTicketInBrowser": "Open {0} in browser",
44 | "enabled": "Enabled",
45 | "disabled": "Disabled",
46 | "decorationsStatus": "TODO NUKEM Decorations: {0}",
47 | "configReloaded": "TODO NUKEM: Config reloaded"
48 | }
49 |
--------------------------------------------------------------------------------
/l10n/bundle.l10n.de.json:
--------------------------------------------------------------------------------
1 | {
2 | "lowPrio": "Niedrige Priorität",
3 | "mediumPrio": "Mittlere Priorität",
4 | "highPrio": "Hohe Priorität",
5 | "selectPriority": "Priorität auswählen",
6 | "feature": "Feature",
7 | "fix": "Fix",
8 | "selectType": "Typ auswählen",
9 | "design": "Design",
10 | "doc": "Dokumentation",
11 | "test": "Test",
12 | "perf": "Performance",
13 | "lang": "Sprache",
14 | "sec": "Sicherheit",
15 | "update": "Update",
16 | "optimize": "Optimierung",
17 | "review": "Review",
18 | "selectContext": "Kontext auswählen",
19 | "enterTodoMessage": "Geben Sie Ihre TODO-Nachricht ein",
20 | "whatNeedsToBeDone": "Was muss erledigt werden?",
21 | "tbd": "Zu Klären",
22 | "scope": "Geltungsbereich",
23 | "ticket": "Ticket",
24 | "until": "Bis",
25 | "assignee": "Zugewiesener",
26 | "selfAssignee": "Selbstzuweisung",
27 | "author": "Autor",
28 | "selfAuthor": "Ich als Autor",
29 | "version": "Version",
30 | "docs": "Dokumentation",
31 | "blockCommit": "Commit-Blockierung",
32 | "unknown": "Unbekannt",
33 | "optionalMetaBlocks": "Optionale Meta-Blöcke",
34 | "enterValueFor": "Wert für {0} eingeben",
35 | "valueLabel": "{0} Wert",
36 | "selectPriorityFilter": "Wähle Priorität zum Filtern",
37 | "selectTypeFilter": "Wähle Typ zum Filtern",
38 | "selectContextFilter": "Wähle Kontext zum Filtern",
39 | "enterAssigneeName": "Gib den Assignee-Namen ein (oder leer lassen für alle)",
40 | "enterAuthorName": "Gib den Author-Namen ein (oder leer lassen für alle)",
41 | "all": "Alle",
42 | "exampleName": "z.B. Duke Nukem",
43 | "openTicketInBrowser": "Öffne {0} im Browser",
44 | "enabled": "Aktiviert",
45 | "disabled": "Deaktiviert",
46 | "decorationsStatus": "TODO NUKEM Dekorationen: {0}",
47 | "configReloaded": "TODO NUKEM: Konfiguration neu geladen"
48 | }
49 |
--------------------------------------------------------------------------------
/src/shared/utils.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from 'vscode';
2 |
3 | export enum MetaBlockKey {
4 | TBD = 'TBD',
5 | Scope = 'Scope',
6 | Ticket = 'Ticket',
7 | Until = 'Until',
8 | Assignee = 'Assignee',
9 | SelfAssignee = 'SelfAssignee',
10 | Author = 'Author',
11 | SelfAuthor = 'SelfAuthor',
12 | Version = 'Version',
13 | Docs = 'Docs',
14 | BlockCommit = 'Block-Commit'
15 | }
16 |
17 | export interface MetaBlock extends vscode.QuickPickItem {
18 | key: string;
19 | metaType: MetaBlockKey;
20 | }
21 |
22 | /**
23 | * Retrieves the Git username from the current workspace
24 | */
25 | export function getGitUserName(): string {
26 | try {
27 | const { execSync } = require('child_process');
28 | return execSync('git config user.name', {
29 | cwd: vscode.workspace.workspaceFolders?.[0]?.uri.fsPath,
30 | encoding: 'utf8'
31 | }).trim();
32 | } catch {
33 | return '';
34 | }
35 | }
36 |
37 | /**
38 | * Returns the appropriate comment prefix for the given language
39 | */
40 | export function getCommentPrefix(languageId: string): string {
41 | const commentMap: { [key: string]: string } = {
42 | 'javascript': '//',
43 | 'typescript': '//',
44 | 'java': '//',
45 | 'c': '//',
46 | 'cpp': '//',
47 | 'csharp': '//',
48 | 'go': '//',
49 | 'rust': '//',
50 | 'php': '//',
51 | 'swift': '//',
52 | 'kotlin': '//',
53 | 'dart': '//',
54 | 'python': '#',
55 | 'ruby': '#',
56 | 'shell': '#',
57 | 'bash': '#',
58 | 'powershell': '#',
59 | 'yaml': '#',
60 | 'perl': '#',
61 | 'r': '#',
62 | 'html': '
14 | [](#contributors-)
15 |
16 |
17 | **Working Draft**
18 |
19 | A VSCode extension for creating and managing structured TODO comments with emojis following the [TODO NUKEM Convention](https://github.com/jolution/todo-nukem/blob/main/README.md). Features **interactive comment generation**, **TODO overview with filtering**, and **quick snippets** for maximum productivity.
20 |
21 |
22 |
23 |
24 |
25 |
26 | ## 📰 Installation
27 |
28 | Install this extension from the [VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=jolution.todo-nukem-vscode)
29 |
30 | ## 🚀 Usage
31 |
32 | This extension offers **two ways** to create TODO NUKEM comments:
33 |
34 | ### 1. 🎯 Interactive Command (Recommended)
35 |
36 | Open the Command Palette (`Cmd+Shift+P` or `Ctrl+Shift+P`) and search for:
37 |
38 | ```
39 | TODO NUKEM Comment
40 | ```
41 |
42 | Follow the guided prompts:
43 |
44 | 1. **Priority**: 🟩 Low / 🔶 Medium / 🔴 High
45 | 2. **Type**: ✨ Feature / 🐛 Fix
46 | 3. **Context**: 🎨 Design / 📚 Doc / 🧪 Test / ⚡ Perf / etc.
47 | 4. **Message**: Your TODO description
48 | 5. **Meta Blocks** (optional): 💬 TBD / 🎯 Scope / 🎫 Ticket / 📅 Until / etc.
49 |
50 | **Example in source code:**
51 |
52 | ```typescript
53 | // TODO: [high] [feature] [design] Refactor button component [ticket: JIRA-123] [until: 2025-12-31]
54 | ```
55 |
56 | **Visual display (with decorations):**
57 |
58 | The extension decorates the keys with emojis in the editor:
59 |
60 | ```text
61 | // TODO: 🔴 ✨ 🎨 Refactor button component 🎫 JIRA-123 📅 2025-12-31
62 | ```
63 |
64 | > **Note:** You can customize the display mode in `todonukem.json` (emoji, text, or emoji-text combination). Alternatively, click the **eye icon (👁️)** in the status bar to quickly toggle between display modes.
65 |
66 | ### 2. ⚡ Quick Snippets
67 |
68 | In supported languages, type `todo` or `fixme` and press `Tab` to activate snippet templates:
69 |
70 | ```todo ⇥```
71 | ```fixme ⇥```
72 |
73 | This provides pre-defined templates for quick TODO insertion.
74 |
75 | ## ✨ Supported Languages
76 |
77 | _Defined in the ```package.json``` file, the following languages are supported with either line or block comments:_
78 |
79 | ### Line Comment
80 |
81 | ```TypeScript, JavaScript```
82 |
83 | ### Block Comment
84 |
85 | ```CSS, PostCSS, SCSS, Less, HTML, Python, Java, C#, C++, Ruby, Swift, PHP, Go, Rust, Dart, Perl, Lua, Shell Script```
86 |
87 | For example, CSS uses block comments like ```/* ... */```.
88 |
89 | And TypeScript could use line comments like ```// ...```.
90 |
91 | **If a language you need is missing, feel free to open a PR and contribute!**
92 |
93 | ## ❓FAQ
94 |
95 | By default, snippet suggestions are not active in comments in VSCode. If you want to enable this feature, you need to adjust your settings.
98 |
99 | In User Settings search for `quickSuggestions` and enable the following options:
100 |
101 | ```json
102 | "editor.quickSuggestions": {
103 | "comments": true,
104 | "strings": true
105 | }
106 | ```
107 |
108 | Older Windows 10 versions don't support the green square emoji (🟩). To fix this, create a You can customize how TODOs are displayed by creating a You can make ticket references clickable by configuring a How can I enable snippet suggestions in comments in VSCode?
97 | The green emoji (🟩) doesn't display on older Windows 10 versions
113 | todonukem.json file in your workspace root with the following content:
114 |
115 | ```json
116 | {
117 | "emojis": {
118 | "priority": {
119 | "low": "🔵"
120 | }
121 | }
122 | }
123 | ```
124 |
125 | This replaces the green square with a blue circle (🔵).
126 |
127 | After creating the file, press `Ctrl+Shift+P` (or `Cmd+Shift+P` on Mac), type `reload`, and select **"Developer: Reload Window"** to apply the changes.
128 |
129 | How can I customize the display mode?
134 | todonukem.json file in your workspace root:
135 |
136 | **Emoji only (default):**
137 |
138 | ```json
139 | {
140 | "displayMode": "emoji"
141 | }
142 | ```
143 |
144 | Displays: `🔴 ✨ 🎨`
145 |
146 | **Text only:**
147 |
148 | ```json
149 | {
150 | "displayMode": "text"
151 | }
152 | ```
153 |
154 | Displays: `High Feature Design`
155 |
156 | **Emoji-text combination:**
157 |
158 | ```json
159 | {
160 | "displayMode": "emoji-text"
161 | }
162 | ```
163 |
164 | Displays: `🔴-high ✨-feature 🎨-design`
165 |
166 | After creating or modifying the file, reload the window with `Ctrl+Shift+P` → `reload` → **"Developer: Reload Window"**.
167 |
168 | How can I configure ticket links?
173 | ticketBaseUrl in your todonukem.json file:
174 |
175 | ```json
176 | {
177 | "ticketBaseUrl": "https://jira.example.com/browse"
178 | }
179 | ```
180 |
181 | Now when you use `[ticket: JIRA-123]` in your TODO comments, the ticket ID becomes a clickable link that opens in your browser:
182 |
183 | ```typescript
184 | // TODO: [high] [feature] Fix login bug [ticket: JIRA-123]
185 | ```
186 |
187 | Clicking on `JIRA-123` will open `https://jira.example.com/browse/JIRA-123`.
188 |
189 | After creating or modifying the file, reload the window with `Ctrl+Shift+P` → `reload` → **"Developer: Reload Window"**.
190 |
191 |
Jochen Simon 🎨 |
252 | Julian Kasimir 🤔 💻 |
253 |