чување 270f884152a572d74dc24709a68c5278e296ef3d
родитељ ee87d9d97269086554ccd990cb1a5b645ea1d267
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Tue, 6 Jul 2021 21:22:57 +0200
WIP search support; TODO: revise u32_draw_string wrt tabs
Signed-off-by: Страхиња Радић <contact@strahinja.org>
Diffstat:
| M | config.def.h | | | 4 | ++++ |
| M | config.h | | | 4 | ++++ |
| M | draw.c | | | 111 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------ |
| M | draw.h | | | 9 | +++++++++ |
| M | po.h | | | 8 | ++++---- |
| M | poe.1.in | | | 2 | +- |
| M | poe.c | | | 459 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------- |
| M | test/sr.po | | | 365 | ++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- |
измењених датотека: 8, додавања: 710(+), брисања: 252(-)
diff --git a/config.def.h b/config.def.h
@@ -39,6 +39,10 @@
#define MSGSTR_BG TB_DEFAULT
#define PROMPT_FG TB_YELLOW | TB_BOLD
#define PROMPT_BG TB_MAGENTA
+#define SEARCH_FG TB_BLACK
+#define SEARCH_BG TB_WHITE
+#define SEARCH_EDIT_FG TB_WHITE | TB_BOLD
+#define SEARCH_EDIT_BG TB_BLACK
#define SHADOW_FG TB_BLACK
#define SHADOW_BG TB_BLACK | TB_BOLD
#define TITLE_FG TB_BLACK
diff --git a/config.h b/config.h
@@ -39,6 +39,10 @@
#define MSGSTR_BG TB_DEFAULT
#define PROMPT_FG TB_YELLOW | TB_BOLD
#define PROMPT_BG TB_MAGENTA
+#define SEARCH_FG TB_BLACK
+#define SEARCH_BG TB_WHITE
+#define SEARCH_EDIT_FG TB_WHITE | TB_BOLD
+#define SEARCH_EDIT_BG TB_BLACK
#define SHADOW_FG TB_BLACK
#define SHADOW_BG TB_BLACK | TB_BOLD
#define TITLE_FG TB_BLACK
diff --git a/draw.c b/draw.c
@@ -82,32 +82,36 @@ void
init_drawstate(struct DrawState* state, char* error, char* filename,
char* prompt)
{
- state->error = error;
- state->filename = filename;
- state->input_buffer = NULL;
- state->input_column = 0;
- state->input_first_shown_column = 0;
- state->input_first_shown_row = 0;
- state->input_rows_count = 0;
- state->input_display_column = 0;
- state->saved_column = -1;
- state->info_buffer = NULL;
- state->info_first_shown_column = 0;
- state->info_first_shown_row = 0;
- state->info_rows_count = 0;
- state->prompt = prompt;
- state->prompt_callback = NULL;
- state->running = 1;
- state->dirty = 0;
- state->in_prompt = 0;
- state->show_help = 0;
- state->show_edit = 0;
- state->edit_info_focused = 0;
- state->msgid_number = state->msgid_count > 0 ? 1 : 0;
- state->fuzzy_count = 0;
- state->untranslated_count = 0;
- state->msgstr_index = 0;
- state->first_shown_msgid = state->msgid_number;
+ state->error = error;
+ state->filename = filename;
+ state->search = NULL;
+ state->input_buffer = NULL;
+ state->input_column = 0;
+ state->input_first_shown_column = 0;
+ state->input_first_shown_row = 0;
+ state->input_rows_count = 0;
+ state->input_display_column = 0;
+ state->saved_column = -1;
+ state->info_buffer = NULL;
+ state->info_first_shown_column = 0;
+ state->info_first_shown_row = 0;
+ state->info_rows_count = 0;
+ state->search_input_column = 0;
+ state->search_input_first_shown_column = 0;
+ state->search_input_display_column = 0;
+ state->prompt = prompt;
+ state->prompt_callback = NULL;
+ state->running = 1;
+ state->dirty = 0;
+ state->in_prompt = 0;
+ state->show_help = 0;
+ state->show_edit = 0;
+ state->edit_info_focused = 0;
+ state->msgid_number = state->msgid_count > 0 ? 1 : 0;
+ state->fuzzy_count = 0;
+ state->untranslated_count = 0;
+ state->msgstr_index = 0;
+ state->first_shown_msgid = state->msgid_number;
}
void
@@ -117,6 +121,9 @@ free_drawstate(struct DrawState* state)
struct PoEntry* current_entry = NULL;
size_t i = 0;
+ if (state->search)
+ free(state->search);
+
if (state->input_buffer)
{
for (i = 0; i < state->input_rows_count; i++)
@@ -282,15 +289,17 @@ u32_draw_string(const int x, const int y, const uint16_t fg, const uint16_t bg,
{
if (*ps == '\t')
{
- for (int i = 0; i < TAB_SIZE - (col % TAB_SIZE); i++)
- tb_change_cell(x+col+i+padding_left, y, ' ',
+ int i = 0;
+ for (i = 0; i < TAB_SIZE - (col % TAB_SIZE)
+ && col+i < max_cols-padding_right; i++)
+ tb_change_cell(x+padding_left+col+i, y, ' ',
fg, bg);
- col += TAB_SIZE - (col % TAB_SIZE);
+ col += i;
ps++;
}
else
{
- tb_change_cell(x+col+padding_left, y, *ps, fg, bg);
+ tb_change_cell(x+padding_left+col, y, *ps, fg, bg);
ps++;
col++;
}
@@ -380,7 +389,7 @@ draw_editbox(const struct DrawState* state)
curline->bg == 0 ? bg : curline->bg,
curline->text +
state->info_first_shown_column,
- w-3, w-3, 1, 1, LEFT);
+ w-2, w-2, 1, 1, LEFT);
}
if (state->info_first_shown_row > 0)
@@ -407,15 +416,15 @@ draw_editbox(const struct DrawState* state)
u32_draw_string(startx+1, endy-h/2-1+i,
fg, bg, curline->text +
state->input_first_shown_column,
- w-3, w-3, 1, 1, LEFT);
+ w-2, w-2, 1, 1, LEFT);
}
if (state->edit_info_focused)
tb_set_cursor(TB_HIDE_CURSOR, TB_HIDE_CURSOR);
else
tb_set_cursor(startx+2+state->input_display_column -
- state->input_first_shown_column, endy-h/2-1 +
- state->input_row -
+ state->input_first_shown_column,
+ endy-h/2-1 + state->input_row -
state->input_first_shown_row);
char sbuf[MAXBUFLINE];
@@ -446,6 +455,36 @@ draw_editbox(const struct DrawState* state)
}
const struct DrawState*
+draw_search(const struct DrawState* state)
+{
+ int startx, endx, starty, endy;
+ int w = SEARCH_WIDTH;
+ int h = SEARCH_HEIGHT;
+ int maxx = state->maxx;
+ int maxy = state->maxy;
+ size_t len = u32_strlen(state->search);
+
+ startx = w > maxx ? 0 : (maxx - w) / 2;
+ endx = w > maxx ? maxx-1 : maxx-startx;
+
+ starty = maxy-1-h;
+ endy = maxy-1;
+
+ draw_box(startx, endx, starty, endy, SEARCH_FG, SEARCH_BG);
+ draw_rect(startx+1, endx-1, starty+1, endy-2, SEARCH_EDIT_FG,
+ SEARCH_EDIT_BG);
+ if (len > state->search_input_first_shown_column)
+ u32_draw_string(startx+1, starty+1,
+ SEARCH_EDIT_FG, SEARCH_EDIT_BG, state->search +
+ state->search_input_first_shown_column,
+ w-3, w-3, 0, 0, LEFT);
+ tb_set_cursor(startx+1+state->search_input_display_column -
+ state->search_input_first_shown_column,
+ starty+1);
+ return state;
+}
+
+const struct DrawState*
draw_status(const struct DrawState* state)
{
if (!state)
@@ -579,6 +618,10 @@ draw(const struct DrawState* state)
if (!draw_editbox(state))
return NULL;
+ if (state->show_search)
+ if (!draw_search(state))
+ return NULL;
+
if (!draw_status(state))
return NULL;
diff --git a/draw.h b/draw.h
@@ -14,7 +14,10 @@
#define EDIT_HEIGHT 20
#define HELP_WIDTH 50
#define HELP_HEIGHT 21
+#define SEARCH_WIDTH 15
+#define SEARCH_HEIGHT 4
#define TAB_SIZE 8
+#define MAXSEARCH (255+1)
typedef enum {
LEFT,
@@ -33,6 +36,7 @@ struct DrawState {
char* error;
char* prompt;
char* filename;
+ uint32_t* search;
struct BufferLine* input_buffer; /* edit box */
int input_column;
int input_row;
@@ -47,6 +51,9 @@ struct DrawState {
int info_first_shown_row;
int info_rows_count;
int info_rows_maxlen;
+ int search_input_column;
+ int search_input_first_shown_column;
+ int search_input_display_column;
struct PoEntry* entries;
void (*prompt_callback)(struct DrawState*, struct tb_event*);
int running;
@@ -56,6 +63,7 @@ struct DrawState {
int show_help;
int show_edit;
int edit_info_focused;
+ int show_search;
int maxx;
int maxy;
size_t msgid_number;
@@ -97,6 +105,7 @@ void u32_draw_string(const int x, const int y, const uint16_t fg, const uint16_t
const Alignment align);
const struct DrawState* draw_help(const struct DrawState* state);
const struct DrawState* draw_editbox(const struct DrawState* state);
+const struct DrawState* draw_search(const struct DrawState* state);
const struct DrawState* draw_status(const struct DrawState* state);
const struct DrawState* draw_list_visible(const struct DrawState* state);
const struct DrawState* draw(const struct DrawState* state);
diff --git a/po.h b/po.h
@@ -3,10 +3,10 @@
#include <stdint.h>
#include <stdlib.h>
-#define MSGSTR_MAX 4096
-#define MAXCOMMENTLINE 512
-#define ALLOC_DELTA 10
-#define PO_DETECTION_LINES 24
+#define MSGSTR_MAX 4096
+#define MAXCOMMENTLINE 512
+#define ALLOC_DELTA 10
+#define PO_DETECTION_LINES 24
#define LOAD_PARSE_ERR(e) (LOAD_ERR_PARSE_PREFIX + (e))
diff --git a/poe.1.in b/poe.1.in
@@ -151,7 +151,7 @@ _
.SH "KNOWN LIMITATIONS"
.
.IP \(bu 4
-This project is currently (Jun 2021) still a work in progress.
+This project is currently (July 2021) still a work in progress.
.
.IP \(bu
CJK characters are unsupported/problematic. This is a limitation of termbox
diff --git a/poe.c b/poe.c
@@ -33,6 +33,18 @@ struct BufferLine* load_info(struct DrawState* state);
struct BufferLine* load_msgstr(struct DrawState* state);
void save_msgstr(struct DrawState* state);
void cancel_msgstr(struct DrawState* state);
+void show_search(struct DrawState* state);
+void hide_search(struct DrawState* state);
+void cancel_search(struct DrawState* state);
+void move_search_start(struct DrawState* state);
+void move_search_left(struct DrawState* state);
+void move_search_right(struct DrawState* state);
+void move_search_end(struct DrawState* state);
+void insert_search_char(struct DrawState* state, uint32_t ch);
+void erase_search_backwards(struct DrawState* state);
+void erase_search_forward(struct DrawState* state);
+void erase_search_to_start(struct DrawState* state);
+void erase_search_to_end(struct DrawState* state);
void next_untranslated(struct DrawState* state);
void next_fuzzy(struct DrawState* state);
void move_up(struct DrawState* state);
@@ -50,15 +62,20 @@ void move_list_page_down(struct DrawState* state);
void next_plural(struct DrawState* state);
void prev_plural(struct DrawState* state);
void toggle_fuzzy(struct DrawState* state);
-size_t display_length(const struct DrawState* state, const size_t max_index);
-size_t input_length(const struct DrawState* state, const size_t max_index);
+size_t display_length(const struct DrawState* state, uint32_t* buffer,
+ const size_t max_index);
+size_t input_length(const struct DrawState* state, uint32_t* buffer,
+ const size_t max_index);
void insert_char(struct DrawState* state, uint32_t ch);
+void erase_backwards(struct DrawState* state);
+void erase_forward(struct DrawState* state);
void erase_to_start(struct DrawState* state);
void erase_to_end(struct DrawState* state);
struct DrawState* insert_line(struct DrawState* state);
struct DrawState* join_lines(struct DrawState* state, size_t first_line);
void handle_editbox_key_event(struct tb_event* ev, struct DrawState* state);
void handle_key_event(struct tb_event* ev, struct DrawState* state);
+void handle_search_key_event(struct tb_event* ev, struct DrawState* state);
int
print_error(const int code, const char* msg, ...)
@@ -435,11 +452,198 @@ cancel_msgstr(struct DrawState* state)
}
void
+show_search(struct DrawState* state)
+{
+ state->show_search = 1;
+ state->search_input_column = 0;
+ state->search_input_display_column = 0;
+ state->search_input_first_shown_column = 0;
+ if (!state->search)
+ state->search = calloc(MAXSEARCH, sizeof(uint32_t));
+ state->search[0] = 0;
+ tb_set_cursor((state->maxx-SEARCH_WIDTH+2)/2,
+ state->maxy-1-SEARCH_HEIGHT+1);
+}
+
+void
+hide_search(struct DrawState* state)
+{
+ state->show_search = 0;
+ tb_set_cursor(TB_HIDE_CURSOR, TB_HIDE_CURSOR);
+}
+
+void
+cancel_search(struct DrawState* state)
+{
+ state->show_search = 0;
+ state->search[0] = 0;
+ tb_set_cursor(TB_HIDE_CURSOR, TB_HIDE_CURSOR);
+}
+
+void
+move_search_start(struct DrawState* state)
+{
+ state->search_input_column = 0;
+ state->search_input_display_column = 0;
+ state->search_input_first_shown_column = 0;
+}
+
+void
+move_search_left(struct DrawState* state)
+{
+ if (state->search_input_column == 0)
+ return;
+
+ if (state->search[state->search_input_column-1] == '\t')
+ state->search_input_display_column = display_length(state,
+ state->search, state->search_input_column-1);
+ else
+ state->search_input_display_column--;
+ state->search_input_column--;
+
+ if (state->search_input_display_column <
+ state->search_input_first_shown_column)
+ state->search_input_first_shown_column =
+ state->search_input_display_column;
+}
+
+void
+move_search_right(struct DrawState* state)
+{
+ size_t len = u32_strlen(state->search);
+ if (state->search_input_column == len)
+ return;
+
+ if (state->search[state->search_input_column] == '\t')
+ state->search_input_display_column = display_length(state,
+ state->search, state->search_input_column+1);
+ else
+ state->search_input_display_column++;
+ state->search_input_column++;
+
+ if (state->search_input_display_column -
+ state->search_input_first_shown_column > SEARCH_WIDTH-3)
+ state->search_input_first_shown_column =
+ state->search_input_display_column - SEARCH_WIDTH+3;
+}
+
+void
+move_search_end(struct DrawState* state)
+{
+ size_t len = u32_strlen(state->search);
+ state->search_input_column = len;
+ size_t dlen = display_length(state, state->search,
+ state->search_input_column);
+ state->search_input_display_column = dlen;
+ if (dlen > SEARCH_WIDTH-3)
+ state->search_input_first_shown_column = dlen - SEARCH_WIDTH+3;
+ else
+ state->search_input_first_shown_column = 0;
+}
+
+void
+insert_search_char(struct DrawState* state, uint32_t ch)
+{
+ size_t len = u32_strlen(state->search);
+ if (state->search_input_column < MAXSEARCH-1)
+ {
+ size_t i = len;
+ int add_null = state->search[state->search_input_column] == 0;
+ while (i < MAXSEARCH-2 && i > state->search_input_column)
+ {
+ state->search[i] = state->search[i-1];
+ i--;
+ }
+ state->search[state->search_input_column++] = ch;
+ if (state->search_input_column == MAXSEARCH)
+ state->search_input_column = MAXSEARCH-1;
+ state->search_input_display_column = display_length(state,
+ state->search,
+ state->search_input_column);
+ if (add_null)
+ state->search[state->search_input_column] = 0;
+ }
+ if (state->search_input_display_column -
+ state->search_input_first_shown_column > SEARCH_WIDTH-3)
+ state->search_input_first_shown_column =
+ state->search_input_display_column - SEARCH_WIDTH+3;
+}
+
+void
+erase_search_backwards(struct DrawState* state)
+{
+ if (state->search_input_column > 0)
+ {
+ size_t i = state->search_input_column;
+ do
+ {
+ state->search[i-1] = state->search[i];
+ i++;
+ }
+ while (state->search[i]);
+ state->search[i-1] = 0;
+ state->search_input_column--;
+ if (state->search_input_column <
+ state->search_input_first_shown_column)
+ {
+ if (state->search_input_column > SEARCH_WIDTH-4)
+ state->search_input_first_shown_column =
+ state->search_input_column
+ - SEARCH_WIDTH+4;
+ else
+ state->search_input_first_shown_column = 0;
+ }
+ state->search_input_display_column = display_length(state,
+ state->search,
+ state->search_input_column);
+ }
+}
+
+void
+erase_search_forward(struct DrawState* state)
+{
+ if (state->search[state->search_input_column])
+ {
+ size_t i = state->search_input_column;
+ while (i < MAXSEARCH-2 && state->search[i+1])
+ {
+ state->search[i] = state->search[i+1];
+ i++;
+ }
+ state->search[i] = 0;
+ }
+}
+
+void
+erase_search_to_start(struct DrawState* state)
+{
+ size_t i = state->search_input_column;
+ size_t len = u32_strlen(state->search);
+ do
+ {
+ state->search[i-state->search_input_column] = state->search[i];
+ i++;
+ }
+ while (state->search[i]);
+ state->search[len-state->search_input_column] = 0;
+ move_search_start(state);
+}
+
+void
+erase_search_to_end(struct DrawState* state)
+{
+ state->search[state->search_input_column] = 0;
+ move_search_end(state);
+}
+
+void
next_untranslated(struct DrawState* state)
{
if (state->msgid_count == 0)
return;
+ state->error[0] = 0;
+
struct PoEntry* current = NULL;
for (size_t e = state->msgid_number; e < state->msgid_count; e++)
{
@@ -490,6 +694,8 @@ next_fuzzy(struct DrawState* state)
if (state->msgid_count == 0)
return;
+ state->error[0] = 0;
+
struct PoEntry* current = NULL;
for (size_t e = state->msgid_number; e < state->msgid_count; e++)
{
@@ -550,19 +756,24 @@ move_up(struct DrawState* state)
if (state->saved_column == -1)
state->saved_column = state->input_display_column;
size_t dlen = display_length(state, state->input_buffer[
- state->input_row].length);
+ state->input_row].text,
+ state->input_buffer[state->input_row].length);
if (dlen < state->saved_column)
state->input_display_column = dlen;
else
state->input_display_column = state->saved_column;
- state->input_column = input_length(state, state->input_display_column);
+ state->input_column = input_length(state, state->input_buffer[
+ state->input_row].text,
+ state->input_display_column);
if (state->input_first_shown_column > state->input_display_column)
state->input_first_shown_column = state->input_display_column;
if (state->input_first_shown_column + EDIT_WIDTH-5 <
state->input_display_column)
state->input_first_shown_column = state->input_display_column -
EDIT_WIDTH+5;
- state->input_display_column = display_length(state, state->input_column);
+ state->input_display_column = display_length(state,
+ state->input_buffer[state->input_row].text,
+ state->input_column);
}
void
@@ -585,19 +796,24 @@ move_down(struct DrawState* state)
if (state->saved_column == -1)
state->saved_column = state->input_display_column;
size_t dlen = display_length(state, state->input_buffer[
- state->input_row].length);
+ state->input_row].text,
+ state->input_buffer[state->input_row].length);
if (dlen < state->saved_column)
state->input_display_column = dlen;
else
state->input_display_column = state->saved_column;
- state->input_column = input_length(state, state->input_display_column);
+ state->input_column = input_length(state, state->input_buffer[
+ state->input_row].text,
+ state->input_display_column);
if (state->input_first_shown_column > state->input_display_column)
state->input_first_shown_column = state->input_display_column;
if (state->input_first_shown_column + EDIT_WIDTH-5 <
state->input_display_column)
state->input_first_shown_column = state->input_display_column -
EDIT_WIDTH+5;
- state->input_display_column = display_length(state, state->input_column);
+ state->input_display_column = display_length(state,
+ state->input_buffer[state->input_row].text,
+ state->input_column);
}
void
@@ -630,7 +846,8 @@ move_left(struct DrawState* state)
if (state->input_buffer[state->input_row].text[
state->input_column-1] == '\t')
- state->input_display_column = display_length(state,
+ state->input_display_column = display_length(state,
+ state->input_buffer[state->input_row].text,
state->input_column-1);
else
state->input_display_column--;
@@ -657,16 +874,17 @@ move_right(struct DrawState* state)
if (state->input_buffer[state->input_row].text[
state->input_column] == '\t')
- state->input_display_column = display_length(state,
+ state->input_display_column = display_length(state,
+ state->input_buffer[state->input_row].text,
state->input_column+1);
else
state->input_display_column++;
state->input_column++;
if (state->input_display_column - state->input_first_shown_column
- > EDIT_WIDTH-5)
+ > EDIT_WIDTH-3)
state->input_first_shown_column = state->input_display_column
- - EDIT_WIDTH+5;
+ - EDIT_WIDTH+3;
}
void
@@ -683,10 +901,11 @@ move_end(struct DrawState* state)
size_t len = state->input_buffer[state->input_row].length;
state->input_column = len;
- size_t dlen = display_length(state, state->input_column);
+ size_t dlen = display_length(state, state->input_buffer[
+ state->input_row].text, state->input_column);
state->input_display_column = dlen;
- if (dlen > EDIT_WIDTH-5)
- state->input_first_shown_column = dlen - EDIT_WIDTH+5;
+ if (dlen > EDIT_WIDTH-3)
+ state->input_first_shown_column = dlen - EDIT_WIDTH+3;
else
state->input_first_shown_column = 0;
}
@@ -806,19 +1025,19 @@ toggle_fuzzy(struct DrawState* state)
* max_index = the input index up to which the length is calculated
*/
size_t
-display_length(const struct DrawState* state, const size_t max_index)
+display_length(const struct DrawState* state, uint32_t* buffer,
+ const size_t max_index)
{
size_t len = 0;
- size_t i = 0;
- uint32_t* pbufline = state->input_buffer[state->input_row].text;
- while (*pbufline && i < max_index)
+ uint32_t* pbuf = buffer;
+
+ for (size_t i = 0; *pbuf && i < max_index; i++)
{
- if (*pbufline == '\t')
+ pbuf = buffer + i;
+ if (*pbuf == '\t')
len += TAB_SIZE - (len % TAB_SIZE);
else
len++;
- pbufline++;
- i++;
}
return len;
@@ -828,19 +1047,21 @@ display_length(const struct DrawState* state, const size_t max_index)
* max_index = the display index up to which the length is calculated
*/
size_t
-input_length(const struct DrawState* state, const size_t max_index)
+input_length(const struct DrawState* state, uint32_t* buffer,
+ const size_t max_index)
{
size_t len = 0;
+ uint32_t* pbuf = buffer;
size_t i = 0;
- uint32_t* pbufline = state->input_buffer[state->input_row].text;
- while (*pbufline && len < max_index)
+
+ for (i = 0; *pbuf && len < max_index; i++)
{
- if (*pbufline == '\t')
- len += TAB_SIZE - (len % TAB_SIZE);
+ pbuf = buffer + i;
+ if (*pbuf == '\t')
+ len += MIN(TAB_SIZE - (len % TAB_SIZE),
+ max_index - len);
else
len++;
- pbufline++;
- i++;
}
return i;
@@ -866,7 +1087,8 @@ insert_char(struct DrawState* state, uint32_t ch)
buffer_line->length++;
if (state->input_column == MAXBUFLINE)
state->input_column = MAXBUFLINE-1;
- state->input_display_column = display_length(state,
+ state->input_display_column = display_length(state,
+ state->input_buffer[state->input_row].text,
state->input_column);
if (add_null)
buffer_line->text[state->input_column] = 0;
@@ -879,6 +1101,71 @@ insert_char(struct DrawState* state, uint32_t ch)
}
void
+erase_backwards(struct DrawState* state)
+{
+ struct BufferLine* buffer_line = &state->input_buffer[state->input_row];
+
+ if (state->input_column > 0)
+ {
+ size_t i = state->input_column;
+ do
+ {
+ buffer_line->text[i-1] = buffer_line->text[i];
+ i++;
+ }
+ while (buffer_line->text[i]);
+ buffer_line->text[i-1] = 0;
+ buffer_line->length--;
+ state->input_column--;
+ if (state->input_column <
+ state->input_first_shown_column)
+ {
+ if (state->input_column > EDIT_WIDTH-6)
+ state->input_first_shown_column =
+ state->input_column
+ - EDIT_WIDTH+6;
+ else
+ state->input_first_shown_column = 0;
+ }
+ state->input_display_column = display_length(state,
+ state->input_buffer[
+ state->input_row].text,
+ state->input_column);
+ }
+ else if (state->input_row > 0)
+ if (!join_lines(state, state->input_row-1))
+ {
+ strcpy(state->error, errors[ERR_CANT_ALLOC]);
+ state->running = 0;
+ }
+}
+
+void
+erase_forward(struct DrawState* state)
+{
+ struct BufferLine* buffer_line = &state->input_buffer[state->input_row];
+
+ if (buffer_line->text[state->input_column])
+ {
+ size_t i = state->input_column;
+ while (i < MAXBUFLINE-2 && buffer_line->text[i+1])
+ {
+ buffer_line->text[i] = buffer_line->text[i+1];
+ i++;
+ }
+ buffer_line->text[i] = 0;
+ buffer_line->length--;
+ state->dirty = 1;
+ }
+ else if (state->input_row < state->input_rows_count-1)
+ if (!join_lines(state, state->input_row))
+ {
+ strcpy(state->error, errors[ERR_CANT_ALLOC]);
+ state->running = 0;
+ }
+}
+
+void
erase_to_start(struct DrawState* state)
{
if (state->edit_info_focused)
@@ -963,7 +1250,8 @@ join_lines(struct DrawState* state, size_t first_line)
return NULL;
state->input_column = state->input_buffer[first_line].length;
- state->input_display_column = display_length(state,
+ state->input_display_column = display_length(state,
+ state->input_buffer[state->input_row].text,
state->input_column);
u32_strncat(state->input_buffer[first_line].text, state->input_buffer[
first_line+1].text, MAXBUFLINE);
@@ -998,8 +1286,6 @@ handle_editbox_key_event(struct tb_event* ev, struct DrawState* state)
if (state->msgid_count < 1)
return;
- struct BufferLine* buffer_line = &state->input_buffer[state->input_row];
-
if (state->error[0])
state->error[0] = 0;
@@ -1018,39 +1304,7 @@ handle_editbox_key_event(struct tb_event* ev, struct DrawState* state)
else if ((ev->key == TB_KEY_BACKSPACE
|| ev->key == TB_KEY_BACKSPACE2)
&& !state->edit_info_focused)
- {
- if (state->input_column > 0)
- {
- size_t i = state->input_column;
- do
- {
- buffer_line->text[i-1] = buffer_line->text[i];
- i++;
- }
- while (buffer_line->text[i]);
- buffer_line->text[i-1] = 0;
- buffer_line->length--;
- state->input_column--;
- if (state->input_column <
- state->input_first_shown_column)
- {
- if (state->input_column > EDIT_WIDTH-6)
- state->input_first_shown_column =
- state->input_column
- - EDIT_WIDTH+6;
- else
- state->input_first_shown_column = 0;
- }
- state->input_display_column = display_length(state,
- state->input_column);
- }
- else if (state->input_row > 0)
- if (!join_lines(state, state->input_row-1))
- {
- strcpy(state->error, errors[ERR_CANT_ALLOC]);
- state->running = 0;
- }
- }
+ erase_backwards(state);
else if (ev->key == TB_KEY_CTRL_K)
erase_to_end(state);
else if (ev->key == TB_KEY_CTRL_N)
@@ -1070,26 +1324,7 @@ handle_editbox_key_event(struct tb_event* ev, struct DrawState* state)
else if (ev->key == TB_KEY_CTRL_Z)
toggle_fuzzy(state);
else if (ev->key == TB_KEY_DELETE && !state->edit_info_focused)
- {
- if (buffer_line->text[state->input_column])
- {
- size_t i = state->input_column;
- while (i < MAXBUFLINE-2 && buffer_line->text[i+1])
- {
- buffer_line->text[i] = buffer_line->text[i+1];
- i++;
- }
- buffer_line->text[i] = 0;
- buffer_line->length--;
- state->dirty = 1;
- }
- else if (state->input_row < state->input_rows_count-1)
- if (!join_lines(state, state->input_row))
- {
- strcpy(state->error, errors[ERR_CANT_ALLOC]);
- state->running = 0;
- }
- }
+ erase_forward(state);
else if (ev->key == TB_KEY_END
|| ev->key == TB_KEY_CTRL_E)
move_end(state);
@@ -1184,20 +1419,22 @@ handle_key_event(struct tb_event* ev, struct DrawState* state)
if (state->show_edit)
handle_editbox_key_event(ev, state);
+ else if (state->show_search)
+ handle_search_key_event(ev, state);
else if (ev->key == TB_KEY_ESC)
{
+ if (state->error[0])
+ state->error[0] = 0;
if (state->in_prompt)
{
state->in_prompt = 0;
state->prompt[0] = 0;
return;
}
- if (state->error[0])
- state->error[0] = 0;
- if (!(state->show_help || state->show_edit))
- strcpy(state->error, errors[ERR_EXIT_KEY]);
- if (state->show_help)
+ else if (state->show_help)
state->show_help = 0;
+ else
+ strcpy(state->error, errors[ERR_EXIT_KEY]);
}
else if ((ev->ch == 'y' || ev->ch == 'n') && state->in_prompt)
{
@@ -1218,6 +1455,7 @@ handle_key_event(struct tb_event* ev, struct DrawState* state)
}
else
state->running = 0;
+ state->error[0] = 0;
}
else if (state->show_help)
strcpy(state->error, errors[ERR_DLG_OPEN]);
@@ -1295,6 +1533,8 @@ handle_key_event(struct tb_event* ev, struct DrawState* state)
state->show_help = 1;
state->error[0] = 0;
}
+ else if (ev->key == TB_KEY_F7 || ev->ch == '/')
+ show_search(state);
else if (ev->key == TB_KEY_F8 || ev->ch == 'u')
next_untranslated(state);
else if (ev->key == TB_KEY_F9 || ev->ch == 'F')
@@ -1305,6 +1545,43 @@ handle_key_event(struct tb_event* ev, struct DrawState* state)
strcpy(state->error, errors[ERR_UNKNOWN_KEY]);
}
+void
+handle_search_key_event(struct tb_event* ev, struct DrawState* state)
+{
+ if (!state)
+ return;
+
+ if (ev->key == TB_KEY_ARROW_LEFT )
+ move_search_left(state);
+ else if (ev->key == TB_KEY_ARROW_RIGHT)
+ move_search_right(state);
+ else if ((ev->key == TB_KEY_BACKSPACE
+ || ev->key == TB_KEY_BACKSPACE2))
+ erase_search_backwards(state);
+ else if (ev->key == TB_KEY_CTRL_K)
+ erase_search_to_end(state);
+ else if (ev->key == TB_KEY_CTRL_U)
+ erase_search_to_start(state);
+ else if (ev->key == TB_KEY_DELETE)
+ erase_search_forward(state);
+ else if (ev->key == TB_KEY_END
+ || ev->key == TB_KEY_CTRL_E)
+ move_search_end(state);
+ else if (ev->key == TB_KEY_ENTER)
+ hide_search(state);
+ else if (ev->key == TB_KEY_ESC)
+ cancel_search(state);
+ else if (ev->key == TB_KEY_HOME
+ || ev->key == TB_KEY_CTRL_A)
+ move_search_start(state);
+ else if (ev->key == TB_KEY_SPACE)
+ insert_search_char(state, ' ');
+ else if (ev->key == TB_KEY_TAB)
+ insert_search_char(state, '\t');
+ else
+ insert_search_char(state, ev->ch);
+}
+
int
main(int argc, char** argv)
{
diff --git a/test/sr.po b/test/sr.po
@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: neomutt 20210205\n"
"Report-Msgid-Bugs-To: neomutt-devel@neomutt.org\n"
"POT-Creation-Date: 2021-06-19 23:57+0100\n"
-"PO-Revision-Date: 2021-06-21 08:12+0200\n"
+"PO-Revision-Date: 2021-07-06 14:33+0200\n"
"Last-Translator: Страхиња Радић <contact@strahinja.org>\n"
"Language-Team: Serbian <sr@li.org>\n"
"Language: sr\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Poedit 3.0\n"
+"X-Generator: poe v0.4.1-alpha-10-gee87d9d\n"
#. L10N: prompt to add a new alias
#: alias/alias.c:397
@@ -2075,18 +2075,24 @@ msgstr " („?“ за списак): "
#: handler.c:94
#, c-format
-msgid "[-- Type: %s/%s%s%s, Encoding: %s, Size: %s --]\n"
-msgstr "[-- Врста: %s/%s%s%s, Кодирање: %s, Величина: %s --]\n"
+msgid ""
+"[-- Type: %s/%s%s%s, Encoding: %s, Size: %s --]\n"
+msgstr ""
+"[-- Врста: %s/%s%s%s, Кодирање: %s, Величина: %s --]\n"
#: handler.c:100
#, c-format
-msgid "[-- Alternative Type #%d: %s/%s%s%s, Encoding: %s, Size: %s --]\n"
-msgstr "[-- Алтернативна врста #%d: %s/%s%s%s, Кодирање: %s, Величина: %s --]\n"
+msgid ""
+"[-- Alternative Type #%d: %s/%s%s%s, Encoding: %s, Size: %s --]\n"
+msgstr ""
+"[-- Алтернативна врста #%d: %s/%s%s%s, Кодирање: %s, Величина: %s --]\n"
#: handler.c:554
#, c-format
-msgid "[-- Autoview using %s --]\n"
-msgstr "[-- Аутопреглед преко %s --]\n"
+msgid ""
+"[-- Autoview using %s --]\n"
+msgstr ""
+"[-- Аутопреглед преко %s --]\n"
#: handler.c:555
#, c-format
@@ -2099,17 +2105,23 @@ msgstr "Не може се креирати филтер"
#: handler.c:589
#, c-format
-msgid "[-- Can't run %s. --]\n"
-msgstr "[-- Не може се покренути %s. --]\n"
+msgid ""
+"[-- Can't run %s. --]\n"
+msgstr ""
+"[-- Не може се покренути %s. --]\n"
#: handler.c:615 handler.c:636
#, c-format
-msgid "[-- Autoview stderr of %s --]\n"
-msgstr "[-- Аутопреглед stderr-а наредбе %s --]\n"
+msgid ""
+"[-- Autoview stderr of %s --]\n"
+msgstr ""
+"[-- Аутопреглед stderr-а наредбе %s --]\n"
#: handler.c:767
-msgid "[-- Error: message/external-body has no access-type parameter --]\n"
-msgstr "[-- Грешка: message/external-body нема параметар access-type --]\n"
+msgid ""
+"[-- Error: message/external-body has no access-type parameter --]\n"
+msgstr ""
+"[-- Грешка: message/external-body нема параметар access-type --]\n"
#. L10N: If the translation of this string is a multi line string, then
#. each line should start with "[-- " and end with " --]".
@@ -2160,11 +2172,16 @@ msgstr[2] ""
#. mutt_str_pretty_size() in mutt/string.c.
#: handler.c:834
#, c-format
-msgid "[-- This %s/%s attachment (size %s byte) has been deleted --]\n"
-msgid_plural "[-- This %s/%s attachment (size %s bytes) has been deleted --]\n"
-msgstr[0] "[-- Овај %s/%s прилог (величине %s бајт) је обрисан --]\n"
-msgstr[1] "[-- Овај %s/%s прилог (величине %s бајта) је обрисан --]\n"
-msgstr[2] "[-- Овај %s/%s прилог (величине %s бајтова) је обрисан --]\n"
+msgid ""
+"[-- This %s/%s attachment (size %s byte) has been deleted --]\n"
+msgid_plural ""
+"[-- This %s/%s attachment (size %s bytes) has been deleted --]\n"
+msgstr[0] ""
+"[-- Овај %s/%s прилог (величине %s бајт) је обрисан --]\n"
+msgstr[1] ""
+"[-- Овај %s/%s прилог (величине %s бајта) је обрисан --]\n"
+msgstr[2] ""
+"[-- Овај %s/%s прилог (величине %s бајтова) је обрисан --]\n"
#. L10N: If the translation of this string is a multi line string, then
#. each line should start with "[-- " and end with " --]".
@@ -2186,13 +2203,17 @@ msgstr ""
#. The first "%s/%s" is a MIME type, e.g. "text/plain".
#: handler.c:860
#, c-format
-msgid "[-- This %s/%s attachment has been deleted --]\n"
-msgstr "[-- Овај %s/%s прилог је обрисан --]\n"
+msgid ""
+"[-- This %s/%s attachment has been deleted --]\n"
+msgstr ""
+"[-- Овај %s/%s прилог је обрисан --]\n"
#: handler.c:870
#, c-format
-msgid "[-- name: %s --]\n"
-msgstr "[-- назив: %s --]\n"
+msgid ""
+"[-- name: %s --]\n"
+msgstr ""
+"[-- назив: %s --]\n"
#. L10N: If the translation of this string is a multi line string, then
#. each line should start with "[-- " and end with " --]".
@@ -2223,19 +2244,25 @@ msgstr ""
"[-- а наведени access-type %s није подржан --]\n"
#: handler.c:1102
-msgid "[-- Error: Could not display any parts of Multipart/Alternative --]\n"
-msgstr "[-- Грешка: Не може се приказати ниједан од делова Multipart/Alternative --]\n"
+msgid ""
+"[-- Error: Could not display any parts of Multipart/Alternative --]\n"
+msgstr ""
+"[-- Грешка: Не може се приказати ниједан од делова Multipart/Alternative --]\n"
#. L10N: %s is the attachment description, filename or form_name.
#: handler.c:1245
#, c-format
-msgid "[-- Attachment #%d: %s --]\n"
-msgstr "[-- Прилог #%d: %s --]\n"
+msgid ""
+"[-- Attachment #%d: %s --]\n"
+msgstr ""
+"[-- Прилог #%d: %s --]\n"
#: handler.c:1251
#, c-format
-msgid "[-- Attachment #%d --]\n"
-msgstr "[-- Прилог #%d --]\n"
+msgid ""
+"[-- Attachment #%d --]\n"
+msgstr ""
+"[-- Прилог #%d --]\n"
#: handler.c:1270
msgid "One or more parts of this message could not be displayed"
@@ -2260,35 +2287,47 @@ msgstr "Грешка: multipart/signed нема протокол"
#. L10N: %s expands to a keystroke/key binding, e.g. 'v'.
#: handler.c:1761
#, c-format
-msgid "[-- This is an attachment (use '%s' to view this part) --]\n"
-msgstr "[-- Ово је прилог (користите ‘%s’ да прегледате овај део) --]\n"
+msgid ""
+"[-- This is an attachment (use '%s' to view this part) --]\n"
+msgstr ""
+"[-- Ово је прилог (користите ‘%s’ да прегледате овај део) --]\n"
#. L10N: %s/%s is a MIME type, e.g. "text/plain".
#. The last %s expands to a keystroke/key binding, e.g. 'v'.
#: handler.c:1768
#, c-format
-msgid "[-- %s/%s is unsupported (use '%s' to view this part) --]\n"
-msgstr "[-- %s/%s није подржан (користите „%s“ да прегледате овај део) --]\n"
+msgid ""
+"[-- %s/%s is unsupported (use '%s' to view this part) --]\n"
+msgstr ""
+"[-- %s/%s није подржан (користите „%s“ да прегледате овај део) --]\n"
#: handler.c:1776
-msgid "[-- This is an attachment (need 'view-attachments' bound to key) --]\n"
-msgstr "[-- Ово је прилог (потребно је „view-attachments“ доделити тастеру) --]\n"
+msgid ""
+"[-- This is an attachment (need 'view-attachments' bound to key) --]\n"
+msgstr ""
+"[-- Ово је прилог (потребно је „view-attachments“ доделити тастеру) --]\n"
#. L10N: %s/%s is a MIME type, e.g. "text/plain".
#: handler.c:1782
#, c-format
-msgid "[-- %s/%s is unsupported (need 'view-attachments' bound to key) --]\n"
-msgstr "[-- %s/%s није подржан (потребно је „view-attachments“ доделити тастеру) --]\n"
+msgid ""
+"[-- %s/%s is unsupported (need 'view-attachments' bound to key) --]\n"
+msgstr ""
+"[-- %s/%s није подржан (потребно је „view-attachments“ доделити тастеру) --]\n"
#: handler.c:1791
-msgid "[-- This is an attachment --]\n"
-msgstr "[-- Ово је прилог --]\n"
+msgid ""
+"[-- This is an attachment --]\n"
+msgstr ""
+"[-- Ово је прилог --]\n"
#. L10N: %s/%s is a MIME type, e.g. "text/plain".
#: handler.c:1796
#, c-format
-msgid "[-- %s/%s is unsupported --]\n"
-msgstr "[-- %s/%s није подржан --]\n"
+msgid ""
+"[-- %s/%s is unsupported --]\n"
+msgstr ""
+"[-- %s/%s није подржан --]\n"
#: hcache/config.c:86
#, c-format
@@ -3271,8 +3310,10 @@ msgid " neomutt [-n] [-e <command>] [-F <config>] -z [-f <mailbox>]"
msgstr " neomutt [-n] [-e <наредба>] [-F <конфиг>] -z [-f <сандуче>]"
#: main.c:179
-msgid " neomutt -v[v]\n"
-msgstr " neomutt -v[v]\n"
+msgid ""
+" neomutt -v[v]\n"
+msgstr ""
+" neomutt -v[v]\n"
#. L10N: Try to limit to 80 columns. If more space is needed add an indented line
#: main.c:182
@@ -3658,13 +3699,17 @@ msgstr "Нема довољно подизраза за шаблон"
#: mutt/signal.c:68 mutt/signal.c:70 mutt/signal.c:72
#, c-format
-msgid "Caught signal %d (%s) ... Exiting\n"
-msgstr "Ухваћен сигнал %d (%s) ... Излазак\n"
+msgid ""
+"Caught signal %d (%s) ... Exiting\n"
+msgstr ""
+"Ухваћен сигнал %d (%s) ... Излазак\n"
#: mutt/signal.c:74
#, c-format
-msgid "Caught signal %d ... Exiting\n"
-msgstr "Ухваћен сигнал %d ... Излазак\n"
+msgid ""
+"Caught signal %d ... Exiting\n"
+msgstr ""
+"Ухваћен сигнал %d ... Излазак\n"
#: mutt_attach.c:143 mutt_attach.c:278
msgid "Can't match 'nametemplate', continue?"
@@ -3921,8 +3966,10 @@ msgstr " (текуће време: %c)"
#: ncrypt/crypt.c:86
#, c-format
-msgid "[-- %s output follows%s --]\n"
-msgstr "[-- Излаз %s је у наставку%s --]\n"
+msgid ""
+"[-- %s output follows%s --]\n"
+msgstr ""
+"[-- Излаз %s је у наставку%s --]\n"
#. L10N: Due to the implementation details (e.g. some passwords are managed
#. by gpg-agent) we can't know whether we forgot zero, 1, 12, ...
@@ -3965,8 +4012,10 @@ msgid "S/MIME messages with no hints on content are unsupported"
msgstr "S/MIME поруке без назнака садржаја нису подржане"
#: ncrypt/crypt.c:899
-msgid "Trying to extract PGP keys...\n"
-msgstr "Покушај извлачења PGP кључева...\n"
+msgid ""
+"Trying to extract PGP keys...\n"
+msgstr ""
+"Покушај извлачења PGP кључева...\n"
#: ncrypt/crypt.c:926
msgid "Trying to extract S/MIME certificates..."
@@ -4063,8 +4112,10 @@ msgstr "тајни кључ ‘%s’ није пронађен: %s"
#: ncrypt/crypt_gpgme.c:1016
#, c-format
-msgid "ambiguous specification of secret key '%s'\n"
-msgstr "двосмислена спецификација тајног кључа „%s“\n"
+msgid ""
+"ambiguous specification of secret key '%s'\n"
+msgstr ""
+"двосмислена спецификација тајног кључа „%s“\n"
#: ncrypt/crypt_gpgme.c:1032
#, c-format
@@ -4091,36 +4142,48 @@ msgid "$pgp_sign_as unset and no default key specified in ~/.gnupg/gpg.conf"
msgstr "$pgp_sign_as није постављен а ниједан подразумевани кључ није задат у ~/.gnupg/gpg.conf"
#: ncrypt/crypt_gpgme.c:1495
-msgid "Warning: One of the keys has been revoked\n"
-msgstr "Упозорење: Један од кључева је повучен\n"
+msgid ""
+"Warning: One of the keys has been revoked\n"
+msgstr ""
+"Упозорење: Један од кључева је повучен\n"
#: ncrypt/crypt_gpgme.c:1505
msgid "Warning: The key used to create the signature expired at: "
msgstr "Упозорење: Кључ уз помоћ кога је креиран потпис је истекао дана: "
#: ncrypt/crypt_gpgme.c:1511
-msgid "Warning: At least one certification key has expired\n"
-msgstr "Упозорење: Бар један сертификациони кључ је истекао\n"
+msgid ""
+"Warning: At least one certification key has expired\n"
+msgstr ""
+"Упозорење: Бар један сертификациони кључ је истекао\n"
#: ncrypt/crypt_gpgme.c:1525
msgid "Warning: The signature expired at: "
msgstr "Упозорење: Потпис је истекао дана: "
#: ncrypt/crypt_gpgme.c:1532
-msgid "Can't verify due to a missing key or certificate\n"
-msgstr "Не може се верификовати због недостатка кључа или сертификата\n"
+msgid ""
+"Can't verify due to a missing key or certificate\n"
+msgstr ""
+"Не може се верификовати због недостатка кључа или сертификата\n"
#: ncrypt/crypt_gpgme.c:1537
-msgid "The CRL is not available\n"
-msgstr "CRL није доступан\n"
+msgid ""
+"The CRL is not available\n"
+msgstr ""
+"CRL није доступан\n"
#: ncrypt/crypt_gpgme.c:1543
-msgid "Available CRL is too old\n"
-msgstr "Доступни CRL је престар\n"
+msgid ""
+"Available CRL is too old\n"
+msgstr ""
+"Доступни CRL је престар\n"
#: ncrypt/crypt_gpgme.c:1548
-msgid "A policy requirement was not met\n"
-msgstr "Није испуњен услов полисе\n"
+msgid ""
+"A policy requirement was not met\n"
+msgstr ""
+"Није испуњен услов полисе\n"
#: ncrypt/crypt_gpgme.c:1557
msgid "A system error occurred"
@@ -4139,16 +4202,22 @@ msgid "Fingerprint: "
msgstr "Отисак: "
#: ncrypt/crypt_gpgme.c:1678
-msgid "WARNING: We have NO indication whether the key belongs to the person named as shown above\n"
-msgstr "УПОЗОРЕЊЕ: НЕ постоје индиције да кључ припада наведеној особи\n"
+msgid ""
+"WARNING: We have NO indication whether the key belongs to the person named as shown above\n"
+msgstr ""
+"УПОЗОРЕЊЕ: НЕ постоје индиције да кључ припада наведеној особи\n"
#: ncrypt/crypt_gpgme.c:1685
-msgid "WARNING: The key does NOT BELONG to the person named as shown above\n"
-msgstr "УПОЗОРЕЊЕ: Кључ НЕ ПРИПАДА наведеној особи\n"
+msgid ""
+"WARNING: The key does NOT BELONG to the person named as shown above\n"
+msgstr ""
+"УПОЗОРЕЊЕ: Кључ НЕ ПРИПАДА наведеној особи\n"
#: ncrypt/crypt_gpgme.c:1689
-msgid "WARNING: It is NOT certain that the key belongs to the person named as shown above\n"
-msgstr "УПОЗОРЕЊЕ: НИЈЕ извесно да кључ припада наведеној особи\n"
+msgid ""
+"WARNING: It is NOT certain that the key belongs to the person named as shown above\n"
+msgstr ""
+"УПОЗОРЕЊЕ: НИЈЕ извесно да кључ припада наведеној особи\n"
#: ncrypt/crypt_gpgme.c:1725 ncrypt/crypt_gpgme.c:1730 ncrypt/dlggpgme.c:94
msgid "aka: "
@@ -4170,8 +4239,10 @@ msgstr "креиран: "
#: ncrypt/crypt_gpgme.c:1838
#, c-format
-msgid "Error getting key information for KeyID %s: %s\n"
-msgstr "Грешка приликом добављања података о кључу за ИБКључа %s: %s\n"
+msgid ""
+"Error getting key information for KeyID %s: %s\n"
+msgstr ""
+"Грешка приликом добављања података о кључу за ИБКључа %s: %s\n"
#: ncrypt/crypt_gpgme.c:1845 ncrypt/crypt_gpgme.c:1860
msgid "Good signature from:"
@@ -4192,22 +4263,30 @@ msgid " expires: "
msgstr " истиче: "
#: ncrypt/crypt_gpgme.c:1929 ncrypt/crypt_gpgme.c:2162 ncrypt/crypt_gpgme.c:2956
-msgid "[-- Begin signature information --]\n"
-msgstr "[-- Почетак информација о потпису --]\n"
+msgid ""
+"[-- Begin signature information --]\n"
+msgstr ""
+"[-- Почетак информација о потпису --]\n"
#: ncrypt/crypt_gpgme.c:1940
#, c-format
-msgid "Error: verification failed: %s\n"
-msgstr "Грешка: верификација неуспешна: %s\n"
+msgid ""
+"Error: verification failed: %s\n"
+msgstr ""
+"Грешка: верификација неуспешна: %s\n"
#: ncrypt/crypt_gpgme.c:1991
#, c-format
-msgid "*** Begin Notation (signature by: %s) ***\n"
-msgstr "*** Почетак нотације (потпис од: %s) ***\n"
+msgid ""
+"*** Begin Notation (signature by: %s) ***\n"
+msgstr ""
+"*** Почетак нотације (потпис од: %s) ***\n"
#: ncrypt/crypt_gpgme.c:2010
-msgid "*** End Notation ***\n"
-msgstr "*** Крај нотације ***\n"
+msgid ""
+"*** End Notation ***\n"
+msgstr ""
+"*** Крај нотације ***\n"
#: ncrypt/crypt_gpgme.c:2018 ncrypt/crypt_gpgme.c:2176 ncrypt/crypt_gpgme.c:2966
msgid ""
@@ -4233,16 +4312,20 @@ msgstr "Грешка приликом увоза кључа: %s"
#: ncrypt/crypt_gpgme.c:2930
#, c-format
-msgid "Error: decryption/verification failed: %s\n"
-msgstr "Грешка: неуспешно дешифровање/верификација: %s\n"
+msgid ""
+"Error: decryption/verification failed: %s\n"
+msgstr ""
+"Грешка: неуспешно дешифровање/верификација: %s\n"
#: ncrypt/crypt_gpgme.c:2937 ncrypt/crypt_gpgme.c:3136 ncrypt/pgp.c:731 ncrypt/pgp.c:1281
msgid "PGP message successfully decrypted"
msgstr "PGP порука успешно дешифрована"
#: ncrypt/crypt_gpgme.c:2978
-msgid "Error: copy data failed\n"
-msgstr "Грешка: неуспешно копирање података\n"
+msgid ""
+"Error: copy data failed\n"
+msgstr ""
+"Грешка: неуспешно копирање података\n"
#: ncrypt/crypt_gpgme.c:2991 ncrypt/pgp.c:678
msgid ""
@@ -4253,8 +4336,10 @@ msgstr ""
"\n"
#: ncrypt/crypt_gpgme.c:2993 ncrypt/pgp.c:680
-msgid "[-- BEGIN PGP PUBLIC KEY BLOCK --]\n"
-msgstr "[-- ПОЧЕТАК PGP БЛОКА ЈАВНОГ КЉУЧА --]\n"
+msgid ""
+"[-- BEGIN PGP PUBLIC KEY BLOCK --]\n"
+msgstr ""
+"[-- ПОЧЕТАК PGP БЛОКА ЈАВНОГ КЉУЧА --]\n"
#: ncrypt/crypt_gpgme.c:2995 ncrypt/pgp.c:682
msgid ""
@@ -4265,16 +4350,22 @@ msgstr ""
"\n"
#: ncrypt/crypt_gpgme.c:3022 ncrypt/pgp.c:720
-msgid "[-- END PGP MESSAGE --]\n"
-msgstr "[-- КРАЈ PGP ПОРУКЕ --]\n"
+msgid ""
+"[-- END PGP MESSAGE --]\n"
+msgstr ""
+"[-- КРАЈ PGP ПОРУКЕ --]\n"
#: ncrypt/crypt_gpgme.c:3024 ncrypt/pgp.c:734
-msgid "[-- END PGP PUBLIC KEY BLOCK --]\n"
-msgstr "[-- КРАЈ PGP БЛОКА ЈАВНОГ КЉУЧА --]\n"
+msgid ""
+"[-- END PGP PUBLIC KEY BLOCK --]\n"
+msgstr ""
+"[-- КРАЈ PGP БЛОКА ЈАВНОГ КЉУЧА --]\n"
#: ncrypt/crypt_gpgme.c:3026 ncrypt/pgp.c:736
-msgid "[-- END PGP SIGNED MESSAGE --]\n"
-msgstr "[-- КРАЈ PGP ПОТПИСАНЕ ПОРУКЕ --]\n"
+msgid ""
+"[-- END PGP SIGNED MESSAGE --]\n"
+msgstr ""
+"[-- КРАЈ PGP ПОТПИСАНЕ ПОРУКЕ --]\n"
#: ncrypt/crypt_gpgme.c:3047 ncrypt/pgp.c:769
msgid ""
@@ -4285,8 +4376,10 @@ msgstr ""
"\n"
#: ncrypt/crypt_gpgme.c:3075 ncrypt/crypt_gpgme.c:3175 ncrypt/pgp.c:1226
-msgid "[-- Error: could not create temporary file --]\n"
-msgstr "[-- Грешка: не може се креирати привремена датотека --]\n"
+msgid ""
+"[-- Error: could not create temporary file --]\n"
+msgstr ""
+"[-- Грешка: не може се креирати привремена датотека --]\n"
#: ncrypt/crypt_gpgme.c:3089
msgid ""
@@ -4305,12 +4398,16 @@ msgstr ""
"\n"
#: ncrypt/crypt_gpgme.c:3131
-msgid "[-- End of PGP/MIME signed and encrypted data --]\n"
-msgstr "[-- Крај података потписаних и шифрованих преко PGP/MIME-а --]\n"
+msgid ""
+"[-- End of PGP/MIME signed and encrypted data --]\n"
+msgstr ""
+"[-- Крај података потписаних и шифрованих преко PGP/MIME-а --]\n"
#: ncrypt/crypt_gpgme.c:3132 ncrypt/pgp.c:1276
-msgid "[-- End of PGP/MIME encrypted data --]\n"
-msgstr "[-- Крај података шифрованих преко PGP/MIME-а --]\n"
+msgid ""
+"[-- End of PGP/MIME encrypted data --]\n"
+msgstr ""
+"[-- Крај података шифрованих преко PGP/MIME-а --]\n"
#: ncrypt/crypt_gpgme.c:3144 ncrypt/pgp.c:669 ncrypt/pgp.c:722 ncrypt/pgp.c:1285 postpone.c:687
msgid "Could not decrypt PGP message"
@@ -4333,12 +4430,16 @@ msgstr ""
"\n"
#: ncrypt/crypt_gpgme.c:3237
-msgid "[-- End of S/MIME signed data --]\n"
-msgstr "[-- Крај података потписаних преко S/MIME-а --]\n"
+msgid ""
+"[-- End of S/MIME signed data --]\n"
+msgstr ""
+"[-- Крај података потписаних преко S/MIME-а --]\n"
#: ncrypt/crypt_gpgme.c:3238
-msgid "[-- End of S/MIME encrypted data --]\n"
-msgstr "[-- Крај података шифрованих преко S/MIME-а --]\n"
+msgid ""
+"[-- End of S/MIME encrypted data --]\n"
+msgstr ""
+"[-- Крај података шифрованих преко S/MIME-а --]\n"
#: ncrypt/crypt_gpgme.c:3421 ncrypt/crypt_gpgme.c:3472
#, c-format
@@ -4529,11 +4630,16 @@ msgstr "[Неисправно]"
#. L10N: This is printed after "Key Type: " and looks like this: PGP, 2048 bit RSA
#: ncrypt/dlggpgme.c:665 ncrypt/dlggpgme.c:806
#, c-format
-msgid "%s, %lu bit %s\n"
-msgid_plural "%s, %lu bit %s\n"
-msgstr[0] "%s, %lu-битни %s\n"
-msgstr[1] "%s, %lu-битни %s\n"
-msgstr[2] "%s, %lu-битни %s\n"
+msgid ""
+"%s, %lu bit %s\n"
+msgid_plural ""
+"%s, %lu bit %s\n"
+msgstr[0] ""
+"%s, %lu-битни %s\n"
+msgstr[1] ""
+"%s, %lu-битни %s\n"
+msgstr[2] ""
+"%s, %lu-битни %s\n"
#. L10N: value in Key Usage: field
#: ncrypt/dlggpgme.c:673 ncrypt/dlggpgme.c:813
@@ -4575,12 +4681,16 @@ msgstr "Прикупљање података..."
#: ncrypt/dlggpgme.c:868
#, c-format
-msgid "Error finding issuer key: %s\n"
-msgstr "Грешка приликом потраге за кључем издавача: %s\n"
+msgid ""
+"Error finding issuer key: %s\n"
+msgstr ""
+"Грешка приликом потраге за кључем издавача: %s\n"
#: ncrypt/dlggpgme.c:877
-msgid "Error: certification chain too long - stopping here\n"
-msgstr "Грешка: ланац сертификовања је предугачак — стајем\n"
+msgid ""
+"Error: certification chain too long - stopping here\n"
+msgstr ""
+"Грешка: ланац сертификовања је предугачак — стајем\n"
#: ncrypt/dlggpgme.c:888 ncrypt/dlgpgp.c:628
#, c-format
@@ -4736,8 +4846,10 @@ msgid "Enter PGP passphrase:"
msgstr "Унесите PGP приступну фразу:"
#: ncrypt/pgp.c:598
-msgid "[-- Error: unable to create PGP subprocess --]\n"
-msgstr "[-- Грешка: не може се креирати PGP потпроцес --]\n"
+msgid ""
+"[-- Error: unable to create PGP subprocess --]\n"
+msgstr ""
+"[-- Грешка: не може се креирати PGP потпроцес --]\n"
#: ncrypt/pgp.c:645 ncrypt/pgp.c:931 ncrypt/pgp.c:1091
msgid ""
@@ -4915,16 +5027,22 @@ msgstr ""
"\n"
#: ncrypt/smime.c:1904 ncrypt/smime.c:1917
-msgid "[-- Error: unable to create OpenSSL subprocess --]\n"
-msgstr "[-- Грешка: не може се креирати OpenSSL потпроцес --]\n"
+msgid ""
+"[-- Error: unable to create OpenSSL subprocess --]\n"
+msgstr ""
+"[-- Грешка: не може се креирати OpenSSL потпроцес --]\n"
#: ncrypt/smime.c:1953
-msgid "[-- The following data is S/MIME encrypted --]\n"
-msgstr "[-- Следећи подаци су шифровани преко S/MIME-а --]\n"
+msgid ""
+"[-- The following data is S/MIME encrypted --]\n"
+msgstr ""
+"[-- Следећи подаци су шифровани преко S/MIME-а --]\n"
#: ncrypt/smime.c:1956
-msgid "[-- The following data is S/MIME signed --]\n"
-msgstr "[-- Следећи подаци су потписани преко S/MIME-а --]\n"
+msgid ""
+"[-- The following data is S/MIME signed --]\n"
+msgstr ""
+"[-- Следећи подаци су потписани преко S/MIME-а --]\n"
#: ncrypt/smime.c:2049
msgid ""
@@ -7061,8 +7179,10 @@ msgstr "Поставите променљиву hostname на исправну
#: remailer.c:923
#, c-format
-msgid "Error sending message, child exited %d\n"
-msgstr "Грешка приликом слања поруке, подређени процес је изашао %d\n"
+msgid ""
+"Error sending message, child exited %d\n"
+msgstr ""
+"Грешка приликом слања поруке, подређени процес је изашао %d\n"
#: remailer.c:927
msgid "Error sending message"
@@ -7407,3 +7527,4 @@ msgstr "Подразумеване опције:"
#: version.c:514
msgid "Compile options:"
msgstr "Опције за компајлирање:"
+