[gtksourceview/wip/chergert/vim] start on a set command



commit 49011dc66051bcdfbeddbc3c24253e79b30fe3ff
Author: Christian Hergert <chergert redhat com>
Date:   Wed Nov 10 17:25:03 2021 -0800

    start on a set command
    
    :set ts=2 sw=2 ft=c et
    
    hls
    tabstop/ts
    shiftwidth/sw
    filetype/ft
    expandtab/et
    noexpandtab/noet

 gtksourceview/vim/gtk-source-vim-command.c | 115 ++++++++++++++++++++++++++++-
 1 file changed, 111 insertions(+), 4 deletions(-)
---
diff --git a/gtksourceview/vim/gtk-source-vim-command.c b/gtksourceview/vim/gtk-source-vim-command.c
index a4ce77ca..2c865bb2 100644
--- a/gtksourceview/vim/gtk-source-vim-command.c
+++ b/gtksourceview/vim/gtk-source-vim-command.c
@@ -24,6 +24,8 @@
 #include <string.h>
 
 #include <gtksourceview/gtksourcebuffer.h>
+#include <gtksourceview/gtksourcelanguagemanager.h>
+#include <gtksourceview/gtksourcelanguage.h>
 #include <gtksourceview/gtksourcesearchcontext.h>
 #include <gtksourceview/gtksourcesearchsettings.h>
 #include <gtksourceview/gtksourcestyleschememanager.h>
@@ -67,6 +69,19 @@ static GParamSpec *properties[N_PROPS];
 static GHashTable *commands;
 static GPtrArray *commands_sorted;
 
+static const struct {
+       const char *ft;
+       const char *id;
+} ft_mappings[] = {
+       { "cs", "c-sharp" },
+       { "docbk", "docbook" },
+       { "javascript", "js" },
+       { "lhaskell", "haskell-literate" },
+       { "spec", "rpmspec" },
+       { "tex", "latex" },
+       { "xhtml", "html" },
+};
+
 static inline gboolean
 parse_number (const char *str,
               int        *number)
@@ -982,6 +997,97 @@ cleanup:
        g_free (options);
 }
 
+static void
+gtk_source_vim_command_set (GtkSourceVimCommand *self)
+{
+       GtkSourceVimState *state = (GtkSourceVimState *)self;
+       GtkSourceSearchContext *context;
+       GtkSourceSearchSettings *search;
+       GtkSourceBuffer *buffer;
+       GtkSourceView *view;
+       g_auto(GStrv) parts = NULL;
+
+       g_assert (GTK_SOURCE_IS_VIM_COMMAND (self));
+
+       if (self->options == NULL || g_strstrip (self->options)[0] == 0)
+       {
+               /* TODO: display current settings */
+               return;
+       }
+
+       view = gtk_source_vim_state_get_view (state);
+       buffer = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));
+       parts = g_strsplit (self->options, " ", 0);
+
+       for (guint i = 0; parts[i]; i++)
+       {
+               const char *part = parts[i];
+
+               if (g_str_equal (part, "hls"))
+               {
+                       gtk_source_vim_state_get_search (state, &search, &context);
+                       gtk_source_search_context_set_highlight (context, TRUE);
+               }
+               else if (g_str_equal (part, "incsearch"))
+               {
+                       /* TODO */
+               }
+               else if (g_str_has_prefix (part, "ft=") ||
+                        g_str_has_prefix (part, "filetype="))
+               {
+                       const char *ft = strchr (part, '=') + 1;
+                       GtkSourceLanguageManager *manager;
+                       GtkSourceLanguage *language;
+
+                       for (guint j = 0; j < G_N_ELEMENTS (ft_mappings); j++)
+                       {
+                               if (g_str_equal (ft_mappings[j].ft, ft))
+                               {
+                                       ft = ft_mappings[j].id;
+                                       break;
+                               }
+                       }
+
+                       manager = gtk_source_language_manager_get_default ();
+                       language = gtk_source_language_manager_get_language (manager, ft);
+
+                       gtk_source_buffer_set_language (buffer, language);
+               }
+               else if (g_str_has_prefix (part, "ts=") ||
+                        g_str_has_prefix (part, "tabstop="))
+               {
+                       const char *ts = strchr (part, '=') + 1;
+                       int n;
+
+                       if (parse_number (ts, &n))
+                       {
+                               gtk_source_view_set_tab_width (view, CLAMP (n, -1, 32));
+                       }
+               }
+               else if (g_str_has_prefix (part, "sw=") ||
+                        g_str_has_prefix (part, "shiftwidth="))
+               {
+                       const char *sw = strchr (part, '=') + 1;
+                       int n;
+
+                       if (parse_number (sw, &n))
+                       {
+                               gtk_source_view_set_indent_width (view, CLAMP (n, -1, 32));
+                       }
+               }
+               else if (g_str_equal (part, "et") ||
+                        g_str_equal (part, "expandtab"))
+               {
+                       gtk_source_view_set_insert_spaces_instead_of_tabs (view, TRUE);
+               }
+               else if (g_str_equal (part, "noet") ||
+                        g_str_equal (part, "noexpandtab"))
+               {
+                       gtk_source_view_set_insert_spaces_instead_of_tabs (view, FALSE);
+               }
+       }
+}
+
 static void
 gtk_source_vim_command_append_command (GtkSourceVimState *state,
                                        GString           *string)
@@ -1250,14 +1356,15 @@ gtk_source_vim_command_class_init (GtkSourceVimCommandClass *klass)
        } G_STMT_END
        ADD_COMMAND (":colorscheme",   gtk_source_vim_command_colorscheme);
        ADD_COMMAND (":delete",        gtk_source_vim_command_delete);
-       ADD_COMMAND (":join",          gtk_source_vim_command_join);
        ADD_COMMAND (":j",             gtk_source_vim_command_join);
+       ADD_COMMAND (":join",          gtk_source_vim_command_join);
        ADD_COMMAND (":nohl",          gtk_source_vim_command_nohl);
-       ADD_COMMAND (":undo",          gtk_source_vim_command_undo);
-       ADD_COMMAND (":u",             gtk_source_vim_command_undo);
        ADD_COMMAND (":redo",          gtk_source_vim_command_redo);
-       ADD_COMMAND (":yank",          gtk_source_vim_command_yank);
+       ADD_COMMAND (":set",           gtk_source_vim_command_set);
+       ADD_COMMAND (":u",             gtk_source_vim_command_undo);
+       ADD_COMMAND (":undo",          gtk_source_vim_command_undo);
        ADD_COMMAND (":y",             gtk_source_vim_command_yank);
+       ADD_COMMAND (":yank",          gtk_source_vim_command_yank);
        ADD_COMMAND ("paste-after",    gtk_source_vim_command_paste_after);
        ADD_COMMAND ("paste-before",   gtk_source_vim_command_paste_before);
        ADD_COMMAND ("toggle-case",    gtk_source_vim_command_toggle_case);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]