From 1653dfaef03d48a8a3aacfdea33ec6d82cab2a06 Mon Sep 17 00:00:00 2001 From: Albert Cervin Date: Thu, 1 Feb 2024 00:08:06 +0100 Subject: Add git commit syntax --- dged.nix | 11 +++++++++++ src/dged/lang.c | 3 ++- src/dged/syntax.c | 21 +++++++++++++++++++-- src/main/main.c | 4 ++-- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/dged.nix b/dged.nix index 84eb6ae..87a0a00 100644 --- a/dged.nix +++ b/dged.nix @@ -9,6 +9,7 @@ , doxygen , valgrind , linkFarm +, fetchFromGitHub }: stdenv.mkDerivation { name = "dged"; @@ -38,6 +39,16 @@ stdenv.mkDerivation { "nix" = tree-sitter-nix; "python" = tree-sitter-python; "make" = tree-sitter-make; + "gitcommit" = tree-sitter.buildGrammar { + language = "gitcommit"; + version = "0.3.3"; + src = fetchFromGitHub { + owner = "gbprod"; + repo = "tree-sitter-gitcommit"; + rev = "v0.3.3"; + hash = "sha256-L3v+dQZhwC+kBOHf3YVbZjuCU+idbUDByEdUBmeGAlo="; + }; + }; }; installPhase = '' diff --git a/src/dged/lang.c b/src/dged/lang.c index e392136..562f162 100644 --- a/src/dged/lang.c +++ b/src/dged/lang.c @@ -57,6 +57,7 @@ void languages_init(bool register_default) { define_lang("Nix", "nix", ".*\\.nix", 4, "rnix-lsp"); define_lang("Make", "make", ".*(Makefile|\\.mk)", 4, NULL); define_lang("Python", "python", ".*\\.py", 4, NULL); + define_lang("Git Commit Message", "gitcommit", "COMMIT_EDITMSG", 4, NULL); } } @@ -215,6 +216,6 @@ struct language lang_from_id(const char *id) { return lang_from_settings(id); } else { minibuffer_echo_timeout(4, "failed to find language \"%s\"", id); - return lang_from_settings("languages.fnd"); + return g_fundamental; } } diff --git a/src/dged/syntax.c b/src/dged/syntax.c index 0935080..1091123 100644 --- a/src/dged/syntax.c +++ b/src/dged/syntax.c @@ -17,6 +17,7 @@ #include "hash.h" #include "minibuffer.h" #include "path.h" +#include "settings.h" #include "text.h" #include "vec.h" @@ -110,8 +111,17 @@ static const char *read_text(void *payload, uint32_t byte_offset, return NULL; } +static const char *grammar_name_from_buffer(struct buffer *buffer) { + struct setting *s = lang_setting(&buffer->lang, "grammar"); + if (s != NULL && s->value.type == Setting_String) { + return s->value.string_value; + } + + return buffer->lang.name; +} + static const char *lang_folder(struct buffer *buffer) { - const char *langname = buffer->lang.name; + const char *langname = grammar_name_from_buffer(buffer); size_t tspath_len = strlen(treesitter_path); size_t lang_len = strlen(langname); @@ -328,6 +338,7 @@ static void update_parser(struct buffer *buffer, void *userdata, } else if (s8eq(cname, s8("string")) || s8eq(cname, s8("string.special")) || s8eq(cname, s8("string.special.path")) || + s8eq(cname, s8("text.title")) || s8eq(cname, s8("text.uri")) || s8eq(cname, s8("string.special.uri"))) { highlight = true; color = Color_Green; @@ -472,7 +483,7 @@ static void create_parser(struct buffer *buffer, void *userdata) { return; } - const char *langname = buffer->lang.name; + const char *langname = grammar_name_from_buffer(buffer); size_t lang_len = strlen(langname); const char *prefix = "tree_sitter_"; @@ -547,7 +558,13 @@ void syntax_init() { return; } + // TODO: check that it exists + struct language l = lang_from_id("gitcommit"); + lang_setting_set_default(&l, "grammar", + (struct setting_value){.type = Setting_String, + .string_value = "gitcommit"}); buffer_add_create_hook(create_parser, NULL); + lang_destroy(&l); } void syntax_teardown() { diff --git a/src/main/main.c b/src/main/main.c index c40f438..348ac1e 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -285,8 +285,8 @@ int main(int argc, char *argv[]) { struct window *active_window = windows_get_active(); - /* Update the screen by flushing command lists collected from updating the - * buffers. + /* Update the screen by flushing command lists collected + * from updating the buffers. */ TIMED_SCOPE_BEGIN(display); display_begin_render(display); -- cgit v1.2.3