Monologo indekso » komputilo » ĉi tie
Meti/Demeti ĉapelon pri letero sub kursoro
2014-09-08

Ĉapelo signifas Supersignon, kiu kuniĝas kun letero Esperanta.

Nia ĉi-foja celo estas meti/demeti ĉapelon pri letero sub kursoro, se ĝi estas membro de la ĉapelita grupo (ĉ, ĝ, ĥ, ĵ, ŝ aŭ ŭ) aŭ la senĉapela grupo (c, g, h, j, s aŭ u) inkluzive majusklojn.

Literkodo de teksto estu UTF-8 por uzi la funkcion.

Celo: Meti ĉapelon sur letero sub kursoro. Se jam metita, demeti ĝin.

Motivo: Ĝene estas refoje tajpi, kiam ni erare tajpis inter ĉapelita kaj senĉapela.

Jen malsupre la skripta kodo. Mi komentos nun anstataŭ komentarii.


1.) Funkcio col(".") akiras nombron, kolumno (=column) de kuranta kursoro. La nombro minus 1 estas uzota por referenci signo-ĉenon (=string)

2.) Ekstrakti signon sub la kursoro referenciita per la nombro de kolumno (minus 1) el linio sub la kursoro.

3-a-1.) Se la signo estas senĉapela litero, konstatu ĉapelitan kiel nombron de literkodo en UTF-8 utiligante Liston kaj la funkcion index().

3-a-2.) Substitui per la komando normal la literon al la formo, ^Vu plus nombro de literkodo. Jen aperas ĉapelita litero anstataŭ senĉapela. (^V signifas specialan signon, "Ctrl-v v" en vim.)

3-b-1.) Se la signo ne estas angla litero aŭ numero (t.e. \W en regulesprimo), plenumiĝos ĉi tion. Plurbajta litero okupas paron da lokoj, do esploru, ĉu la paro, signo sub la kursoro kaj la sekva, estas ĉapelita litero.

3-b-2.) Se la respondo estas Jes, konstatu ĝian demetitan literon inverse uzante la funkcion index().

3-a-2.) Substitui per la komando normal la ĉapelitan al la senĉapela.

function! Konverti()
let l:pos = col(".") - 1
let l:teksto = getline(".")
let l:signo = ""
let l:rezulto = ""

if l:teksto[l:pos] =~ '["c","g","h","j","s","u"]'
let l:signo = l:teksto[l:pos]
if l:signo =~ '\l'
let l:rezulto = ["0109","011d","0125","0135","015d","016d"][index(["c","g","h","j","s","u"], l:signo)]
else
let l:rezulto = ["0108","011c","0124","0134","015c","016c"][index(["C","G","H","J","S","U"], l:signo)]
endif
exec 'normal! r^Vu' .l:rezulto
return l:rezulto
elseif l:teksto[l:pos] =~ '\W'
if l:teksto[l:pos : l:pos + 1] !~ '["ĉ","ĝ","ĥ","ĵ","ŝ","ŭ"]'
return -1
endif
let l:signo = l:teksto[l:pos : l:pos + 1]
if match(["ĉ","ĝ","ĥ","ĵ","ŝ","ŭ"], '\C' .l:signo) != -1
let l:rezulto = ["c","g","h","j","s","u"][index(["ĉ","ĝ","ĥ","ĵ","ŝ","ŭ"], l:signo)]
else
let l:rezulto = ["C","G","H","J","S","U"][index(["Ĉ","Ĝ","Ĥ","Ĵ","Ŝ","Ŭ"], l:signo)]
endif
exec 'normal! r' .l:rezulto
return l:rezulto
endif

return 0
endfunction

Rilatigu la funkcion al iu klavo. Jene mi rilatigis ĝin al komo. En tiu okazo se oni tajpis komon en normala modo, litero sub la kursoro ŝanĝiĝas inter ĉapelita kaj senĉapela.

nnoremap <silent> , :call Konverti()<CR>
« reen
inserted by FC2 system