我最近发现了Vim Tip n°1531(文件的字频统计信息)。
根据建议,我将以下代码放在我的.vimrc
中function! WordFrequency() range
let all = split(join(getline(a:firstline, a:lastline)), '\A\+')
let frequencies = {}
for word in all
let frequencies[word] = get(frequencies, word, 0) + 1
endfor
new
setlocal buftype=nofile bufhidden=hide noswapfile tabstop=20
for [key,value] in items(frequencies)
call append('$', key."\t".value)
endfor
sort i
endfunction
command! -range=% WordFrequency <line1>,<line2>call WordFrequency()
除了口音和其他法语细节(拉丁小结扎a或o等等)外,它的效果很好。
我应该在此功能中添加什么才能满足我的需求?
提前致谢
答案 0 :(得分:3)
模式\A\+
匹配任意数量的连续非字母字符 - 不幸的是 - 包括多字节字符,如我们心爱的çàéô
和朋友。
这意味着您的文本在空格和多字节字符处分割。
使用\A\+
,短语
Rendez-vous après l'apéritif.
给出:
ap 1
apr 1
l 1
Rendez 1
ritif 1
s 1
vous 1
如果您确定您的文字不包含花哨空格,您可以将此模式替换为仅匹配空格的\s\+
,但它可能更自由。
使用此模式\s\+
,相同的短语给出:
après 1
l'apéritif. 1
Rendez-vous 1
我认为,这更接近你想要的东西。
可能需要进行一些自定义以排除标点符号。
答案 1 :(得分:3)
对于8位字符,您可以尝试将分割模式从\A\+
更改为
[^[:alpha:]]\+
。
答案 2 :(得分:0)
function! WordFrequency() range
" Whitespace and all punctuation characters except dash and single quote
let wordSeparators = '[[:blank:],.;:!?%#*+^@&/~_|=<>\[\](){}]\+'
let all = split(join(getline(a:firstline, a:lastline)), wordSeparators)
"...
endfunction
如果all punctuation characters应该是单词分隔符,则表达式会缩短为
let wordSeparators = '[[:blank:][:punct:]]\+'