νμ¬ μ½λλ λ©ν°λ°μ΄νΈ λ¬Έμμ΄(μ: ASCII λ²μλ₯Ό λλ μ λμ½λ λ¬Έμκ° μλ λ¬Έμμ΄)μ μ§μνμ§ μμ΅λλ€. refreshLineμ μ΄ μ΄λμ ν°ν€μ΄μ 'Ε'κ³Ό κ°μ 2λ°μ΄νΈ λ¬Έμμ λν΄ 1 λμ 2λ₯Ό λ°ννλ strlen()μ μ¬μ©νμ¬ κ³μ°λ©λλ€.
λΌμ΄λΈλ¬λ¦¬λ μ΄ μ²λ¦¬(μμͺ½, μλμͺ½ νμ΄ν, λ¬Έμ μ§μ°κΈ° λ±)λ₯Ό μν λ°μ΄νΈ μ λμ mbstowcs() λλ κΈ°ν ν¨μλ₯Ό μ¬μ©νμ¬ λ¬Έμ μλ₯Ό κ°μ ΈμμΌ ν©λλ€.
λν μ΄λ¬ν κΈ°λ₯μ LC_CTYPEμ λ°λΌ λ€λ₯΄λ―λ‘ linenoiseλ₯Ό μ¬μ©νλ μμ© νλ‘κ·Έλ¨μ΄λ μ¬μ©μλ setlocale(LC_ALL, "")μ νΈμΆνμ¬ μμ© νλ‘κ·Έλ¨μ λ‘μΊμ μμ€ν λ‘μΊλ‘ μ€μ ν΄μΌ ν©λλ€.
κ°μ¬ ν΄μ.
utf-8μ μ§μνλ λ΄ ν¬ν¬ https://github.com/msteveb/linenoiseλ₯Ό μ΄ν΄λ³΄μμμ€.
μ΄ λͺ¨λ κΈ°λ₯μ΄ μ λ§λ‘ νμν©λκΉ? λλ κ·Έ λ΄μ©μ μ΅μνμ§ μμ§λ§ λ¬Έμμ΄μ κΈΈμ΄κ° λ¬Έμμ΄μ λ¬Έμ μμ λμΌνλ€κ³ κ°μ λλ strlen() λμ mbstowcs()λ₯Ό μ¬μ©νμ¬ λͺ κ°μ§ μ΄μν λ¬Έμ λ₯Ό μ½κ² κ³ μ³€μ΅λλ€. νμ§λ§ λ°±μ€νμ΄μ€λ₯Ό μ¬μ©νμ¬ μμ΄λ λ¬Έμ μμ λ₯Ό μμ νλ λ°©λ²μ μ°Ύμ§ λͺ»νμ΅λλ€.
μ¬κΈ°μ μ κ·Ό λ°©μμ utf-8μ λν μμ€ν μ§μμ λν μμ‘΄λλ₯Ό νΌνλ κ²μ λλ€. μλ₯Ό λ€μ΄, μ§λ ¬ ν¬νΈλ₯Ό ν΅ν΄ utf-8 μ½μμ μ¬μ ν ν볡νκ² μ€νν μ μλ λ‘μΌμΌ μ§μ μμ΄ uClibcλ₯Ό μ€ννλ μμ€ν μ΄ μμ΅λλ€. λ¬Όλ‘ λ€λ₯Έ μ κ·Ό λ°©μμ μ·¨νλ κ²λ νμν©λλ€.
λΉμ·ν λ¬Έμ κ° μμ΅λλ€. μ ꡬνμ μν΄ λΌμΈ λ Έμ΄μ¦λ₯Ό μλνμ΅λλ€. μ»¬λ¬ ν둬ννΈλ₯Ό μνλ©΄ μ΄μ€μΌμ΄ν μ½λκ° κΈΈμ΄ κ³μ°μ ν¬ν¨λ©λλ€.
λ κ°λ¨νκ³ μ¬μ΄ μμ μ λ€μμ μννλ κ²μ λλ€.
1) ν둬ννΈμ κΈΈμ΄λ₯Ό μ§μ μ§μ ν μ μμ΅λλ€.
2) ν둬ννΈλ₯Ό μΆλ ₯ν ν ν°λ―Έλ λͺ
λ Ήμ μ¬μ©νμ¬ μ»€μμ μμΉλ₯Ό ββμΆμΆν©λλ€(κ°λ₯νμ§ νμ€νμ§ μμ)
λλ μ΄κ²μ mongo shellμ μ½λμμ μ°Ύλλ€. λ©ν°λ°μ΄νΈ λ¬Έμκ° μμ λ 컀μκ° μ΄μνκ² μμ§μ΄λ CLI λꡬ(mongo, redis-cli, node)κ° μ μ λ λ§μμ§λ©΄ νμ μ§μ¦μ΄ λ©λλ€. λ€λ₯Έ μ¬λλ€μ΄ linenoiseλ λ€λ₯Έ κ²μ μ¬μ©νκ³ μλμ§λ λͺ¨λ₯΄κ² μ§λ§ μ΄ λ¬Έμ κ° ν΄κ²°λμμΌλ©΄ ν©λλ€ :-)
λλΉλ₯Ό μ§μ μ§μ ν μ μλλ‘ μμ λ linenoiseλ₯Ό λ§λ€μμΌλ―λ‘ μμ© νλ‘κ·Έλ¨μ λν μΆκ° μμ μ΄μ§λ§ μ΅μν κ°λ₯ν©λλ€. μ½ 3κ°μ μ λ λ¬Έμ μμ΄ μ¬μ©νκ³ μμ΅λλ€. μλ§λ pull requestλ‘ λ³ννκ² μ΅λλ€.
λ΄ ν¬ν¬μ 'utf-8 μ§μ' λΆκΈ° λ μ΅μ linenoise λ²μ 1.0μ λνλλ λ€μ UTF-8 λ¬Έμ λ₯Ό μμ νμ΅λλ€.
ΓΆ (U+00F6)
oΜ (U+006F U+0308)
ζ₯ζ¬θͺ
('μΌλ³Έμ΄')λλ λ¨Όμ https://github.com/msteveb/linenoiseλ₯Ό μλνμ΅λλ€
μλ νμΈμ, μ λ μ΄ λ¬Έμ λ‘ λ€μκ³Ό κ°μ κΈΈμ κ° μκ°μ νκ³ μμ΅λλ€.
μ΄ λ°©λ²μΌλ‘ μ°λ¦¬λ linenoise λ¨μμ±μ΄ κ±°μ κ·Έλλ‘ μ μ§λλ€λ κ²μ μ»μ΅λλ€. κ·Έλ¬λ μ νμ μΌλ‘ C++
ν¨μ, λ€λ₯Έ μ¬μ©μ μ 곡 ν¨μ, νμ€ ν¨μμ λ€λ₯Έ λ€λ₯Έ μ¬μ©μ μ 곡 ν¨μ, λλ νλ‘μ νΈκ° Cλ‘ λμ΄ μκ³ @yhiroseκ° μ΄λ―Έ μ΄ κ²μ
λΉμ μκ² μλ―Έκ° μμ΅λκΉ? κ°μ¬ ν΄μ.
@antirez , λ©ν°λ°μ΄νΈ μ½λ μ¬μ©μμκ² κ΄μ¬μ κ°μ Έμ£Όμ μ κ°μ¬ν©λλ€! λΉμ μ΄ μ μν μμ΄λμ΄λ λμκ² μμ ν μλ―Έκ° μμ΅λλ€. linenoise λΌμ΄λΈλ¬λ¦¬ μμ²΄κ° νμ₯μ±μ μ 곡ν μ μλ€λ©΄ λ€λ₯Έ λ©ν°λ°μ΄νΈ μΈμ½λ© μ§μμ μ½κ² μΆκ°ν μ μκΈ° λλ¬Έμ λμ± κΈ°μ©λλ€.
λ΄ ν¬ν¬μμ λ³Ό μ μλ―μ΄ 'λ©ν° λ°μ΄νΈ' μ§μμ νμ±ννλ κ°μ₯ μ€μν κ°λ μ ν μ€νΈ λ²νΌμ ' λ°μ΄νΈ μμΉ/λλΉ 'μ νλ©΄μ ' μ΄ μμΉ/λλΉ 'λ₯Ό λͺ ννκ² κ΅¬λΆνλ κ²μ λλ€. λ€μμ UTF-8μ λͺ κ°μ§ μμ λλ€.
γ
(U+3042): E3 81 82
(3λ°μ΄νΈ): μμ΄λ(2μ΄ λλΉ)ΓΆ
(U+00F6): C3 B6
(2λ°μ΄νΈ): μ’μ(1μ΄ λλΉ)oΜ
(U+006F U+0308): 6F CC 88
(3λ°μ΄νΈ): μ’μ(1μ΄ λλΉ)μ°¨μ΄μ μ μκ² λλ©΄ λ©ν°λ°μ΄νΈ μ½λλ₯Ό μ¬λ°λ₯΄κ² μ²λ¦¬νλ κ²μ΄ λ§€μ° μ½μ΅λλ€. 첫 λ²μ§Έ 컀λ°μ λ³κ²½ μ¬νμμ μμ΄λμ΄λ₯Ό νμ ν μ μμ΅λλ€. λ λ²μ§Έ μ»€λ° μμλ ν둬ννΈ ν μ€νΈμ λμΌν μμΉμ μ μ©νμ΅λλ€.
μ°λ¦¬κ° μ£Όμν΄μΌ ν μ μΌν κ³³μ λ©ν°λΌμΈ λͺ¨λ μ²λ¦¬ μ½λμ λλ€. μλ₯Ό λ€μ΄, λ§μ§λ§ λ¬Έμκ° μμ΄λμ΄κ³ νμ¬ νμ 1κ°μ μ΄λ§ λ¨μ μλ κ²½μ° ν΄λΉ μμ΄λ λ¬Έμλ λλ¨Έμ§ κ³΅κ°μ λ§μ§ μμ΅λλ€. λ°λΌμ μμ΄λ λ¬Έμλ λ€μ μ€μ μμ λΆλΆμ νμλμ΄μΌ ν©λλ€. μ΄ μ½λ κ° μ²λ¦¬ν©λλ€.
λ΄κ° ν λ λ€λ₯Έ μΌμ μΈ λ²μ§Έ μ»€λ° μμ μ΄ μμΉ/λλΉλ₯Ό κ³μ°ν λ λͺ¨λ ANSI μ΄μ€μΌμ΄ν μνμ€ λ¬Έμλ₯Ό 건λλ°λ κ²μ λλ€. μ΄ λ³κ²½μ ν΅ν΄ ν둬ννΈ ν μ€νΈμμ μμμ μ¬μ©ν μ μμ΅λλ€.
κ°κΉμ΄ μμΌ λ΄μ μλ‘μ΄ APIλ₯Ό λ³΄κ² λμ΄ λ§€μ° κΈ°μ©λλ€. μ΄ λ¬Έμ μ λν΄ μ§λ¬Έμ΄ μμΌλ©΄ μλ €μ£ΌμΈμ. λλ λΉμ μ΄ νλ₯ν μΌμ ν κ²μ΄λΌκ³ νμ ν©λλ€!!
λμμΈ λͺ©νμ λ°λΌ linenoise μ½λμ UTF-8 μΈμ½λ© μ½λ κ°μ μ’ μμ±μ λν΄ μμΈν μ‘°μ¬ν ν λ€λ₯Έ μΈμ½λ© μ§μμ μΆκ°ν λ μΈ κ°μ§ κΈ°λ₯λ§ νμνλ€λ κ²μ κΉ¨λ¬μμ΅λλ€.
μ°κ΅¬λ₯Ό κΈ°λ°μΌλ‘ λ΄ μ§μ μ μ
λ°μ΄νΈνμ΅λλ€. λ€μμ linenoise ν€λμ utf8-support λΆκΈ° κ°μ μ°¨μ΄μ μ
λλ€. κ±°κΈ°μμ λ³Ό μ μλ―μ΄ linenoise.c
μμ λͺ¨λ UTF-8 νΉμ μ½λλ₯Ό μ κ±°νκ³ encodings/utf8.h
λ° encodings/utf8.c
λ£μμ΅λλ€. λν linenoise.hμ linenoiseSetEncodingFunctions
λΌλ μ€ν APIλ₯Ό μΆκ°νμ¬ μ¬μ©μκ° κ³ μ ν μΈμ½λ© κΈ°λ₯ μΈνΈλ₯Ό μ€μ ν μ μλλ‘ νμ΅λλ€. λͺ¨λ κΈ°λ₯μ΄ μ¬μ ν μλνλ κ²μ νμΈνμ΅λλ€.
λ€μμ νμ¬ μ€νμ© APIμ μ€λν«μ λλ€.
typedef size_t (linenoisePrevCharLen)(const char *buf, size_t buf_len, size_t pos, size_t *col_len);
typedef size_t (linenoiseNextCharLen)(const char *buf, size_t buf_len, size_t pos, size_t *col_len);
typedef size_t (linenoiseReadCode)(int fd, char *buf, size_t buf_len, int* c);
void linenoiseSetEncodingFunctions(
linenoisePrevCharLen *prevCharLenFunc,
linenoiseNextCharLen *nextCharLenFunc,
linenoiseReadCode *readCodeFunc);
linenoisePrevCharLen
λ° linenoiseNextCharLen
λ λ°μ΄νΈ κΈΈμ΄ λ₯Ό λ°ν κ°μΌλ‘ λ°ννκ³ μ΄ κΈΈμ΄ λ₯Ό col_len
맀κ°λ³μλ‘ μ€μ ν©λλ€. linenoiseReadCode
λ°μ΄νΈ λ₯Ό buf
λ‘ μ½κ³ λ°μ΄νΈ λ₯Ό λ³ννκ³ μΈμ½λ©μ μλ―Έ μλ λ¬Έμ μ½λλ₯Ό c
맀κ°λ³μλ‘ μ€μ ν©λλ€.
μ¬μ©μκ° linenoiseSetEncodingFunctions
νΈμΆνμ§ μμΌλ©΄ _default_ ꡬνμ νΈμΆνκ² λ©λλ€. κ·Έλ€μ λ¨μν _1λ°μ΄νΈ_λ₯Ό λ¬Έμλ‘ μ²λ¦¬ν©λλ€.
μ΄ κ²μλ¬Όμ΄ μλ‘μ΄ μΈμ½λ© APIλ₯Ό μ€κ³ν λ λμμ΄ λκΈ°λ₯Ό λ°λλλ€. λλ μ λ§ κ·Έκ²μ κΈ°λνκ³ μλ€!!
@yhirose μ λ§ λ©μ§ μνμ λλ€!!! :-) μ½λλ₯Ό νμΈνκ³ λ³ν©νκ² μ΅λλ€. κ°μ¬ν©λλ€.
μμ§ λ³ν©λμ§ μμμ΅λκΉ?
@antirez λ³ν©μ μ§μ μ΄ μμ΅λκΉ?
'ννΈ' κΈ°λ₯κ³Ό κ°μ μλ linenoiseμ μ΅κ·Ό λ³κ²½ μ¬νμ λ°λΌμ‘κΈ° μν΄ ν¬ν¬(https://github.com/yhrose/linenoise/tree/utf8-support)λ₯Ό μμ νμ΅λλ€.
@yhirose μ λ§ κ°μ¬ν©λλ€. μ’μ μ½λλ₯Ό λ μ λ§λ€μμ΅λλ€! κ·Έλ¦¬κ³ λ΄
λ μ½κ²!
@sonophoto
2016λ 6μ 27μΌ μμμΌ 18:56:45 -0700μ yhiroseλ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.
I have modified my fork
(https://github.com/yrose/linenoise/tree/utf8-support) λ°λΌμ‘κΈ°
'ννΈ'μ κ°μ μλ linenoiseμ μ μ©λ μ΅κ·Ό λ³κ²½ μ¬νμΌλ‘
νΉμ§.
β
μ΄ μ€λ λμ κ°μ
νκΈ° λλ¬Έμ μ΄ λ©μμ§λ₯Ό λ°κ³ μμ΅λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ±°λ GitHubμμ 보거λ μ€λ λλ₯Ό μμκ±°νμΈμ.
*
λ΄ ν¬ν¬(https://github.com/yrose/linenoise/tree/utf8-support)λ μ΄μ μ λμ½λ 9.0μ μ§μν©λλ€.
@antirez κ°κΉμ΄ μ₯λμ @yhirose μ λ©ν°λ°μ΄νΈ μ§μμ λ³ν©ν μμ μκ°μ΄ μμ΅λκΉ? μλλ©΄ κ·ΈλκΉμ§ @yhirose μ ν¬ν¬λ₯Ό μ¬μ©νλλ‘ https://github.com/hoelzro/lua-linenoise λ₯Ό μ νν΄μΌ ν©λκΉ? βοΈ
λ΄ ν¬ν¬(https://github.com/yrose/linenoise/tree/utf8-support)λ μ΄μ μ λμ½λ 11.0μ μ§μνκ³ antirez/linenoise μ λͺ¨λ μ΅κ·Ό λ³κ²½ μ¬νμ ν¬ν¨ν©λλ€.
λ΄ ν¬ν¬(https://github.com/yrose/linenoise/tree/utf8-support)λ μ΄μ μ λμ½λ 12.1μ μ§μν©λλ€.
λ΄ ν¬ν¬(https://github.com/yrose/linenoise/tree/utf8-support)λ μ΄μ μ λμ½λ 13.0μ μ§μν©λλ€.
κ°μ₯ μ μ©ν λκΈ
λ΄ ν¬ν¬(https://github.com/yrose/linenoise/tree/utf8-support)λ μ΄μ μ λμ½λ 11.0μ μ§μνκ³ antirez/linenoise μ λͺ¨λ μ΅κ·Ό λ³κ²½ μ¬νμ ν¬ν¨ν©λλ€.