Add kill-selection function and visual binds for 'y' and 'd'

This commit is contained in:
Julian Aron Prenner 2014-01-18 10:18:29 +01:00
parent 88eae68987
commit 3728fc7dba
6 changed files with 27 additions and 11 deletions

View file

@ -472,14 +472,13 @@ static int builtin_commandline(parser_t &parser, wchar_t **argv)
if (selection_mode)
{
size_t sel_start, sel_stop;
size_t start, len;
const wchar_t *buffer = reader_get_buffer();
if(reader_get_selection_pos(sel_start, sel_stop))
if(reader_get_selection(start, len))
{
size_t len = std::min(sel_stop - sel_start + 1, wcslen(buffer));
wchar_t *selection = new wchar_t[len + 1];
selection[len] = L'\0';
selection = wcsncpy(selection, buffer + sel_start, len);
selection = wcsncpy(selection, buffer + start, len);
append_format(stdout_buffer, selection);
delete selection;

View file

@ -140,6 +140,7 @@ static const wchar_t * const name_arr[] =
L"accept-autosuggestion",
L"begin-selection",
L"end-selection",
L"kill-selection"
}
;
@ -231,7 +232,8 @@ static const wchar_t code_arr[] =
R_SUPPRESS_AUTOSUGGESTION,
R_ACCEPT_AUTOSUGGESTION,
R_BEGIN_SELECTION,
R_END_SELECTION
R_END_SELECTION,
R_KILL_SELECTION
}
;

View file

@ -62,12 +62,13 @@ enum
R_SUPPRESS_AUTOSUGGESTION,
R_ACCEPT_AUTOSUGGESTION,
R_BEGIN_SELECTION,
R_END_SELECTION
R_END_SELECTION,
R_KILL_SELECTION
}
;
#define R_MIN R_NULL
#define R_MAX R_END_SELECTION
#define R_MAX R_KILL_SELECTION
/**
Initialize the terminal by calling setupterm, and set up arrays

View file

@ -2436,7 +2436,7 @@ size_t reader_get_cursor_pos()
return data->buff_pos;
}
bool reader_get_selection_pos(size_t &start, size_t &stop)
bool reader_get_selection(size_t &start, size_t &len)
{
if (!data)
{
@ -2449,7 +2449,7 @@ bool reader_get_selection_pos(size_t &start, size_t &stop)
else
{
start = data->sel_start_pos;
stop = data->sel_stop_pos;
len = std::min(data->sel_stop_pos - data->sel_start_pos + 1, data->command_length());
return true;
}
}
@ -3850,6 +3850,17 @@ const wchar_t *reader_readline(void)
break;
}
case R_KILL_SELECTION:
{
bool newv = (last_char != R_KILL_SELECTION);
size_t start, len;
if(reader_get_selection(start, len))
{
reader_kill(start, len, KILL_APPEND, newv);
}
break;
}
/* Other, if a normal character, we add it to the command */
default:
{

View file

@ -120,7 +120,7 @@ size_t reader_get_cursor_pos();
Get the current selection range in the command line.
Returns false if there is no active selection, true otherwise.
*/
bool reader_get_selection_pos(size_t &start, size_t &stop);
bool reader_get_selection(size_t &start, size_t &len);
/**
Return the value of the interrupted flag, which is set by the sigint

View file

@ -192,7 +192,10 @@ function fish_vi_key_bindings -d "vi-like key bindings for fish"
bind -M visual -k left backward-char
bind -M visual h backward-char
bind -M visual l forward-char
bind -M visual '"*y' "commandline -s | xsel -p"
bind -M visual -m default d kill-selection end-selection force-repaint
bind -M visual -m default y kill-selection yank end-selection force-repaint
bind -M visual -m default '"*y' "commandline -s | xsel -p" end-selection force-repaint
bind -M visual -m default \cc end-selection force-repaint
bind -M visual -m default \e end-selection force-repaint