When pasting, translate \n into \r. This matches xterm and putty's behaviour,

and makes emacs happy when pasting into some modes. A new -r (raw) flag to
paste-buffer pastes without the translation.

From Kalle Olavi Niemitalo, thanks!
This commit is contained in:
Nicholas Marriott 2009-07-12 17:11:39 +00:00
parent d8de72ca77
commit 27fc963631
4 changed files with 51 additions and 10 deletions

View File

@ -1,4 +1,4 @@
/* $Id: cmd-generic.c,v 1.28 2009-05-21 19:47:57 nicm Exp $ */
/* $Id: cmd-generic.c,v 1.29 2009-07-12 17:11:39 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@ -23,9 +23,9 @@
#include "tmux.h"
#define CMD_FLAGS "adDgkuU"
#define CMD_FLAGS "adDgkruU"
#define CMD_FLAGMASK (CMD_AFLAG|CMD_DFLAG|CMD_BIGDFLAG|CMD_GFLAG|CMD_KFLAG| \
CMD_UFLAG|CMD_BIGUFLAG)
CMD_RFLAG|CMD_UFLAG|CMD_BIGUFLAG)
int cmd_do_flags(int, int, int *);
size_t cmd_print_flags(char *, size_t, size_t, int);
@ -73,6 +73,12 @@ cmd_do_flags(int opt, int iflags, int *oflags)
return (0);
}
return (-1);
case 'r':
if (iflags & CMD_RFLAG) {
(*oflags) |= CMD_RFLAG;
return (0);
}
return (-1);
case 'u':
if (iflags & CMD_UFLAG) {
(*oflags) |= CMD_UFLAG;
@ -107,6 +113,8 @@ cmd_print_flags(char *buf, size_t len, size_t off, int flags)
off += xsnprintf(buf + off, len - off, "g");
if (off < len && flags & CMD_KFLAG)
off += xsnprintf(buf + off, len - off, "k");
if (off < len && flags & CMD_RFLAG)
off += xsnprintf(buf + off, len - off, "r");
if (off < len && flags & CMD_UFLAG)
off += xsnprintf(buf + off, len - off, "u");
if (off < len && flags & CMD_BIGUFLAG)

View File

@ -1,4 +1,4 @@
/* $Id: cmd-paste-buffer.c,v 1.16 2009-07-02 16:23:54 nicm Exp $ */
/* $Id: cmd-paste-buffer.c,v 1.17 2009-07-12 17:11:39 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -27,11 +27,12 @@
*/
int cmd_paste_buffer_exec(struct cmd *, struct cmd_ctx *);
void cmd_paste_buffer_lf2cr(struct buffer *, const char *, size_t);
const struct cmd_entry cmd_paste_buffer_entry = {
"paste-buffer", "pasteb",
"[-d] " CMD_BUFFER_WINDOW_USAGE,
CMD_DFLAG,
"[-dr] " CMD_BUFFER_WINDOW_USAGE,
CMD_DFLAG|CMD_RFLAG,
cmd_buffer_init,
cmd_buffer_parse,
cmd_paste_buffer_exec,
@ -63,8 +64,16 @@ cmd_paste_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
}
}
if (pb != NULL && *pb->data != '\0')
buffer_write(w->active->out, pb->data, strlen(pb->data));
if (pb != NULL && *pb->data != '\0') {
/* -r means raw data without LF->CR conversion. */
if (data->flags & CMD_RFLAG) {
buffer_write(
w->active->out, pb->data, strlen(pb->data));
} else {
cmd_paste_buffer_lf2cr(
w->active->out, pb->data, strlen(pb->data));
}
}
/* Delete the buffer if -d. */
if (data->flags & CMD_DFLAG) {
@ -76,3 +85,21 @@ cmd_paste_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
return (0);
}
/* Add bytes to a buffer but change every '\n' to '\r'. */
void
cmd_paste_buffer_lf2cr(struct buffer *b, const char *data, size_t size)
{
const char *end = data + size;
const char *lf;
while ((lf = memchr(data, '\n', end - data)) != NULL) {
if (lf != data)
buffer_write(b, data, lf - data);
buffer_write8(b, '\r');
data = lf + 1;
}
if (end != data)
buffer_write(b, data, end - data);
}

7
tmux.1
View File

@ -1,4 +1,4 @@
.\" $Id: tmux.1,v 1.110 2009-07-12 17:10:35 nicm Exp $
.\" $Id: tmux.1,v 1.111 2009-07-12 17:11:39 nicm Exp $
.\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\"
@ -897,6 +897,11 @@ Insert the contents of a paste buffer into the current window.
With
.Fl d ,
also delete the paste buffer from the stack.
When output, any linefeed (LF) characters in the paste buffer are replaced with
carriage returns (CR).
This translation may be disabled with the
.Fl r
flag.
.It Xo Ic previous-window
.Op Fl a
.Op Fl t Ar target-session

3
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.354 2009-07-12 17:07:58 nicm Exp $ */
/* $Id: tmux.h,v 1.355 2009-07-12 17:11:39 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -857,6 +857,7 @@ struct cmd_entry {
#define CMD_UFLAG 0x100
#define CMD_BIGDFLAG 0x200
#define CMD_BIGUFLAG 0x400
#define CMD_RFLAG 0x800
int flags;