Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C gtk&x2B;文本编辑器vim类型模式(插入/命令)_C_Gtk_Keypress_Gtksourceview - Fatal编程技术网

C gtk&x2B;文本编辑器vim类型模式(插入/命令)

C gtk&x2B;文本编辑器vim类型模式(插入/命令),c,gtk,keypress,gtksourceview,C,Gtk,Keypress,Gtksourceview,我试图将类似vim的功能合并到我在gtk+2.0和gtksourceview 2.0中创建的文本编辑器中。我有它的工作,除了当我按下“我”进入插入模式,它进入这个模式正常,但它键入一个“我”在文本缓冲区。这是我的按键功能,设置为在按下esc键时进入命令模式(离开插入模式),如前所述,按下I键时进入插入模式: gboolean on_key_press_win_main (GtkWidget *widget, GdkEventKey *event, gpointer user_data) {

我试图将类似vim的功能合并到我在gtk+2.0和gtksourceview 2.0中创建的文本编辑器中。我有它的工作,除了当我按下“我”进入插入模式,它进入这个模式正常,但它键入一个“我”在文本缓冲区。这是我的按键功能,设置为在按下esc键时进入命令模式(离开插入模式),如前所述,按下I键时进入插入模式:

gboolean on_key_press_win_main (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
{

  switch (event->keyval)
  {

    case GDK_i:
      if (event->state & GDK_CONTROL_MASK)
      {
        printf("key pressed: %s\n", "ctrl + i");
      }
      else
      {
        GtkTextBuffer *tbuffer;
                GtkTextView *text_view;
                int page = 0;
        gchar *msg;
        gint row, col;
        GtkTextIter iter;

              page = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
                text_view = GTK_TEXT_VIEW(txtinput[notebookPages[page]]);
                tbuffer = gtk_text_view_get_buffer (text_view);

        if (insert_mode == 0)
        {
            insert_mode = 1;
            command_mode = 0;

            /* update statusbar */
            gtk_statusbar_pop(GTK_STATUSBAR(statusbar), 0); 

            gtk_text_buffer_get_iter_at_mark(tbuffer, &iter, gtk_text_buffer_get_insert(tbuffer));

            row = gtk_text_iter_get_line(&iter);
            col = gtk_text_iter_get_line_offset(&iter);

            msg = g_strdup_printf("INSERT\t\t Col %d Ln %d", col+1, row+1);
            gtk_statusbar_push(GTK_STATUSBAR(statusbar), 0, msg);

            gtk_text_view_set_editable (text_view, TRUE);

        }

      }

      break;

        /* esc key */
        case 65307:
    {
        GtkTextBuffer *tbuffer;
          GtkTextView *text_view;
          int page = 0;
      gchar *msg;
      gint row, col;
      GtkTextIter iter;

        page = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
          text_view = GTK_TEXT_VIEW(txtinput[notebookPages[page]]);
          tbuffer = gtk_text_view_get_buffer (text_view);

      insert_mode = 0;
      command_mode = 1;
      gtk_text_view_set_editable (text_view, FALSE);

      /* update statusbar */
      gtk_statusbar_pop(GTK_STATUSBAR(statusbar), 0); 

      gtk_text_buffer_get_iter_at_mark(tbuffer, &iter, gtk_text_buffer_get_insert(tbuffer));

      row = gtk_text_iter_get_line(&iter);
      col = gtk_text_iter_get_line_offset(&iter);

      msg = g_strdup_printf("Col %d Ln %d", col+1, row+1);
      gtk_statusbar_push(GTK_STATUSBAR(statusbar), 0, msg);

    }

    break;

    default:
      return FALSE; 
  }

  return FALSE; 
}

如您所见,进入命令模式时设置了
gtk\u text\u view\u set\u editable(text\u view,FALSE)
,进入插入模式时设置了
gtk\u text\u view\u set\u editable(text\u view,TRUE)
。但是,当进入插入模式时,在按键在缓冲区中注册之前,文本视图被设置为可编辑,即使它是按键框中的最后一个命令。当我进入插入模式时,如何避免将I放入文本缓冲区?

你难道不知道吗,当我写完这个问题时,一个可行的选项突然出现在我的脑海中。这可能就是创建
key\u release\u事件的原因。工作起来很有魅力。

从事件处理程序返回
TRUE
,而不是
FALSE
,以阻止事件的任何进一步处理。事件处理程序的工作方式类似于过滤器,您可以过滤掉不想传递给textview的击键


注意:不要使用像
65307
这样的常量,使用
GDK_KEY_Escape
或其他任何东西。

如果您发布链接,我希望看到您的编辑器。