[gtksourceview/wip/chergert/vim] start on a set command
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview/wip/chergert/vim] start on a set command
- Date: Thu, 11 Nov 2021 01:25:07 +0000 (UTC)
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]