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-11 19:14:56 +00:00
parent 289320a9b1
commit 2f7198246e
4 changed files with 47 additions and 6 deletions

View File

@ -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

@ -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);
}

5
tmux.1
View File

@ -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

1
tmux.h
View File

@ -858,6 +858,7 @@ struct cmd_entry {
#define CMD_UFLAG 0x100
#define CMD_BIGDFLAG 0x200
#define CMD_BIGUFLAG 0x400
#define CMD_RFLAG 0x800
int flags;