change the way of keypress

This commit is contained in:
Dongdong Zhou 2021-10-07 21:31:03 +01:00
parent 0c940e8b82
commit c958b49da3
5 changed files with 1085 additions and 1198 deletions

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,7 @@
LapceMainSplitData, LapceTabData, RegisterData, LapceMainSplitData, LapceTabData, RegisterData,
}; };
use crate::find::Find; use crate::find::Find;
use crate::keypress::{KeyMap, KeyPressFocus}; use crate::keypress::{KeyMap, KeyPress, KeyPressFocus};
use crate::proxy::LapceProxy; use crate::proxy::LapceProxy;
use crate::scroll::LapceIdentityWrapper; use crate::scroll::LapceIdentityWrapper;
use crate::signature::SignatureState; use crate::signature::SignatureState;
@ -4027,11 +4027,11 @@ fn layout(
for keymap in keymaps { for keymap in keymaps {
if keymap.command == cmd.cmd { if keymap.command == cmd.cmd {
let mut keymap_str = "".to_string(); let mut keymap_str = "".to_string();
for (mods, key) in &keymap.key { for keypress in &keymap.key {
if keymap_str != "" { if keymap_str != "" {
keymap_str += " " keymap_str += " "
} }
keymap_str += &keybinding_to_string(mods, key); keymap_str += &keybinding_to_string(keypress);
} }
key = Some(keymap_str); key = Some(keymap_str);
break; break;
@ -4340,18 +4340,15 @@ fn empty_editor_commands(modal: bool, has_workspace: bool) -> Vec<LapceCommandNe
} }
} }
fn keybinding_to_string( fn keybinding_to_string(keypress: &KeyPress) -> String {
mods: &Modifiers,
code: &druid::keyboard_types::Code,
) -> String {
let mut keymap_str = "".to_string(); let mut keymap_str = "".to_string();
if mods.ctrl() { if keypress.mods.ctrl() {
keymap_str += "Ctrl+"; keymap_str += "Ctrl+";
} }
if mods.alt() { if keypress.mods.alt() {
keymap_str += "Alt+"; keymap_str += "Alt+";
} }
if mods.meta() { if keypress.mods.meta() {
let keyname = match std::env::consts::OS { let keyname = match std::env::consts::OS {
"macos" => "Cmd", "macos" => "Cmd",
"windows" => "Win", "windows" => "Win",
@ -4360,9 +4357,9 @@ fn keybinding_to_string(
keymap_str += &keyname; keymap_str += &keyname;
keymap_str += "+"; keymap_str += "+";
} }
if mods.shift() { if keypress.mods.shift() {
keymap_str += "Shift+"; keymap_str += "Shift+";
} }
keymap_str += &code.to_string(); keymap_str += &keypress.key.to_string();
keymap_str keymap_str
} }

View File

@ -36,16 +36,15 @@ enum KeymapMatch {
None, None,
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct KeyPress { pub struct KeyPress {
pub code: druid::keyboard_types::Code,
pub key: druid::keyboard_types::Key, pub key: druid::keyboard_types::Key,
pub mods: Modifiers, pub mods: Modifiers,
} }
#[derive(PartialEq, Eq, Hash, Clone, Debug)] #[derive(PartialEq, Eq, Hash, Clone, Debug)]
pub struct KeyMap { pub struct KeyMap {
pub key: Vec<(Modifiers, druid::keyboard_types::Code)>, pub key: Vec<KeyPress>,
pub modes: Vec<Mode>, pub modes: Vec<Mode>,
pub when: Option<String>, pub when: Option<String>,
pub command: String, pub command: String,
@ -67,8 +66,7 @@ fn run_command(
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct KeyPressData { pub struct KeyPressData {
pending_keypress: Vec<KeyPress>, pending_keypress: Vec<KeyPress>,
pub keymaps: pub keymaps: Arc<IndexMap<Vec<KeyPress>, Vec<KeyMap>>>,
Arc<IndexMap<Vec<(Modifiers, druid::keyboard_types::Code)>, Vec<KeyMap>>>,
pub commands: Arc<IndexMap<String, LapceCommandNew>>, pub commands: Arc<IndexMap<String, LapceCommandNew>>,
count: Option<usize>, count: Option<usize>,
} }
@ -139,25 +137,24 @@ pub fn key_down<T: KeyPressFocus>(
focus: &mut T, focus: &mut T,
env: &Env, env: &Env,
) -> bool { ) -> bool {
let code = match key_event.code { if key_event.key == druid::keyboard_types::Key::Shift {
druid::keyboard_types::Code::AltRight => { let mut mods = key_event.mods.clone();
druid::keyboard_types::Code::AltLeft mods.set(Modifiers::SHIFT, false);
if mods.is_empty() {
return false;
} }
druid::keyboard_types::Code::ShiftRight => { }
druid::keyboard_types::Code::ShiftLeft let mut mods = key_event.mods.clone();
match &key_event.key {
druid::keyboard_types::Key::Character(c) => {
mods.set(Modifiers::SHIFT, false);
} }
druid::keyboard_types::Code::MetaRight => { _ => (),
druid::keyboard_types::Code::MetaLeft }
}
druid::keyboard_types::Code::ControlRight => {
druid::keyboard_types::Code::ControlLeft
}
_ => key_event.code,
};
let keypress = KeyPress { let keypress = KeyPress {
code,
key: key_event.key.clone(), key: key_event.key.clone(),
mods: key_event.mods.clone(), mods,
}; };
let mode = focus.get_mode(); let mode = focus.get_mode();
@ -165,12 +162,8 @@ pub fn key_down<T: KeyPressFocus>(
return false; return false;
} }
let mut keypresses: Vec<(Modifiers, druid::keyboard_types::Code)> = self let mut keypresses: Vec<KeyPress> = self.pending_keypress.clone();
.pending_keypress keypresses.push(keypress.clone());
.iter()
.map(|k| (k.mods.clone(), k.code.clone()))
.collect();
keypresses.push((keypress.mods.clone(), keypress.code.clone()));
let matches = self.match_keymap(&keypresses, focus); let matches = self.match_keymap(&keypresses, focus);
let keymatch = if matches.len() == 0 { let keymatch = if matches.len() == 0 {
@ -233,7 +226,7 @@ pub fn key_down<T: KeyPressFocus>(
fn match_keymap<T: KeyPressFocus>( fn match_keymap<T: KeyPressFocus>(
&self, &self,
keypresses: &Vec<(Modifiers, druid::keyboard_types::Code)>, keypresses: &Vec<KeyPress>,
check: &T, check: &T,
) -> Vec<&KeyMap> { ) -> Vec<&KeyMap> {
self.keymaps self.keymaps
@ -316,20 +309,14 @@ fn check_condition<T: KeyPressFocus>(&self, condition: &str, check: &T) -> bool
} }
} }
fn keymaps_from_str( fn keymaps_from_str(s: &str) -> Result<IndexMap<Vec<KeyPress>, Vec<KeyMap>>> {
s: &str,
) -> Result<IndexMap<Vec<(Modifiers, druid::keyboard_types::Code)>, Vec<KeyMap>>>
{
let toml_keymaps: toml::Value = toml::from_str(s)?; let toml_keymaps: toml::Value = toml::from_str(s)?;
let toml_keymaps = toml_keymaps let toml_keymaps = toml_keymaps
.get("keymaps") .get("keymaps")
.and_then(|v| v.as_array()) .and_then(|v| v.as_array())
.ok_or(anyhow!("no keymaps"))?; .ok_or(anyhow!("no keymaps"))?;
let mut keymaps: IndexMap< let mut keymaps: IndexMap<Vec<KeyPress>, Vec<KeyMap>> = IndexMap::new();
Vec<(Modifiers, druid::keyboard_types::Code)>,
Vec<KeyMap>,
> = IndexMap::new();
for toml_keymap in toml_keymaps { for toml_keymap in toml_keymaps {
if let Ok(keymap) = Self::get_keymap(toml_keymap) { if let Ok(keymap) = Self::get_keymap(toml_keymap) {
for i in 1..keymap.key.len() + 1 { for i in 1..keymap.key.len() + 1 {
@ -347,9 +334,7 @@ fn keymaps_from_str(
Ok(keymaps) Ok(keymaps)
} }
fn get_keymaps( fn get_keymaps() -> Result<IndexMap<Vec<KeyPress>, Vec<KeyMap>>> {
) -> Result<IndexMap<Vec<(Modifiers, druid::keyboard_types::Code)>, Vec<KeyMap>>>
{
let mut keymaps_str = if std::env::consts::OS == "macos" { let mut keymaps_str = if std::env::consts::OS == "macos" {
default_keymaps_macos default_keymaps_macos
} else if std::env::consts::OS == "linux" { } else if std::env::consts::OS == "linux" {
@ -375,7 +360,7 @@ fn get_keymaps(
Self::keymaps_from_str(&keymaps_str) Self::keymaps_from_str(&keymaps_str)
} }
fn get_keypress(key: &str) -> Vec<(Modifiers, druid::keyboard_types::Code)> { fn get_keypress(key: &str) -> Vec<KeyPress> {
let mut keypresses = Vec::new(); let mut keypresses = Vec::new();
for k in key.split(" ") { for k in key.split(" ") {
let mut mods = Modifiers::default(); let mut mods = Modifiers::default();
@ -384,88 +369,26 @@ fn get_keypress(key: &str) -> Vec<(Modifiers, druid::keyboard_types::Code)> {
if parts.len() == 0 { if parts.len() == 0 {
continue; continue;
} }
let code = match parts[parts.len() - 1].to_lowercase().as_ref() { let key = match parts[parts.len() - 1].to_lowercase().as_str() {
"escape" => druid::keyboard_types::Code::Escape, "escape" => druid::keyboard_types::Key::Escape,
"esc" => druid::keyboard_types::Code::Escape, "esc" => druid::keyboard_types::Key::Escape,
"backspace" => druid::keyboard_types::Code::Backspace, "backspace" => druid::keyboard_types::Key::Backspace,
"bs" => druid::keyboard_types::Code::Backspace, "bs" => druid::keyboard_types::Key::Backspace,
"arrowup" => druid::keyboard_types::Code::ArrowUp, "arrowup" => druid::keyboard_types::Key::ArrowUp,
"arrowdown" => druid::keyboard_types::Code::ArrowDown, "arrowdown" => druid::keyboard_types::Key::ArrowDown,
"arrowright" => druid::keyboard_types::Code::ArrowRight, "arrowright" => druid::keyboard_types::Key::ArrowRight,
"arrowleft" => druid::keyboard_types::Code::ArrowLeft, "arrowleft" => druid::keyboard_types::Key::ArrowLeft,
"up" => druid::keyboard_types::Code::ArrowUp, "up" => druid::keyboard_types::Key::ArrowUp,
"down" => druid::keyboard_types::Code::ArrowDown, "down" => druid::keyboard_types::Key::ArrowDown,
"right" => druid::keyboard_types::Code::ArrowRight, "right" => druid::keyboard_types::Key::ArrowRight,
"left" => druid::keyboard_types::Code::ArrowLeft, "left" => druid::keyboard_types::Key::ArrowLeft,
"tab" => druid::keyboard_types::Code::Tab, "tab" => druid::keyboard_types::Key::Tab,
"enter" => druid::keyboard_types::Code::Enter, "enter" => druid::keyboard_types::Key::Enter,
"delete" => druid::keyboard_types::Code::Delete, "delete" => druid::keyboard_types::Key::Delete,
"del" => druid::keyboard_types::Code::Delete, "del" => druid::keyboard_types::Key::Delete,
"ctrl" => druid::keyboard_types::Code::ControlLeft, _ => druid::keyboard_types::Key::Character(
"meta" => druid::keyboard_types::Code::MetaLeft, parts[parts.len() - 1].to_string(),
"shift" => druid::keyboard_types::Code::ShiftLeft, ),
"alt" => druid::keyboard_types::Code::AltLeft,
"f1" => druid::keyboard_types::Code::F1,
"f2" => druid::keyboard_types::Code::F2,
"f3" => druid::keyboard_types::Code::F3,
"f4" => druid::keyboard_types::Code::F4,
"f5" => druid::keyboard_types::Code::F5,
"f6" => druid::keyboard_types::Code::F6,
"f7" => druid::keyboard_types::Code::F7,
"f8" => druid::keyboard_types::Code::F8,
"f9" => druid::keyboard_types::Code::F9,
"f10" => druid::keyboard_types::Code::F10,
"f11" => druid::keyboard_types::Code::F11,
"f12" => druid::keyboard_types::Code::F12,
"a" => druid::keyboard_types::Code::KeyA,
"b" => druid::keyboard_types::Code::KeyB,
"c" => druid::keyboard_types::Code::KeyC,
"d" => druid::keyboard_types::Code::KeyD,
"e" => druid::keyboard_types::Code::KeyE,
"f" => druid::keyboard_types::Code::KeyF,
"g" => druid::keyboard_types::Code::KeyG,
"h" => druid::keyboard_types::Code::KeyH,
"i" => druid::keyboard_types::Code::KeyI,
"j" => druid::keyboard_types::Code::KeyJ,
"k" => druid::keyboard_types::Code::KeyK,
"l" => druid::keyboard_types::Code::KeyL,
"m" => druid::keyboard_types::Code::KeyM,
"n" => druid::keyboard_types::Code::KeyN,
"o" => druid::keyboard_types::Code::KeyO,
"p" => druid::keyboard_types::Code::KeyP,
"q" => druid::keyboard_types::Code::KeyQ,
"r" => druid::keyboard_types::Code::KeyR,
"s" => druid::keyboard_types::Code::KeyS,
"t" => druid::keyboard_types::Code::KeyT,
"u" => druid::keyboard_types::Code::KeyU,
"v" => druid::keyboard_types::Code::KeyV,
"w" => druid::keyboard_types::Code::KeyW,
"x" => druid::keyboard_types::Code::KeyX,
"y" => druid::keyboard_types::Code::KeyY,
"z" => druid::keyboard_types::Code::KeyZ,
"1" => druid::keyboard_types::Code::Digit1,
"2" => druid::keyboard_types::Code::Digit2,
"3" => druid::keyboard_types::Code::Digit3,
"4" => druid::keyboard_types::Code::Digit4,
"5" => druid::keyboard_types::Code::Digit5,
"6" => druid::keyboard_types::Code::Digit6,
"7" => druid::keyboard_types::Code::Digit7,
"8" => druid::keyboard_types::Code::Digit8,
"9" => druid::keyboard_types::Code::Digit9,
"0" => druid::keyboard_types::Code::Digit0,
"=" => druid::keyboard_types::Code::Equal,
"-" => druid::keyboard_types::Code::Minus,
"]" => druid::keyboard_types::Code::BracketRight,
"[" => druid::keyboard_types::Code::BracketLeft,
"'" => druid::keyboard_types::Code::Quote,
";" => druid::keyboard_types::Code::Semicolon,
"\\" => druid::keyboard_types::Code::Backslash,
"," => druid::keyboard_types::Code::Comma,
"/" => druid::keyboard_types::Code::Slash,
"." => druid::keyboard_types::Code::Period,
"`" => druid::keyboard_types::Code::Backquote,
_ => druid::keyboard_types::Code::Unidentified,
}; };
for part in &parts[..parts.len() - 1] { for part in &parts[..parts.len() - 1] {
match part.to_lowercase().as_ref() { match part.to_lowercase().as_ref() {
@ -477,41 +400,8 @@ fn get_keypress(key: &str) -> Vec<(Modifiers, druid::keyboard_types::Code)> {
} }
} }
keypresses.push((mods, code)); let keypress = KeyPress { mods, key };
// for (i, part) in keypresses.push(keypress);
// k.split("+").collect::<Vec<&str>>().iter().rev().enumerate()
// {
// if i == 0 {
// keypress.key = match part.to_lowercase().as_ref() {
// "escape" => druid::keyboard_types::Key::Escape,
// "esc" => druid::keyboard_types::Key::Escape,
// "backspace" => druid::keyboard_types::Key::Backspace,
// "bs" => druid::keyboard_types::Key::Backspace,
// "arrowup" => druid::keyboard_types::Key::ArrowUp,
// "arrowdown" => druid::keyboard_types::Key::ArrowDown,
// "arrowright" => druid::keyboard_types::Key::ArrowRight,
// "arrowleft" => druid::keyboard_types::Key::ArrowLeft,
// "up" => druid::keyboard_types::Key::ArrowUp,
// "down" => druid::keyboard_types::Key::ArrowDown,
// "right" => druid::keyboard_types::Key::ArrowRight,
// "left" => druid::keyboard_types::Key::ArrowLeft,
// "tab" => druid::keyboard_types::Key::Tab,
// "enter" => druid::keyboard_types::Key::Enter,
// "delete" => druid::keyboard_types::Key::Delete,
// "del" => druid::keyboard_types::Key::Delete,
// _ => druid::keyboard_types::Key::Character(part.to_string()),
// }
// } else {
// match part.to_lowercase().as_ref() {
// "ctrl" => keypress.mods.set(Modifiers::CONTROL, true),
// "meta" => keypress.mods.set(Modifiers::META, true),
// "shift" => keypress.mods.set(Modifiers::SHIFT, true),
// "alt" => keypress.mods.set(Modifiers::ALT, true),
// _ => (),
// }
// }
// }
// keypresses.push(keypress);
} }
keypresses keypresses
} }

View File

@ -5,7 +5,7 @@ key = "meta+p"
command = "palette" command = "palette"
[[keymaps]] [[keymaps]]
key = "shift+meta+p" key = "meta+P"
command = "palette.command" command = "palette.command"
[[keymaps]] [[keymaps]]
@ -13,7 +13,7 @@ key = "F1"
command = "palette.command" command = "palette.command"
[[keymaps]] [[keymaps]]
key = "shift+;" key = ":"
command = "palette.command" command = "palette.command"
mode = "n" mode = "n"
@ -213,7 +213,7 @@ mode = "i"
when = "in_snippet" when = "in_snippet"
[[keymaps]] [[keymaps]]
key = "shift+g" key = "G"
command = "go_to_line_deault_last" command = "go_to_line_deault_last"
mode = "nv" mode = "nv"
@ -248,7 +248,7 @@ command = "append"
mode = "n" mode = "n"
[[keymaps]] [[keymaps]]
key = "shift+a" key = "A"
command = "append_end_of_line" command = "append_end_of_line"
mode = "n" mode = "n"
@ -318,7 +318,7 @@ command = "paste"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+j" key = "J"
command = "join_lines" command = "join_lines"
mode = "n" mode = "n"
@ -338,7 +338,7 @@ command = "delete_foreward_and_insert"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+i" key = "I"
command = "insert_first_non_blank" command = "insert_first_non_blank"
mode = "nv" mode = "nv"
@ -353,7 +353,7 @@ command = "line_start"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+4" key = "$"
command = "line_end" command = "line_end"
mode = "nv" mode = "nv"
@ -373,7 +373,7 @@ command = "word_backward"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+o" key = "O"
command = "new_line_above" command = "new_line_above"
mode = "nv" mode = "nv"
@ -418,7 +418,7 @@ command = "delete_line"
mode = "n" mode = "n"
[[keymaps]] [[keymaps]]
key = "shift+8" key = "*"
command = "search_whole_word_forward" command = "search_whole_word_forward"
mode = "nv" mode = "nv"
@ -428,32 +428,32 @@ command = "search_forward"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+n" key = "N"
command = "search_backward" command = "search_backward"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+5" key = "%"
command = "match_pairs" command = "match_pairs"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "] shift+0" key = "] )"
command = "next_unmatched_right_bracket" command = "next_unmatched_right_bracket"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "[ shift+9" key = "[ ("
command = "previous_unmatched_left_bracket" command = "previous_unmatched_left_bracket"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "] shift+]" key = "] }"
command = "next_unmatched_right_curly_bracket" command = "next_unmatched_right_curly_bracket"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "[ shift+[" key = "[ {"
command = "previous_unmatched_left_curly_bracket" command = "previous_unmatched_left_curly_bracket"
mode = "nv" mode = "nv"
@ -463,7 +463,7 @@ command = "toggle_visual_mode"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+v" key = "V"
command = "toggle_linewise_visual_mode" command = "toggle_linewise_visual_mode"
mode = "nv" mode = "nv"

View File

@ -5,7 +5,7 @@ key = "ctrl+p"
command = "palette" command = "palette"
[[keymaps]] [[keymaps]]
key = "shift+ctrl+p" key = "Ctrl+P"
command = "palette.command" command = "palette.command"
[[keymaps]] [[keymaps]]
@ -213,7 +213,7 @@ mode = "i"
when = "in_snippet" when = "in_snippet"
[[keymaps]] [[keymaps]]
key = "shift+g" key = "G"
command = "go_to_line_deault_last" command = "go_to_line_deault_last"
mode = "nv" mode = "nv"
@ -248,7 +248,7 @@ command = "append"
mode = "n" mode = "n"
[[keymaps]] [[keymaps]]
key = "shift+a" key = "A"
command = "append_end_of_line" command = "append_end_of_line"
mode = "n" mode = "n"
@ -318,7 +318,7 @@ command = "paste"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+j" key = "J"
command = "join_lines" command = "join_lines"
mode = "n" mode = "n"
@ -338,7 +338,7 @@ command = "delete_foreward_and_insert"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+i" key = "I"
command = "insert_first_non_blank" command = "insert_first_non_blank"
mode = "nv" mode = "nv"
@ -353,7 +353,7 @@ command = "line_start"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+4" key = "$"
command = "line_end" command = "line_end"
mode = "nv" mode = "nv"
@ -373,7 +373,7 @@ command = "word_backward"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+o" key = "O"
command = "new_line_above" command = "new_line_above"
mode = "nv" mode = "nv"
@ -428,32 +428,32 @@ command = "search_forward"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+n" key = "N"
command = "search_backward" command = "search_backward"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+5" key = "%"
command = "match_pairs" command = "match_pairs"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "] shift+0" key = "] )"
command = "next_unmatched_right_bracket" command = "next_unmatched_right_bracket"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "[ shift+9" key = "[ ("
command = "previous_unmatched_left_bracket" command = "previous_unmatched_left_bracket"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "] shift+]" key = "] }"
command = "next_unmatched_right_curly_bracket" command = "next_unmatched_right_curly_bracket"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "[ shift+[" key = "[ {"
command = "previous_unmatched_left_curly_bracket" command = "previous_unmatched_left_curly_bracket"
mode = "nv" mode = "nv"
@ -463,7 +463,7 @@ command = "toggle_visual_mode"
mode = "nv" mode = "nv"
[[keymaps]] [[keymaps]]
key = "shift+v" key = "V"
command = "toggle_linewise_visual_mode" command = "toggle_linewise_visual_mode"
mode = "nv" mode = "nv"