📄 enter.c
字号:
case OP_EDITOR_FORWARD_WORD: if (state->curpos == state->lastchar) BEEP (); else { while (state->curpos < state->lastchar && iswspace (state->wbuf[state->curpos])) ++state->curpos; while (state->curpos < state->lastchar && !iswspace (state->wbuf[state->curpos])) ++state->curpos; } break; case OP_EDITOR_CAPITALIZE_WORD: case OP_EDITOR_UPCASE_WORD: case OP_EDITOR_DOWNCASE_WORD: if (state->curpos == state->lastchar) { BEEP (); break; } while (state->curpos && !iswspace (state->wbuf[state->curpos])) --state->curpos; while (state->curpos < state->lastchar && iswspace (state->wbuf[state->curpos])) ++state->curpos; while (state->curpos < state->lastchar && !iswspace (state->wbuf[state->curpos])) { if (ch == OP_EDITOR_DOWNCASE_WORD) state->wbuf[state->curpos] = towlower (state->wbuf[state->curpos]); else { state->wbuf[state->curpos] = towupper (state->wbuf[state->curpos]); if (ch == OP_EDITOR_CAPITALIZE_WORD) ch = OP_EDITOR_DOWNCASE_WORD; } state->curpos++; } break; case OP_EDITOR_DELETE_CHAR: if (state->curpos == state->lastchar) BEEP (); else { i = state->curpos; while (i < state->lastchar && COMB_CHAR (state->wbuf[i])) ++i; if (i < state->lastchar) ++i; while (i < state->lastchar && COMB_CHAR (state->wbuf[i])) ++i; memmove (state->wbuf + state->curpos, state->wbuf + i, (state->lastchar - i) * sizeof (wchar_t)); state->lastchar -= i - state->curpos; } break; case OP_EDITOR_KILL_WORD: /* delete to begining of word */ if (state->curpos != 0) { i = state->curpos; while (i && iswspace (state->wbuf[i - 1])) --i; if (i) { if (iswalnum (state->wbuf[i - 1])) { for (--i; i && iswalnum (state->wbuf[i - 1]); i--) ; } else --i; } memmove (state->wbuf + i, state->wbuf + state->curpos, (state->lastchar - state->curpos) * sizeof (wchar_t)); state->lastchar += i - state->curpos; state->curpos = i; } break; case OP_EDITOR_KILL_EOW: /* delete to end of word */ for (i = state->curpos; i < state->lastchar && iswspace (state->wbuf[i]); i++) ; for (; i < state->lastchar && !iswspace (state->wbuf[i]); i++) ; memmove (state->wbuf + state->curpos, state->wbuf + i, (state->lastchar - i) * sizeof (wchar_t)); state->lastchar += state->curpos - i; break; case OP_EDITOR_BUFFY_CYCLE: if (flags & M_EFILE) { first = 1; /* clear input if user types a real key later */ my_wcstombs (buf, buflen, state->wbuf, state->curpos); mutt_buffy (buf, buflen); state->curpos = state->lastchar = my_mbstowcs (&state->wbuf, &state->wbuflen, 0, buf); break; } else if (!(flags & M_FILE)) goto self_insert; /* fall through to completion routine (M_FILE) */ case OP_EDITOR_COMPLETE: case OP_EDITOR_COMPLETE_QUERY: state->tabs++; if (flags & M_CMD) { for (i = state->curpos; i && state->wbuf[i-1] != ' '; i--) ; my_wcstombs (buf, buflen, state->wbuf + i, state->curpos - i); if (tempbuf && templen == state->lastchar - i && !memcmp (tempbuf, state->wbuf + i, (state->lastchar - i) * sizeof (wchar_t))) { mutt_select_file (buf, buflen, (flags & M_EFILE) ? M_SEL_FOLDER : 0); set_option (OPTNEEDREDRAW); if (*buf) replace_part (state, i, buf); rv = 1; goto bye; } if (!mutt_complete (buf, buflen)) { templen = state->lastchar - i; safe_realloc (&tempbuf, templen * sizeof (wchar_t)); } else BEEP (); replace_part (state, i, buf); } else if (flags & M_ALIAS && ch == OP_EDITOR_COMPLETE) { /* invoke the alias-menu to get more addresses */ for (i = state->curpos; i && state->wbuf[i-1] != ',' && state->wbuf[i-1] != ':'; i--) ; for (; i < state->lastchar && state->wbuf[i] == ' '; i++) ; my_wcstombs (buf, buflen, state->wbuf + i, state->curpos - i); r = mutt_alias_complete (buf, buflen); replace_part (state, i, buf); if (!r) { rv = 1; goto bye; } break; } else if (flags & M_ALIAS && ch == OP_EDITOR_COMPLETE_QUERY) { /* invoke the query-menu to get more addresses */ if ((i = state->curpos)) { for (; i && state->wbuf[i - 1] != ','; i--) ; for (; i < state->curpos && state->wbuf[i] == ' '; i++) ; } my_wcstombs (buf, buflen, state->wbuf + i, state->curpos - i); mutt_query_complete (buf, buflen); replace_part (state, i, buf); rv = 1; goto bye; } else if (flags & M_COMMAND) { my_wcstombs (buf, buflen, state->wbuf, state->curpos); i = strlen (buf); if (i && buf[i - 1] == '=' && mutt_var_value_complete (buf, buflen, i)) state->tabs = 0; else if (!mutt_command_complete (buf, buflen, i, state->tabs)) BEEP (); replace_part (state, 0, buf); } else if (flags & (M_FILE | M_EFILE)) { my_wcstombs (buf, buflen, state->wbuf, state->curpos); /* see if the path has changed from the last time */ if ((!tempbuf && !state->lastchar) || (tempbuf && templen == state->lastchar && !memcmp (tempbuf, state->wbuf, state->lastchar * sizeof (wchar_t)))) { _mutt_select_file (buf, buflen, ((flags & M_EFILE) ? M_SEL_FOLDER : 0) | (multiple ? M_SEL_MULTI : 0), files, numfiles); set_option (OPTNEEDREDRAW); if (*buf) { mutt_pretty_mailbox (buf); if (!pass) mutt_history_add (hclass, buf); rv = 0; goto bye; } /* file selection cancelled */ rv = 1; goto bye; } if (!mutt_complete (buf, buflen)) { templen = state->lastchar; safe_realloc (&tempbuf, templen * sizeof (wchar_t)); memcpy (tempbuf, state->wbuf, templen * sizeof (wchar_t)); } else BEEP (); /* let the user know that nothing matched */ replace_part (state, 0, buf); } else goto self_insert; break; case OP_EDITOR_QUOTE_CHAR: { event_t event; /*ADDCH (LastKey);*/ event = mutt_getch (); if (event.ch != -1) { LastKey = event.ch; goto self_insert; } } case OP_EDITOR_TRANSPOSE_CHARS: if (state->lastchar < 2) BEEP (); else { wchar_t t; if (state->curpos == 0) state->curpos = 2; else if (state->curpos < state->lastchar) ++state->curpos; t = state->wbuf[state->curpos - 2]; state->wbuf[state->curpos - 2] = state->wbuf[state->curpos - 1]; state->wbuf[state->curpos - 1] = t; } break; default: BEEP (); } } else { self_insert: state->tabs = 0; /* use the raw keypress */ ch = LastKey;#ifdef KEY_ENTER /* treat ENTER the same as RETURN */ if (ch == KEY_ENTER) ch = '\r';#endif /* quietly ignore all other function keys */ if (ch & ~0xff) continue; /* gather the octets into a wide character */ { char c; size_t k; c = ch; k = mbrtowc (&wc, &c, 1, &mbstate); if (k == (size_t)(-2)) continue; else if (k && k != 1) { memset (&mbstate, 0, sizeof (mbstate)); continue; } } if (first && (flags & M_CLEAR)) { first = 0; if (IsWPrint (wc)) /* why? */ state->curpos = state->lastchar = 0; } if (wc == '\r' || wc == '\n') { /* Convert from wide characters */ my_wcstombs (buf, buflen, state->wbuf, state->lastchar); if (!pass) mutt_history_add (hclass, buf); if (multiple) { char **tfiles; *numfiles = 1; tfiles = safe_calloc (*numfiles, sizeof (char *)); mutt_expand_path (buf, buflen); tfiles[0] = safe_strdup (buf); *files = tfiles; } rv = 0; goto bye; } else if (wc && (wc < ' ' || IsWPrint (wc))) /* why? */ { if (state->lastchar >= state->wbuflen) { state->wbuflen = state->lastchar + 20; safe_realloc (&state->wbuf, state->wbuflen * sizeof (wchar_t)); } memmove (state->wbuf + state->curpos + 1, state->wbuf + state->curpos, (state->lastchar - state->curpos) * sizeof (wchar_t)); state->wbuf[state->curpos++] = wc; state->lastchar++; } else { mutt_flushinp (); BEEP (); } } } bye: FREE (&tempbuf); return rv;}void mutt_free_enter_state (ENTER_STATE **esp){ if (!esp) return; FREE (&(*esp)->wbuf); FREE (esp); /* __FREE_CHECKED__ */}/* * TODO: * very narrow screen might crash it * sort out the input side * unprintable chars */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -