Patch 7.4.1042
Problem: g-CTRL-G shows the word count, but there is no way to get the word
count in a script.
Solution: Add the wordcount() function. (Christian Brabandt)
Files: runtime/doc/editing.txt, runtime/doc/eval.txt,
runtime/doc/usr_41.txt, src/eval.c, src/normal.c, src/ops.c,
src/proto/ops.pro, src/testdir/test_wordcount.in,
src/testdir/test_wordcount.ok, src/testdir/Make_all.mak
*** ../vim-7.4.1041/runtime/doc/editing.txt 2016-01-02 22:25:40.666710151
+0100
--- runtime/doc/editing.txt 2016-01-03 22:28:11.760313436 +0100
***************
*** 78,84 ****
than one position on the screen (<Tab> or special
character), both the "real" column and the screen
column are shown, separated with a dash.
! See also 'ruler' option. {not in Vi}
*v_g_CTRL-G*
{Visual}g CTRL-G Similar to "g CTRL-G", but Word, Character, Line, and
--- 78,86 ----
than one position on the screen (<Tab> or special
character), both the "real" column and the screen
column are shown, separated with a dash.
! Also see the 'ruler' option and the |wordcount()|
! function.
! {not in Vi}
*v_g_CTRL-G*
{Visual}g CTRL-G Similar to "g CTRL-G", but Word, Character, Line, and
*** ../vim-7.4.1041/runtime/doc/eval.txt 2016-01-02 17:54:04.407793439
+0100
--- runtime/doc/eval.txt 2016-01-03 22:29:41.835330215 +0100
***************
*** 2071,2076 ****
--- 2075,2081 ----
winrestview( {dict}) none restore view of current window
winsaveview() Dict save view of current window
winwidth( {nr}) Number width of window {nr}
+ wordcount() Dict get byte/char/word statistics
writefile( {list}, {fname} [, {flags}])
Number write list of lines to file {fname}
xor( {expr}, {expr}) Number bitwise XOR
***************
*** 6674,6679 ****
--- 6745,6772 ----
: exe "normal 50\<C-W>|"
:endif
<
+ wordcount() *wordcount()*
+ The result is a dictionary of byte/chars/word statistics for
+ the current buffer. This is the same info as provided by
+ |g_CTRL-G|
+ The return value includes:
+ bytes Number of bytes in the buffer
+ chars Number of chars in the buffer
+ words Number of words in the buffer
+ cursor_bytes Number of bytes before cursor position
+ (not in Visual mode)
+ cursor_chars Number of chars before cursor position
+ (not in Visual mode)
+ cursor_words Number of words before cursor position
+ (not in Visual mode)
+ visual_bytes Number of bytes visually selected
+ (only in Visual mode)
+ visual_chars Number of chars visually selected
+ (only in Visual mode)
+ visual_words Number of chars visually selected
+ (only in Visual mode)
+
+
*writefile()*
writefile({list}, {fname} [, {flags}])
Write |List| {list} to file {fname}. Each list item is
*** ../vim-7.4.1041/runtime/doc/usr_41.txt 2015-11-30 21:37:23.592219629
+0100
--- runtime/doc/usr_41.txt 2016-01-03 22:26:33.421386983 +0100
***************
*** 919,924 ****
--- 923,929 ----
mzeval() evaluate |MzScheme| expression
py3eval() evaluate Python expression (|+python3|)
pyeval() evaluate Python expression (|+python|)
+ wordcount() get byte/word/char count of buffer
==============================================================================
*41.7* Defining a function
*** ../vim-7.4.1041/src/eval.c 2016-01-02 20:59:05.607566224 +0100
--- src/eval.c 2016-01-03 22:30:36.714731227 +0100
***************
*** 780,785 ****
--- 780,786 ----
static void f_winsaveview __ARGS((typval_T *argvars, typval_T *rettv));
static void f_winwidth __ARGS((typval_T *argvars, typval_T *rettv));
static void f_writefile __ARGS((typval_T *argvars, typval_T *rettv));
+ static void f_wordcount __ARGS((typval_T *argvars, typval_T *rettv));
static void f_xor __ARGS((typval_T *argvars, typval_T *rettv));
static int list2fpos __ARGS((typval_T *arg, pos_T *posp, int *fnump, colnr_T
*curswantp));
***************
*** 8387,8392 ****
--- 8388,8394 ----
{"winrestview", 1, 1, f_winrestview},
{"winsaveview", 0, 0, f_winsaveview},
{"winwidth", 1, 1, f_winwidth},
+ {"wordcount", 0, 0, f_wordcount},
{"writefile", 2, 3, f_writefile},
{"xor", 2, 2, f_xor},
};
***************
*** 20220,20225 ****
--- 20222,20240 ----
}
/*
+ * "wordcount()" function
+ */
+ static void
+ f_wordcount(argvars, rettv)
+ typval_T *argvars UNUSED;
+ typval_T *rettv;
+ {
+ if (rettv_dict_alloc(rettv) == FAIL)
+ return;
+ cursor_pos_info(rettv->vval.v_dict);
+ }
+
+ /*
* Write list of strings to file
*/
static int
*** ../vim-7.4.1041/src/normal.c 2015-12-05 19:47:00.730636672 +0100
--- src/normal.c 2016-01-03 22:26:33.429386896 +0100
***************
*** 8270,8276 ****
* "g CTRL-G": display info about cursor position
*/
case Ctrl_G:
! cursor_pos_info();
break;
/*
--- 8270,8276 ----
* "g CTRL-G": display info about cursor position
*/
case Ctrl_G:
! cursor_pos_info(NULL);
break;
/*
*** ../vim-7.4.1041/src/ops.c 2016-01-02 17:54:04.419793309 +0100
--- src/ops.c 2016-01-03 22:31:28.042171041 +0100
***************
*** 6963,6977 ****
* Give some info about the position of the cursor (for "g CTRL-G").
* In Visual mode, give some info about the selected region. (In this case,
* the *_count_cursor variables store running totals for the selection.)
*/
void
! cursor_pos_info()
{
char_u *p;
char_u buf1[50];
char_u buf2[40];
linenr_T lnum;
long byte_count = 0;
long byte_count_cursor = 0;
long char_count = 0;
long char_count_cursor = 0;
--- 6963,6980 ----
* Give some info about the position of the cursor (for "g CTRL-G").
* In Visual mode, give some info about the selected region. (In this case,
* the *_count_cursor variables store running totals for the selection.)
+ * When "dict" is not NULL store the info there instead of showing it.
*/
void
! cursor_pos_info(dict)
! dict_T *dict;
{
char_u *p;
char_u buf1[50];
char_u buf2[40];
linenr_T lnum;
long byte_count = 0;
+ long bom_count = 0;
long byte_count_cursor = 0;
long char_count = 0;
long char_count_cursor = 0;
***************
*** 6989,6995 ****
*/
if (curbuf->b_ml.ml_flags & ML_EMPTY)
{
! MSG(_(no_lines_msg));
}
else
{
--- 6992,7002 ----
*/
if (curbuf->b_ml.ml_flags & ML_EMPTY)
{
! if (dict == NULL)
! {
! MSG(_(no_lines_msg));
! return;
! }
}
else
{
***************
*** 7122,7195 ****
if (!curbuf->b_p_eol && (curbuf->b_p_bin || !curbuf->b_p_fixeol))
byte_count -= eol_size;
! if (VIsual_active)
{
! if (VIsual_mode == Ctrl_V && curwin->w_curswant < MAXCOL)
{
! getvcols(curwin, &min_pos, &max_pos, &min_pos.col,
! &max_pos.col);
! vim_snprintf((char *)buf1, sizeof(buf1), _("%ld Cols; "),
! (long)(oparg.end_vcol - oparg.start_vcol + 1));
}
else
! buf1[0] = NUL;
!
! if (char_count_cursor == byte_count_cursor
! && char_count == byte_count)
! vim_snprintf((char *)IObuff, IOSIZE,
! _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld
of %ld Bytes"),
! buf1, line_count_selected,
(long)curbuf->b_ml.ml_line_count,
word_count_cursor, word_count,
byte_count_cursor, byte_count);
! else
! vim_snprintf((char *)IObuff, IOSIZE,
! _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld
of %ld Chars; %ld of %ld Bytes"),
! buf1, line_count_selected,
(long)curbuf->b_ml.ml_line_count,
word_count_cursor, word_count,
char_count_cursor, char_count,
byte_count_cursor, byte_count);
! }
! else
! {
! p = ml_get_curline();
! validate_virtcol();
! col_print(buf1, sizeof(buf1), (int)curwin->w_cursor.col + 1,
! (int)curwin->w_virtcol + 1);
! col_print(buf2, sizeof(buf2), (int)STRLEN(p),
! linetabsize(p));
!
! if (char_count_cursor == byte_count_cursor
! && char_count == byte_count)
! vim_snprintf((char *)IObuff, IOSIZE,
! _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Byte %ld
of %ld"),
! (char *)buf1, (char *)buf2,
! (long)curwin->w_cursor.lnum,
! (long)curbuf->b_ml.ml_line_count,
! word_count_cursor, word_count,
! byte_count_cursor, byte_count);
! else
! vim_snprintf((char *)IObuff, IOSIZE,
! _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Char %ld
of %ld; Byte %ld of %ld"),
! (char *)buf1, (char *)buf2,
! (long)curwin->w_cursor.lnum,
! (long)curbuf->b_ml.ml_line_count,
! word_count_cursor, word_count,
! char_count_cursor, char_count,
! byte_count_cursor, byte_count);
}
#ifdef FEAT_MBYTE
! byte_count = bomb_size();
! if (byte_count > 0)
sprintf((char *)IObuff + STRLEN(IObuff), _("(+%ld for BOM)"),
! byte_count);
#endif
! /* Don't shorten this message, the user asked for it. */
! p = p_shm;
! p_shm = (char_u *)"";
! msg(IObuff);
! p_shm = p;
}
}
--- 7129,7226 ----
if (!curbuf->b_p_eol && (curbuf->b_p_bin || !curbuf->b_p_fixeol))
byte_count -= eol_size;
! if (dict == NULL)
{
! if (VIsual_active)
{
! if (VIsual_mode == Ctrl_V && curwin->w_curswant < MAXCOL)
! {
! getvcols(curwin, &min_pos, &max_pos, &min_pos.col,
!
&max_pos.col);
! vim_snprintf((char *)buf1, sizeof(buf1), _("%ld Cols; "),
! (long)(oparg.end_vcol - oparg.start_vcol + 1));
! }
! else
! buf1[0] = NUL;
!
! if (char_count_cursor == byte_count_cursor
! && char_count == byte_count)
! vim_snprintf((char *)IObuff, IOSIZE,
! _("Selected %s%ld of %ld Lines; %ld of %ld Words;
%ld of %ld Bytes"),
! buf1, line_count_selected,
! (long)curbuf->b_ml.ml_line_count,
! word_count_cursor, word_count,
! byte_count_cursor, byte_count);
! else
! vim_snprintf((char *)IObuff, IOSIZE,
! _("Selected %s%ld of %ld Lines; %ld of %ld Words;
%ld of %ld Chars; %ld of %ld Bytes"),
! buf1, line_count_selected,
! (long)curbuf->b_ml.ml_line_count,
! word_count_cursor, word_count,
! char_count_cursor, char_count,
! byte_count_cursor, byte_count);
}
else
! {
! p = ml_get_curline();
! validate_virtcol();
! col_print(buf1, sizeof(buf1), (int)curwin->w_cursor.col + 1,
! (int)curwin->w_virtcol + 1);
! col_print(buf2, sizeof(buf2), (int)STRLEN(p),
! linetabsize(p));
!
! if (char_count_cursor == byte_count_cursor
! && char_count == byte_count)
! vim_snprintf((char *)IObuff, IOSIZE,
! _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Byte
%ld of %ld"),
! (char *)buf1, (char *)buf2,
! (long)curwin->w_cursor.lnum,
(long)curbuf->b_ml.ml_line_count,
word_count_cursor, word_count,
byte_count_cursor, byte_count);
! else
! vim_snprintf((char *)IObuff, IOSIZE,
! _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Char
%ld of %ld; Byte %ld of %ld"),
! (char *)buf1, (char *)buf2,
! (long)curwin->w_cursor.lnum,
(long)curbuf->b_ml.ml_line_count,
word_count_cursor, word_count,
char_count_cursor, char_count,
byte_count_cursor, byte_count);
! }
}
+ /* Don't shorten this message, the user asked for it. */
#ifdef FEAT_MBYTE
! bom_count = bomb_size();
! if (bom_count > 0)
sprintf((char *)IObuff + STRLEN(IObuff), _("(+%ld for BOM)"),
! bom_count);
#endif
! if (dict == NULL)
! {
! p = p_shm;
! p_shm = (char_u *)"";
! msg(IObuff);
! p_shm = p;
! }
! }
! if (dict != NULL)
! {
! dict_add_nr_str(dict, "words", (long)word_count, NULL);
! dict_add_nr_str(dict, "chars", (long)char_count, NULL);
! dict_add_nr_str(dict, "bytes", (long)byte_count + bom_count, NULL);
! if (VIsual_active)
! {
! dict_add_nr_str(dict, "visual_bytes", (long)byte_count_cursor,
NULL);
! dict_add_nr_str(dict, "visual_chars", (long)char_count_cursor,
NULL);
! dict_add_nr_str(dict, "visual_words", (long)word_count_cursor,
NULL);
! }
! else
! {
! dict_add_nr_str(dict, "cursor_bytes", (long)byte_count_cursor,
NULL);
! dict_add_nr_str(dict, "cursor_chars", (long)char_count_cursor,
NULL);
! dict_add_nr_str(dict, "cursor_words", (long)word_count_cursor,
NULL);
! }
}
}
*** ../vim-7.4.1041/src/proto/ops.pro 2015-06-25 13:57:20.033431073 +0200
--- src/proto/ops.pro 2016-01-03 22:26:33.433386852 +0100
***************
*** 58,62 ****
void write_reg_contents_lst __ARGS((int name, char_u **strings, int maxlen,
int must_append, int yank_type, long block_len));
void write_reg_contents_ex __ARGS((int name, char_u *str, int maxlen, int
must_append, int yank_type, long block_len));
void clear_oparg __ARGS((oparg_T *oap));
! void cursor_pos_info __ARGS((void));
/* vim: set ft=c : */
--- 58,62 ----
void write_reg_contents_lst __ARGS((int name, char_u **strings, int maxlen,
int must_append, int yank_type, long block_len));
void write_reg_contents_ex __ARGS((int name, char_u *str, int maxlen, int
must_append, int yank_type, long block_len));
void clear_oparg __ARGS((oparg_T *oap));
! void cursor_pos_info __ARGS((dict_T *eval));
/* vim: set ft=c : */
*** ../vim-7.4.1041/src/testdir/test_wordcount.in 2016-01-03
22:46:13.980506817 +0100
--- src/testdir/test_wordcount.in 2016-01-03 22:41:46.999418253 +0100
***************
*** 0 ****
--- 1,125 ----
+ Test for wordcount() function
+
+ STARTTEST
+ :so small.vim
+ :so mbyte.vim
+ :set enc=utf8
+ :new
+ :fu DoRecordWin(...)
+ : wincmd k
+ : if exists("a:1")
+ : call cursor(a:1)
+ : endif
+ : let result=[]
+ : call add(result, g:test)
+ : call add(result, getline(1, '$'))
+ : call add(result, wordcount())
+ : wincmd j
+ : return result
+ :endfu
+ :fu PutInWindow(args)
+ : wincmd k
+ : %d _
+ : call append(1, a:args)
+ : wincmd j
+ :endfu
+ :fu Log()
+ : $put ='----'
+ : $put =remove(g:log,0)
+ : $put =string(g:log)
+ :endfu
+ :fu! STL()
+ : if mode() =~? 'V'
+ : let g:visual_stat=wordcount()
+ : endif
+ : return string(wordcount())
+ :endfu
+ :let g:test="Test 1: empty window"
+ :let log=DoRecordWin()
+ :call Log()
+ :"
+ :let g:test="Test 2: some words, cursor at start"
+ :call PutInWindow('one two three')
+ :let log=DoRecordWin([1,1,0])
+ :call Log()
+ :"
+ :let g:test="Test 3: some words, cursor at end"
+ :call PutInWindow('one two three')
+ :let log=DoRecordWin([2,99,0])
+ :call Log()
+ :"
+ :let g:test="Test 4: some words, cursor at end, ve=all"
+ :set ve=all
+ :call PutInWindow('one two three')
+ :let log=DoRecordWin([2,99,0])
+ :call Log()
+ :set ve=
+ :"
+ :let g:test="Test 5: several lines with words"
+ :call PutInWindow(['one two three', 'one two three', 'one two three'])
+ :let log=DoRecordWin([4,99,0])
+ :call Log()
+ :"
+ :let g:test="Test 6: one line with BOM set"
+ :call PutInWindow('one two three')
+ :wincmd k
+ :set bomb
+ :w! Xtest
+ :wincmd j
+ :let log=DoRecordWin([2,99,0])
+ :call Log()
+ :wincmd k
+ :set nobomb
+ :w!
+ :wincmd j
+ :"
+ :let g:test="Test 7: one line with multibyte words"
+ :call PutInWindow(['Äne M¤ne Müh'])
+ :let log=DoRecordWin([2,99,0])
+ :call Log()
+ :"
+ :let g:test="Test 8: several lines with multibyte words"
+ :call PutInWindow(['Äne M¤ne Müh', 'und raus bist dü!'])
+ :let log=DoRecordWin([3,99,0])
+ :call Log()
+ :"
+ :let g:test="Test 9: visual mode, complete buffer"
+ :call PutInWindow(['Äne M¤ne Müh', 'und raus bist dü!'])
+ :wincmd k
+ :set ls=2 stl=%{STL()}
+ :" start visual mode quickly and select complete buffer
+ :0
+ V2jy
+ :set stl= ls=1
+ :let log=DoRecordWin([3,99,0])
+ :let log[2]=g:visual_stat
+ :call Log()
+ :"
+ :let g:test="Test 10: visual mode (empty)"
+ :call PutInWindow(['Äne M¤ne Müh', 'und raus bist dü!'])
+ :wincmd k
+ :set ls=2 stl=%{STL()}
+ :" start visual mode quickly and select complete buffer
+ :0
+ v$y
+ :set stl= ls=1
+ :let log=DoRecordWin([3,99,0])
+ :let log[2]=g:visual_stat
+ :call Log()
+ :"
+ :let g:test="Test 11: visual mode, single line"
+ :call PutInWindow(['Äne M¤ne Müh', 'und raus bist dü!'])
+ :wincmd k
+ :set ls=2 stl=%{STL()}
+ :" start visual mode quickly and select complete buffer
+ :2
+ 0v$y
+ :set stl= ls=1
+ :let log=DoRecordWin([3,99,0])
+ :let log[2]=g:visual_stat
+ :call Log()
+ :"
+ :/^RESULT test/,$w! test.out
+ :qa!
+ ENDTEST
+ RESULT test:
*** ../vim-7.4.1041/src/testdir/test_wordcount.ok 2016-01-03
22:46:13.988506730 +0100
--- src/testdir/test_wordcount.ok 2016-01-03 22:42:07.083199212 +0100
***************
*** 0 ****
--- 1,34 ----
+ RESULT test:
+ ----
+ Test 1: empty window
+ [[''], {'chars': 0, 'cursor_chars': 0, 'words': 0, 'cursor_words': 0,
'bytes': 0, 'cursor_bytes': 0}]
+ ----
+ Test 2: some words, cursor at start
+ [['', 'one two three'], {'chars': 15, 'cursor_chars': 1, 'words': 3,
'cursor_words': 0, 'bytes': 15, 'cursor_bytes': 1}]
+ ----
+ Test 3: some words, cursor at end
+ [['', 'one two three'], {'chars': 15, 'cursor_chars': 14, 'words': 3,
'cursor_words': 3, 'bytes': 15, 'cursor_bytes': 14}]
+ ----
+ Test 4: some words, cursor at end, ve=all
+ [['', 'one two three'], {'chars': 15, 'cursor_chars': 15, 'words': 3,
'cursor_words': 3, 'bytes': 15, 'cursor_bytes': 15}]
+ ----
+ Test 5: several lines with words
+ [['', 'one two three', 'one two three', 'one two three'], {'chars': 43,
'cursor_chars': 42, 'words': 9, 'cursor_words': 9, 'bytes': 43, 'cursor_bytes':
42}]
+ ----
+ Test 6: one line with BOM set
+ [['', 'one two three'], {'chars': 15, 'cursor_chars': 14, 'words': 3,
'cursor_words': 3, 'bytes': 18, 'cursor_bytes': 14}]
+ ----
+ Test 7: one line with multibyte words
+ [['', 'Äne M¤ne Müh'], {'chars': 14, 'cursor_chars': 13, 'words': 3,
'cursor_words': 3, 'bytes': 17, 'cursor_bytes': 16}]
+ ----
+ Test 8: several lines with multibyte words
+ [['', 'Äne M¤ne Müh', 'und raus bist dü!'], {'chars': 32, 'cursor_chars': 31,
'words': 7, 'cursor_words': 7, 'bytes': 36, 'cursor_bytes': 35}]
+ ----
+ Test 9: visual mode, complete buffer
+ [['', 'Äne M¤ne Müh', 'und raus bist dü!'], {'chars': 32, 'words': 7,
'bytes': 36, 'visual_chars': 32, 'visual_words': 7, 'visual_bytes': 36}]
+ ----
+ Test 10: visual mode (empty)
+ [['', 'Äne M¤ne Müh', 'und raus bist dü!'], {'chars': 32, 'words': 7,
'bytes': 36, 'visual_chars': 1, 'visual_words': 0, 'visual_bytes': 1}]
+ ----
+ Test 11: visual mode, single line
+ [['', 'Äne M¤ne Müh', 'und raus bist dü!'], {'chars': 32, 'words': 7,
'bytes': 36, 'visual_chars': 13, 'visual_words': 3, 'visual_bytes': 16}]
*** ../vim-7.4.1041/src/testdir/Make_all.mak 2016-01-01 14:57:46.688558639
+0100
--- src/testdir/Make_all.mak 2016-01-03 22:27:33.164734760 +0100
***************
*** 120,125 ****
--- 120,126 ----
test_tagcase.out \
test_textobjects.out \
test_utf8.out \
+ test_wordcount.out \
test_writefile.out
*** ../vim-7.4.1041/src/version.c 2016-01-03 22:16:16.004130318 +0100
--- src/version.c 2016-01-03 22:24:55.350457735 +0100
***************
*** 743,744 ****
--- 743,746 ----
{ /* Add new patch number below this line */
+ /**/
+ 1042,
/**/
--
LAUNCELOT: Isn't there a St. Aaaaarrrrrrggghhh's in Cornwall?
ARTHUR: No, that's Saint Ives.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.