You probably don't need to know this because it won't update at any point, but in case you want to make your own confusable list.
First, go on https://lookout.net/test/confusablesjs/ (https://web.archive.org/web/20191220151912im_/https://lookout.net/test/confusablesjs/ if it's down)
Then, run this in the JS console:
document.body.innerHTML=`
Key combo: <input id=keyinput value="<Multi_key> <Down>"> <button onclick=changekey()>Change</button>
<h2>Cyrillic base list</h2>
<textarea id=output1 style="width:600px;height:400px;font-family:sans-serif;"></textarea>
<br>
<h3>Generate all for character (select one to put in .XCompose)</h3>
Character: <input id=charinput maxlength=1 style="width:1em" /> <button onclick=gac()>Gen</button><br>
<textarea id=output2 style="width:600px;height:400px;font-family:sans-serif;"></textarea>
`
keycombo = "<Multi_key> <Down>"
ranges = [
[[0x0,0x7F], "Basic Latin"],
[[0x80,0x2AF], "Latin supplement"],
[[0x370,0x3FF], "Greek"],
[[0x400,0x4FF], "Cyrillic"],
[[0x500,0x52F], "Cyrillic (supplement)"],
[[0x530,0x58F], "Armenian"],
[[0xFF00,0xFFEF], "Full-width"]
]
rangeTest = i=>{
var o = ranges.find(x=>(i>=x[0][0]&&i<=x[0][1]))
if(o&&o.length)return o[1]
else return "Unknown"
}
getCon = (codepoint,filter)=>(confusables.data.characters[confusables.data.index[codepoint]]||[]).filter(filter).map(x=>String.fromCharCode(x))||[]
function gen(char,filter=(x=>x!==codepoint)) {
list = []
codepoint = char.codePointAt(0)
con = getCon(codepoint,filter)
if(con.length==0){return []}
con.forEach(c=>{
list.push(`${keycombo} <${char}> : "${c}" # ${rangeTest(c.codePointAt(0))} lookalike U+${c.codePointAt(0).toString(16).padStart(4,'0')}`)
})
return list;
}
function updateCyr() {
cyrillicList = ""
missed = []
for(var i=0x41;i<0x7b;i++) {
if(i>0x5a&&i<0x61){continue;}
cyr = gen(String.fromCharCode(i), (c=>rangeTest(c)=='Cyrillic'))[0]
if(cyr) cyrillicList += cyr+'\n'
else continue
}
console.log(output1.value=cyrillicList)
}
charinput.onkeyup = function(e){console.log(e.target.value);gac();return true}
function gac() {
console.log(output2.value = gen(charinput.value).join`\n`||`# none found for ${charinput.value}`)
}
keyinput.onkeydown = function(e){if(e.keyCode==13)changekey();return true}
function changekey() {
keycombo = keyinput.value.trim()
updateCyr()
if(charinput.value){gac()}
}
updateCyr()
This isn't exactly how I did it, but it's the things I did compiled in an easy way to do em yourself.
Note that this doesn't properly replace "<->" with "" or "<>>" with "" in the "generate all for char" field. Sorry if that's a dealbreaker, but that's a ton of work for not much of a payoff.