diff --git a/lib/mu-server.cc b/lib/mu-server.cc index 20bdc972..81cdc77c 100644 --- a/lib/mu-server.cc +++ b/lib/mu-server.cc @@ -551,19 +551,35 @@ Server::Private::contacts_handler(const Command& cmd) mu_debug("sent {} of {} contact(s)", n, store().contacts_cache().size()); } +template +std::string quoted_join(const T& items, F&& func) +{ + std::vector vec; + + std::transform(items.begin(), items.end(), std::back_inserter(vec), + [&](const auto& item) { return quote(func(item)); }); + + return join(vec, " "); +} + void Server::Private::data_handler(const Command& cmd) { const auto request_type{unwrap(cmd.symbol_arg(":kind"))}; - if (request_type == "maildirs") { - auto&& out{make_output_stream()}; - mu_print(out, "("); - for (auto&& mdir: store().maildirs()) - mu_println(out, "{}", quote(std::move(mdir))); - mu_print(out, ")"); - output(mu_format("(:maildirs {})", out.to_string())); - } else + if (request_type == "maildirs") + output(mu_format("(:maildirs ({}))", + quoted_join(store().maildirs(), + [](const auto& item) { + return item; // identity + }))); + else if (request_type == "labels") + output(mu_format("(:labels ({}))", + quoted_join(store().label_map(), + [](const auto& item) { + return item.first; + }))); + else throw Error(Error::Code::InvalidArgument, "invalid request type '{}'", request_type); } diff --git a/mu4e/mu4e-search.el b/mu4e/mu4e-search.el index 0315ce89..4c597dae 100644 --- a/mu4e/mu4e-search.el +++ b/mu4e/mu4e-search.el @@ -154,6 +154,9 @@ but also manually invoked searches." :type 'hook :group 'mu4e-search) +(defvar mu4e-labels-list nil + "Cached list of labels.") + ;; Internals ;;; History diff --git a/mu4e/mu4e-server.el b/mu4e/mu4e-server.el index 0c5ee094..db684e0e 100644 --- a/mu4e/mu4e-server.el +++ b/mu4e/mu4e-server.el @@ -130,6 +130,7 @@ Note: this REPL is not to be confused with the mu REPL as per ;; Cached data (defvar mu4e-maildir-list) +(defvar mu4e-labels-list) ;; Handlers are not strictly internal, but are not meant ;; for overriding outside mu4e. The are mainly for breaking @@ -470,6 +471,8 @@ The server output is as follows: ;; get some data ((plist-get sexp :maildirs) (setq mu4e-maildir-list (mu4e--server-plist-get sexp :maildirs))) + ((plist-get sexp :labels) + (setq mu4e-labels-list (mu4e--server-plist-get sexp :labels))) ;; receive an error ((plist-get sexp :error) @@ -654,7 +657,7 @@ get at most MAX contacts." (defun mu4e--server-data (kind) "Request data of some KIND. -KIND is a symbol. Currently supported kinds: maildirs." +KIND is a symbol. One of maildirs, labels." (mu4e--server-call-mu `(data :kind ,kind))) diff --git a/mu4e/mu4e.el b/mu4e/mu4e.el index 73a087e2..daaaa8d2 100644 --- a/mu4e/mu4e.el +++ b/mu4e/mu4e.el @@ -160,8 +160,9 @@ invoke FUNC (if available) afterwards." (add-hook 'mu4e-query-items-updated-hook #'mu4e--main-redraw) (setq mu4e--initialized t) ;; last before we call the server. (mu4e--server-ping) - ;; ask for the maildir-list + ;; ask for the maildir-list and labels (mu4e--server-data 'maildirs) + (mu4e--server-data 'labels) ;; maybe request the list of contacts, automatically refreshed after ;; re-indexing (mu4e--query-items-refresh 'reset-baseline) @@ -249,7 +250,9 @@ invoke FUNC (if available) afterwards." (unless (and (not (string= mu4e--contacts-tstamp "0")) (zerop (plist-get info :updated))) (mu4e--request-contacts-maybe) - (mu4e--server-data 'maildirs)) ;; update maildir list + (mu4e--server-data 'maildirs) + (mu4e--server-data 'labels)) ;; update maildir/labels list + (mu4e--main-redraw)))) ((plist-get info :message) (mu4e-index-message "%s" (plist-get info :message))))))