diff --git a/builtins/src/main/java/org/jline/builtins/Commands.java b/builtins/src/main/java/org/jline/builtins/Commands.java index c872d20b3..d18c0d4c5 100644 --- a/builtins/src/main/java/org/jline/builtins/Commands.java +++ b/builtins/src/main/java/org/jline/builtins/Commands.java @@ -190,9 +190,7 @@ public static void history(LineReader reader, PrintStream out, PrintStream err, for (History.Entry entry : history) { AttributedStringBuilder sb = new AttributedStringBuilder(); sb.append(" "); - sb.style(AttributedStyle.BOLD); - sb.append(String.format("%3d", entry.index() + 1)); - sb.style(AttributedStyle.DEFAULT); + sb.styled(AttributedStyle::bold, String.format("%3d", entry.index() + 1)); if (opt.isSet("d")) { sb.append(" "); LocalTime lt = LocalTime.from(entry.time().atZone(ZoneId.systemDefault())) diff --git a/builtins/src/main/java/org/jline/builtins/Completers.java b/builtins/src/main/java/org/jline/builtins/Completers.java index 7d21ea8af..50a172b2f 100644 --- a/builtins/src/main/java/org/jline/builtins/Completers.java +++ b/builtins/src/main/java/org/jline/builtins/Completers.java @@ -343,16 +343,12 @@ protected String getDisplay(Terminal terminal, Path p) { String name = p.getFileName().toString(); if (Files.isDirectory(p)) { AttributedStringBuilder sb = new AttributedStringBuilder(); - sb.style(AttributedStyle.BOLD.foreground(AttributedStyle.RED)); - sb.append(name); - sb.style(AttributedStyle.DEFAULT); + sb.styled(AttributedStyle.BOLD.foreground(AttributedStyle.RED), name); sb.append("/"); name = sb.toAnsi(terminal); } else if (Files.isSymbolicLink(p)) { AttributedStringBuilder sb = new AttributedStringBuilder(); - sb.style(AttributedStyle.BOLD.foreground(AttributedStyle.RED)); - sb.append(name); - sb.style(AttributedStyle.DEFAULT); + sb.styled(AttributedStyle.BOLD.foreground(AttributedStyle.RED), name); sb.append("@"); name = sb.toAnsi(terminal); } diff --git a/reader/src/main/java/org/jline/reader/impl/DefaultHighlighter.java b/reader/src/main/java/org/jline/reader/impl/DefaultHighlighter.java index af30dcd0a..943c611e0 100644 --- a/reader/src/main/java/org/jline/reader/impl/DefaultHighlighter.java +++ b/reader/src/main/java/org/jline/reader/impl/DefaultHighlighter.java @@ -13,6 +13,7 @@ import org.jline.reader.Highlighter; import org.jline.utils.AttributedString; import org.jline.utils.AttributedStringBuilder; +import org.jline.utils.AttributedStyle; import org.jline.utils.WCWidth; public class DefaultHighlighter implements Highlighter { @@ -51,19 +52,19 @@ public AttributedString highlight(LineReader reader, String buffer) { AttributedStringBuilder sb = new AttributedStringBuilder(); for (int i = 0; i < buffer.length(); i++) { if (i == underlineStart) { - sb.style(sb.style().underline()); + sb.style(AttributedStyle::underline); } if (i == negativeStart) { - sb.style(sb.style().inverse()); + sb.style(AttributedStyle::inverse); } char c = buffer.charAt(i); if (c == '\t' || c == '\n') { sb.append(c); } else if (c < 32) { - sb.style(sb.style().inverseNeg()) + sb.style(AttributedStyle::inverseNeg) .append('^') .append((char) (c + '@')) - .style(sb.style().inverseNeg()); + .style(AttributedStyle::inverseNeg); } else { int w = WCWidth.wcwidth(c); if (w > 0) { @@ -71,10 +72,10 @@ public AttributedString highlight(LineReader reader, String buffer) { } } if (i == underlineEnd) { - sb.style(sb.style().underlineOff()); + sb.style(AttributedStyle::underlineOff); } if (i == negativeEnd) { - sb.style(sb.style().inverseOff()); + sb.style(AttributedStyle::inverseOff); } } return sb.toAttributedString(); diff --git a/reader/src/main/java/org/jline/reader/impl/completer/FileNameCompleter.java b/reader/src/main/java/org/jline/reader/impl/completer/FileNameCompleter.java index c1c948c3c..cf270e66b 100644 --- a/reader/src/main/java/org/jline/reader/impl/completer/FileNameCompleter.java +++ b/reader/src/main/java/org/jline/reader/impl/completer/FileNameCompleter.java @@ -113,16 +113,12 @@ protected String getDisplay(Terminal terminal, Path p) { String name = p.getFileName().toString(); if (Files.isDirectory(p)) { AttributedStringBuilder sb = new AttributedStringBuilder(); - sb.style(AttributedStyle.BOLD.foreground(AttributedStyle.RED)); - sb.append(name); - sb.style(AttributedStyle.DEFAULT); + sb.styled(AttributedStyle.BOLD.foreground(AttributedStyle.RED), name); sb.append("/"); name = sb.toAnsi(terminal); } else if (Files.isSymbolicLink(p)) { AttributedStringBuilder sb = new AttributedStringBuilder(); - sb.style(AttributedStyle.BOLD.foreground(AttributedStyle.RED)); - sb.append(name); - sb.style(AttributedStyle.DEFAULT); + sb.styled(AttributedStyle.BOLD.foreground(AttributedStyle.RED), name); sb.append("@"); name = sb.toAnsi(terminal); } diff --git a/terminal/src/main/java/org/jline/utils/AttributedStringBuilder.java b/terminal/src/main/java/org/jline/utils/AttributedStringBuilder.java index cc6a9bdd2..103ba60c3 100644 --- a/terminal/src/main/java/org/jline/utils/AttributedStringBuilder.java +++ b/terminal/src/main/java/org/jline/utils/AttributedStringBuilder.java @@ -9,6 +9,9 @@ package org.jline.utils; import java.util.Arrays; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -106,6 +109,27 @@ public AttributedStringBuilder style(AttributedStyle style) { return this; } + public AttributedStringBuilder style(Function style) { + current = style.apply(current); + return this; + } + + public AttributedStringBuilder styled(Function style, CharSequence cs) { + return styled(style, sb -> sb.append(cs)); + } + + public AttributedStringBuilder styled(AttributedStyle style, CharSequence cs) { + return styled(s -> style, sb -> sb.append(cs)); + } + + public AttributedStringBuilder styled(Function style, Consumer consumer) { + AttributedStyle prev = current; + current = style.apply(prev); + consumer.accept(this); + current = prev; + return this; + } + public AttributedStyle style() { return current; }