summaryrefslogtreecommitdiff
path: root/Libraries/LibLine
diff options
context:
space:
mode:
authorAnotherTest <ali.mpfard@gmail.com>2020-10-19 10:07:00 +0330
committerAndreas Kling <kling@serenityos.org>2020-10-22 23:49:51 +0200
commit691b1058851cdb16d0664a2064dc1f5eb6be7a34 (patch)
treec2fb62eee7fef2725894d4fcd357f6b912133815 /Libraries/LibLine
parent27040e65eb9485eeccaa0235753032c935a3e890 (diff)
downloadserenity-691b1058851cdb16d0664a2064dc1f5eb6be7a34.zip
LibLine: Support basic escaped characters in config file
Until we can figure out how shift+enter works (or an alternative), this can be used to input literal newlines: ```ini [keybinds] \\\n=\n ```
Diffstat (limited to 'Libraries/LibLine')
-rw-r--r--Libraries/LibLine/Editor.cpp53
1 files changed, 34 insertions, 19 deletions
diff --git a/Libraries/LibLine/Editor.cpp b/Libraries/LibLine/Editor.cpp
index bd97454e76..28f66ce718 100644
--- a/Libraries/LibLine/Editor.cpp
+++ b/Libraries/LibLine/Editor.cpp
@@ -80,27 +80,38 @@ Configuration Configuration::from_config(const StringView& libname)
GenericLexer key_lexer(binding_key);
auto has_ctrl = false;
auto alt = false;
+ auto escape = false;
Vector<Key> keys;
while (!key_lexer.is_eof()) {
- if (key_lexer.next_is("alt+")) {
- alt = key_lexer.consume_specific("alt+");
- continue;
- }
- if (key_lexer.next_is("^[")) {
- alt = key_lexer.consume_specific("^[");
- continue;
- }
- if (key_lexer.next_is("^")) {
- has_ctrl = key_lexer.consume_specific("^");
- continue;
- }
- if (key_lexer.next_is("ctrl+")) {
- has_ctrl = key_lexer.consume_specific("ctrl+");
- continue;
+ unsigned key;
+ if (escape) {
+ key = key_lexer.consume_escaped_character();
+ escape = false;
+ } else {
+ if (key_lexer.next_is("alt+")) {
+ alt = key_lexer.consume_specific("alt+");
+ continue;
+ }
+ if (key_lexer.next_is("^[")) {
+ alt = key_lexer.consume_specific("^[");
+ continue;
+ }
+ if (key_lexer.next_is("^")) {
+ has_ctrl = key_lexer.consume_specific("^");
+ continue;
+ }
+ if (key_lexer.next_is("ctrl+")) {
+ has_ctrl = key_lexer.consume_specific("ctrl+");
+ continue;
+ }
+ if (key_lexer.next_is("\\")) {
+ escape = true;
+ continue;
+ }
+ // FIXME: Support utf?
+ key = key_lexer.consume();
}
- // FIXME: Support utf?
- unsigned key = key_lexer.consume();
if (has_ctrl)
key = ctrl(key);
@@ -109,12 +120,16 @@ Configuration Configuration::from_config(const StringView& libname)
has_ctrl = false;
}
- auto value = config_file->read_entry("keybinds", binding_key);
+ GenericLexer value_lexer { config_file->read_entry("keybinds", binding_key) };
+ StringBuilder value_builder;
+ while (!value_lexer.is_eof())
+ value_builder.append(value_lexer.consume_escaped_character());
+ auto value = value_builder.string_view();
if (value.starts_with("internal:")) {
configuration.set(KeyBinding {
keys,
KeyBinding::Kind::InternalFunction,
- value.substring(9, value.length() - 9) });
+ value.substring_view(9, value.length() - 9) });
} else {
configuration.set(KeyBinding {
keys,