mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 05:13:10 +00:00
Add commandline --showing-suggestion
Returns 0 (true) in case an autosuggestion is currently being displayed. This was first requested in #5000 then again in #10580 after the existing workaround for this missing functionality was broken as part of a change to the overall behavior of `commandline` (for the better).
This commit is contained in:
parent
4730a04f25
commit
faf3b356f2
2 changed files with 23 additions and 1 deletions
|
@ -13,7 +13,7 @@ use crate::parse_util::{
|
||||||
use crate::proc::is_interactive_session;
|
use crate::proc::is_interactive_session;
|
||||||
use crate::reader::{
|
use crate::reader::{
|
||||||
commandline_get_state, commandline_set_buffer, commandline_set_search_field,
|
commandline_get_state, commandline_set_buffer, commandline_set_search_field,
|
||||||
reader_execute_readline_cmd,
|
reader_execute_readline_cmd, reader_showing_suggestion,
|
||||||
};
|
};
|
||||||
use crate::tokenizer::TOK_ACCEPT_UNFINISHED;
|
use crate::tokenizer::TOK_ACCEPT_UNFINISHED;
|
||||||
use crate::tokenizer::{TokenType, Tokenizer};
|
use crate::tokenizer::{TokenType, Tokenizer};
|
||||||
|
@ -201,6 +201,7 @@ pub fn commandline(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr])
|
||||||
let mut paging_full_mode = false;
|
let mut paging_full_mode = false;
|
||||||
let mut search_field_mode = false;
|
let mut search_field_mode = false;
|
||||||
let mut is_valid = false;
|
let mut is_valid = false;
|
||||||
|
let mut showing_suggestion = false;
|
||||||
|
|
||||||
let mut range = 0..0;
|
let mut range = 0..0;
|
||||||
let mut override_buffer = None;
|
let mut override_buffer = None;
|
||||||
|
@ -231,6 +232,7 @@ pub fn commandline(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr])
|
||||||
wopt(L!("paging-full-mode"), ArgType::NoArgument, 'F'),
|
wopt(L!("paging-full-mode"), ArgType::NoArgument, 'F'),
|
||||||
wopt(L!("search-field"), ArgType::NoArgument, '\x03'),
|
wopt(L!("search-field"), ArgType::NoArgument, '\x03'),
|
||||||
wopt(L!("is-valid"), ArgType::NoArgument, '\x01'),
|
wopt(L!("is-valid"), ArgType::NoArgument, '\x01'),
|
||||||
|
wopt(L!("showing-suggestion"), ArgType::NoArgument, '\x04'),
|
||||||
];
|
];
|
||||||
|
|
||||||
let mut w = WGetopter::new(short_options, long_options, args);
|
let mut w = WGetopter::new(short_options, long_options, args);
|
||||||
|
@ -277,6 +279,7 @@ pub fn commandline(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr])
|
||||||
'F' => paging_full_mode = true,
|
'F' => paging_full_mode = true,
|
||||||
'\x03' => search_field_mode = true,
|
'\x03' => search_field_mode = true,
|
||||||
'\x01' => is_valid = true,
|
'\x01' => is_valid = true,
|
||||||
|
'\x04' => showing_suggestion = true,
|
||||||
'h' => {
|
'h' => {
|
||||||
builtin_print_help(parser, streams, cmd);
|
builtin_print_help(parser, streams, cmd);
|
||||||
return STATUS_CMD_OK;
|
return STATUS_CMD_OK;
|
||||||
|
@ -510,6 +513,13 @@ pub fn commandline(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr])
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if showing_suggestion {
|
||||||
|
if reader_showing_suggestion(parser) {
|
||||||
|
return Some(0);
|
||||||
|
}
|
||||||
|
return Some(1);
|
||||||
|
}
|
||||||
|
|
||||||
if search_field_mode {
|
if search_field_mode {
|
||||||
range = 0..current_buffer.len();
|
range = 0..current_buffer.len();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -942,6 +942,18 @@ pub fn reader_execute_readline_cmd(parser: &Parser, ch: CharEvent) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn reader_showing_suggestion(parser: &Parser) -> bool {
|
||||||
|
if !is_interactive_session() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if let Some(data) = current_data() {
|
||||||
|
let reader = Reader { parser, data };
|
||||||
|
!reader.autosuggestion.is_empty()
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Return the value of the interrupted flag, which is set by the sigint handler, and clear it if it
|
/// Return the value of the interrupted flag, which is set by the sigint handler, and clear it if it
|
||||||
/// was set. If the current reader is interruptible, mark the reader as exit_loop_requested.
|
/// was set. If the current reader is interruptible, mark the reader as exit_loop_requested.
|
||||||
pub fn reader_reading_interrupted(data: &mut ReaderData) -> i32 {
|
pub fn reader_reading_interrupted(data: &mut ReaderData) -> i32 {
|
||||||
|
|
Loading…
Reference in a new issue