From 913862f97766675f5a02cc00c90afb7d873ef2a4 Mon Sep 17 00:00:00 2001 From: mattirn Date: Sun, 24 Jan 2021 12:48:50 +0100 Subject: [PATCH] After JLine has trimmed history history-search-backward widget does not work well, fixes #643 --- .../reader/impl/history/DefaultHistory.java | 16 +++++++++++----- .../jline/reader/impl/history/HistoryTest.java | 4 ++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/reader/src/main/java/org/jline/reader/impl/history/DefaultHistory.java b/reader/src/main/java/org/jline/reader/impl/history/DefaultHistory.java index d2c030b9d..036bca55b 100644 --- a/reader/src/main/java/org/jline/reader/impl/history/DefaultHistory.java +++ b/reader/src/main/java/org/jline/reader/impl/history/DefaultHistory.java @@ -257,11 +257,11 @@ protected void trimHistory(Path path, int max) throws IOException { }); } // Remove duplicates - doTrimHistory(allItems, max); + List trimmedItems = doTrimHistory(allItems, max); // Write history Path temp = Files.createTempFile(path.toAbsolutePath().getParent(), path.getFileName().toString(), ".tmp"); try (BufferedWriter writer = Files.newBufferedWriter(temp, StandardOpenOption.WRITE)) { - for (Entry entry : allItems) { + for (Entry entry : trimmedItems) { writer.append(format(entry)); } } @@ -269,8 +269,8 @@ protected void trimHistory(Path path, int max) throws IOException { // Keep items in memory if (isLineReaderHistory(path)) { internalClear(); - offset = allItems.get(0).index(); - items.addAll(allItems); + offset = trimmedItems.get(0).index(); + items.addAll(trimmedItems); setHistoryFileData(path, new HistoryFileData(items.size(), items.size())); } else { setEntriesInFile(path, allItems.size()); @@ -296,7 +296,7 @@ private void internalClear() { items.clear(); } - static void doTrimHistory(List allItems, int max) { + static List doTrimHistory(List allItems, int max) { int idx = 0; while (idx < allItems.size()) { int ridx = allItems.size() - idx - 1; @@ -313,6 +313,12 @@ static void doTrimHistory(List allItems, int max) { while (allItems.size() > max) { allItems.remove(0); } + int index = allItems.get(allItems.size() - 1).index() - allItems.size() + 1; + List out = new ArrayList<>(); + for (Entry e : allItems) { + out.add(new EntryImpl(index++, e.time(), e.line())); + } + return out; } public int size() { diff --git a/reader/src/test/java/org/jline/reader/impl/history/HistoryTest.java b/reader/src/test/java/org/jline/reader/impl/history/HistoryTest.java index 29f74ea6f..c061464b0 100644 --- a/reader/src/test/java/org/jline/reader/impl/history/HistoryTest.java +++ b/reader/src/test/java/org/jline/reader/impl/history/HistoryTest.java @@ -141,10 +141,10 @@ public void testTrim() { entries.add(new DefaultHistory.EntryImpl(8, Instant.now(), "a")); List trimmed = new ArrayList<>(entries); - DefaultHistory.doTrimHistory(trimmed, 6); + trimmed = DefaultHistory.doTrimHistory(trimmed, 6); assertEquals(5, trimmed.size()); - DefaultHistory.doTrimHistory(trimmed, 3); + trimmed = DefaultHistory.doTrimHistory(trimmed, 3); assertEquals(3, trimmed.size()); assertEquals("c", trimmed.get(0).line()); assertEquals("b", trimmed.get(1).line());