summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Smith <luke@lukesmith.xyz>2019-05-08 15:29:33 -0400
committerLuke Smith <luke@lukesmith.xyz>2019-05-08 15:29:33 -0400
commitda13ef12463d1870caed94584db464d68c6b3182 (patch)
treeb8c786a393b13aef8bbeae4f024564ab5a68d3cb
parentca12440fa9f323b9f33298cc41c22ea4bc0afd6a (diff)
external pipe eternal
-rw-r--r--st.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/st.c b/st.c
index bcb3444..21c6739 100644
--- a/st.c
+++ b/st.c
@@ -48,6 +48,8 @@
term.scr + HISTSIZE + 1) % HISTSIZE] : \
term.line[(y) - term.scr])
+#define TLINE_HIST(y) ((y) <= HISTSIZE-term.row+2 ? term.hist[(y)] : term.line[(y-HISTSIZE+term.row-3)])
+
/* constants */
#define ISO14755CMD "dmenu -w \"$WINDOWID\" -p codepoint: </dev/null"
@@ -429,6 +431,20 @@ tlinelen(int y)
return i;
}
+int
+tlinehistlen(int y)
+{
+ int i = term.col;
+
+ if (TLINE_HIST(y)[i - 1].mode & ATTR_WRAP)
+ return i;
+
+ while (i > 0 && TLINE_HIST(y)[i - 1].u == ' ')
+ --i;
+
+ return i;
+}
+
void
selstart(int col, int row, int snap)
{
@@ -2059,16 +2075,19 @@ externalpipe(const Arg *arg)
/* ignore sigpipe for now, in case child exists early */
oldsigpipe = signal(SIGPIPE, SIG_IGN);
newline = 0;
- for (n = 0; n < term.row; n++) {
- bp = term.line[n];
- lastpos = MIN(tlinelen(n) + 1, term.col) - 1;
+ /* modify externalpipe patch to pipe history too */
+ for (n = 0; n <= HISTSIZE + 2; n++) {
+ bp = TLINE_HIST(n);
+ lastpos = MIN(tlinehistlen(n) +1, term.col) - 1;
if (lastpos < 0)
break;
+ if (lastpos == 0)
+ continue;
end = &bp[lastpos + 1];
for (; bp < end; ++bp)
if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
break;
- if ((newline = term.line[n][lastpos].mode & ATTR_WRAP))
+ if ((newline = TLINE_HIST(n)[lastpos].mode & ATTR_WRAP))
continue;
if (xwrite(to[1], "\n", 1) < 0)
break;