Add option select_by_word_characters_forward

This adds an option to select separate characters for forward and
backward word extension on double click. If it is empty the old behavior
is preserved. This is the default.

If it is not empty, select_by_word_characters_forward will be used for
extending the selection in forward direction (right) and
select_by_word_characters will be used for extending in backward
direction (left).

Signed-off-by: Konrad Gräfe <kgraefe@paktolos.net>
This commit is contained in:
Konrad Gräfe
2022-05-16 11:09:36 +02:00
parent d3656bf7e9
commit 8c41cc8d3e
7 changed files with 56 additions and 9 deletions

View File

@@ -492,6 +492,18 @@ Unicode database will be matched.
'''
)
opt('select_by_word_characters_forward', '',
ctype='!select_by_word_characters_forward',
long_text='''
Characters considered part of a word when extending the selection forward on
double clicking. In addition to these characters any character that is marked
as an alphanumeric character in the Unicode database will be matched.
If empty (default) :opt:`select_by_word_characters` will be used for both
directions.
'''
)
opt('click_interval', '-1.0',
option_type='float', ctype='time',
long_text='''

View File

@@ -1163,6 +1163,9 @@ class Parser:
def select_by_word_characters(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
ans['select_by_word_characters'] = str(val)
def select_by_word_characters_forward(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
ans['select_by_word_characters_forward'] = str(val)
def selection_background(self, val: str, ans: typing.Dict[str, typing.Any]) -> None:
ans['selection_background'] = to_color_or_none(val)

View File

@@ -304,6 +304,19 @@ convert_from_opts_select_by_word_characters(PyObject *py_opts, Options *opts) {
Py_DECREF(ret);
}
static void
convert_from_python_select_by_word_characters_forward(PyObject *val, Options *opts) {
select_by_word_characters_forward(val, opts);
}
static void
convert_from_opts_select_by_word_characters_forward(PyObject *py_opts, Options *opts) {
PyObject *ret = PyObject_GetAttrString(py_opts, "select_by_word_characters_forward");
if (ret == NULL) return;
convert_from_python_select_by_word_characters_forward(ret, opts);
Py_DECREF(ret);
}
static void
convert_from_python_click_interval(PyObject *val, Options *opts) {
opts->click_interval = parse_s_double_to_monotonic_t(val);
@@ -1067,6 +1080,8 @@ convert_opts_from_python_opts(PyObject *py_opts, Options *opts) {
if (PyErr_Occurred()) return false;
convert_from_opts_select_by_word_characters(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_select_by_word_characters_forward(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_click_interval(py_opts, opts);
if (PyErr_Occurred()) return false;
convert_from_opts_focus_follows_mouse(py_opts, opts);

View File

@@ -187,6 +187,12 @@ select_by_word_characters(PyObject *chars, Options *opts) {
opts->select_by_word_characters = list_of_chars(chars);
}
static void
select_by_word_characters_forward(PyObject *chars, Options *opts) {
free(opts->select_by_word_characters_forward);
opts->select_by_word_characters_forward = list_of_chars(chars);
}
static void
tab_bar_style(PyObject *val, Options *opts) {
opts->tab_bar_hidden = PyUnicode_CompareWithASCIIString(val, "hidden") == 0 ? true: false;

View File

@@ -411,6 +411,7 @@ option_names = ( # {{{
'scrollback_pager',
'scrollback_pager_history_size',
'select_by_word_characters',
'select_by_word_characters_forward',
'selection_background',
'selection_foreground',
'shell',
@@ -561,6 +562,7 @@ class Options:
scrollback_pager: typing.List[str] = ['less', '--chop-long-lines', '--RAW-CONTROL-CHARS', '+INPUT_LINE_NUMBER']
scrollback_pager_history_size: int = 0
select_by_word_characters: str = '@-./_~?&=%+#'
select_by_word_characters_forward: str = ''
selection_background: typing.Optional[kitty.fast_data_types.Color] = Color(255, 250, 205)
selection_foreground: typing.Optional[kitty.fast_data_types.Color] = Color(0, 0, 0)
shell: str = '.'