mirror of https://github.com/djcb/mu.git
mu/mu4e: implement mu4e-compose-complete-max
Allow limiting number of contacts for auto-completion to a specific number; defaulting to 2000.
This commit is contained in:
parent
ffce3dda21
commit
836bfc9062
|
@ -304,7 +304,7 @@ using ContactSet = std::set<std::reference_wrapper<const Contact>,
|
||||||
ContactLessThan>;
|
ContactLessThan>;
|
||||||
|
|
||||||
void
|
void
|
||||||
ContactsCache::for_each(const EachContactFunc& each_contact) const
|
ContactsCache::for_each(const EachContactFunc& each_contact, size_t max_num) const
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> l_{priv_->mtx_};
|
std::lock_guard<std::mutex> l_{priv_->mtx_};
|
||||||
|
|
||||||
|
@ -316,8 +316,13 @@ ContactsCache::for_each(const EachContactFunc& each_contact) const
|
||||||
for (const auto& item : priv_->contacts_)
|
for (const auto& item : priv_->contacts_)
|
||||||
sorted.emplace(item.second);
|
sorted.emplace(item.second);
|
||||||
|
|
||||||
for (const auto& ci : sorted)
|
// sadly, there's no set::resize
|
||||||
|
size_t n{};
|
||||||
|
for (const auto& ci : sorted) {
|
||||||
|
if (max_num > 0 && n++ >= max_num)
|
||||||
|
break;
|
||||||
each_contact(ci);
|
each_contact(ci);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -142,9 +142,10 @@ public:
|
||||||
/**
|
/**
|
||||||
* Invoke some callable for each contact, in order of rank.
|
* Invoke some callable for each contact, in order of rank.
|
||||||
*
|
*
|
||||||
* @param each_contact
|
* @param each_contact function invoked for each contact
|
||||||
|
* @param max_num stop after at most so many contacts, or 0 for no limit
|
||||||
*/
|
*/
|
||||||
void for_each(const EachContactFunc& each_contact) const;
|
void for_each(const EachContactFunc& each_contact, size_t max_num=0) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Private;
|
struct Private;
|
||||||
|
|
|
@ -228,7 +228,8 @@ Server::Private::make_command_map()
|
||||||
ArgMap{{":personal", ArgInfo{Type::Symbol, false, "only personal contacts"}},
|
ArgMap{{":personal", ArgInfo{Type::Symbol, false, "only personal contacts"}},
|
||||||
{":after",
|
{":after",
|
||||||
ArgInfo{Type::String, false, "only contacts seen after time_t string"}},
|
ArgInfo{Type::String, false, "only contacts seen after time_t string"}},
|
||||||
{":tstamp", ArgInfo{Type::String, false, "return changes since tstamp"}}},
|
{":tstamp", ArgInfo{Type::String, false, "return changes since tstamp"}},
|
||||||
|
{":maxnum", ArgInfo{Type::Number, false, "max number of contacts to return"}}},
|
||||||
"get contact information",
|
"get contact information",
|
||||||
[&](const auto& params) { contacts_handler(params); }});
|
[&](const auto& params) { contacts_handler(params); }});
|
||||||
cmap.emplace(
|
cmap.emplace(
|
||||||
|
|
|
@ -56,6 +56,17 @@ time-based restriction."
|
||||||
:type 'string
|
:type 'string
|
||||||
:group 'mu4e-compose)
|
:group 'mu4e-compose)
|
||||||
|
|
||||||
|
(defcustom mu4e-compose-complete-max 2000
|
||||||
|
"Consider only the top-n contacts.
|
||||||
|
After considering the other
|
||||||
|
constraints (`mu4e-compose-complete-addresses' and
|
||||||
|
`mu4e-compose-complete-only-after'), pick only the highest-ranked n.
|
||||||
|
|
||||||
|
This reduce start-up time and memory usage. Set to nil for no
|
||||||
|
limits."
|
||||||
|
:type 'string
|
||||||
|
:group 'mu4e-compose)
|
||||||
|
|
||||||
;; names and mail-addresses can be mapped onto their canonical
|
;; names and mail-addresses can be mapped onto their canonical
|
||||||
;; counterpart. use the customizeable function
|
;; counterpart. use the customizeable function
|
||||||
;; mu4e-canonical-contact-function to do that. below the identity
|
;; mu4e-canonical-contact-function to do that. below the identity
|
||||||
|
@ -293,6 +304,7 @@ nothing."
|
||||||
(mu4e--server-contacts
|
(mu4e--server-contacts
|
||||||
mu4e-compose-complete-only-personal
|
mu4e-compose-complete-only-personal
|
||||||
mu4e-compose-complete-only-after
|
mu4e-compose-complete-only-after
|
||||||
|
mu4e-compose-complete-max
|
||||||
mu4e--contacts-tstamp)))
|
mu4e--contacts-tstamp)))
|
||||||
|
|
||||||
(provide 'mu4e-contacts)
|
(provide 'mu4e-contacts)
|
||||||
|
|
|
@ -441,17 +441,21 @@ The result is delivered to the function registered as
|
||||||
:decrypt ,(and decrypt t)
|
:decrypt ,(and decrypt t)
|
||||||
:docid ,docid)))
|
:docid ,docid)))
|
||||||
|
|
||||||
(defun mu4e--server-contacts (personal after tstamp)
|
(defun mu4e--server-contacts (personal after maxnum tstamp)
|
||||||
"Ask for contacts with PERSONAL AFTER TSTAMP.
|
"Ask for contacts with PERSONAL AFTER MAXNUM TSTAMP.
|
||||||
S-expression (:contacts (<list>) :tstamp \"<tstamp>\") is expected in
|
|
||||||
response. If PERSONAL is non-nil, only get personal contacts, if
|
S-expression (:contacts (<list>) :tstamp \"<tstamp>\")
|
||||||
AFTER is non-nil, get only contacts seen AFTER (the time_t
|
is expected in response.
|
||||||
value)."
|
|
||||||
|
If PERSONAL is non-nil, only get personal contacts, if AFTER is
|
||||||
|
non-nil, get only contacts seen AFTER (the time_t value). If MAX is non-nil,
|
||||||
|
get at most MAX contacts."
|
||||||
(mu4e--server-call-mu
|
(mu4e--server-call-mu
|
||||||
`(contacts
|
`(contacts
|
||||||
:personal ,(and personal t)
|
:personal ,(and personal t)
|
||||||
:after ,(or after nil)
|
:after ,(or after nil)
|
||||||
:tstamp ,(or tstamp nil))))
|
:tstamp ,(or tstamp nil)
|
||||||
|
:maxnum ,(or maxnum nil))))
|
||||||
|
|
||||||
(defun mu4e--server-find (query threads sortfield sortdir maxnum skip-dups
|
(defun mu4e--server-find (query threads sortfield sortdir maxnum skip-dups
|
||||||
include-related)
|
include-related)
|
||||||
|
|
Loading…
Reference in New Issue