Linenoise: Ctrl์„ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 11์›” 24์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: antirez/linenoise

์ด ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ค„์„ ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹œํ–‰ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ชจ๋“  8 ๋Œ“๊ธ€

A: ์ด๊ฒƒ์€ POSIX/UNIX์˜ ์ผ๋ฐ˜์ ์ธ ์ด๋™ ๋ช…๋ น์ด ์•„๋‹™๋‹ˆ๋‹ค. Linenoise๋Š” 100% POSIX์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์„ ์ž์‹ ์˜ linenoise ์‚ฌ๋ณธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค. linenoise๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฐ์ €๋Ÿฐ ์ด์œ ๋กœ ๊ทธ๊ฒƒ์„ ํ•ดํ‚นํ•ฉ๋‹ˆ๋‹ค. ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Win/Unix/Emacs์—์„œ ์ œ์–ด ํ‚ค ์‚ฌ์šฉ์„ ๋น„๊ตํ•˜๋Š” ์ฐจํŠธ์ž…๋‹ˆ๋‹ค. https://en.wikipedia.org/wiki/Control_key


๋ฌด์—‡์„ ํ• ๊นŒ์š”?

linenoise.c์˜ 41๋ฒˆ ์ค„์—์„œ ์ปค์„œ๊ฐ€ ์ œ์–ด๋˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ธ # 768์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
์ •์  int linenoiseEdit(int stdin_fd, int stdout_fd, char *buf, size_t buflen, const char *prompt)

ํŽธ์ง‘ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด ๊ธฐ๋Šฅ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ API ํ˜ธ์ถœ๋กœ ์—ฌ๋Ÿฌ ์ค„ ํŽธ์ง‘์„ ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

linenoiseSetMultiLine(1);

๋„์›€์ด ๋˜์…จ๊ธธ ๋ฐ”๋ผ๋ฉฐ ์ฆ๊ฑฐ์šด ์ถ”์ˆ˜๊ฐ์‚ฌ์ ˆ ๋˜์„ธ์š”! (์–ด๋””์— ์žˆ๋”๋ผ๋„ :-)

์ด๊ฒƒ์€ #64 ๋ฐ #92์™€ ๊ฐ™์€ ์•„์ด๋””์–ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” linenoise๊ฐ€ POSIX์— ์˜ํ•ด ์ •์˜๋œ ๋ผ์ธ ํŽธ์ง‘ ๊ธฐ๋Šฅ์œผ๋กœ ์ œํ•œ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  vi/emacs/readline back-word ๋ฐ ์ˆœ๋ฐฉํ–ฅ ๋‹จ์–ด ์‹œํ€€์Šค). linenoise๊ฐ€ POSIX ํ™˜๊ฒฝ์— ์˜์กดํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด๋Š” OS๋ณ„ ํ˜ธ์ถœ์—์„œ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋‚ด๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. control+left๊ฐ€ ์ œ์–ด ๋ฌธ์ž์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(ctrl+a๊ฐ€ \01์— ํ•ด๋‹นํ•˜๋Š” ๋ฐฉ์‹ ๋“ฑ). ๋งŽ์€ ํ„ฐ๋ฏธ๋„ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์ด์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์˜ˆ \033[1;5D ๋˜๋Š” \033f ). ์ผ๋ถ€ ๋ผ์ธ ํŽธ์ง‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹จ์–ด๋ณ„๋กœ ์•ž/๋’ค๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ด๊ฒƒ์ด ์ด ๋ฌธ์ œ๊ฐ€ ์‹œ์‚ฌํ•˜๋Š” ๋ฐ”๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

POSIX๊ฐ€ ์ •์˜ํ•˜๋Š”(n't) ์ค„ ํŽธ์ง‘ ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค๋ฅผ ๋‚˜์—ดํ•˜๋Š” ํ•ญ๋ชฉ์„ ๋ฐœ๊ฒฌํ–ˆ๊ฑฐ๋‚˜ linenoise๊ฐ€ POSIX ํ‘œ์ค€์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ํ•ญ๋ชฉ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‚ด์šฉ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์œ„์—์„œ ๋งํฌํ•œ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ POSIX๋ฅผ ์ฐธ์กฐํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ท€ํ•˜์˜ ์š”์ ์„ ์•Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ctrl+left/right๋ฅผ ์ฐฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ผ๋ถ€ ์‹œํ€€์Šค๋Š” ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Š” ํ‚ค ์กฐํ•ฉ ๋˜๋Š” readline ๋ฐ”์ธ๋”ฉ์˜ ์ „์ฒด ๋ชฉ๋ก์ด ์•„๋‹™๋‹ˆ๋‹ค. readline์€ esc-b/f(๋ฐ ๊ธฐํƒ€ ๋” ๊ธด ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค)๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฑฐ๊ธฐ์— ๋‚˜์—ด๋˜์ง€ ์•Š์€ back/forward-word์— ๋ฐ”์ธ๋”ฉํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

JelteF๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์ž…๋ ฅ ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค linenoise ํ•ธ๋“ค ํ™•์žฅ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: ํ™”์‚ดํ‘œ ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์—ฌ ์ƒ์„ฑ๋œ ์‹œํ€€์Šค). ์ถœ๋ ฅ ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค(์˜ˆ: ์‹ค์ œ๋กœ ์ปค์„œ๋ฅผ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ์ถœ๋ ฅ์œผ๋กœ ์ „์†ก๋œ ์‹œํ€€์Šค)๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. . ๋‚˜๋Š” termcap์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด linenoise์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜๊ณ , linenoise๊ฐ€ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ ์€ ์ˆ˜์˜ ๋ช…๋ น์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค๋Š” ์‚ฌ์‹ค์— ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ @JelteF ๋Š” ์ด ๊ธฐ๋Šฅ ์š”์ฒญ์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์š”๊ตฌํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. linenoiseEdit()์—์„œ ๋‘ ๊ฐœ์˜ ์ถ”๊ฐ€ ์‹œํ€€์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ctrl-left ๋˜๋Š” ctrl-right ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ํ•œ ๋‹จ์–ด๋ฅผ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ(๊ฐ๊ฐ ํ•ด๋‹นํ•˜๋Š” ๊ธด ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค \033[5;D ๋ฐ C ์‚ฌ์šฉ) OCaml ๋ฐ”์ธ๋”ฉ์— ํ•ด๋‹น ํŒจ์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/fxfactorial/ocaml-linenoise/commit/c3d130cd62419ed3e77203bea392b12830c3e593

@c-cube๋‹˜ ๋ง์”€์ด ๋งž๋„ค์š”. ๋ฏธ๋ฆฌ ๋‹ต๋ณ€๋“œ๋ฆฌ์ง€ ๋ชปํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

ํ•˜ํ•˜ 1๋…„ ๋ฐ˜๋ฐ–์— ์•ˆ๋๋Š”๋ฐ ์ธํ„ฐ๋„ท ์‹œ๊ฐ„์— ์•„๋ฌด๊ฒƒ๋„ ์•„๋‹ˆ๋„ค์š”. ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ linenoiseEdit()์—๋„ ์žˆ์Šต๋‹ˆ๋‹ค. @c-cube ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :+1:

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰