mirror of https://github.com/helix-editor/helix
various fixes
parent
c9e9fcf7c5
commit
2b44031929
|
@ -239,7 +239,7 @@ impl Renderer {
|
||||||
|
|
||||||
pub fn render_prompt(&mut self, view: &View, prompt: &Prompt) {
|
pub fn render_prompt(&mut self, view: &View, prompt: &Prompt) {
|
||||||
// completion
|
// completion
|
||||||
if let Some(completion) = &prompt.completion {
|
if !prompt.completion.is_empty() {
|
||||||
// TODO: find out better way of clearing individual lines of the screen
|
// TODO: find out better way of clearing individual lines of the screen
|
||||||
for i in (3..7) {
|
for i in (3..7) {
|
||||||
self.surface.set_string(
|
self.surface.set_string(
|
||||||
|
@ -255,10 +255,10 @@ impl Renderer {
|
||||||
);
|
);
|
||||||
let mut row = 0;
|
let mut row = 0;
|
||||||
let mut col = 0;
|
let mut col = 0;
|
||||||
let max_row: u16 = self.size.0 / BASE_WIDTH;
|
let max_col: u16 = self.size.0 / BASE_WIDTH;
|
||||||
// TODO: this will crash if there are too many cols added
|
// TODO: this will crash if there are too many cols added
|
||||||
// TODO: set char limit
|
// TODO: set char limit
|
||||||
for (i, command) in completion.iter().enumerate() {
|
for (i, command) in prompt.completion.iter().enumerate() {
|
||||||
let color = if prompt.completion_selection_index.is_some()
|
let color = if prompt.completion_selection_index.is_some()
|
||||||
&& i == prompt.completion_selection_index.unwrap()
|
&& i == prompt.completion_selection_index.unwrap()
|
||||||
{
|
{
|
||||||
|
@ -267,18 +267,18 @@ impl Renderer {
|
||||||
self.text_color
|
self.text_color
|
||||||
};
|
};
|
||||||
self.surface.set_stringn(
|
self.surface.set_stringn(
|
||||||
1 + row * BASE_WIDTH,
|
1 + col * BASE_WIDTH,
|
||||||
self.size.1 - 6 + col as u16,
|
self.size.1 - 6 + row as u16,
|
||||||
&command,
|
&command,
|
||||||
BASE_WIDTH as usize - 1,
|
BASE_WIDTH as usize - 1,
|
||||||
color,
|
color,
|
||||||
);
|
);
|
||||||
col += 1;
|
row += 1;
|
||||||
if col > 3 {
|
if row > 3 {
|
||||||
col = 0;
|
row = 0;
|
||||||
row += 1;
|
col += 1;
|
||||||
}
|
}
|
||||||
if row > max_row {
|
if col > max_col {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -434,7 +434,6 @@ impl Application {
|
||||||
let prompt = Prompt::new(
|
let prompt = Prompt::new(
|
||||||
":".to_owned(),
|
":".to_owned(),
|
||||||
|_input: &str| {
|
|_input: &str| {
|
||||||
let mut matches = vec![];
|
|
||||||
// TODO: i need this duplicate list right now to avoid borrow checker issues
|
// TODO: i need this duplicate list right now to avoid borrow checker issues
|
||||||
let command_list = vec![
|
let command_list = vec![
|
||||||
String::from("q"),
|
String::from("q"),
|
||||||
|
@ -469,15 +468,10 @@ impl Application {
|
||||||
String::from("ddd"),
|
String::from("ddd"),
|
||||||
String::from("eee"),
|
String::from("eee"),
|
||||||
];
|
];
|
||||||
for command in command_list {
|
command_list
|
||||||
if command.contains(_input) {
|
.into_iter()
|
||||||
matches.push(command);
|
.filter(|command| command.contains(_input))
|
||||||
}
|
.collect()
|
||||||
}
|
|
||||||
if matches.len() != 0 {
|
|
||||||
return Some(matches);
|
|
||||||
}
|
|
||||||
None
|
|
||||||
}, // completion
|
}, // completion
|
||||||
|editor: &mut Editor, input: &str| match input {
|
|editor: &mut Editor, input: &str| match input {
|
||||||
"q" => editor.should_close = true,
|
"q" => editor.should_close = true,
|
||||||
|
|
|
@ -309,6 +309,10 @@ pub fn append_mode(view: &mut View, _count: usize) {
|
||||||
|
|
||||||
// TODO: I, A, o and O can share a lot of the primitives.
|
// TODO: I, A, o and O can share a lot of the primitives.
|
||||||
|
|
||||||
|
pub fn command_mode(_view: &mut View, _count: usize) {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
// calculate line numbers for each selection range
|
// calculate line numbers for each selection range
|
||||||
fn selection_lines(state: &State) -> Vec<usize> {
|
fn selection_lines(state: &State) -> Vec<usize> {
|
||||||
let mut lines = state
|
let mut lines = state
|
||||||
|
|
|
@ -163,6 +163,7 @@ pub fn default() -> Keymaps {
|
||||||
vec![key!('p')] => commands::paste,
|
vec![key!('p')] => commands::paste,
|
||||||
vec![key!('>')] => commands::indent,
|
vec![key!('>')] => commands::indent,
|
||||||
vec![key!('<')] => commands::unindent,
|
vec![key!('<')] => commands::unindent,
|
||||||
|
vec![key!(':')] => commands::command_mode,
|
||||||
vec![Key {
|
vec![Key {
|
||||||
code: KeyCode::Esc,
|
code: KeyCode::Esc,
|
||||||
modifiers: Modifiers::NONE
|
modifiers: Modifiers::NONE
|
||||||
|
|
|
@ -6,17 +6,17 @@ pub struct Prompt {
|
||||||
pub prompt: String,
|
pub prompt: String,
|
||||||
pub line: String,
|
pub line: String,
|
||||||
pub cursor: usize,
|
pub cursor: usize,
|
||||||
pub completion: Option<Vec<String>>,
|
pub completion: Vec<String>,
|
||||||
pub should_close: bool,
|
pub should_close: bool,
|
||||||
pub completion_selection_index: Option<usize>,
|
pub completion_selection_index: Option<usize>,
|
||||||
completion_fn: Box<dyn FnMut(&str) -> Option<Vec<String>>>,
|
completion_fn: Box<dyn FnMut(&str) -> Vec<String>>,
|
||||||
callback_fn: Box<dyn FnMut(&mut Editor, &str)>,
|
callback_fn: Box<dyn FnMut(&mut Editor, &str)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Prompt {
|
impl Prompt {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
prompt: String,
|
prompt: String,
|
||||||
mut completion_fn: impl FnMut(&str) -> Option<Vec<String>> + 'static,
|
mut completion_fn: impl FnMut(&str) -> Vec<String> + 'static,
|
||||||
callback_fn: impl FnMut(&mut Editor, &str) + 'static,
|
callback_fn: impl FnMut(&mut Editor, &str) + 'static,
|
||||||
) -> Prompt {
|
) -> Prompt {
|
||||||
Prompt {
|
Prompt {
|
||||||
|
@ -68,11 +68,11 @@ impl Prompt {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn change_completion_selection(&mut self) {
|
pub fn change_completion_selection(&mut self) {
|
||||||
if self.completion.is_some() {
|
if !self.completion.is_empty() {
|
||||||
self.completion_selection_index = self
|
self.completion_selection_index = self
|
||||||
.completion_selection_index
|
.completion_selection_index
|
||||||
.map(|i| {
|
.map(|i| {
|
||||||
if i == self.completion.as_ref().unwrap().len() - 1 {
|
if i == self.completion.len() - 1 {
|
||||||
0
|
0
|
||||||
} else {
|
} else {
|
||||||
i + 1
|
i + 1
|
||||||
|
@ -81,8 +81,6 @@ impl Prompt {
|
||||||
.or(Some(0));
|
.or(Some(0));
|
||||||
self.line = String::from(
|
self.line = String::from(
|
||||||
self.completion
|
self.completion
|
||||||
.as_ref()
|
|
||||||
.unwrap()
|
|
||||||
.get(self.completion_selection_index.unwrap())
|
.get(self.completion_selection_index.unwrap())
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue