feat: Add /spellcheck list command

To list all available dictionaries.

Signed-off-by: Michael Vetter <jubalh@iodoru.org>
This commit is contained in:
Michael Vetter
2026-03-26 23:08:58 +01:00
parent 4922366366
commit ed2fdf88ac
5 changed files with 51 additions and 0 deletions

View File

@@ -568,6 +568,7 @@ cmd_ac_init(void)
autocomplete_add(spellcheck_ac, "on");
autocomplete_add(spellcheck_ac, "off");
autocomplete_add(spellcheck_ac, "list");
autocomplete_add(spellcheck_ac, "lang");
autocomplete_add(disco_ac, "info");

View File

@@ -1458,6 +1458,7 @@ static const struct cmd_t command_defs[] = {
CMD_TAG_UI)
CMD_SYN(
"/spellcheck on|off",
"/spellcheck list",
"/spellcheck lang <locale>")
CMD_DESC(
"Enable or disable spellchecking, or set the language.")

View File

@@ -6571,6 +6571,24 @@ cmd_spellcheck(ProfWin* window, const char* const command, gchar** args)
} else if (g_strcmp0(args[0], "off") == 0) {
prefs_set_boolean(PREF_SPELLCHECK_ENABLE, FALSE);
cons_show("Spellcheck disabled.");
} else if (g_strcmp0(args[0], "list") == 0) {
GList* langs = spellcheck_get_available_langs();
if (langs == NULL) {
cons_show("No dictionaries found. Install Enchant-compatible dictionaries (hunspell/aspell).");
} else {
GString* lang_str = g_string_new("");
GList* curr = langs;
while (curr) {
g_string_append(lang_str, (char*)curr->data);
if (curr->next) {
g_string_append(lang_str, ", ");
}
curr = g_list_next(curr);
}
cons_show("Available spellcheck dictionaries: %s", lang_str->str);
g_string_free(lang_str, TRUE);
g_list_free_full(langs, g_free);
}
} else if (g_strcmp0(args[0], "lang") == 0) {
if (args[1] == NULL) {
cons_bad_cmd_usage(command);

View File

@@ -93,6 +93,31 @@ spellcheck_get_lang(void)
return current_lang;
}
static void
_list_dicts_cb(const char* const lang_tag,
const char* const provider_name,
const char* const provider_desc,
const char* const provider_file,
void* user_data)
{
GList** list = (GList**)user_data;
if (g_list_find_custom(*list, lang_tag, (GCompareFunc)g_strcmp0) == NULL) {
*list = g_list_append(*list, g_strdup(lang_tag));
}
}
GList*
spellcheck_get_available_langs(void)
{
if (!broker) {
return NULL;
}
GList* list = NULL;
enchant_broker_list_dicts(broker, _list_dicts_cb, &list);
return g_list_sort(list, (GCompareFunc)g_strcmp0);
}
gboolean
spellcheck_is_misspelled(const char* word)
{

View File

@@ -20,6 +20,7 @@ void spellcheck_deinit(void);
gboolean spellcheck_is_misspelled(const char* word);
gboolean spellcheck_set_lang(const char* lang);
const char* spellcheck_get_lang(void);
GList* spellcheck_get_available_langs(void);
#else
@@ -46,6 +47,11 @@ spellcheck_get_lang(void)
{
return NULL;
}
static inline GList*
spellcheck_get_available_langs(void)
{
return NULL;
}
#endif