Vim,单词频率功能和法语口音

时间:2011-09-23 07:48:52

标签: vim diacritics word-frequency

我最近发现了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等等)外,它的效果很好。

我应该在此功能中添加什么才能满足我的需求?

提前致谢

3 个答案:

答案 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:]]\+'