@@ -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);