command history rotation
This commit is contained in:
parent
f1875e5343
commit
31715240b6
@ -37,6 +37,7 @@ public class MainWindow extends JFrame {
|
|||||||
private int lastMainPanelExtent = -1;
|
private int lastMainPanelExtent = -1;
|
||||||
private boolean applyingSavedDividerLocation = false;
|
private boolean applyingSavedDividerLocation = false;
|
||||||
private boolean wildcardDialogOpen = false;
|
private boolean wildcardDialogOpen = false;
|
||||||
|
private int commandHistoryIndex = -1;
|
||||||
|
|
||||||
public MainWindow() {
|
public MainWindow() {
|
||||||
super("KF Manager v" + MainApp.APP_VERSION + " (" + MainApp.CURRENT_OS + ")");
|
super("KF Manager v" + MainApp.APP_VERSION + " (" + MainApp.CURRENT_OS + ")");
|
||||||
@ -390,6 +391,8 @@ public class MainWindow extends JFrame {
|
|||||||
} else if (e.getKeyCode() == KeyEvent.VK_E && e.isControlDown()) {
|
} else if (e.getKeyCode() == KeyEvent.VK_E && e.isControlDown()) {
|
||||||
showCommandLineHistory();
|
showCommandLineHistory();
|
||||||
e.consume();
|
e.consume();
|
||||||
|
} else if (!e.isControlDown() && !e.isAltDown() && !e.isMetaDown()) {
|
||||||
|
commandHistoryIndex = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1233,6 +1236,7 @@ public class MainWindow extends JFrame {
|
|||||||
Object currentItem = commandLine.getEditor().getItem();
|
Object currentItem = commandLine.getEditor().getItem();
|
||||||
if (currentItem != null && !currentItem.toString().isEmpty()) {
|
if (currentItem != null && !currentItem.toString().isEmpty()) {
|
||||||
commandLine.getEditor().setItem("");
|
commandLine.getEditor().setItem("");
|
||||||
|
commandHistoryIndex = -1;
|
||||||
textCleared = true;
|
textCleared = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2347,15 +2351,14 @@ public class MainWindow extends JFrame {
|
|||||||
private void showCommandLineHistory() {
|
private void showCommandLineHistory() {
|
||||||
if (commandLine != null && commandLine.getItemCount() > 0) {
|
if (commandLine != null && commandLine.getItemCount() > 0) {
|
||||||
commandLine.requestFocusInWindow();
|
commandLine.requestFocusInWindow();
|
||||||
if (!commandLine.isPopupVisible()) {
|
|
||||||
commandLine.setSelectedIndex(0);
|
|
||||||
commandLine.showPopup();
|
|
||||||
} else {
|
|
||||||
int count = commandLine.getItemCount();
|
int count = commandLine.getItemCount();
|
||||||
int current = commandLine.getSelectedIndex();
|
commandHistoryIndex = (commandHistoryIndex + 1) % count;
|
||||||
// If index is -1 or invalid, start from 0, otherwise go to next
|
String nextCommand = commandLine.getItemAt(commandHistoryIndex);
|
||||||
int nextIndex = (current < 0) ? 0 : (current + 1) % count;
|
commandLine.getEditor().setItem(nextCommand);
|
||||||
commandLine.setSelectedIndex(nextIndex);
|
|
||||||
|
Component editorComp = commandLine.getEditor().getEditorComponent();
|
||||||
|
if (editorComp instanceof JTextField tf) {
|
||||||
|
tf.setCaretPosition(tf.getText().length());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2553,10 +2556,16 @@ public class MainWindow extends JFrame {
|
|||||||
} else if (trimmed.equalsIgnoreCase("bash") || trimmed.equalsIgnoreCase("sh")) {
|
} else if (trimmed.equalsIgnoreCase("bash") || trimmed.equalsIgnoreCase("sh")) {
|
||||||
// Special handling for bash/sh to open a terminal with that shell
|
// Special handling for bash/sh to open a terminal with that shell
|
||||||
openTerminal(trimmed.toLowerCase());
|
openTerminal(trimmed.toLowerCase());
|
||||||
|
} else {
|
||||||
|
// On Linux, run command line commands in an external terminal.
|
||||||
|
// This keeps command output visible and uses the active panel directory.
|
||||||
|
if (MainApp.CURRENT_OS == MainApp.OS.LINUX) {
|
||||||
|
openTerminalWithCommand(trimmed);
|
||||||
} else {
|
} else {
|
||||||
// Execute natively for other commands
|
// Execute natively for other commands
|
||||||
executeNative(trimmed, null);
|
executeNative(trimmed, null);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Final prompt update after command execution (path might have changed)
|
// Final prompt update after command execution (path might have changed)
|
||||||
updateCommandLinePrompt();
|
updateCommandLinePrompt();
|
||||||
@ -2645,6 +2654,115 @@ public class MainWindow extends JFrame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void openTerminalWithCommand(String command) {
|
||||||
|
if (command == null || command.trim().isEmpty()) return;
|
||||||
|
|
||||||
|
File currentDir = activePanel.getCurrentDirectory();
|
||||||
|
if (currentDir == null || !currentDir.exists()) {
|
||||||
|
currentDir = new File(System.getProperty("user.home"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep terminal open after running command so user can inspect output.
|
||||||
|
String shellScript = command + "; exec sh -i";
|
||||||
|
|
||||||
|
try {
|
||||||
|
List<String> terminals = new ArrayList<>();
|
||||||
|
|
||||||
|
String envTerminal = System.getenv("TERMINAL");
|
||||||
|
if (envTerminal != null && !envTerminal.isEmpty()) {
|
||||||
|
terminals.add(envTerminal);
|
||||||
|
}
|
||||||
|
|
||||||
|
terminals.add("xdg-terminal-exec");
|
||||||
|
terminals.addAll(Arrays.asList(
|
||||||
|
"x-terminal-emulator",
|
||||||
|
"gnome-terminal",
|
||||||
|
"konsole",
|
||||||
|
"xfce4-terminal",
|
||||||
|
"alacritty",
|
||||||
|
"kitty",
|
||||||
|
"foot",
|
||||||
|
"wezterm",
|
||||||
|
"mate-terminal",
|
||||||
|
"terminator",
|
||||||
|
"tilix",
|
||||||
|
"qterminal",
|
||||||
|
"urxvt",
|
||||||
|
"st",
|
||||||
|
"xterm"
|
||||||
|
));
|
||||||
|
|
||||||
|
boolean started = false;
|
||||||
|
for (String terminal : terminals) {
|
||||||
|
try {
|
||||||
|
List<String> args = new ArrayList<>();
|
||||||
|
args.add(terminal);
|
||||||
|
|
||||||
|
if (terminal.equals("gnome-terminal") || terminal.equals("xfce4-terminal") ||
|
||||||
|
terminal.equals("mate-terminal") || terminal.equals("terminator") ||
|
||||||
|
terminal.equals("tilix")) {
|
||||||
|
args.add("--working-directory=" + currentDir.getAbsolutePath());
|
||||||
|
args.add("--");
|
||||||
|
args.add("sh");
|
||||||
|
args.add("-c");
|
||||||
|
args.add(shellScript);
|
||||||
|
} else if (terminal.equals("alacritty") || terminal.equals("foot")) {
|
||||||
|
args.add("--working-directory");
|
||||||
|
args.add(currentDir.getAbsolutePath());
|
||||||
|
args.add("-e");
|
||||||
|
args.add("sh");
|
||||||
|
args.add("-c");
|
||||||
|
args.add(shellScript);
|
||||||
|
} else if (terminal.equals("kitty")) {
|
||||||
|
args.add("--directory");
|
||||||
|
args.add(currentDir.getAbsolutePath());
|
||||||
|
args.add("sh");
|
||||||
|
args.add("-c");
|
||||||
|
args.add(shellScript);
|
||||||
|
} else if (terminal.equals("konsole") || terminal.equals("qterminal")) {
|
||||||
|
args.add("--workdir");
|
||||||
|
args.add(currentDir.getAbsolutePath());
|
||||||
|
args.add("-e");
|
||||||
|
args.add("sh");
|
||||||
|
args.add("-c");
|
||||||
|
args.add(shellScript);
|
||||||
|
} else if (terminal.equals("wezterm")) {
|
||||||
|
args.add("start");
|
||||||
|
args.add("--cwd");
|
||||||
|
args.add(currentDir.getAbsolutePath());
|
||||||
|
args.add("sh");
|
||||||
|
args.add("-c");
|
||||||
|
args.add(shellScript);
|
||||||
|
} else if (terminal.equals("xdg-terminal-exec")) {
|
||||||
|
args.add("sh");
|
||||||
|
args.add("-c");
|
||||||
|
args.add(shellScript);
|
||||||
|
} else {
|
||||||
|
args.add("-e");
|
||||||
|
args.add("sh");
|
||||||
|
args.add("-c");
|
||||||
|
args.add(shellScript);
|
||||||
|
}
|
||||||
|
|
||||||
|
new ProcessBuilder(args).directory(currentDir).start();
|
||||||
|
started = true;
|
||||||
|
break;
|
||||||
|
} catch (IOException ignore) {
|
||||||
|
// Try next terminal command.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!started) {
|
||||||
|
throw new Exception("Could not start any terminal emulator.");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Error opening terminal for command execution: " + e.getMessage(),
|
||||||
|
"Error",
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private List<String> parseCommand(String command) {
|
private List<String> parseCommand(String command) {
|
||||||
List<String> list = new ArrayList<>();
|
List<String> list = new ArrayList<>();
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
@ -2679,6 +2797,7 @@ public class MainWindow extends JFrame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
commandLine.insertItemAt(command, 0);
|
commandLine.insertItemAt(command, 0);
|
||||||
|
commandHistoryIndex = -1;
|
||||||
// We don't necessarily want to select it here as it might interfere with the editor state
|
// We don't necessarily want to select it here as it might interfere with the editor state
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user