@@ -17,6 +18,17 @@
+ مُحَرِّرُ نُصُوصٍ يَعمَلُ فِي الطَّرَفِيَّة، مُستَلهَمٌ مِن Kakoune وَ Neovim وَمَكتُوبٌ بِلُغَةِ رَست البَرمَجِيَّة. +
+` blocks into `Event::Code`
let mut in_code = false;
let parser = parser.filter_map(|event| match event {
- Event::Html(tag) if *tag == *"" => {
+ Event::Html(tag)
+ if tag.starts_with("')) =>
+ {
in_code = true;
None
}
@@ -275,17 +278,21 @@ impl Markdown {
);
lines.extend(tui_text.lines.into_iter());
} else {
- let style = if let Some(Tag::Heading(level, ..)) = tags.last() {
- match level {
+ let style = match tags.last() {
+ Some(Tag::Heading(level, ..)) => match level {
HeadingLevel::H1 => heading_styles[0],
HeadingLevel::H2 => heading_styles[1],
HeadingLevel::H3 => heading_styles[2],
HeadingLevel::H4 => heading_styles[3],
HeadingLevel::H5 => heading_styles[4],
HeadingLevel::H6 => heading_styles[5],
+ },
+ Some(Tag::Emphasis) => text_style.add_modifier(Modifier::ITALIC),
+ Some(Tag::Strong) => text_style.add_modifier(Modifier::BOLD),
+ Some(Tag::Strikethrough) => {
+ text_style.add_modifier(Modifier::CROSSED_OUT)
}
- } else {
- text_style
+ _ => text_style,
};
spans.push(Span::styled(text, style));
}
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index 7aa5aa483..d5cdc3bea 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -1192,71 +1192,80 @@ impl Editor {
}
/// Refreshes the language server for a given document
- pub fn refresh_language_servers(&mut self, doc_id: DocumentId) -> Option<()> {
+ pub fn refresh_language_servers(&mut self, doc_id: DocumentId) {
self.launch_language_servers(doc_id)
}
/// Launch a language server for a given document
- fn launch_language_servers(&mut self, doc_id: DocumentId) -> Option<()> {
+ fn launch_language_servers(&mut self, doc_id: DocumentId) {
if !self.config().lsp.enable {
- return None;
+ return;
}
// if doc doesn't have a URL it's a scratch buffer, ignore it
- let doc = self.documents.get_mut(&doc_id)?;
- let doc_url = doc.url()?;
+ let Some(doc) = self.documents.get_mut(&doc_id) else {
+ return;
+ };
+ let Some(doc_url) = doc.url() else {
+ return;
+ };
let (lang, path) = (doc.language.clone(), doc.path().cloned());
let config = doc.config.load();
let root_dirs = &config.workspace_lsp_roots;
- // try to find language servers based on the language name
- let language_servers = lang.as_ref().and_then(|language| {
+ // store only successfully started language servers
+ let language_servers = lang.as_ref().map_or_else(HashMap::default, |language| {
self.language_servers
.get(language, path.as_ref(), root_dirs, config.lsp.snippets)
- .map_err(|e| {
- log::error!(
- "Failed to initialize the language servers for `{}` {{ {} }}",
- language.scope(),
- e
- )
+ .filter_map(|(lang, client)| match client {
+ Ok(client) => Some((lang, client)),
+ Err(err) => {
+ log::error!(
+ "Failed to initialize the language servers for `{}` - `{}` {{ {} }}",
+ language.scope(),
+ lang,
+ err
+ );
+ None
+ }
})
- .ok()
+ .collect::>()
});
- if let Some(language_servers) = language_servers {
- let language_id = doc.language_id().map(ToOwned::to_owned).unwrap_or_default();
-
- // only spawn new language servers if the servers aren't the same
-
- let doc_language_servers_not_in_registry =
- doc.language_servers.iter().filter(|(name, doc_ls)| {
- language_servers
- .get(*name)
- .map_or(true, |ls| ls.id() != doc_ls.id())
- });
+ if language_servers.is_empty() {
+ return;
+ }
- for (_, language_server) in doc_language_servers_not_in_registry {
- tokio::spawn(language_server.text_document_did_close(doc.identifier()));
- }
+ let language_id = doc.language_id().map(ToOwned::to_owned).unwrap_or_default();
- let language_servers_not_in_doc = language_servers.iter().filter(|(name, ls)| {
- doc.language_servers
+ // only spawn new language servers if the servers aren't the same
+ let doc_language_servers_not_in_registry =
+ doc.language_servers.iter().filter(|(name, doc_ls)| {
+ language_servers
.get(*name)
- .map_or(true, |doc_ls| ls.id() != doc_ls.id())
+ .map_or(true, |ls| ls.id() != doc_ls.id())
});
- for (_, language_server) in language_servers_not_in_doc {
- // TODO: this now races with on_init code if the init happens too quickly
- tokio::spawn(language_server.text_document_did_open(
- doc_url.clone(),
- doc.version(),
- doc.text(),
- language_id.clone(),
- ));
- }
+ for (_, language_server) in doc_language_servers_not_in_registry {
+ tokio::spawn(language_server.text_document_did_close(doc.identifier()));
+ }
+
+ let language_servers_not_in_doc = language_servers.iter().filter(|(name, ls)| {
+ doc.language_servers
+ .get(*name)
+ .map_or(true, |doc_ls| ls.id() != doc_ls.id())
+ });
- doc.language_servers = language_servers;
+ for (_, language_server) in language_servers_not_in_doc {
+ // TODO: this now races with on_init code if the init happens too quickly
+ tokio::spawn(language_server.text_document_did_open(
+ doc_url.clone(),
+ doc.version(),
+ doc.text(),
+ language_id.clone(),
+ ));
}
- Some(())
+
+ doc.language_servers = language_servers;
}
fn _refresh(&mut self) {
@@ -1460,7 +1469,7 @@ impl Editor {
doc.set_version_control_head(self.diff_providers.get_current_head_name(&path));
let id = self.new_document(doc);
- let _ = self.launch_language_servers(id);
+ self.launch_language_servers(id);
id
};
diff --git a/helix-view/src/gutter.rs b/helix-view/src/gutter.rs
index a332a8a32..397dff4f4 100644
--- a/helix-view/src/gutter.rs
+++ b/helix-view/src/gutter.rs
@@ -94,9 +94,9 @@ pub fn diff<'doc>(
theme: &Theme,
_is_focused: bool,
) -> GutterFn<'doc> {
- let added = theme.get("diff.plus");
- let deleted = theme.get("diff.minus");
- let modified = theme.get("diff.delta");
+ let added = theme.get("diff.plus.gutter");
+ let deleted = theme.get("diff.minus.gutter");
+ let modified = theme.get("diff.delta.gutter");
if let Some(diff_handle) = doc.diff_handle() {
let hunks = diff_handle.load();
let mut hunk_i = 0;
diff --git a/languages.toml b/languages.toml
index 37d2e94cf..c12c4e82d 100644
--- a/languages.toml
+++ b/languages.toml
@@ -317,7 +317,7 @@ indent = { tab-width = 2, unit = " " }
name = "json"
scope = "source.json"
injection-regex = "json"
-file-types = ["json", "jsonc", "arb", "ipynb", "geojson", "gltf"]
+file-types = ["json", "jsonc", "arb", "ipynb", "geojson", "gltf", "webmanifest", "flake.lock", ".babelrc"]
roots = []
language-servers = [ "vscode-json-language-server" ]
auto-format = true
@@ -546,7 +546,7 @@ name = "javascript"
scope = "source.js"
injection-regex = "(js|javascript)"
language-id = "javascript"
-file-types = ["js", "mjs", "cjs"]
+file-types = ["js", "mjs", "cjs", "rules"]
shebangs = ["node"]
roots = []
comment-token = "//"
@@ -1003,7 +1003,10 @@ language-servers = [ "purescript-language-server" ]
indent = { tab-width = 2, unit = " " }
auto-format = true
formatter = { command = "purs-tidy", args = ["format"] }
-grammar = "haskell"
+
+[[grammar]]
+name = "purescript"
+source = { git = "https://github.com/maskhjarna/tree-sitter-purescript", rev = "5f5a030826849b7be17596d372967f60051b42bd" }
[[language]]
name = "zig"
@@ -1084,6 +1087,7 @@ source = { git = "https://github.com/uyha/tree-sitter-cmake", rev = "6e51463ef30
name = "make"
scope = "source.make"
file-types = ["Makefile", "makefile", "make", "mk"]
+shebangs = ["make", "gmake"]
injection-regex = "(make|makefile|Makefile|mk)"
roots = []
comment-token = "#"
@@ -2202,7 +2206,7 @@ source = { git = "https://github.com/Unoqwy/tree-sitter-kdl", rev = "e1cd292c6d1
name = "xml"
scope = "source.xml"
injection-regex = "xml"
-file-types = ["xml", "mobileconfig", "plist", "xib", "storyboard", "svg", "xsd", "gml", "xaml", "gir", "rss", "atom", "opml"]
+file-types = ["xml", "mobileconfig", "plist", "xib", "storyboard", "svg", "xsd", "gml", "xaml", "gir", "rss", "atom", "opml", "policy"]
indent = { tab-width = 2, unit = " " }
roots = []
@@ -2290,7 +2294,8 @@ file-types = [
"container",
"volume",
"kube",
- "network"
+ "network",
+ ".editorconfig"
]
injection-regex = "ini"
comment-token = "#"
@@ -2495,7 +2500,7 @@ source = { git = "https://github.com/erasin/tree-sitter-po", rev = "417cee9abb20
[[language]]
name = "nasm"
scope = "source.nasm"
-file-types = ["asm", "s", "S", "nasm"]
+file-types = ["asm", "S", "nasm"]
injection-regex = "n?asm"
roots = []
comment-token = ";"
@@ -2505,6 +2510,19 @@ indent = { tab-width = 8, unit = " " }
name = "nasm"
source = { git = "https://github.com/naclsn/tree-sitter-nasm", rev = "a0db15db6fcfb1bf2cc8702500e55e558825c48b" }
+[[language]]
+name = "gas"
+scope = "source.gas"
+file-types = ["s"]
+injection-regex = "gas"
+roots = []
+comment-token = "#"
+indent = { tab-width = 8, unit = " " }
+
+[[grammar]]
+name = "gas"
+source = { git = "https://github.com/sirius94/tree-sitter-gas", rev = "60f443646b20edee3b7bf18f3a4fb91dc214259a" }
+
[[language]]
name = "rst"
scope = "source.rst"
diff --git a/runtime/queries/gas/highlights.scm b/runtime/queries/gas/highlights.scm
new file mode 100644
index 000000000..46cefcbab
--- /dev/null
+++ b/runtime/queries/gas/highlights.scm
@@ -0,0 +1,21 @@
+(comment) @comment
+(number) @constant.numeric
+(directive_name) @keyword.directive
+(symbol) @variable
+(label) @function
+(label)
+(instruction_prefix) @keyword
+(instruction_name) @function.special
+(register) @constant.builtin
+(string) @string
+(char) @constant.character
+(type) @type
+(constant "$" @constant)
+(operand_modifier) @attribute
+
+(expression
+ ["-" "+" "*" "/" "="] @operator)
+
+["(" ")"] @punctuation.bracket
+
+["," ":"] @punctuation.delimiter
diff --git a/runtime/queries/gas/injections.scm b/runtime/queries/gas/injections.scm
new file mode 100644
index 000000000..2f0e58eb6
--- /dev/null
+++ b/runtime/queries/gas/injections.scm
@@ -0,0 +1,2 @@
+((comment) @injection.content
+ (#set! injection.language "comment"))
diff --git a/runtime/queries/gas/textobjects.scm b/runtime/queries/gas/textobjects.scm
new file mode 100644
index 000000000..4465c8768
--- /dev/null
+++ b/runtime/queries/gas/textobjects.scm
@@ -0,0 +1,2 @@
+(comment) @comment.inside
+(comment)+ @comment.around
diff --git a/runtime/queries/go/highlights.scm b/runtime/queries/go/highlights.scm
index b2d81e45d..b45a11bee 100644
--- a/runtime/queries/go/highlights.scm
+++ b/runtime/queries/go/highlights.scm
@@ -24,7 +24,6 @@
; Identifiers
-((identifier) @constant (match? @constant "^[A-Z][A-Z\\d_]+$"))
(const_spec
name: (identifier) @constant)
@@ -38,6 +37,7 @@
(type_spec
name: (type_identifier) @constructor)
(field_identifier) @variable.other.member
+(keyed_element (literal_element (identifier) @variable.other.member))
(identifier) @variable
(package_identifier) @namespace
diff --git a/runtime/queries/nix/injections.scm b/runtime/queries/nix/injections.scm
index 1da63ce08..9804b75be 100644
--- a/runtime/queries/nix/injections.scm
+++ b/runtime/queries/nix/injections.scm
@@ -5,6 +5,20 @@
((((comment) @injection.language) .
(indented_string_expression (string_fragment) @injection.content))
(#set! injection.combined))
+((binding
+ (comment) @injection.language
+ expression: (indented_string_expression (string_fragment) @injection.content))
+ (#set! injection.combined))
+
+; Common attribute keys corresponding to Python scripts,
+; such as those for NixOS VM tests in nixpkgs/nixos/tests.
+((binding
+ attrpath: (attrpath (identifier) @_path)
+ expression: (indented_string_expression
+ (string_fragment) @injection.content))
+ (#match? @_path "(^|\\.)testScript$")
+ (#set! injection.language "python")
+ (#set! injection.combined))
; Common attribute keys corresponding to scripts,
; such as those of stdenv.mkDerivation.
diff --git a/runtime/queries/purescript/highlights.scm b/runtime/queries/purescript/highlights.scm
index ef073eb25..86deb48f6 100644
--- a/runtime/queries/purescript/highlights.scm
+++ b/runtime/queries/purescript/highlights.scm
@@ -1 +1,122 @@
-; inherits: haskell
+; ----------------------------------------------------------------------------
+; Literals and comments
+
+ (integer) @constant.numeric.integer
+ (exp_negation) @constant.numeric.integer
+ (exp_literal (float)) @constant.numeric.float
+ (char) @constant.character
+ (string) @string
+
+ (con_unit) @constant.builtin ; unit, as in ()
+
+ (comment) @comment
+
+
+; ----------------------------------------------------------------------------
+; Punctuation
+
+ [
+ "("
+ ")"
+ "{"
+ "}"
+ "["
+ "]"
+ ] @punctuation.bracket
+
+ [
+ (comma)
+ ";"
+ ] @punctuation.delimiter
+
+
+; ----------------------------------------------------------------------------
+; Keywords, operators, includes
+
+ [
+ "if"
+ "then"
+ "else"
+ "case"
+ "of"
+ ] @keyword.control.conditional
+
+ [
+ "import"
+ "module"
+ ] @keyword.control.import
+
+ [
+ (operator)
+ (constructor_operator)
+ (type_operator)
+ (tycon_arrow)
+ (qualified_module) ; grabs the `.` (dot), ex: import System.IO
+ (all_names)
+ "="
+ "|"
+ "::"
+ "∷"
+ "=>"
+ "⇒"
+ "->"
+ "→"
+ "<-"
+ "←"
+ "\\"
+ "`"
+ "@"
+ ] @operator
+
+ (qualified_module (module) @constructor)
+ (module) @namespace
+ (qualified_type (module) @namespace)
+ (qualified_variable (module) @namespace)
+ (import (module) @namespace)
+
+ [
+ (where)
+ "let"
+ "in"
+ "class"
+ "instance"
+ "derive"
+ "foreign"
+ "data"
+ "newtype"
+ "type"
+ "as"
+ "do"
+ "ado"
+ "forall"
+ "∀"
+ "infix"
+ "infixl"
+ "infixr"
+ ] @keyword
+
+
+; ----------------------------------------------------------------------------
+; Functions and variables
+
+ (signature name: (variable) @type)
+ (function name: (variable) @function)
+
+ ; true or false
+((variable) @constant.builtin.boolean
+ (#match? @constant.builtin.boolean "^(true|false)$"))
+
+ (variable) @variable
+
+ (exp_infix (variable) @operator) ; consider infix functions as operators
+
+ ("@" @namespace) ; "as" pattern operator, e.g. x@Constructor
+
+
+; ----------------------------------------------------------------------------
+; Types
+
+ (type) @type
+
+ (constructor) @constructor
+
diff --git a/runtime/queries/purescript/injections.scm b/runtime/queries/purescript/injections.scm
index ef073eb25..321c90add 100644
--- a/runtime/queries/purescript/injections.scm
+++ b/runtime/queries/purescript/injections.scm
@@ -1 +1,2 @@
-; inherits: haskell
+((comment) @injection.content
+ (#set! injection.language "comment"))
diff --git a/runtime/queries/purescript/locals.scm b/runtime/queries/purescript/locals.scm
index ef073eb25..ad67fe43f 100644
--- a/runtime/queries/purescript/locals.scm
+++ b/runtime/queries/purescript/locals.scm
@@ -1 +1,4 @@
-; inherits: haskell
+(signature name: (variable)) @local.definition
+(function name: (variable)) @local.definition
+(pat_name (variable)) @local.definition
+(exp_name (variable)) @local.reference
diff --git a/runtime/queries/purescript/textobjects.scm b/runtime/queries/purescript/textobjects.scm
new file mode 100644
index 000000000..5f8eaff73
--- /dev/null
+++ b/runtime/queries/purescript/textobjects.scm
@@ -0,0 +1,13 @@
+(comment) @comment.inside
+
+[
+ (data)
+ (type)
+ (newtype)
+] @class.around
+
+((signature)? (function rhs:(_) @function.inside)) @function.around
+(exp_lambda) @function.around
+
+(data (type_variable) @parameter.inside)
+(patterns (_) @parameter.inside)
diff --git a/runtime/queries/unison/highlights.scm b/runtime/queries/unison/highlights.scm
index 8ec2b6ff2..956dc5824 100644
--- a/runtime/queries/unison/highlights.scm
+++ b/runtime/queries/unison/highlights.scm
@@ -10,14 +10,18 @@
[
(kw_forall)
(unique_kw)
+ (structural_kw)
(type_kw)
(kw_equals)
(do)
+ (ability)
+ (where)
] @keyword
(kw_let) @keyword.function
(type_kw) @keyword.storage.type
(unique) @keyword.storage.modifier
+(structural) @keyword.storage.modifier
("use") @keyword.control.import
@@ -31,6 +35,7 @@
(arrow_symbol)
(">")
(or)
+ (and)
(bang)
] @operator
@@ -47,13 +52,22 @@
;; Types
(record_field name: (wordy_id) @variable.other.member type: (wordy_id) @type)
-[
- (type_name)
- (type_signature)
- (effect)
-] @type
+(type_constructor (type_name (wordy_id) @constructor))
+(ability_declaration type_name: (wordy_id) @type type_arg: (wordy_id) @variable.parameter)
+(effect (wordy_id) @special) ;; NOTE: an effect is just like a type, but in signature we special case it
+
+;; Namespaces
+(path) @namespace
+(namespace) @namespace
+
+;; Terms
+(type_signature term_name: (path)? @variable term_name: (wordy_id) @variable)
+(type_signature (wordy_id) @type)
+(type_signature (delayed (wordy_id)) @type)
+
+(term_definition param: (wordy_id) @variable.parameter)
-(term_definition) @variable
+(function_application function_name: (path)? function_name: (wordy_id) @function)
;; Punctuation
[
@@ -70,3 +84,4 @@
"]"
] @punctuation.bracket
+(test_watch_expression (wordy_id) @keyword.directive)
diff --git a/runtime/themes/cyan_light.toml b/runtime/themes/cyan_light.toml
new file mode 100644
index 000000000..2114054d0
--- /dev/null
+++ b/runtime/themes/cyan_light.toml
@@ -0,0 +1,151 @@
+# An approximation/port of the Cyan Light Theme from Jetbrains
+#
+# Original Color Scheme here https://plugins.jetbrains.com/plugin/12102-cyan-light-theme
+
+"attribute" = "blue"
+"type" = "shade07"
+"type.enum.variant" = "purple"
+"constructor" = "shade07"
+
+"constant" = "darker_blue"
+"constant.builtin.boolean" = "blue"
+"constant.character" = "blue"
+"constant.character.escape" = "dark_red"
+"constant.numeric" = "blue"
+
+"string" = "green"
+"string.regexp" = "blue"
+"string.special" = { fg = "dark_red", modifiers = ["underlined"] }
+
+"comment" = "comment_gray"
+
+"variable" = "green_blue"
+"variable.builtin" = { fg = "darker_blue" }
+"variable.parameter" = "purple"
+"variable.other.member" = "purple"
+
+"label" = { fg = "darker_blue", modifiers = ["underlined"] }
+"punctuation" = "shade06"
+
+"keyword" = "darker_blue"
+"keyword.control.exception" = "darker_blue"
+
+"operator" = "shade06"
+
+"function" = "shade07"
+"function.macro" = "yellow"
+"function.builtin" = { fg = "shade07", modifiers = ["italic"] }
+"function.special" = "dark_red"
+"function.method" = "dark_yellow"
+
+"tag" = "darker_blue"
+"special" = "shade06"
+"namespace" = "darker_blue"
+
+"markup.bold" = { fg = "shade06", modifiers = ["bold"] }
+"markup.italic" = { fg = "shade06", modifiers = ["italic"] }
+"markup.strikethrough" = { fg = "shade06", modifiers = ["crossed_out"] }
+"markup.heading" = { fg = "purple" }
+"markup.list" = "darker_blue"
+"markup.list.numbered" = "darker_blue"
+"markup.list.unnumbered" = "darker_blue"
+"markup.link.url" = "shade06"
+"markup.link.text" = { fg = "dark_blue", modifiers = ['underlined'] }
+"markup.link.label" = "dark_blue"
+"markup.quote" = "green"
+"markup.raw" = "green"
+"markup.raw.inline" = "green"
+"markup.raw.block" = "green"
+
+"diff.plus" = "diff_green"
+"diff.minus" = "diff_red"
+"diff.delta" = "diff_blue"
+
+# ui specific
+"ui.background" = { bg = "shade00" }
+"ui.cursor" = { bg = "shade02" }
+"ui.cursor.primary" = { bg = "cursor_blue" }
+"ui.cursor.match" = { fg = "shade00", bg = "shade04" }
+"ui.cursor.primary.select" = { bg = "light_purple" }
+"ui.cursor.primary.insert" = { bg = "light_green" }
+
+"ui.selection" = { bg = "lighter_blue" }
+"ui.selection.primary" = { bg = "lighter_blue" }
+
+"ui.highlight" = { bg = "faint_blue" }
+"ui.cursorline.primary" = { bg = "faint_blue" }
+
+"ui.linenr" = { fg = "shade03" }
+"ui.linenr.selected" = { fg = "shade04", bg = "faint_blue", modifiers = [
+ "bold",
+] }
+
+"ui.statusline" = { fg = "shade06", bg = "shade02" }
+"ui.statusline.inactive" = { fg = "shade04", bg = "shade01" }
+"ui.statusline.normal" = { fg = "shade00", bg = "blue" }
+"ui.statusline.insert" = { fg = "shade00", bg = "green" }
+"ui.statusline.select" = { fg = "shade00", bg = "purple" }
+
+"ui.popup" = { bg = "shade01", fg = "shade04" }
+"ui.window" = { bg = "shade00", fg = "shade04" }
+"ui.help" = { fg = "shade06", bg = "shade01" }
+"ui.text" = "shade05"
+"ui.text.focus" = { fg = "shade07", bg = "light_blue" }
+"ui.virtual" = "shade03"
+"ui.virtual.ruler" = { bg = "shade04" }
+"ui.menu" = { fg = "shade05", bg = "shade01" }
+"ui.menu.selected" = { fg = "shade07", bg = "light_blue" }
+
+"hint" = "shade04"
+"info" = "light_blue"
+"warning" = "orange"
+"error" = "red"
+"diagnostic" = { modifiers = [] }
+"diagnostic.hint" = { underline = { color = "shade04", style = "line" } }
+"diagnostic.info" = { underline = { color = "light_blue", style = "line" } }
+"diagnostic.warning" = { underline = { color = "orange", style = "curl" } }
+"diagnostic.error" = { underline = { color = "red", style = "curl" } }
+
+[palette]
+shade00 = "#f2f3f7"
+shade01 = "#dadde8"
+shade02 = "#c1c6d9"
+shade03 = "#a9b0ca"
+shade04 = "#525c85"
+shade05 = "#434b6c"
+shade06 = "#343a54"
+shade07 = "#25293c"
+
+background = "#f2f3f7"
+foreground = "#25293c"
+
+comment_gray = "#808080"
+
+diff_blue = "#C3D6E8"
+faint_blue = "#E8Eef1"
+lighter_blue = "#d0eaff"
+light_blue = "#99ccff"
+cursor_blue = "#80bfff"
+blue = "#0073E6"
+dark_blue = "#185b93"
+darker_blue = "#000080"
+
+
+purple = "#660E7A"
+light_purple = "#ED9CFF"
+
+diff_green = "#C9DEC1"
+green = "#00733B"
+light_green = "#5DCE87"
+green_blue = "#458383"
+
+
+yellow = "#808000"
+dark_yellow = "#7A7A43"
+
+light_orange = "#f9c881"
+orange = "#F49810"
+
+diff_red = "#EBBCBC"
+red = "#d90016"
+dark_red = "#7F0000"
diff --git a/runtime/themes/onedark.toml b/runtime/themes/onedark.toml
index 21101ea75..1db2aff86 100644
--- a/runtime/themes/onedark.toml
+++ b/runtime/themes/onedark.toml
@@ -1,5 +1,6 @@
# Author : Gokul Soumya
+"tag" = { fg = "red" }
"attribute" = { fg = "yellow" }
"comment" = { fg = "light-gray", modifiers = ["italic"] }
"constant" = { fg = "cyan" }