on master help sign in
More responsive key input

Use biased select!, don't eagerly process lsp message since we want to prioritize user input rather than lsp messages, but still limit rendering for lsp messages.

commita0a5bd555b47cbc9fbbd73f680eef62ae3dcb511 authorIvan Tham <pickfire@riseup.net> dateSun 4 Jul 2021, 00:19 (5 years ago) parent47a6882
1 file changed+11−12
helix-term/src/application.rs+11−12
helix-term/src/application.rs+11−12
@@ -9,6 +9,7 @@ use log::error;
99use std::{
1010 io::{stdout, Write},
1111 sync::Arc,
12+ time::{Duration, Instant},
1213};
1314
1415use anyhow::Error;
@@ -130,6 +131,8 @@ impl Application {
130131
131132 pub async fn event_loop(&mut self) {
132133 let mut reader = EventStream::new();
134+ let mut last_render = Instant::now();
135+ let deadline = Duration::from_secs(1) / 60;
133136
134137 self.render();
135138
@@ -139,26 +142,22 @@ impl Application {
139142 break;
140143 }
141144
142− use futures_util::{FutureExt, StreamExt};
145+ use futures_util::StreamExt;
143146
144147 tokio::select! {
148+ biased;
149+
145150 event = reader.next() => {
146151 self.handle_terminal_events(event)
147152 }
148153 Some((id, call)) = self.editor.language_servers.incoming.next() => {
149154 self.handle_language_server_message(call, id).await;
150−
151− // eagerly process any other available notifications/calls
152− let now = std::time::Instant::now();
153− let deadline = std::time::Duration::from_millis(10);
154− while let Some(Some((id, call))) = self.editor.language_servers.incoming.next().now_or_never() {
155− self.handle_language_server_message(call, id).await;
156−
157− if now.elapsed() > deadline { // use a deadline so we don't block too long
158− break;
159− }
155+ // limit render calls for fast language server messages
156+ let last = self.editor.language_servers.incoming.is_empty();
157+ if last || last_render.elapsed() > deadline {
158+ self.render();
159+ last_render = Instant::now();
160160 }
161− self.render();
162161 }
163162 Some(callback) = self.jobs.futures.next() => {
164163 self.jobs.handle_callback(&mut self.editor, &mut self.compositor, callback);