From 591d2b6167af53ce07b060711a4074f1e19c5f3f Mon Sep 17 00:00:00 2001 From: Akshay Date: Sat, 8 May 2021 21:25:47 +0530 Subject: add basic user-definable keybinds --- src/lisp/eval.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/lisp/eval.rs') diff --git a/src/lisp/eval.rs b/src/lisp/eval.rs index 75cb5c9..677fa23 100644 --- a/src/lisp/eval.rs +++ b/src/lisp/eval.rs @@ -1,5 +1,6 @@ use crate::{ app::AppState, + keybind::Keybind, lisp::{ error::{EvalError, LispError}, expr::{Arity, Ident, LispExpr, LispFunction}, @@ -8,7 +9,7 @@ use crate::{ type_match, }; -use std::convert::TryInto; +use std::{convert::TryInto, str::FromStr}; use log::{error, info}; @@ -44,6 +45,7 @@ where "for" => self.eval_for(&li[1..]), "quote" => Ok(apply_quote(&li[1])), "let" => self.eval_let(&li[1..]), + "bind-key" => self.eval_bind_key(&li[1..]), _ => { let mut new_ls = vec![self.eval(&func_expr)?]; new_ls.extend(li[1..].to_vec()); @@ -302,6 +304,22 @@ where } } } + + pub fn eval_bind_key(&mut self, args: &[LispExpr]) -> Result { + let arity = Arity::Exact(2); + if !arity.check(args) { + Err(arity.to_error()) + } else { + match args { + [LispExpr::StringLit(s), body] => { + let bind = Keybind::from_str(&s).map_err(EvalError::KeybindError)?; + self.app.keybinds.insert(bind, body.clone()); + Ok(LispExpr::Unit) + } + _ => Err(EvalError::BadForm.into()), + } + } + } } pub fn apply_quote(arg: &LispExpr) -> LispExpr { -- cgit v1.2.3