POE(1) General Commands Manual POE(1)

poe.po file editor

poe -h | --help | -V | --full-version | -v | --version

poe [-B | --no-backup] [-b | --backup] [-L | --dont-break-literals] [-W | --no-wrap] [-w cols | --wrap-width=cols] filename.po

poe is a .po (GNU gettext) file editor with a terminal UI.

, --no-backup
Disables backups. This option overrides the setting in config.h.
, --backup
Enables backups. This option overrides the setting in config.h.
, --help
Show option summary.
, --dont-break-literals
Don't break long literals into an empty string and a literal on a separate line. By default (unless changed in config.h), if the length of the text
msgid "

(or msgid_plural, msgstr, etc) plus the length of the literal, plus one (for the closing quote) is greater than literal_break_threshold, a line of the form

msgid "Some really long literal string"

will be broken into two lines:

msgid ""
"Some really long literal string"

This option prevents that. It overrides the setting in config.h.

, --full-version
Show full version information: like -v, followed by copyright notice and the state of options.
, --version
Show version information: program version and source git repository commit date.
, --no-wrap
Sets wrap_width to 0, effectively turning off wrapping of msgids, msgid_plurals, msgstrs and msgstr[nn]s on save.
cols, --wrap-width=cols
Sets wrap_width to the specified value. If cols is negative, it will be set to zero, effectively turning off wrapping on save.

Main window key bindings are as follows:

Esc Close dialog or clear error
Enter Edit entry
H or F1 Show help dialog
/ or F7 Incremental search (end input with Enter)
n or F3 Find next
N or F4 Find previous
u or F8 Go to next untranslated entry
f or F9 Go to next fuzzy entry
w or C-S Save file (with backup)
g or Home Go to first entry
C-B or PgUp Go to previous page
k or Up Go to previous entry
j or Down Go to next entry
C-F or PgDn Go to next page
G or End Go to last entry
z or C-Z Toggle fuzzy flag
q or C-Q Quit

Edit dialog key bindings are as follows:

C-S Update entry and close dialog
C-B or PgUp Update entry and edit previous entry
C-F or PgDn Update entry and edit next entry
C-P Show previous plural form of msgstr
C-N Show next plural form of msgstr
Escape Cancel changes and close dialog
C-C Yank (copy) current msgstr to paste buffer
C-V Paste the contents of paste buffer into current msgstr
F8 Go to next untranslated entry
F9 Go to next fuzzy entry
F5 Copy msgid to edit box as current msgstr
F6 Toggle focus between info box and edit box
C-Z Toggle fuzzy flag
C-A or Home Go to start of line
C-E or End Go to end of line
C-U Erase to start of line
C-K Erase to end of line
C-R Go to previous word
C-T Go to next word
C-W Erase previous word
Up Go to previous line
Left Go to previous character
Right Go to next character
Down Go to next line

In the table above, “current msgstr” refers to the situation when there are multiple msgstrs, representing different plural forms. Only the currently shown plural form is affected.

When the info box is focused, arrow keys, C-B/C-F (PgUp/PgDn) and C-A/C-E (Home/End) keys scroll the info box.

When the search box is open, relevant text editing and movement commands from the edit box also apply. For example, C-R moves one word backwards, and C-W deletes one word backwards.

Status line is comprised of a number of segments, by default three. The central segment displays the current message number, the total messages count, then in parentheses: number of untranslated messages, number of fuzzy messages and the number of obsolete messages. Obsolete messages are messages whose msgid doesn't match any msgid in the message catalog anymore, and are commented out in the .po file using the #~ comments.

Message flags are shown to the left of the msgid in the main window and the statusbar of the edit box. They mean the following:

C c-format flag
F fuzzy flag
P Message has plural forms
N no-c-format flag

poe has some rudimentary checks of the translated messages built in. First, when saving changes in the edit box, if the msgid has a newline character (\n), a dot (.) or a space ( ) at the end, and the corresponding msgstr doesn't, msgstr being saved will have its ending character made to match the one from the msgid. This feature can be disabled by setting the match_msgstr_ending configuration variable to 0.

Second, if the numbers of newline characters (\n), or, additionally, dots when warn_count_dots is set, in msgid and msgstr don't match, msgstr will be shown in a different color on the main screen. If the number of newlines was intended, you can simply ignore this warning. Otherwise, it can be useful to detect unwanted discrepancies in formatting between the original message and the translation.

The poe utility exits 0 on success, and >0 if an error occurs.

For errors caused by the unsuccessful calls to libc functions setting errno, that value is returned as the exit status. Otherwise, the exit status is one of the following:

No filename was given on the command line.
Command line option is missing a required argument.
Command line argument is invalid/unsupported.
File is not a valid PO (Portable Object) file.
File is not a regular file.
There has been a termbox error.
Syntax error.
PO file doesn't have Plural-Forms: in the first msgid.
The nplurals field in the first msgstr does not contain a valid integer.

Most error messages output by poe are in the format

poe: msg

In the case of a syntax error, output is in the format:

poe: filename:lineno:colno: msg

where filename is the name of the input file, lineno and colno are the line and column numbers in the input file where the error occured.

When the error is caused by an error in the libc function which sets errno, poe calls perror(3) prior to outputting an error message in the above format.

Strahinya Radich <sr@strahinja.org>, 2021-2026

Bugs can be reported using the ticket tracker at: https://todo.sr.ht/~strahinja/poe

  • UTF-8 character set is assumed.
  • RTL scripts are unsupported/problematic. CJK scripts should work better after v2.0, which introduced the use of wcwidth(3).
  • Only one file can be edited at a time, and no additional files can be loaded at runtime. This is a design decision.
  • Unless the variable create_backups is set to 0 before compilation, or the parameter -B is used when invoking poe, the directory of the edited file must be writable by the user in order to write the changes to the file. This is due to creating backups in order to avoid the potential data loss under specific circumstances (loss of power during write).
  • Only the flags fuzzy, c-format and no-c-format are supported. Other flags will be stripped on save. This is a design decision.
OpenBSD 7.8 February 21, 2026 POE(1)