📄 readline.c
字号:
int
rl_forward (count, key)
int count, key;
{
if (count < 0)
rl_backward (-count, key);
else if (count > 0)
{
int end = rl_point + count;
#if defined (VI_MODE)
int lend = rl_end - (rl_editing_mode == vi_mode);
#else
int lend = rl_end;
#endif
if (end > lend)
{
rl_point = lend;
ding ();
}
else
rl_point = end;
}
if (rl_end < 0)
rl_end = 0;
return 0;
}
/* Move backward COUNT characters. */
int
rl_backward (count, key)
int count, key;
{
if (count < 0)
rl_forward (-count, key);
else if (count > 0)
{
if (rl_point < count)
{
rl_point = 0;
ding ();
}
else
rl_point -= count;
}
return 0;
}
/* Move to the beginning of the line. */
int
rl_beg_of_line (count, key)
int count, key;
{
rl_point = 0;
return 0;
}
/* Move to the end of the line. */
int
rl_end_of_line (count, key)
int count, key;
{
rl_point = rl_end;
return 0;
}
/* Move forward a word. We do what Emacs does. */
int
rl_forward_word (count, key)
int count, key;
{
int c;
if (count < 0)
{
rl_backward_word (-count, key);
return 0;
}
while (count)
{
if (rl_point == rl_end)
return 0;
/* If we are not in a word, move forward until we are in one.
Then, move forward until we hit a non-alphabetic character. */
c = the_line[rl_point];
if (alphabetic (c) == 0)
{
while (++rl_point < rl_end)
{
c = the_line[rl_point];
if (alphabetic (c))
break;
}
}
if (rl_point == rl_end)
return 0;
while (++rl_point < rl_end)
{
c = the_line[rl_point];
if (alphabetic (c) == 0)
break;
}
--count;
}
return 0;
}
/* Move backward a word. We do what Emacs does. */
int
rl_backward_word (count, key)
int count, key;
{
int c;
if (count < 0)
{
rl_forward_word (-count, key);
return 0;
}
while (count)
{
if (!rl_point)
return 0;
/* Like rl_forward_word (), except that we look at the characters
just before point. */
c = the_line[rl_point - 1];
if (alphabetic (c) == 0)
{
while (--rl_point)
{
c = the_line[rl_point - 1];
if (alphabetic (c))
break;
}
}
while (rl_point)
{
c = the_line[rl_point - 1];
if (alphabetic (c) == 0)
break;
else
--rl_point;
}
--count;
}
return 0;
}
/* Clear the current line. Numeric argument to C-l does this. */
int
rl_refresh_line (ignore1, ignore2)
int ignore1, ignore2;
{
int curr_line;
curr_line = _rl_current_display_line ();
_rl_move_vert (curr_line);
_rl_move_cursor_relative (0, the_line); /* XXX is this right */
_rl_clear_to_eol (0); /* arg of 0 means to not use spaces */
rl_forced_update_display ();
rl_display_fixed = 1;
return 0;
}
/* C-l typed to a line without quoting clears the screen, and then reprints
the prompt and the current input line. Given a numeric arg, redraw only
the current line. */
int
rl_clear_screen (count, key)
int count, key;
{
if (rl_explicit_arg)
{
rl_refresh_line (count, key);
return 0;
}
_rl_clear_screen (); /* calls termcap function to clear screen */
rl_forced_update_display ();
rl_display_fixed = 1;
return 0;
}
int
rl_arrow_keys (count, c)
int count, c;
{
int ch;
ch = rl_read_key ();
switch (_rl_to_upper (ch))
{
case 'A':
rl_get_previous_history (count, ch);
break;
case 'B':
rl_get_next_history (count, ch);
break;
case 'C':
rl_forward (count, ch);
break;
case 'D':
rl_backward (count, ch);
break;
default:
ding ();
}
return 0;
}
/* **************************************************************** */
/* */
/* Text commands */
/* */
/* **************************************************************** */
/* Insert the character C at the current location, moving point forward. */
int
rl_insert (count, c)
int count, c;
{
register int i;
char *string;
if (count <= 0)
return 0;
/* If we can optimize, then do it. But don't let people crash
readline because of extra large arguments. */
if (count > 1 && count <= 1024)
{
string = xmalloc (1 + count);
for (i = 0; i < count; i++)
string[i] = c;
string[i] = '\0';
rl_insert_text (string);
free (string);
return 0;
}
if (count > 1024)
{
int decreaser;
char str[1024+1];
for (i = 0; i < 1024; i++)
str[i] = c;
while (count)
{
decreaser = (count > 1024 ? 1024 : count);
str[decreaser] = '\0';
rl_insert_text (str);
count -= decreaser;
}
return 0;
}
/* We are inserting a single character.
If there is pending input, then make a string of all of the
pending characters that are bound to rl_insert, and insert
them all. */
if (_rl_any_typein ())
_rl_insert_typein (c);
else
{
/* Inserting a single character. */
char str[2];
str[1] = '\0';
str[0] = c;
rl_insert_text (str);
}
return 0;
}
/* Insert the next typed character verbatim. */
int
rl_quoted_insert (count, key)
int count, key;
{
int c;
#if defined (HANDLE_SIGNALS)
_rl_disable_tty_signals ();
#endif
c = rl_read_key ();
#if defined (HANDLE_SIGNALS)
_rl_restore_tty_signals ();
#endif
return (rl_insert (count, c));
}
/* Insert a tab character. */
int
rl_tab_insert (count, key)
int count, key;
{
return (rl_insert (count, '\t'));
}
/* What to do when a NEWLINE is pressed. We accept the whole line.
KEY is the key that invoked this command. I guess it could have
meaning in the future. */
int
rl_newline (count, key)
int count, key;
{
rl_done = 1;
#if defined (VI_MODE)
if (rl_editing_mode == vi_mode)
{
_rl_vi_done_inserting ();
_rl_vi_reset_last ();
}
#endif /* VI_MODE */
/* If we've been asked to erase empty lines, suppress the final update,
since _rl_update_final calls crlf(). */
if (rl_erase_empty_line && rl_point == 0 && rl_end == 0)
return 0;
if (readline_echoing_p)
_rl_update_final ();
return 0;
}
/* What to do for some uppercase characters, like meta characters,
and some characters appearing in emacs_ctlx_keymap. This function
is just a stub, you bind keys to it and the code in _rl_dispatch ()
is special cased. */
int
rl_do_lowercase_version (ignore1, ignore2)
int ignore1, ignore2;
{
return 0;
}
/* Rubout the character behind point. */
int
rl_rubout (count, key)
int count, key;
{
if (count < 0)
{
rl_delete (-count, key);
return 0;
}
if (!rl_point)
{
ding ();
return -1;
}
if (count > 1 || rl_explicit_arg)
{
int orig_point = rl_point;
rl_backward (count, key);
rl_kill_text (orig_point, rl_point);
}
else
{
int c = the_line[--rl_point];
rl_delete_text (rl_point, rl_point + 1);
if (rl_point == rl_end && isprint (c) && _rl_last_c_pos)
{
int l;
l = rl_character_len (c, rl_point);
_rl_erase_at_end_of_line (l);
}
}
return 0;
}
/* Delete the character under the cursor. Given a numeric argument,
kill that many characters instead. */
int
rl_delete (count, key)
int count, key;
{
if (count < 0)
return (rl_rubout (-count, key));
if (rl_point == rl_end)
{
ding ();
return -1;
}
if (count > 1 || rl_explicit_arg)
{
int orig_point = rl_point;
rl_forward (count, key);
rl_kill_text (orig_point, rl_point);
rl_point = orig_point;
return 0;
}
else
return (rl_delete_text (rl_point, rl_point + 1));
}
/* Delete the character under the cursor, unless the insertion
point is at the end of the line, in which case the character
behind the cursor is deleted. COUNT is obeyed and may be used
to delete forward or backward that many characters. */
int
rl_rubout_or_delete (count, key)
int count, key;
{
if (rl_end != 0 && rl_point == rl_end)
return (rl_rubout (count, key));
else
return (rl_delete (count, key));
}
/* Delete all spaces and tabs around point. */
int
rl_delete_horizontal_space (count, ignore)
int count, ignore;
{
int start = rl_point;
while (rl_point && whitespace (the_line[rl_point - 1]))
rl_point--;
start = rl_point;
while (rl_point < rl_end && whitespace (the_line[rl_point]))
rl_point++;
if (start != rl_point)
{
rl_delete_text (start, rl_point);
rl_point = start;
}
return 0;
}
/* Like the tcsh editing function delete-char-or-list. The eof character
is caught before this is invoked, so this really does the same thing as
delete-char-or-list-or-eof, as long as it's bound to the eof character. */
int
rl_delete_or_show_completions (count, key)
int count, key;
{
if (rl_end != 0 && rl_point == rl_end)
return (rl_possible_completions (count, key));
else
return (rl_delete (count, key));
}
#ifndef RL_COMMENT_BEGIN_DEFAULT
#define RL_COMMENT_BEGIN_DEFAULT "#"
#endif
/* Turn the current line into a comment in shell history.
A K*rn shell style function. */
int
rl_insert_comment (count, key)
int count, key;
{
rl_beg_of_line (1, key);
rl_insert_text (_rl_comment_begin ? _rl_comment_begin
: RL_COMMENT_BEGIN_DEFAULT);
(*rl_redisplay_function) ();
rl_newline (1, '\n');
return (0);
}
/* **************************************************************** */
/* */
/* Changing Case */
/* */
/* **************************************************************** */
/* The three kinds of things that we know how to do. */
#define UpCase 1
#define DownCase 2
#define CapCase 3
/* Uppercase the word at point. */
int
rl_upcase_word (count, key)
int count, key;
{
return (rl_change_case (count, UpCase));
}
/* Lowercase the word at point. */
int
rl_downcase_word (count, key)
int count, key;
{
return (rl_change_case (count, DownCase));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -