is_blank_mbchar(), is_blank_wchar() (renamed niswblank()),
is_cntrl_wchar(), control_rep(), control_mbrep(), etc.;
removal of is_alnum_char() and is_alnum_wchar(). (DLR)
+ - Implement word count via Meta-D at the main window. Note that
+ this is disabled when NANO_SMALL is defined. New functions
+ do_word_count() and do_next_word_void(); changes to
+ shortcut_init() and do_next_word(). (DLR)
- chars.c:
make_mbstring()
- Change erroneous ENABLE_EXTRA #ifdef to NANO_EXTRA to fix a
#ifndef NANO_SMALL
const char *nano_nextword_msg = N_("Move forward one word");
const char *nano_prevword_msg = N_("Move backward one word");
+ const char *nano_wordcount_msg =
+ N_("Count the number of words in the file");
#endif
#ifndef DISABLE_JUSTIFY
const char *nano_parabegin_msg =
#ifndef NANO_SMALL
sc_init_one(&main_list, NANO_NEXTWORD_KEY, N_("Next Word"),
IFHELP(nano_nextword_msg, NANO_NO_KEY), NANO_NO_KEY,
- NANO_NO_KEY, VIEW, do_next_word);
+ NANO_NO_KEY, VIEW, do_next_word_void);
sc_init_one(&main_list, NANO_NO_KEY, N_("Prev Word"),
IFHELP(nano_prevword_msg, NANO_PREVWORD_KEY), NANO_NO_KEY,
NANO_NO_KEY, VIEW, do_prev_word);
+
+ sc_init_one(&main_list, NANO_NO_KEY, N_("Word Count"),
+ IFHELP(nano_wordcount_msg, NANO_WORDCOUNT_KEY), NANO_NO_KEY,
+ NANO_NO_KEY, VIEW, do_word_count);
#endif
#ifndef DISABLE_JUSTIFY
}
#ifndef NANO_SMALL
-/* Move to the next word. */
-void do_next_word(void)
+/* Move to the next word. If allow_update is FALSE, don't update the
+ * screen afterward. Return TRUE if we started on a word, and FALSE
+ * otherwise. */
+bool do_next_word(bool allow_update)
{
size_t pww_save = placewewant;
const filestruct *current_save = current;
char *char_mb;
int char_mb_len;
+ bool started_on_word = FALSE;
assert(current != NULL && current->data != NULL);
* line. */
if (!is_alnum_mbchar(char_mb))
break;
+ /* If we haven't found it, then we've started on a word, so set
+ * started_on_word to TRUE. */
+ else
+ started_on_word = TRUE;
current_x += char_mb_len;
}
placewewant = xplustabs();
- /* Update the screen. */
- edit_redraw(current_save, pww_save);
+ /* If allow_update is TRUE, update the screen. */
+ if (allow_update)
+ edit_redraw(current_save, pww_save);
+
+ /* Return whether we started on a word. */
+ return started_on_word;
+}
+
+void do_next_word_void(void)
+{
+ do_next_word(TRUE);
}
/* Move to the previous word. */
edit_redraw(current_save, pww_save);
}
+void do_word_count(void)
+{
+ size_t words = 0;
+ size_t current_x_save = current_x, pww_save = placewewant;
+ filestruct *current_save = current;
+
+ /* Start at the beginning of the file. */
+ current = fileage;
+ current_x = 0;
+ placewewant = 0;
+
+ /* Keep moving to the next word until we reach the end of the file,
+ * incrementing the total word count whenever we're on a word just
+ * before moving. */
+ while (current != filebot || current_x != 0) {
+ if (do_next_word(FALSE))
+ words++;
+ }
+
+ /* Go back to where we were before. */
+ current = current_save;
+ current_x = current_x_save;
+ placewewant = pww_save;
+
+ /* Update the screen. */
+ edit_refresh();
+
+ /* Display the total word count on the statusbar. */
+ statusbar(_("Word count: %lu"), (unsigned long)words);
+}
+
void do_mark(void)
{
TOGGLE(MARK_ISSET);
#define NANO_BRACKET_KEY NANO_ALT_RBRACKET
#define NANO_NEXTWORD_KEY NANO_CONTROL_SPACE
#define NANO_PREVWORD_KEY NANO_ALT_SPACE
+#define NANO_WORDCOUNT_KEY NANO_ALT_D
#define NANO_CUTTILLEND_KEY NANO_CONTROL_X
#define NANO_CUTTILLEND_ALTKEY NANO_ALT_T
#define NANO_PARABEGIN_KEY NANO_CONTROL_W
void do_tab(void);
void do_enter(void);
#ifndef NANO_SMALL
-void do_next_word(void);
+bool do_next_word(bool allow_update);
+void do_next_word_void(void);
void do_prev_word(void);
+void do_word_count(void);
void do_mark(void);
#endif
#ifndef DISABLE_WRAPPING