nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit 7d483987ceca957b86e490d14602d95d239ae6fc
parent f705a9674b2ad75702f2c1e8c989558d45a7d243
Author: Benno Schulenberg <bensberg@telfort.nl>
Date:   Sun,  5 Jan 2020 14:21:46 +0100

input: do not auto-indent when something is pasted into nano from outside

Also, do not break overlong lines and do not convert tabs to spaces,
nor interpret a <Tab> as an indent command (when the mark is on).
In other words: accept an outside paste as literally as possible.

This fulfills https://savannah.gnu.org/bugs/?40060.
Requested-by: Egmont Koblinger <egmont@gmail.com>

And fulfills https://savannah.gnu.org/bugs/?57527.
Requested-by: Sébastien Desreux <seb@h-k.fr>
Requested-by: Hans Ecke <hecke@gxt.com>

Original-idea-by: Brand Huntsman <alpha@qzx.com>

Diffstat:
Msrc/nano.c | 9++++++++-
Msrc/text.c | 8++++----
Msrc/winio.c | 2+-
3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/nano.c b/src/nano.c @@ -78,6 +78,9 @@ static linestruct *hindline; static linestruct *filetail; /* What was the bottom line of the buffer. */ +static bool pasting_from_outside = FALSE; + /* Whether a bracketed paste is in progress. */ + /* Create a new linestruct node. Note that we do not set prevnode->next. */ linestruct *make_new_node(linestruct *prevnode) { @@ -1493,6 +1496,9 @@ void do_input(void) } #endif + if (bracketed_paste) + pasting_from_outside = TRUE; + /* Check for a shortcut in the main list. */ shortcut = get_shortcut(&input); @@ -1534,6 +1540,7 @@ void do_input(void) * at once, filtering out any ASCII control codes. */ puddle[depth] = '\0'; inject(puddle, depth, TRUE); + pasting_from_outside = FALSE; /* Empty the input buffer. */ free(puddle); @@ -1699,7 +1706,7 @@ void inject(char *output, size_t output_len, bool filtering) #ifdef ENABLE_WRAPPING /* If text gets wrapped, the edit window needs a refresh. */ - if (ISSET(BREAK_LONG_LINES) && do_wrap()) + if (ISSET(BREAK_LONG_LINES) && !pasting_from_outside && do_wrap()) refresh_needed = TRUE; #endif } diff --git a/src/text.c b/src/text.c @@ -68,12 +68,12 @@ void do_mark(void) void do_tab(void) { #ifdef ENABLE_COLOR - if (openfile->syntax && openfile->syntax->tab) + if (openfile->syntax && openfile->syntax->tab && !bracketed_paste) inject(openfile->syntax->tab, strlen(openfile->syntax->tab), FALSE); else #endif #ifndef NANO_TINY - if (ISSET(TABS_TO_SPACES)) { + if (ISSET(TABS_TO_SPACES) && !bracketed_paste) { char *spaces = charalloc(tabsize + 1); size_t length = tabsize - (xplustabs() % tabsize); @@ -853,7 +853,7 @@ void do_enter(void) linestruct *sampleline = openfile->current; bool allblanks = FALSE; - if (ISSET(AUTOINDENT)) { + if (ISSET(AUTOINDENT) && !bracketed_paste) { #ifdef ENABLE_JUSTIFY /* When doing automatic long-line wrapping and the next line is * in this same paragraph, use its indentation as the model. */ @@ -875,7 +875,7 @@ void do_enter(void) strcpy(&newnode->data[extra], openfile->current->data + openfile->current_x); #ifndef NANO_TINY - if (ISSET(AUTOINDENT)) { + if (ISSET(AUTOINDENT) && !bracketed_paste) { /* Copy the whitespace from the sample line to the new one. */ strncpy(newnode->data, sampleline->data, extra); /* If there were only blanks before the cursor, trim them. */ diff --git a/src/winio.c b/src/winio.c @@ -657,7 +657,7 @@ int parse_kbinput(WINDOW *win) #ifndef NANO_TINY /* When <Tab> is pressed while the mark is on, do an indent. */ if (retval == TAB_CODE && openfile->mark && currmenu == MMAIN && - openfile->mark != openfile->current) + !bracketed_paste && openfile->mark != openfile->current) return INDENT_KEY; #endif