aboutsummaryrefslogtreecommitdiff
path: root/window-copy.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-07-12 16:15:34 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-07-12 16:15:34 +0000
commit22d51ec1ead8077f9528727db56e54e997da1775 (patch)
tree8c1a870eeec35123d22fa20c564676fbfea19d17 /window-copy.c
parentfa8333eddb747e9b3c2a72c4fab4308137891f49 (diff)
downloadrtmux-22d51ec1ead8077f9528727db56e54e997da1775.tar.gz
rtmux-22d51ec1ead8077f9528727db56e54e997da1775.tar.bz2
rtmux-22d51ec1ead8077f9528727db56e54e997da1775.zip
Add a "back to indentation" key in copy mode to move the cursor to the first
non-whitespace character. ^ with vi and M-m with emacs key bindings. Another from Kalle Olavi Niemitalo, thanks.
Diffstat (limited to 'window-copy.c')
-rw-r--r--window-copy.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/window-copy.c b/window-copy.c
index fb249698..04f22a8a 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -50,6 +50,7 @@ int window_copy_is_space(struct window_pane *, u_int, u_int);
u_int window_copy_find_length(struct window_pane *, u_int);
void window_copy_set_cursor_x(struct window_pane *, u_int);
void window_copy_cursor_start_of_line(struct window_pane *);
+void window_copy_cursor_back_to_indentation(struct window_pane *);
void window_copy_cursor_end_of_line(struct window_pane *);
void window_copy_cursor_left(struct window_pane *);
void window_copy_cursor_right(struct window_pane *);
@@ -207,6 +208,9 @@ window_copy_key(struct window_pane *wp, struct client *c, int key)
case MODEKEYCMD_STARTOFLINE:
window_copy_cursor_start_of_line(wp);
break;
+ case MODEKEYCMD_BACKTOINDENTATION:
+ window_copy_cursor_back_to_indentation(wp);
+ break;
case MODEKEYCMD_ENDOFLINE:
window_copy_cursor_end_of_line(wp);
break;
@@ -601,6 +605,33 @@ window_copy_cursor_start_of_line(struct window_pane *wp)
}
void
+window_copy_cursor_back_to_indentation(struct window_pane *wp)
+{
+ struct window_copy_mode_data *data = wp->modedata;
+ u_int px, py, xx;
+ const struct grid_cell *gc;
+
+ px = 0;
+ py = screen_hsize(&wp->base) + data->cy - data->oy;
+ xx = window_copy_find_length(wp, py);
+
+ /*
+ * Don't use window_copy_is_space because that treats some word
+ * delimiters as spaces.
+ */
+ while (px < xx) {
+ gc = grid_peek_cell(wp->base.grid, px, py);
+ if (gc->flags & GRID_FLAG_UTF8)
+ break;
+ if (gc->data != ' ')
+ break;
+ px++;
+ }
+
+ window_copy_set_cursor_x(wp, px);
+}
+
+void
window_copy_cursor_end_of_line(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;