diff -ru a/data/geany.css b/data/geany.css --- a/data/geany.css 2019-01-04 18:26:23.000000000 +0300 +++ b/data/geany.css 2019-02-23 01:38:02.717031701 +0300 @@ -51,3 +51,7 @@ #geany-terminal-dirty { color: #ff0000; } + +statusbar { + font-family: monospace; +} diff -ru a/src/ui_utils.c b/src/ui_utils.c --- a/src/ui_utils.c 2019-01-04 18:26:24.000000000 +0300 +++ b/src/ui_utils.c 2019-02-23 01:36:08.605956489 +0300 @@ -193,7 +193,6 @@ const gchar *cur_tag; const gchar *fmt; const gchar *expos; /* % expansion position */ - const gchar sp[] = " "; GString *stats_str; ScintillaObject *sci = doc->editor->sci; @@ -208,24 +207,27 @@ { /* append leading text before % char */ g_string_append_len(stats_str, fmt, expos - fmt); - - switch (*++expos) + ++expos; /* skip % */ + /* parse integer number, if any */ + long l = strtol( expos, (char**)&expos, 10 ); + int w = l > 100 ? 100 : l < -100 ? -100 : l; /* l may be too large, clip it */ + switch (*expos) { case 'l': - g_string_append_printf(stats_str, "%d", line + 1); + g_string_append_printf(stats_str, "%*d", w, line + 1); break; case 'L': - g_string_append_printf(stats_str, "%d", + g_string_append_printf(stats_str, "%*d", w, sci_get_line_count(doc->editor->sci)); break; case 'c': - g_string_append_printf(stats_str, "%d", vcol); + g_string_append_printf(stats_str, "%*d", w, vcol); break; case 'C': - g_string_append_printf(stats_str, "%d", vcol + 1); + g_string_append_printf(stats_str, "%*d", w, vcol + 1); break; case 'p': - g_string_append_printf(stats_str, "%u", pos); + g_string_append_printf(stats_str, "%*u", w, pos); break; case 's': { @@ -235,74 +237,72 @@ sci_get_selection_start(sci)) != 0 || sci_get_col_from_position(sci, sci_get_selection_end(sci)) != 0) - g_string_append_printf(stats_str, "%d", len); + g_string_append_printf(stats_str, "%*d ", w, len); else /* L = lines */ - g_string_append_printf(stats_str, _("%dL"), + g_string_append_printf(stats_str, _("%*dL"), w, sci_get_lines_selected(doc->editor->sci) - 1); break; } case 'n' : - g_string_append_printf(stats_str, "%d", + g_string_append_printf(stats_str, "%*d", w, sci_get_selected_text_length(doc->editor->sci) - 1); break; case 'w': /* RO = read-only */ - g_string_append(stats_str, (doc->readonly) ? _("RO ") : + g_string_append_printf(stats_str, "%*s", w, (doc->readonly) ? _("RO ") : /* OVR = overwrite/overtype, INS = insert */ (sci_get_overtype(doc->editor->sci) ? _("OVR") : _("INS"))); break; case 'r': - if (doc->readonly) - { - g_string_append(stats_str, _("RO ")); /* RO = read-only */ - g_string_append(stats_str, sp + 1); - } + g_string_append_printf(stats_str, "%*s", w, doc->readonly ? _("RO ") : ""); /* RO = read-only */ break; case 't': { switch (editor_get_indent_prefs(doc->editor)->type) { case GEANY_INDENT_TYPE_TABS: - g_string_append(stats_str, _("TAB")); + g_string_append_printf(stats_str, "%*s", w, _("TAB")); break; case GEANY_INDENT_TYPE_SPACES: /* SP = space */ - g_string_append(stats_str, _("SP")); + g_string_append_printf(stats_str, "%*s", w, _("SP")); break; case GEANY_INDENT_TYPE_BOTH: /* T/S = tabs and spaces */ - g_string_append(stats_str, _("T/S")); + g_string_append_printf(stats_str, "%*s", w, _("T/S")); break; } break; } case 'm': - if (doc->changed) - { - g_string_append(stats_str, _("MOD")); /* MOD = modified */ - g_string_append(stats_str, sp); - } + g_string_append_printf(stats_str, "%*s", w, doc->changed ? _("MOD") : ""); /* MOD = modified */ break; case 'M': - g_string_append(stats_str, utils_get_eol_short_name(sci_get_eol_mode(doc->editor->sci))); + g_string_append_printf(stats_str, "%*s", w, utils_get_eol_short_name(sci_get_eol_mode(doc->editor->sci))); break; case 'e': - g_string_append(stats_str, + { + /* The longest encoding is "GEORGIAN_ACADEMY" — 16 characters. Let's reserve a bit + more memory just in case. */ + GString * encoding = g_string_sized_new(32); + g_string_append(encoding, doc->encoding ? doc->encoding : _("unknown")); if (encodings_is_unicode_charset(doc->encoding) && (doc->has_bom)) { g_string_append_c(stats_str, ' '); g_string_append(stats_str, _("(with BOM)")); /* BOM = byte order mark */ } + g_string_append_printf(stats_str, "%*s", w, encoding->str); + g_string_free(encoding, TRUE); break; + } case 'f': - g_string_append(stats_str, filetypes_get_display_name(doc->file_type)); + g_string_append_printf(stats_str, "%*s", w, filetypes_get_display_name(doc->file_type)); break; case 'S': symbols_get_current_scope(doc, &cur_tag); - g_string_append(stats_str, cur_tag); + g_string_append_printf(stats_str, "%*s", w, cur_tag); break; case 'Y': - g_string_append_c(stats_str, ' '); - g_string_append_printf(stats_str, "%d", + g_string_append_printf(stats_str, "%*d", w, sci_get_style_at(doc->editor->sci, pos)); break; default: