| 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 |
/* 設定 */ |
/* 設定 */ |
| 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) { |
| 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; |
| 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); |
| 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 |
} |
} |
| 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); |