]> git.wh0rd.org Git - nano.git/commitdiff
implement word count via Meta-D at the main window
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Sun, 12 Jun 2005 22:31:03 +0000 (22:31 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Sun, 12 Jun 2005 22:31:03 +0000 (22:31 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2633 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/global.c
src/nano.c
src/nano.h
src/proto.h

index 1c4b96eadac0cc9dda6d66adc63e5b505533c8b8..f726e9c0accb82fa5b88d1c852f11ad00d00c069 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -61,6 +61,10 @@ CVS code -
          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
index f432e37cec3f2d46a6d832d3498c6fea6fb311fa..4512e10f28d571007c54a6ddb341ff8aaea31b27 100644 (file)
@@ -321,6 +321,8 @@ void shortcut_init(bool unjustify)
 #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 =
@@ -564,11 +566,15 @@ void shortcut_init(bool unjustify)
 #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
index 4df9dda9a065210d76e1fe9494b900f0afff8d20..535a2c15de4ac09bf01bf4b9af309b403c70ccac 100644 (file)
@@ -1445,13 +1445,16 @@ void do_enter(void)
 }
 
 #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);
 
@@ -1467,6 +1470,10 @@ void do_next_word(void)
         * 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;
     }
@@ -1505,8 +1512,17 @@ void do_next_word(void)
 
     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. */
@@ -1615,6 +1631,37 @@ void do_prev_word(void)
     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);
index 4bcbb8e6c2f95fe54806c5a1fdb30c864a3a5818..0be8df4d754de3dbd0569e139aacbf222ce27194 100644 (file)
@@ -455,6 +455,7 @@ typedef struct syntaxtype {
 #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
index 6ceeab90d613f5f7b13ee5911e0156704b4a3349..f180a8c118566b4994c09e942a409dad76fdbb04 100644 (file)
@@ -401,8 +401,10 @@ void do_delete(void);
 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