1
0
mirror of https://github.com/irssi/irssi.git synced 2024-09-29 04:45:57 -04:00

Added /SET paste_join_multiline - it attempts to be smart and detect when

you're copy&pasting indented lines, and merge them together to one long
line, but splits them to max. 400 chars per line.


git-svn-id: http://svn.irssi.org/repos/irssi/trunk@3206 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2004-01-19 18:59:17 +00:00 committed by cras
parent 2199b35892
commit 4c1628e25d

View File

@ -65,6 +65,7 @@ static GArray *paste_buffer;
static char *paste_old_prompt;
static int paste_prompt, paste_line_count;
static int paste_join_multiline;
static void sig_input(void);
@ -147,6 +148,107 @@ static void window_next_page(void)
gui_window_scroll(active_win, get_scroll_count());
}
static void paste_buffer_join_lines(GArray *buf)
{
#define IS_WHITE(c) ((c) == ' ' || (c) == '\t')
unsigned int i, count, indent, line_len;
unichar *arr, *dest, *last_lf_pos;
int last_lf;
/* first check if we actually want to join anything. This is assuming
that we only want to join lines if
a) first line doesn't begin with whitespace
b) subsequent lines begin with same amount of whitespace
c) whenever there's no whitespace, goto a)
For example:
line 1
line 2
line 3
line 4
line 5
line 6
->
line1 line2 line 3
line4
line5 line 6
*/
if (buf->len == 0)
return;
arr = (unichar *) paste_buffer->data;
/* first line */
if (IS_WHITE(arr[0]))
return;
/* find the first beginning of indented line */
for (i = 1; i < buf->len; i++) {
if (arr[i-1] == '\n' && IS_WHITE(arr[i]))
break;
}
if (i == buf->len)
return;
/* get how much indentation we have.. */
for (indent = 0; i < buf->len; i++, indent++) {
if (!IS_WHITE(arr[i]))
break;
}
if (i == buf->len)
return;
/* now, enforce these to all subsequent lines */
count = indent; last_lf = TRUE;
for (; i < buf->len; i++) {
if (last_lf) {
if (IS_WHITE(arr[i]))
count++;
else {
last_lf = FALSE;
if (count != 0 && count != indent)
return;
count = 0;
}
}
if (arr[i] == '\n')
last_lf = TRUE;
}
/* all looks fine - now remove the whitespace, but don't let lines
get longer than 400 chars */
dest = arr; last_lf = TRUE; last_lf_pos = NULL; line_len = 0;
for (i = 0; i < buf->len; i++) {
if (last_lf && IS_WHITE(arr[i])) {
/* whitespace, ignore */
} else if (arr[i] == '\n') {
if (!last_lf && i+1 != buf->len &&
IS_WHITE(arr[i+1]))
last_lf_pos = dest;
else {
*dest++ = '\n'; /* double-LF */
line_len = 0;
last_lf_pos = NULL;
}
last_lf = TRUE;
} else {
last_lf = FALSE;
if (++line_len >= 400 && last_lf_pos != NULL) {
memmove(last_lf_pos+1, last_lf_pos,
dest - last_lf_pos);
*last_lf_pos = '\n'; last_lf_pos = NULL;
dest++;
}
*dest++ = arr[i];
}
}
buf->len = dest - arr;
}
static void paste_send(void)
{
HISTORY_REC *history;
@ -155,6 +257,9 @@ static void paste_send(void)
char out[10], *text;
unsigned int i;
if (paste_join_multiline)
paste_buffer_join_lines(paste_buffer);
arr = (unichar *) paste_buffer->data;
if (active_entry->text_len == 0)
i = 0;
@ -854,7 +959,8 @@ static void setup_changed(void)
else if (paste_state == -1)
paste_state = 0;
paste_verify_line_count = settings_get_int("paste_verify_line_count");
paste_verify_line_count = settings_get_int("paste_verify_line_count");
paste_join_multiline = settings_get_bool("paste_join_multiline");
}
void gui_readline_init(void)
@ -879,6 +985,7 @@ void gui_readline_init(void)
/* NOTE: function keys can generate at least 5 characters long
keycodes. this must be larger to allow them to work. */
settings_add_int("misc", "paste_verify_line_count", 5);
settings_add_bool("misc", "paste_join_multiline", TRUE);
setup_changed();
keyboard = keyboard_create(NULL);