Develop and Download Open Source Software

Browse CVS Repository

Diff of /shiki/shiki/shiki.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.28 by aloha, Tue Nov 14 16:59:14 2006 UTC revision 1.29 by aloha, Wed Nov 15 03:08:03 2006 UTC
# Line 106  static void load_buffer_by_gauche(); Line 106  static void load_buffer_by_gauche();
106  static void load_region_by_gauche();  static void load_region_by_gauche();
107  static void load_scheme_file_by_gauche();  static void load_scheme_file_by_gauche();
108  static gboolean is_kakko_or_kokka(gunichar ch, gpointer);  static gboolean is_kakko_or_kokka(gunichar ch, gpointer);
109    static gboolean is_kakko(gunichar ch, gpointer);
110  static gboolean is_kokka(gunichar ch, gpointer);  static gboolean is_kokka(gunichar ch, gpointer);
111  static gboolean search_last_sexp_string(GtkTextIter *start);  static gboolean search_sexp_kokka(GtkTextIter *start);
112    static gboolean search_last_sexp_kakko(GtkTextIter *start);
113  static gint get_parent_nest_level_at_cursor(GtkTextBuffer *buffer);  static gint get_parent_nest_level_at_cursor(GtkTextBuffer *buffer);
114    
115  /* 設定 */  /* 設定 */
# Line 536  static void load_region_by_gauche() { Line 538  static void load_region_by_gauche() {
538  static gboolean is_kakko_or_kokka(gunichar ch, gpointer p) {  static gboolean is_kakko_or_kokka(gunichar ch, gpointer p) {
539    return ch == '(' || ch == ')';    return ch == '(' || ch == ')';
540  }  }
541    static gboolean is_kakko(gunichar ch, gpointer p) {return ch == '(';}
542  static gboolean is_kokka(gunichar ch, gpointer p) {return ch == ')';}  static gboolean is_kokka(gunichar ch, gpointer p) {return ch == ')';}
543    
544    /* '(' に対応する ')' までの文字列 (S 式) を切り出す */
545    static gboolean search_sexp_kokka(GtkTextIter *start) {
546      gint nest_level = 0;
547      /* カーソル位置の後にある S 式を切り出す */
548      while(1) {
549        if(!gtk_text_iter_forward_find_char(start, is_kakko_or_kokka, NULL, NULL))
550          return FALSE;
551    
552        if(gtk_text_iter_get_char(start) == '(')
553          nest_level++;
554        else {
555          if(!nest_level)
556            break;
557          else
558            nest_level--;
559        }
560      }
561      return TRUE;
562    }
563    
564  /* ')' に対応する '(' までの文字列 (S 式) を切り出す */  /* ')' に対応する '(' までの文字列 (S 式) を切り出す */
565  static gboolean search_last_sexp_string(GtkTextIter *start) {  static gboolean search_last_sexp_kakko(GtkTextIter *start) {
566    gint nest_level = 0;    gint nest_level = 0;
567    /* カーソル位置の前にある S 式を切り出す */    /* カーソル位置の前にある S 式を切り出す */
568    while(1) {    while(1) {
# Line 671  static gboolean signal_key_press_handler Line 693  static gboolean signal_key_press_handler
693          }          }
694          break;          break;
695    
696        case GDK_j :  /* Ctrl + j : カーソル手前の S 式の評価 */        case GDK_e :  /* Ctrl + e : eval-expression */
697            {
698              gchar *code;
699              GtkTextIter start, end;
700    
701              /* カーソルの位置を取得 */
702              gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &start, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
703    
704              if(gtk_text_iter_get_char(&start) != '(')
705                  gtk_text_iter_forward_find_char(&start, is_kakko, NULL, NULL);
706    
707              end = start;
708    
709              /* カーソル位置の前にある S 式を切り出す */
710              if(!search_sexp_kokka(&end)) return FALSE;
711              gtk_text_iter_forward_char(&end);
712    
713              code = gtk_text_buffer_get_text(Shiki_CURRENT_TEXT_BUFFER, &start, &end, FALSE);
714              gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n\n", -1);
715              gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, eval_cstring_by_gauche(code), -1);
716              g_free(code);
717            }
718            break;
719    
720          case GDK_j :  /* Ctrl + j : eval-last-sexp */
721          {          {
722            gchar *code;            gchar *code;
723            GtkTextIter start, end;            GtkTextIter start, end;
# Line 679  static gboolean signal_key_press_handler Line 725  static gboolean signal_key_press_handler
725            /* カーソルの位置を取得 */            /* カーソルの位置を取得 */
726            gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &end, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));            gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &end, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
727    
728            gtk_text_iter_backward_find_char(&end, is_kokka, NULL, NULL);            if(gtk_text_iter_get_char(&end) != ')')
729                gtk_text_iter_backward_find_char(&end, is_kokka, NULL, NULL);
730            start = end;            start = end;
731            gtk_text_iter_forward_char(&end);            gtk_text_iter_forward_char(&end);
732    
733            /* カーソル位置の前にある S 式を切り出す */            /* カーソル位置の前にある S 式を切り出す */
734            if(!search_last_sexp_string(&start)) return FALSE;            if(!search_last_sexp_kakko(&start)) return FALSE;
735    
736            code = gtk_text_buffer_get_text(Shiki_CURRENT_TEXT_BUFFER, &start, &end, FALSE);            code = gtk_text_buffer_get_text(Shiki_CURRENT_TEXT_BUFFER, &start, &end, FALSE);
737            gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n\n", -1);            gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n\n", -1);
# Line 720  static gboolean signal_key_release_handl Line 767  static gboolean signal_key_release_handl
767      gtk_text_iter_backward_char(&start);      gtk_text_iter_backward_char(&start);
768    
769      /* カーソル位置の前にある S 式を切り出す */      /* カーソル位置の前にある S 式を切り出す */
770      if(!search_last_sexp_string(&start)) return FALSE;      if(!search_last_sexp_kakko(&start)) return FALSE;
771    
772      gtk_text_buffer_apply_tag_by_name(Shiki_CURRENT_TEXT_BUFFER, "parent_emphasis_background", &start, &end);      gtk_text_buffer_apply_tag_by_name(Shiki_CURRENT_TEXT_BUFFER, "parent_emphasis_background", &start, &end);
773    }    }
# Line 808  static void open_online_help() { Line 855  static void open_online_help() {
855  "C-n : ↓ に移動 (next line)\n"  "C-n : ↓ に移動 (next line)\n"
856  "C-p : ↑ に移動 (previous line)\n\n"  "C-p : ↑ に移動 (previous line)\n\n"
857  "C-h : バックスペース\n\n"  "C-h : バックスペース\n\n"
858    "C-e : カーソル後ろの S 式を評価 (eval-expression)\n"
859  "C-j : カーソル手前の S 式を評価 (eval-last-sexp)\n"  "C-j : カーソル手前の S 式を評価 (eval-last-sexp)\n"
860  "(emacs/xyzzy の *scratch* バッファと同じ)\n\n"  "(emacs/xyzzy の *scratch* バッファと同じ)\n\n"
861    
862  "C-x C-c : 終了.ウィンドウの × ボタンを押したのと同じ\n\n"  "C-x C-c : 終了.ウィンドウの × ボタンを押したのと同じ\n\n"
863    
864  "また,内容が失われる恐れがあるときには全て「Reqlly Quit ?」のように警告します.\n", -1);  "また,内容が失われる恐れがあるときには全て「Really Quit ?」のように警告します.\n", -1);
865      gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE);      gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE);
866      /* カーソル位置を先頭に */      /* カーソル位置を先頭に */
867      gtk_text_buffer_get_start_iter(Shiki_CURRENT_TEXT_BUFFER, &p);      gtk_text_buffer_get_start_iter(Shiki_CURRENT_TEXT_BUFFER, &p);

Legend:
Removed from v.1.28  
changed lines
  Added in v.1.29

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26