| 110 |
/* プロトタイプ */ |
/* プロトタイプ */ |
| 111 |
|
|
| 112 |
/* タブの生成と削除 : 基本的に,ShikiTabInfo の中身に格納する情報を増やしたかったら,この 2 つの関数だけを変更すれば良い (ようにする…) */ |
/* タブの生成と削除 : 基本的に,ShikiTabInfo の中身に格納する情報を増やしたかったら,この 2 つの関数だけを変更すれば良い (ようにする…) */ |
| 113 |
static void append_tabpage(gchar *filename); |
static void get_buffer_create(gchar *filename); |
| 114 |
static void remove_tabpage(); |
static void remove_tabpage(); |
| 115 |
|
|
| 116 |
/* foo_bar_handler() は,イベントハンドラのためのラッパー */ |
/* foo_bar_handler() は,イベントハンドラのためのラッパー */ |
| 183 |
/* エディタの初期化 */ |
/* エディタの初期化 */ |
| 184 |
static void shiki_editor_window_init(int argc, char **argv); |
static void shiki_editor_window_init(int argc, char **argv); |
| 185 |
|
|
| 186 |
|
/* バッファの内容を消去 */ |
| 187 |
|
static void clear_current_buffer() { |
| 188 |
|
GtkTextIter start, end; |
| 189 |
|
gtk_text_buffer_get_start_iter(Shiki_CURRENT_TEXT_BUFFER, &start); |
| 190 |
|
gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &end); |
| 191 |
|
gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &start, &end); |
| 192 |
|
} |
| 193 |
|
|
| 194 |
|
static ScmObj Shiki_clear_current_buffer() |
| 195 |
|
{ |
| 196 |
|
clear_current_buffer(); |
| 197 |
|
return SCM_NIL; |
| 198 |
|
} |
| 199 |
|
|
| 200 |
|
static SCM_DEFINE_STRING_CONST(clear_current_buffer__NAME, "clear-current-buffer", 20, 20); |
| 201 |
|
static SCM_DEFINE_SUBR(clear_current_buffer__STUB, 0, 0, SCM_OBJ(&clear_current_buffer__NAME), Shiki_clear_current_buffer, NULL, NULL); |
| 202 |
|
|
| 203 |
static void destroy_handler(GtkWidget *button, GtkWidget *widget) {gtk_widget_destroy(widget);} |
static void destroy_handler(GtkWidget *button, GtkWidget *widget) {gtk_widget_destroy(widget);} |
| 204 |
|
|
| 205 |
static void toggled_handler(GtkToggleButton *togglebutton, gboolean *flag) { |
static void toggled_handler(GtkToggleButton *togglebutton, gboolean *flag) { |
| 484 |
|
|
| 485 |
case GDK_e : /* Ctrl + e : eval-expression */ |
case GDK_e : /* Ctrl + e : eval-expression */ |
| 486 |
{ |
{ |
| 487 |
gchar *code; |
gchar *code, *result; |
| 488 |
GtkTextIter start, end; |
GtkTextIter start, end; |
| 489 |
|
|
| 490 |
if(!search_sexp(&start, &end)) return FALSE; |
if(!search_sexp(&start, &end)) return FALSE; |
| 491 |
|
|
| 492 |
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); |
| 493 |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n\n", -1); |
result = eval_cstring_by_gauche(code); |
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, eval_cstring_by_gauche(code), -1); |
|
| 494 |
g_free(code); |
g_free(code); |
| 495 |
|
|
| 496 |
|
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &end, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
| 497 |
|
|
| 498 |
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n\n", -1); |
| 499 |
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, result, -1); |
| 500 |
} |
} |
| 501 |
break; |
break; |
| 502 |
|
|
| 503 |
case GDK_j : /* Ctrl + j : eval-last-sexp */ |
case GDK_j : /* Ctrl + j : eval-last-sexp */ |
| 504 |
{ |
{ |
| 505 |
gchar *code; |
gchar *code, *result; |
| 506 |
GtkTextIter start, end; |
GtkTextIter start, end; |
| 507 |
|
|
| 508 |
if(!search_last_sexp(&start, &end)) return FALSE; |
if(!search_last_sexp(&start, &end)) return FALSE; |
| 509 |
|
|
| 510 |
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); |
| 511 |
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n\n", -1); |
result = eval_cstring_by_gauche(code); |
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, eval_cstring_by_gauche(code), -1); |
|
| 512 |
g_free(code); |
g_free(code); |
| 513 |
|
|
| 514 |
|
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &end, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
| 515 |
|
|
| 516 |
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n\n", -1); |
| 517 |
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, result, -1); |
| 518 |
} |
} |
| 519 |
break; |
break; |
| 520 |
|
|
| 547 |
|
|
| 548 |
|
|
| 549 |
/* ノートブックにタブとページ (バッファ) を追加 */ |
/* ノートブックにタブとページ (バッファ) を追加 */ |
| 550 |
static void append_tabpage(gchar *filename) { |
static void get_buffer_create(gchar *filename) { |
| 551 |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
| 552 |
/* ShikiTabInfo には,タブに関連する情報が全て保持されている */ |
/* ShikiTabInfo には,タブに関連する情報が全て保持されている */ |
| 553 |
ShikiTabInfo *tabinfo = g_malloc(sizeof(ShikiTabInfo)); |
ShikiTabInfo *tabinfo = g_malloc(sizeof(ShikiTabInfo)); |
| 558 |
tabinfo->tabpage_label = g_strndup(tabinfo->basename, 7); |
tabinfo->tabpage_label = g_strndup(tabinfo->basename, 7); |
| 559 |
tabinfo->env = Scm_MakeModule(NULL, FALSE); |
tabinfo->env = Scm_MakeModule(NULL, FALSE); |
| 560 |
|
|
| 561 |
|
SCM_DEFINE(tabinfo->env, "clear-current-buffer", SCM_OBJ(&clear_current_buffer__STUB)); |
| 562 |
|
|
| 563 |
g_return_if_fail(tabinfo->env != SCM_FALSE); |
g_return_if_fail(tabinfo->env != SCM_FALSE); |
| 564 |
|
|
| 565 |
/* スクロールウィンドウ (タブの中身の大外) を作る */ |
/* スクロールウィンドウ (タブの中身の大外) を作る */ |
| 604 |
} |
} |
| 605 |
|
|
| 606 |
static void append_default_tabpage_handler() { |
static void append_default_tabpage_handler() { |
| 607 |
append_tabpage(g_strdup("*scratch*")); |
get_buffer_create(g_strdup("*scratch*")); |
| 608 |
} |
} |
| 609 |
|
|
| 610 |
/* ノートブックからタブとページ (バッファ) を削除 */ |
/* ノートブックからタブとページ (バッファ) を削除 */ |
| 632 |
} |
} |
| 633 |
} |
} |
| 634 |
|
|
|
/* バッファの内容を消去 */ |
|
|
static void clear_current_buffer() { |
|
|
GtkTextIter start, end; |
|
|
gtk_text_buffer_get_start_iter(Shiki_CURRENT_TEXT_BUFFER, &start); |
|
|
gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &end); |
|
|
gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &start, &end); |
|
|
} |
|
|
|
|
| 635 |
/* バッファをまるごとロード */ |
/* バッファをまるごとロード */ |
| 636 |
static void load_buffer_by_gauche() { |
static void load_buffer_by_gauche() { |
| 637 |
GtkTextIter p; |
GtkTextIter p; |
| 867 |
/* g_file_get_contents(filename, &contents, &len, NULL); */ |
/* g_file_get_contents(filename, &contents, &len, NULL); */ |
| 868 |
|
|
| 869 |
/* 新しいバッファを開く */ |
/* 新しいバッファを開く */ |
| 870 |
append_tabpage(g_strdup(filename)); |
get_buffer_create(g_strdup(filename)); |
| 871 |
gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename); |
gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename); |
| 872 |
g_free(filename); |
g_free(filename); |
| 873 |
|
|
| 1185 |
} |
} |
| 1186 |
static void open_online_help() { |
static void open_online_help() { |
| 1187 |
GtkTextIter p; |
GtkTextIter p; |
| 1188 |
append_tabpage(g_strdup("*help*")); |
get_buffer_create(g_strdup("*help*")); |
| 1189 |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, |
| 1190 |
"コマンドラインからの起動方法\n" |
"コマンドラインからの起動方法\n" |
| 1191 |
"$ ./shiki [file1 file2 ....]\n\n" |
"$ ./shiki [file1 file2 ....]\n\n" |
| 1224 |
"C-M-@ : カーソル以降の S 式を選択 (mark-sexp)\n" |
"C-M-@ : カーソル以降の S 式を選択 (mark-sexp)\n" |
| 1225 |
"C-M-SPC : カーソル手前の S 式を選択 (mark-last-sexp)\n" |
"C-M-SPC : カーソル手前の S 式を選択 (mark-last-sexp)\n" |
| 1226 |
"C-x C-c : 終了.ウィンドウの × ボタンを押したのと同じ\n" |
"C-x C-c : 終了.ウィンドウの × ボタンを押したのと同じ\n" |
| 1227 |
|
"\n" |
| 1228 |
|
"エディタ API\n" |
| 1229 |
|
"(clear-current-buffer) : バッファをクリアします (警告無し)\n" |
| 1230 |
, -1); |
, -1); |
| 1231 |
gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE); |
gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE); |
| 1232 |
/* カーソル位置を先頭に */ |
/* カーソル位置を先頭に */ |