aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES6
-rw-r--r--client.c4
-rw-r--r--local.c4
-rw-r--r--tmux.19
-rw-r--r--window-copy.c64
5 files changed, 78 insertions, 9 deletions
diff --git a/CHANGES b/CHANGES
index 0a5533cb..a067866e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+26 November 2007
+
+* Add ^A and ^E to copy mode to move to start-of-line/end-of-line.
+
24 November 2007
* Support for alt charset mode (VT100 graphics characters).
@@ -267,4 +271,4 @@
(including mutt, emacs). No status bar yet and no key remapping or other
customisation.
-$Id: CHANGES,v 1.84 2007-11-24 23:29:49 nicm Exp $
+$Id: CHANGES,v 1.85 2007-11-26 20:36:30 nicm Exp $
diff --git a/client.c b/client.c
index a9307f60..1bf97966 100644
--- a/client.c
+++ b/client.c
@@ -1,4 +1,4 @@
-/* $Id: client.c,v 1.21 2007-11-12 15:12:08 nicm Exp $ */
+/* $Id: client.c,v 1.22 2007-11-26 20:36:30 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -102,7 +102,7 @@ retry:
cctx->srv_in = buffer_create(BUFSIZ);
cctx->srv_out = buffer_create(BUFSIZ);
- if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) {
+ if (isatty(STDIN_FILENO)) {
if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == -1) {
log_warn("ioctl(TIOCGWINSZ)");
return (-1);
diff --git a/local.c b/local.c
index fa15baa2..84a8c670 100644
--- a/local.c
+++ b/local.c
@@ -1,4 +1,4 @@
-/* $Id: local.c,v 1.22 2007-11-25 10:59:44 nicm Exp $ */
+/* $Id: local.c,v 1.23 2007-11-26 20:36:30 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -243,7 +243,7 @@ local_init(struct buffer **in, struct buffer **out)
NULL
};
- if ((tty = ttyname(STDOUT_FILENO)) == NULL)
+ if ((tty = ttyname(STDIN_FILENO)) == NULL)
fatal("ttyname failed");
if ((local_fd = open(tty, O_RDWR)) == -1)
fatal("open failed");
diff --git a/tmux.1 b/tmux.1
index f1d82da5..c795b2d4 100644
--- a/tmux.1
+++ b/tmux.1
@@ -1,4 +1,4 @@
-.\" $Id: tmux.1,v 1.19 2007-11-24 18:05:39 nicm Exp $
+.\" $Id: tmux.1,v 1.20 2007-11-26 20:36:30 nicm Exp $
.\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\"
@@ -176,7 +176,12 @@ This is permits a section of a window or its history to be copied to the
.Em paste buffer
for later insertion into another window.
The navigation keys move the cursor around the window, scrolling as necessary.
-The space key begins a selection; the enter key or
+In addition,
+.Ql ^A
+and
+.Ql ^E
+move to the start and end of the line; the space key begins a selection; and the
+enter key or
.Ql ^W
copies the selection to the paste buffer and exits copy mode.
.Pp
diff --git a/window-copy.c b/window-copy.c
index 0efa72e4..2c2cd090 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -1,4 +1,4 @@
-/* $Id: window-copy.c,v 1.6 2007-11-23 17:52:54 nicm Exp $ */
+/* $Id: window-copy.c,v 1.7 2007-11-26 20:36:30 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -34,6 +34,8 @@ void window_copy_copy_line(
struct window *, char **, size_t *, size_t *, u_int, u_int, u_int);
u_int window_copy_find_length(struct window *, u_int);
void window_copy_move_cursor(struct window *);
+void window_copy_cursor_bol(struct window *);
+void window_copy_cursor_eol(struct window *);
void window_copy_cursor_left(struct window *);
void window_copy_cursor_right(struct window *);
void window_copy_cursor_up(struct window *);
@@ -186,12 +188,21 @@ window_copy_key(struct window *w, int key)
data->sely = data->size + data->cy - data->oy;
oy = -1; /* XXX */
break;
+ case '\033':
+ data->selflag = 0;
+ oy = -1; /* XXX */
+ break;
case '\027': /* C-w */
case '\r': /* enter */
if (data->selflag)
window_copy_copy_selection(w);
goto done;
- /* XXX start/end of line, next word, prev word, cancel sel */
+ case '\001': /* C-a */
+ window_copy_cursor_bol(w);
+ return;
+ case '\005': /* C-e */
+ window_copy_cursor_eol(w);
+ return;
}
if (data->oy != oy) {
server_redraw_window_all(w);
@@ -338,6 +349,55 @@ window_copy_move_cursor(struct window *w)
}
void
+window_copy_cursor_bol(struct window *w)
+{
+ struct window_copy_mode_data *data = w->modedata;
+
+ if (data->ox != 0)
+ window_copy_scroll_right(w, data->ox);
+ data->cx = 0;
+ window_copy_move_cursor(w);
+}
+
+void
+window_copy_cursor_eol(struct window *w)
+{
+ struct window_copy_mode_data *data = w->modedata;
+ struct screen *s = &w->screen;
+ u_int xx;
+
+ xx = window_copy_find_length(w, data->size + data->cy - data->oy);
+
+ /* On screen. */
+ if (xx > data->ox && xx < data->ox + screen_last_x(s))
+ data->cx = xx - data->ox;
+
+ /* Off right of screen. */
+ if (xx > data->ox + screen_last_x(s)) {
+ /* Move cursor to last and scroll screen. */
+ window_copy_scroll_left(w,
+ xx - data->ox - screen_last_x(s));
+ data->cx = screen_last_x(s);
+ }
+
+ /* Off left of screen. */
+ if (xx <= data->ox) {
+ if (xx < screen_last_x(s)) {
+ /* Short enough to fit on screen. */
+ window_copy_scroll_right(w, data->ox);
+ data->cx = xx;
+ } else {
+ /* Too long to fit on screen. */
+ window_copy_scroll_right(
+ w, data->ox - (xx - screen_last_x(s)));
+ data->cx = screen_last_x(s);
+ }
+ }
+
+ window_copy_move_cursor(w);
+}
+
+void
window_copy_cursor_left(struct window *w)
{
struct window_copy_mode_data *data = w->modedata;