Vim、词频函数和法语重音
我最近发现了第1531号Vim提示(文件的字频统计) 按照建议,我将以下代码放在我的.vimrc中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
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:]]\+'