1212import java .io .IOException ;
1313import java .nio .file .Path ;
1414import java .util .*;
15+ import java .util .function .BiConsumer ;
1516import java .util .function .Consumer ;
1617import java .util .function .Supplier ;
1718
4041 * .historyFile(path) // optional
4142 * .variable(name, value) // forwarded to LineReader
4243 * .option(Option.X, true) // forwarded to LineReader
43- * .onReaderReady(reader -> { ... })// optional callback
44+ * .onReaderReady(( reader, dispatcher) -> { ... })// optional callback
4445 * .build();
4546 * </pre>
4647 *
@@ -58,7 +59,7 @@ public class ShellBuilder {
5859 private Supplier <String > rightPromptSupplier ;
5960 private final Map <String , Object > variables = new LinkedHashMap <>();
6061 private final Map <Option , Boolean > options = new LinkedHashMap <>();
61- private Consumer <LineReader > onReaderReady ;
62+ private BiConsumer <LineReader , CommandDispatcher > onReaderReady ;
6263 private File initScript ;
6364 private JobManager jobManager ;
6465 private PipelineParser pipelineParser ;
@@ -201,12 +202,35 @@ public ShellBuilder option(Option option, boolean value) {
201202 /**
202203 * Sets a callback invoked after the LineReader is created but before {@link Shell#run()}.
203204 * <p>
204- * This is useful for setting up TailTipWidgets or other post-reader customizations.
205+ * This is useful for setting up post-reader customizations.
205206 *
206- * @param onReaderReady the callback
207+ * @param onReaderReady the callback receiving the LineReader
207208 * @return this builder
209+ * @see #onReaderReady(BiConsumer)
208210 */
209211 public ShellBuilder onReaderReady (Consumer <LineReader > onReaderReady ) {
212+ this .onReaderReady = (reader , dispatcher ) -> onReaderReady .accept (reader );
213+ return this ;
214+ }
215+
216+ /**
217+ * Sets a callback invoked after the LineReader is created but before {@link Shell#run()}.
218+ * <p>
219+ * This is useful for setting up {@link org.jline.shell.widget.CommandTailTipWidgets}
220+ * or other post-reader customizations that need access to both the reader and the dispatcher.
221+ *
222+ * <pre>
223+ * Shell.builder()
224+ * .onReaderReady((reader, dispatcher) -> {
225+ * new CommandTailTipWidgets(reader, dispatcher, 5).enable();
226+ * })
227+ * .build();
228+ * </pre>
229+ *
230+ * @param onReaderReady the callback receiving the LineReader and CommandDispatcher
231+ * @return this builder
232+ */
233+ public ShellBuilder onReaderReady (BiConsumer <LineReader , CommandDispatcher > onReaderReady ) {
210234 this .onReaderReady = onReaderReady ;
211235 return this ;
212236 }
@@ -460,7 +484,7 @@ public Shell build() throws IOException {
460484
461485 // Callback
462486 if (onReaderReady != null ) {
463- onReaderReady .accept (reader );
487+ onReaderReady .accept (reader , disp );
464488 }
465489
466490 return new Shell (term , ownTerminal , reader , disp , prompt , rightPromptSupplier , initScript , jobManager );
0 commit comments