Emacs and Hunspell: рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрддрдиреА рдЬрд╛рдБрдЪ


Hunspell рдЖрдЬ рдЙрдкрд▓рдмреНрдз рд╕рдмрд╕реЗ рд╣реЛрдирд╣рд╛рд░ рдореБрдлреНрдд рд╡рд░реНрддрдиреА рдкрд░реАрдХреНрд╖рдХ рд╣реИред рдпрд╣ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдФрд░ рдУрдкрдирдСрдлрд╝рд┐рд╕ рдЬреИрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХреАрдХреГрдд рд╣реИред рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╢рдмреНрджрдХреЛрд╢ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╣реИред рд▓реЗрдХрд┐рди Emacs рдХреЗ рд╕рд╛рде рджреЛрд╕реНрддреА рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред


Hunspell рд╕реНрдерд╛рдкрдирд╛


рдкрд╣рд▓реА рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╣рдВрд╕реЗрд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдЬрд╛рдиреЗ рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдЯрд╛рд░рдмреЙрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

cd /tmp wget 'http://hunspell.cvs.sourceforge.net/viewvc/hunspell/hunspell/?view=tar' -O hunspell.tgz tar -xzf hunspell.tgz cd hunspell 


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдВрд╕реНрдкреЗрд▓ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ, рдЬреЛ рдлрд┐рд░ рднреА Emacs рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рдХреЛрд▓рд╛рдИ рд╕реБрд╕рдЪреЗрдХреЛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдкреИрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдпрд╣рд╛рдБ рдкреИрдЪ рд▓реЗ рдЖрдУред

рдкреИрдЪ
 --- src/tools/hunspell.cxx~0 2011-01-21 19:01:29.000000000 +0200 +++ src/tools/hunspell.cxx 2013-02-07 10:11:54.443610900 +0200 @@ -710,13 +748,22 @@ if (pos >= 0) { fflush(stdout); } else { char ** wlst = NULL; - int ns = pMS[d]->suggest(&wlst, token); + int byte_offset = parser->get_tokenpos() + pos; + int char_offset = 0; + if (strcmp(io_enc, "UTF-8") == 0) { + for (int i = 0; i < byte_offset; i++) { + if ((buf[i] & 0xc0) != 0x80) + char_offset++; + } + } else { + char_offset = byte_offset; + } + int ns = pMS[d]->suggest(&wlst, chenc(token, io_enc, dic_enc[d])); if (ns == 0) { - fprintf(stdout,"# %s %d", token, - parser->get_tokenpos() + pos); + fprintf(stdout,"# %s %d", token, char_offset); } else { fprintf(stdout,"& %s %d %d: ", token, ns, - parser->get_tokenpos() + pos); + char_offset); fprintf(stdout,"%s", chenc(wlst[0], dic_enc[d], io_enc)); } for (int j = 1; j < ns; j++) { @@ -745,13 +792,23 @@ if (pos >= 0) { if (root) free(root); } else { char ** wlst = NULL; + int byte_offset = parser->get_tokenpos() + pos; + int char_offset = 0; + if (strcmp(io_enc, "UTF-8") == 0) { + for (int i = 0; i < byte_offset; i++) { + if ((buf[i] & 0xc0) != 0x80) + char_offset++; + } + } else { + char_offset = byte_offset; + } int ns = pMS[d]->suggest(&wlst, chenc(token, io_enc, dic_enc[d])); if (ns == 0) { fprintf(stdout,"# %s %d", chenc(token, io_enc, ui_enc), - parser->get_tokenpos() + pos); + char_offset); } else { fprintf(stdout,"& %s %d %d: ", chenc(token, io_enc, ui_enc), ns, - parser->get_tokenpos() + pos); + char_offset); fprintf(stdout,"%s", chenc(wlst[0], dic_enc[d], ui_enc)); } for (int j = 1; j < ns; j++) { 


рдкреИрдЪ рдХреЛ рдлрд╝рд╛рдЗрд▓ /tmp/hunspell/emacs_patch.patch рдкрд░ рд╕рд╣реЗрдЬреЗрдВред рдЕрдм рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

  cd /tmp/hunspell patch src/tools/hunspell.cxx emacs_patch.patch 


рд╕рдм рдХреБрдЫ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрдкрд╕рд░реНрдЧ / usr / рд╕реНрдерд╛рдиреАрдп / рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рдорд╛рдирдХ рд╣рдВрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

  ./configure make sudo make install 



рд╢рдмреНрджрдХреЛрд╢ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдЕрдВрдЧреНрд░реЗрдЬреА рдФрд░ рд░реВрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рдорд╛рдирдХ рд╣рдВрд╕реЗрд▓ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  sudo apt-get install hunspell hunspell-en-us hunspell-ru 



Emacs рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


.Emacs рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:

 ;;     (setq ispell-local-dictionary-alist '(("russian" "[]" "[^]" "[-]" nil ("-d" "ru_RU") nil utf-8) ("english" "[A-Za-z]" "[^A-Za-z]" "[']" nil ("-d" "en_US") nil iso-8859-1))) ;;  aspell  hunspell (setq ispell-really-aspell nil ispell-really-hunspell t) ;;      hunspell (setq ispell-program-name "/usr/local/bin/hunspell") 


рдпрд╣реА рд╣реИ, рдЕрдм рд░реВрд╕реА рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╡рд░реНрддрдиреА рдЬрд╛рдБрдЪ рдкрд░рд┐рдЪрд┐рдд ispell- рдмрдлрд░ рдФрд░ рдлреНрд▓рд╛рдИрд╕реНрдкреЗрд▓-рдореЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

Source: https://habr.com/ru/post/In215055/


All Articles