📄 textsw_edit.c
字号:
extern voidtextsw_insert_makes_visible(textsw) Textsw textsw;{ Textsw_view view = VIEW_ABS_TO_REP(textsw); register Textsw_folio folio = FOLIO_FOR_VIEW(view); int old_insert_makes_visible = folio->insert_makes_visible; int old_state = folio->state; folio->insert_makes_visible = TEXTSW_ALWAYS; folio->state |= TXTSW_DOING_EVENT; textsw_do_insert_makes_visible(view); folio->insert_makes_visible = old_insert_makes_visible; folio->state = old_state;}pkg_private inttextsw_do_edit(view, unit, direction) register Textsw_view view; unsigned unit, direction;{ extern struct ei_span_result ev_span_for_edit(); register Textsw_folio folio = FOLIO_FOR_VIEW(view); struct ei_span_result span; int delta; span = ev_span_for_edit(folio->views, (int)(unit|direction)); if ((span.flags>>16) == 0) { /* Don't join with next line for ERASE_LINE_END */ if ((unit == EV_EDIT_LINE) && (direction == 0)) { Es_index file_length = es_get_length(folio->views->esh); if (span.last_plus_one < file_length) span.last_plus_one--; } delta = textsw_delete_span(view, span.first, span.last_plus_one, TXTSW_DS_ADJUST); if (delta == ES_CANNOT_SET) { delta = 0; } else { textsw_do_insert_makes_visible(view); textsw_record_edit(folio, unit, direction); delta = -delta; } } else delta = 0; return(delta);}extern Textsw_indextextsw_edit(abstract, unit, count, direction) Textsw abstract; register unsigned unit, count; unsigned direction;{ Textsw_view view = VIEW_ABS_TO_REP(abstract); Textsw_folio folio = FOLIO_FOR_VIEW(view); int result = 0; if (direction) direction = EV_EDIT_BACK; switch (unit) { case TEXTSW_UNIT_IS_CHAR: unit = EV_EDIT_CHAR; break; case TEXTSW_UNIT_IS_WORD: unit = EV_EDIT_WORD; break; case TEXTSW_UNIT_IS_LINE: unit = EV_EDIT_LINE; break; default: return 0; } textsw_take_down_caret(folio); for (; count; count--) { result += textsw_do_edit(view, unit, direction); } return(result);}pkg_private voidtextsw_input_before(view, old_insert_pos, old_length) Textsw_view view; Es_index *old_insert_pos, *old_length;{ Textsw_folio folio = FOLIO_FOR_VIEW(view); register Ev_chain chain = folio->views; *old_length = es_get_length(chain->esh); *old_insert_pos = ev_get_insert(chain); ev_input_before(chain);}pkg_private inttextsw_input_partial(view, buf, buf_len) Textsw_view view; char *buf; long int buf_len;{ int status; status = ev_input_partial(FOLIO_FOR_VIEW(view)->views, buf, buf_len); if (status) { textsw_esh_failed_msg(view, "Insertion failed - "); } return(status);}pkg_private Es_indextextsw_input_after(view, old_insert_pos, old_length, record) Textsw_view view; Es_index old_insert_pos, old_length; int record;{ register Textsw_folio folio = FOLIO_FOR_VIEW(view); Es_index delta; delta = ev_input_after(folio->views, old_insert_pos, old_length); if (delta != ES_CANNOT_SET) { textsw_do_insert_makes_visible(view); if (record) { Es_handle pieces; pieces = textsw_esh_for_span(folio->first_view, old_insert_pos, old_insert_pos+delta, ES_NULL); textsw_record_piece_insert(folio, pieces); } if ((folio->state & TXTSW_EDITED) == 0) textsw_possibly_edited_now_notify(folio); if (folio->notify_level & TEXTSW_NOTIFY_EDIT) { textsw_notify_replaced((Textsw_opaque)folio->first_view, old_insert_pos, old_length, old_insert_pos, old_insert_pos, delta); } (void) textsw_checkpoint(folio); } return(delta);}pkg_private Es_indextextsw_do_input(view, buf, buf_len, flag) Textsw_view view; char *buf; long int buf_len; unsigned flag;{ register Textsw_folio folio = FOLIO_FOR_VIEW(view); register Ev_chain chain = folio->views; int record; Es_index delta, old_insert_pos, old_length; textsw_input_before(view, &old_insert_pos, &old_length); delta = textsw_input_partial(view, buf, buf_len); if (delta == ES_CANNOT_SET) return(0); record = (TXTSW_DO_AGAIN(folio) && ((folio->func_state & TXTSW_FUNC_AGAIN) == 0) ); delta = textsw_input_after(view, old_insert_pos, old_length, record && (buf_len > 100)); if (delta == ES_CANNOT_SET) return(0); if ((int)ev_get(chain, EV_CHAIN_DELAY_UPDATE) == 0) { ev_update_chain_display(chain); if (flag & TXTSW_UPDATE_SCROLLBAR) textsw_update_scrollbars(folio, TEXTSW_VIEW_NULL); else if ((flag & TXTSW_UPDATE_SCROLLBAR_IF_NEEDED) && update_scrollbar(delta, old_length, buf, buf_len)) textsw_update_scrollbars(folio, TEXTSW_VIEW_NULL); } if (record && (buf_len <= 100)) textsw_record_input(folio, buf, buf_len); return(delta);}extern Textsw_indextextsw_insert(abstract, buf, buf_len) Textsw abstract; char *buf; long int buf_len;{ Textsw_view view = VIEW_ABS_TO_REP(abstract); register Textsw_folio folio = FOLIO_FOR_VIEW(view); Es_index result; textsw_take_down_caret(folio); result = textsw_do_input(view, buf, buf_len, TXTSW_UPDATE_SCROLLBAR_IF_NEEDED); return(result);}extern Textsw_indextextsw_replace_bytes(abstract, first, last_plus_one, buf, buf_len) Textsw abstract; Es_index first, last_plus_one; char *buf; long int buf_len;/* This routine is a placeholder that can be documented without casting the * calling sequence to textsw_replace (the preferred name) in concrete. */{ return(textsw_replace(abstract, first, last_plus_one, buf, buf_len));}extern Textsw_indextextsw_replace(abstract, first, last_plus_one, buf, buf_len) Textsw abstract; Es_index first, last_plus_one; char *buf; long int buf_len;{ extern void textsw_remove_mark_internal(); pkg_private Ev_mark_object textsw_add_mark_internal(); Ev_mark_object saved_insert_mark; Es_index saved_insert; Textsw_view view = VIEW_ABS_TO_REP(abstract); register Textsw_folio folio = FOLIO_FOR_VIEW(view); register Ev_chain chain = folio->views; Es_index result, insert_result; int lower_context; insert_result = 0; textsw_take_down_caret(folio); /* BUG ALERT: change this to avoid the double paint. */ if (first < last_plus_one) { ev_set(0, chain, EV_CHAIN_DELAY_UPDATE, TRUE, 0); result = textsw_delete_span(view, first, last_plus_one, TXTSW_DS_ADJUST); ev_set(0, chain, EV_CHAIN_DELAY_UPDATE, FALSE, 0); if (result == ES_CANNOT_SET) { if (ES_REPLACE_DIVERTED == (Es_status)LINT_CAST( es_get(chain->esh, ES_STATUS) )) { result = 0; } } } else { result = 0; } if (result == ES_CANNOT_SET) { result = 0; } else { ev_check_insert_visibility(chain); lower_context = (int) ev_get(chain, EV_CHAIN_LOWER_CONTEXT); ev_set(0, chain, EV_CHAIN_LOWER_CONTEXT, EV_NO_CONTEXT, 0); saved_insert = ev_get_insert(chain); saved_insert_mark = textsw_add_mark_internal(folio, saved_insert, TEXTSW_MARK_MOVE_AT_INSERT); (void) ev_set_insert(chain, first); insert_result += textsw_do_input(view, buf, buf_len, TXTSW_DONT_UPDATE_SCROLLBAR); result += insert_result; saved_insert = textsw_find_mark_internal(folio, saved_insert_mark); if AN_ERROR(saved_insert == ES_INFINITY) { } else (void) ev_set_insert(chain, saved_insert); textsw_remove_mark_internal(folio, saved_insert_mark); ev_set(0, chain, EV_CHAIN_LOWER_CONTEXT, lower_context, 0); ev_scroll_if_old_insert_visible(chain, saved_insert, insert_result); textsw_update_scrollbars(folio, TEXTSW_VIEW_NULL); } return(result);}static intupdate_scrollbar(delta, old_length) long int delta, old_length; { long int THRESHOLD = 20; return ((THRESHOLD * delta) >= old_length); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -