Vim、词频函数和法语重音

Vim、词频函数和法语重音,vim,diacritics,word-frequency,Vim,Diacritics,Word Frequency,我最近发现了第1531号Vim提示(文件的字频统计) 按照建议,我将以下代码放在我的.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 e

我最近发现了第1531号Vim提示(文件的字频统计)

按照建议,我将以下代码放在我的.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()
函数!WordFrequency()范围
let all=split(join(getline(a:firstline,a:lastline)),“\a\+”)
设频率={}
一言以蔽之
让频率[word]=get(频率,单词,0)+1
外循环
新的
setlocal buftype=nofile bufhidden=hide noswapfile tabstop=20
对于项目中的[键,值](频率)
调用附加(“$”,键“\t”.value)
外循环
第一类
端功能
命令-范围=%WordFrequency,调用WordFrequency()
除了口音和其他法语细节(拉丁小连字a或o等)外,它工作正常

我应该在这个函数中添加什么来满足我的需要


提前感谢

模式
\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
我认为这更接近你想要的


排除标点符号可能需要一些自定义设置。

对于8位字符,您可以尝试将拆分模式从
\A\+
更改为
[^[:alpha:][]\+

首先,谢谢:它很有效。但就为了它,我如何排除撇号(并且,在你的例子中,我得到了Aéritif)首先,谢谢:它是有效的。但仅仅为了它:1)我应该如何排除标点符号(实际上是逗号和点);2) 我应该如何排除撇号(并且,在你的例子中,仅获得apéritif);(3)我应该如何让“emmener”前面列出“éminent”,而不是像单词的所有其他重音首字母一样列在单词列表的末尾?很抱歉,这是一个麻烦(但为什么当你可能令人讨厌的时候,为什么只是让人讨厌?;-))Q1:也许可以在分割之前用正则表达式清理你的选择,然后在第二次传递中删除所有单个字母或无意义的对,如
qu
。问题2:将其添加到用于拆分的模式中,但您必须小心不要拆分像
aujourd'hui
这样的单词。问题3:有关可用的选项,请参见
:帮助排序
。我认为您必须求助于一些外部库/脚本,Vim的
:sort
命令似乎没有太多选项。似乎
$man sort
找到了一个可能的解决方案。@romaini:ib.提出了一个似乎能回答Q1和Q2的建议,如您所述,aujourd'hui除外。至于排序,我将深入研究$man排序。再次感谢。谢谢,这个解决方案回答了我的Q1和Q2问题,当然“aujourd'hui”的romaini指出了一个例外。再次感谢。
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
let wordSeparators = '[[:blank:][:punct:]]\+'