Terminal: [Conpty] ๋งˆ์šฐ์Šค ์ž…๋ ฅ ์ง€์› ์ถ”๊ฐ€

์— ๋งŒ๋“  2019๋…„ 02์›” 18์ผ  ยท  48์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/terminal

์ผœ์ง: Microsoft Windows [Version 10.0.17763.134]

ํ„ฐ๋ฏธ๋„ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ conpty๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/wez/wezterm

cmd.exe powershell.exe ๋ฐ bash ์™€ ๊ฐ™์€ ์ฝ˜์†” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด target\debug\wezterm.exe ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋Š” ๊ฐ„์ ‘์ ์œผ๋กœ cmd.exe ๋ฅผ ํ†ตํ•ด ๋˜๋Š” bash ์‹คํ–‰๊ธฐ๋ฅผ ํ†ตํ•ด ์ง์ ‘ bash๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ conpty๊ฐ€ ๋งˆ์šฐ์Šค ๋ณด๊ณ  ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค๋ฅผ ์‚ผํ‚ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ๋‚ด ํ„ฐ๋ฏธ๋„ ํŒŒ์„œ ์ˆ˜์‹ , ๋”ฐ๋ผ์„œ๋˜๊ณ  ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค vim ๋กœ ๊ตฌ์„ฑ๋˜์–ด์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํšจ๊ณผ์ ์ธ ๋งˆ์šฐ์Šค ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค set mouse=a .

wsl-terminal ๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ WSL ์„ค์น˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ž‘๋™ํ•˜๋Š” ๋งˆ์šฐ์Šค ์ง€์›์ด ์žˆ์œผ๋ฉฐ wezterm ๋Š” ์ž‘๋™ํ•˜๋Š” ๋งˆ์šฐ์Šค ์ง€์›๊ณผ ํ•จ๊ป˜ ์•ฝ 1๋…„ ๋™์•ˆ Linux์—์„œ ์ผ์ƒ์ ์ธ ๋“œ๋ผ์ด๋ฒ„์˜€์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ฐฑํ•œ ์ž˜๋ชป๋œ ๊ตฌ์„ฑ์„ ๋ฐฐ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. vim ๋ฐ wezterm ์˜ ํŒŒ์„œ.

๋˜ํ•œ ์‰˜์—์„œ ๋งˆ์šฐ์Šค ๋ณด๊ณ ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด echo -e "\e[?1000h" ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ (๋ฆฌ๋ˆ…์Šค์—์„œ ๊ทธ๋ฆฌ๊ณ  wsl-terminal์„ ํ†ตํ•ด) ์ด๊ฒƒ์€ ํ„ฐ๋ฏธ๋„์—์„œ ํด๋ฆญ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์‰˜๋กœ ๋ณด๋‚ด๊ฒŒ ๋˜์ง€๋งŒ(๊ฐ€๋น„์ง€ ์ž…๋ ฅ์œผ๋กœ ๋‚˜ํƒ€๋‚จ), ๋‚ด ํ„ฐ๋ฏธ๋„์„ conpty๋กœ ์‹คํ–‰ํ•  ๋•Œ ์ด๊ฒƒ๋“ค๋„ ์–ด๋”˜๊ฐ€์— ์‚ผ์ผœ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์šฐ์Šค์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚ด pty์— ์ƒ์„ฑํ•˜๋Š” ์•ฑ์— ํŠน๋ณ„ํ•œ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์ฝ”๋“œ์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ํ™•์ธํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ด€๋ จ ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://github.com/wez/wezterm/blob/master/src/winpty.rs
ํ๋ฆ„์€ CreatePipe ํŒŒ์ดํ”„ ์Œ CreatePseudoConsole ๋กœ ์ด๋™ํ•œ ๋‹ค์Œ, MSDN ๋ฌธ์„œ ๋ฐ ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ์ƒ˜ํ”Œ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ threadproc ์†์„ฑ์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ž์‹์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

Area-Interop Issue-Feature Product-Conpty

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ฐธ๊ณ ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•˜๊ณ  ์žˆ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›(/cc @SamuelEnglad!)์„ ์œ„ํ•ด ๊ณต์‹์ ์œผ๋กœ ๊ฐœ๋ฐœํŒ€์—์„œ ์ž‘์—…์„ ์˜ˆ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹น์‹ ์˜ ๋ฐœ์„ ๋ฐŸ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

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

์•ˆ๋…•ํ•˜์„ธ์š” @wez ,
์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ๋„ ConPTY๋Š” ๋งˆ์šฐ์Šค ๋ณด๊ณ ์„œ(๋˜๋Š” ํ˜ธ์ŠคํŒ…๋œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ _๋งˆ์šฐ์Šค ๋ณด๊ณ  ์š”์ฒญ_)๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์ถ”์ ํ•˜๋Š” ๋ฐฑ๋กœ๊ทธ ํ•ญ๋ชฉ์ด ์žˆ์–ด ๊ณง ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์ธ์ฝ”๋”ฉ๋œ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ๋‹ค์Œ์„ ํ†ตํ•ด ์ „๋‹ฌํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ConPTY๋Š” ํ‘œ์ค€ Windows ์ฝ˜์†” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ˜ธ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— MOUSE_EVENT ReadConsoleInput ๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ฌ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆ์—ญ์„ ์ข€ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๋ชจ๋“  ์ธก๋ฉด์—์„œ ์˜์‚ฌ ์ฝ˜์†”์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.


์ถ”์ : MSFT:20469462

@DHowett-MSFT ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
๋งˆ์šฐ์Šค ๋ณด๊ณ  ๊ธฐ๋Šฅ์ด ์•„์ง ์—†๋‹ค๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ์•„์‰ฝ๊ธด ํ•˜์ง€๋งŒ, ๋‚˜๋จธ์ง€ pty ํ•ญ๋ชฉ์ด ์ง€๊ธˆ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค!

ConPTY๋กœ ๋งˆ์šฐ์Šค ์ง€์›์„ ์ •๋ง๋กœ ์›ํ•˜๋Š” ๊ฒƒ ์™ธ์— ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. alacritty + ssh + tmux๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ConPTY๋ฅผ ์ง€์›ํ•˜๋Š” alacritty์™€ ํ•จ๊ป˜ Windows์˜ ๋†€๋ผ์šด Linux ํ„ฐ๋ฏธ๋„์€ ์ด์ œ ๋งˆ์šฐ์Šค ์ง€์›๋งŒ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” Ubuntu bash ์…ธ์—์„œ ์ž์ • ์‚ฌ๋ น๊ด€์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ Windows ํ„ฐ๋ฏธ๋„ 0.3.2171.0์˜ Ubuntu ์…ธ ํƒญ์€ mc ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚˜ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฒ„๊ทธ๋ฅผ ๊ฒŒ์‹œํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์ด๊ฒƒ์„ ๋ณต์ œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ vim ๋ฐ tmux์— ๋Œ€ํ•œ ์ข‹์€ ๊ฒฝํ—˜์„ ์œ„ํ•ด ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋Œ€ํ•œ ์ง€์›๊ณผ ์•ฝ๊ฐ„์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. ์ง€๋‚œ ๋‹ฌ์— ์ €๋Š” ์ด์ค‘ ๋ถ€ํŒ…์„ ์ค‘๋‹จํ•˜๊ณ  Windows 10 ๋‚ด๋ถ€์ž ๋นŒ๋“œ "๋น ๋ฅธ" ๋ง์„ ๊ธฐ๋ณธ ๊ฐœ์ธ ์ปดํ“จํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” wsl2๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ณ , x410์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ณ , microsoft ํ„ฐ๋ฏธ๋„์ด ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ณ , Visual Studio ์ฝ”๋“œ wsl2 interop์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ณ , explorer.exe interop์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋งˆ์šฐ์Šค ์ž…๋ ฅ ํ‹ฐ์ผ“์€ ๋ณ„๋„์˜ ํŒŒํ‹ฐ์…˜/๊ฐœ๋ฐœ ์ƒ์ž๊ฐ€ ์žˆ๋Š” ํ•ฉ๋ฆฌ์ ์ธ ๋Œ€์ฒดํ’ˆ์œผ๋กœ wsl2/microsoft ํ„ฐ๋ฏธ๋„์„ ํ˜ธ์ถœํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฑฐ์˜ ์œ ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์ผ๋ถ€ ์ง€์ ์€ ์˜คํ”ˆ ์†Œ์Šค์ด๋ฏ€๋กœ /dev ์–ด๋”˜๊ฐ€์—์„œ ๋งˆ์šฐ์Šค ์žฅ์น˜ ์ž…๋ ฅ์„ ๋ณด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ๋ฉˆ์ถฐ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ž˜๋„ ์ด ๋ชจ๋“  ๊ฒƒ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๋‹ค๋ฅธ ์ ์€ ์ •๋ง ๋งˆ์Œ์— ๋“ค์–ด์š” :)

๋งˆ์šฐ์Šค ์ง€์›์ด ๋งค์šฐ ๋‹ฌ์ฝคํ•˜๊ณ  tmux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๊ทธ๋ฆฌ์›Œํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ง/์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ ๋” ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์šฐ์Šค ์ง€์›์„ ํ™œ์„ฑํ™”ํ•ด์ฃผ์„ธ์š” ๐Ÿ˜„

@DHowett-MSFT, ์ž”์†Œ๋ฆฌ์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๊ณง ๊ณ ์น  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๋ฌธ์ œ์— ํ• ๋‹น๋œ ๋ ˆ์ด๋ธ”/์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ณด์ง€๋งŒ ์ด๊ฒƒ์€ ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ํ™•์ธ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@damnskippy ์šฐ์„ ์ˆœ์œ„๋Š” ์ธ๋ฐ•์Šค Windows ์ฝ˜์†” ํ˜ธ์ŠคํŠธ์—์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์‚ฌํ•ญ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค(๋‚ด๋ถ€ ๋ฒ„๊ทธ ๋งˆ๊ฐ์œผ๋กœ ์ธํ•ด). ์ด๊ฒƒ์€ _๊ฑฐ๋Œ€ํ•œ_ ๊ธฐ๋Šฅ์ด๋ฉฐ(๊ทธ๋ฆฌ๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์กฐ์ •๋œ ์‚ฌ์–‘์ด ํ•„์š”ํ•จ) v1.0์— ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ํ˜„์žฌ ์ ๊ทน์ ์œผ๋กœ ์ž‘์—…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฒ„๊ทธ์ฒ˜๋Ÿผ "์ˆ˜์ •"ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹๊ฒ ์ง€๋งŒ ์ˆ˜์ • ์ด์ƒ์˜ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์—ฌ๊ธฐ์„œ ํ•˜๋Š” ์ผ์„ ์‚ฌ๋ž‘ํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ๋งˆ์šฐ์Šค ์ง€์›์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ์ด ํ„ฐ๋ฏธ๋„์˜ ๋ชฉ์ ์„ ๋‹ค์†Œ ๋ฌด๋„ˆ๋œจ๋ฆฌ๋Š” ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„๋กœ ์ด ํ„ฐ๋ฏธ๋„์„ ์นญ์ฐฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์—†๋Š” ๋ฏธ๋“œ๋‚˜์ž‡ ์ปค๋งจ๋”๋Š” ์•…๋ชฝ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋งˆ์šฐ์Šค ์ž…๋ ฅ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Windows ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” DosBox ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๋ฐ ํ”„๋กœํ•„์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” vim์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค ์ง€์›๋„ ๊ทธ๋ฆฌ์›Œ์š” ๐Ÿ˜ข

๋ฐฉ๊ธˆ @cinnamon-msft ๋ธ”๋กœ๊ทธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ํŒ€์ด ์˜ฌํ•ด ๋ง๊นŒ์ง€ 1.0์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์˜ฌํ•ด ๋ง๊นŒ์ง€ ๋งˆ์šฐ์Šค ์ง€์›์„ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ ํ™œ๋ฐœํžˆ ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์˜ฌํ•ด ๋ง๊นŒ์ง€ ๋งˆ์šฐ์Šค ์ง€์›์„ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์•„๋งˆ๋„, ํ•˜์ง€๋งŒ ํ•˜๋“œ ์ปค๋ฐ‹์€ ์—†์Šต๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ถ”์ •ํ•˜๋Š” ๊ฒƒ์€ P==NP๋ฅผ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ๋งŒํผ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—†์œผ๋ฉด ํ„ฐ๋ฏธ๋„์€ 1.0 ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ ํ™œ๋ฐœํžˆ ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์ž‘์—…์— ํ• ๋‹น๋˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํŒ€์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž‘์—…์„ ์ค‘๋‹จํ•˜๋ฉด ์Šค์Šค๋กœ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ๊ธฐ์‹ฌ์— ์—ฌ๊ธฐ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•ผ์‹ฌ ์ฐฌ (์ฝ๊ธฐ : ๋ฏธ์นœ) ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ฐ›์•„ PR์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก , ์•ผ์‹ฌ ์ฐฌ ์‚ฌ๋žŒ์€ ์Šค์Šค๋กœ ์ด๊ฒƒ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ• ๊นŒ์š”?

๋จผ์ € ๋ฒ”์œ„๋ฅผ ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค ์ž…๋ ฅ์œผ๋กœ ํ•ด์•ผ ํ•  ์ผ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๊ฒŒ ์‹œ์ž‘ํ•˜์—ฌ ์™„์ „ํ•œ ์†”๋ฃจ์…˜์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์กฐ๊ฐ์„ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—…ํ•ด์•ผ ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ž‘์—…์€ ๋‹จ์ˆœํ•œ SGR ์ธ์ฝ”๋”ฉ ๋งˆ์šฐ์Šค ์—…/๋‹ค์šด ์‹œํ€€์Šค๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋งˆ์šฐ์Šค ํœ  ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ ํ›„์— ๋งˆ์šฐ์Šค๋ฅผ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ ํด๋ฆญํ•˜๋ฉด _๋Œ€๋ถ€๋ถ„์˜_ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

InputStateMachineEngine.cpp๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค. InputStateMachineEngine ๋Š” conpty๋ฅผ ํ†ตํ•ด ์ „์†ก๋œ ์ž…๋ ฅ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์ด๋ฅผ INPUT_RECORD ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ง„์ทจ์ ์ธ ์ Š์€ ๊ฐœ๋ฐœ์ž๋Š” ํ•ด๋‹น ๋งˆ์šฐ์Šค ์‹œํ€€์Šค๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  INPUT_RECORD ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. INPUT_RECORD ๊ฐ€ ์žˆ์œผ๋ฉด InteractDispatch::WriteInput ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด INPUT_RECORD ๊ฐ€ ์ž…๋ ฅ ๋ฒ„ํผ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ ๋ฒ„ํผ์— ์žˆ์œผ๋ฉด ์—ฐ๊ฒฐ๋œ ์ฝ˜์†” ํด๋ผ์ด์–ธํŠธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์ •์ƒ์ ์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฃผ์˜ํ•  ์ :

  • conhost๋Š” ๋งˆ์šฐ์Šค ์ž…๋ ฅ ๋ชจ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด MouseEvents๋ฅผ ๋ฒ„ํผ์— ์ „ํ˜€ ์‚ฝ์ž…ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์‹œํ€€์Šค๋„ ๋ฌด์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • VT์—์„œ ๋งˆ์šฐ์Šค ์ž…๋ ฅ์„ ์›ํ•˜๋Š” ์•ฑ์€ INPUT_RECORD ์ŠคํŠธ๋ฆผ์ด ์•„๋‹ˆ๋ผ ๋ฌธ์ž ์ŠคํŠธ๋ฆผ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด VT ๋งˆ์šฐ์Šค ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ conhost์˜ ํŠน์ • ์ง€์ ์—์„œ ํ•ด๋‹น ๋งˆ์šฐ์Šค INPUT_RECORD ๋ฅผ ๋ฌธ์ž ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๊ฐ€ ๋ฒ„ํผ์— ์žˆ๊ธฐ _์ „์—_ ๋ฒˆ์—ญ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์œ„์˜ ์ž‘์—…์ด VT ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฝ๊ธฐ: wsl ). ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ, ์šฐ๋ฆฌ๋Š” ๋งˆ์šฐ์Šค์—์„œ ๋ฒˆ์—ญ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค INPUT_RECORD VT-์ธ์ฝ”๋”ฉ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๊ฐ€์— ์˜ํ•ด ์ƒ์„ฑ ๋œ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ InputStateMachineEngine .

    • ์ข€ ๋” ๋“ค์—ฌ๋‹ค๋ณด๋ฉด ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ฐฝ์— ์˜ํ•ด ์‹œ์ž‘๋œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋งˆ์šฐ์Šค ์ž…๋ ฅ๋งŒ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

      https://github.com/microsoft/terminal/blob/2c8b3243dca0c48dd05ecd7b420a7a03b3e19c93/src/interactivity/win32/windowio.cpp#L113 -L129

      terminalMouseInput.HandleMouse ๋Š” ํด๋ผ์ด์–ธํŠธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ VT ์‹œํ€€์Šค๋ฅผ ํ•ฉ์„ฑํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์ฐฝ ํ”„๋กœ์„ธ์Šค์—์„œ๋งŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ InputStateMachineEngine ์ด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์–ด๋–ป๊ฒŒ๋“  ๋…ธ์ถœํ•ด์•ผ ํ•˜๊ณ ( InteractDispatch ์˜ ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด) ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ ์ ˆํ•œ INPUT_RECORD ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ๊ธฐ์ˆ ์ ์œผ๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ terminalMouseInput.HandleMouse ํ˜ธ์ถœ์„ InputBuffer ์ฝ๊ธฐ๋กœ ์˜ฎ๊ธฐ๊ณ  INPUT_RECORD ์ฝ์„ ๋•Œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฒˆ์—ญํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? ๋งˆ์šฐ์Šค๋Š” ๊ณ ๋Œ€ Windows ์ฝ˜์†”์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ์ฝ˜์†”์„ ๊ณ„์† ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ธ๊ฐ€์š”?

VT ๋งˆ์šฐ์Šค ์ง€์›์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•˜๊ณ  ์žˆ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›(/cc @SamuelEnglad!)์„ ์œ„ํ•ด ๊ณต์‹์ ์œผ๋กœ ๊ฐœ๋ฐœํŒ€์—์„œ ์ž‘์—…์„ ์˜ˆ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹น์‹ ์˜ ๋ฐœ์„ ๋ฐŸ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

์ƒ๊ฐํ•ด๋ดค๋Š”๋ฐ ์ œ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์™„๋ฒฝํ•ด์„œ ์˜ˆ์•ฝ์„ ๋ชปํ–ˆ์–ด์š” ใ…‹ใ…‹ใ…‹ใ…‹

๋‚˜๋Š” ์›๊ฒฉ ๊ฐœ๋ฐœ ํ™•์žฅ์œผ๋กœ VSCode๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€๊ณ  ์žˆ์—ˆ๊ณ  ๊ทธ ์•ˆ์— ํ†ตํ•ฉ ํ„ฐ๋ฏธ๋„์ด ์‹ค์ œ๋กœ tmux์—์„œ ๋งˆ์šฐ์Šค ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค! ํŒจ๋„ ์„ ํƒ, ์ฐฝ ์„ ํƒ, ํŒจ๋„ ํฌ๊ธฐ ์กฐ์ • ๋ฐ ์Šคํฌ๋กค ํœ ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ„ฐ๋ฏธ๋„์ด ์˜คํ”ˆ ์†Œ์Šค VS Codium์˜ ์ผ๋ถ€์ด๊ณ  ์‹œ์ž‘์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค... ์ด๊ฒƒ์ด ์ •๋ง ์œ ์šฉํ•œ ์ •๋ณด๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•˜๊ณ  ์žˆ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›(/cc @SamuelEnglad!)์„ ์œ„ํ•ด ๊ณต์‹์ ์œผ๋กœ ๊ฐœ๋ฐœํŒ€์—์„œ ์ž‘์—…์„ ์˜ˆ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹น์‹ ์˜ ๋ฐœ์„ ๋ฐŸ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

@DHowett-MSFT @zadjii-msft @bitcrazed ์—ฌ๊ธฐ์™€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์€ ํ™˜์ƒ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ท€ํ•˜์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ฐธ์—ฌ์‹œํ‚ค๋Š” ๋ณธ๋ณด๊ธฐ์ด๋ฉฐ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํŒ€(console/WSL/msft-linux)์€ ๊ฐœ์ธ์ ์œผ๋กœ Windows(๋น„ nix)๋ฅผ ์„ค์น˜ํ•˜๋Š” ์ œ ๋น„์ฆˆ๋‹ˆ์Šค์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋›ฐ์–ด๋‚œ ์ž‘์—…์„ ๊ณ„์†ํ•˜์‹ญ์‹œ์˜ค ๐Ÿฅ‡

@thinkjrs ์ข‹์€ ๋ง์”€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ„ฐ๋ฏธ๋„, Cascadia ์ฝ”๋“œ, WSL ๋“ฑ์— ๋Œ€ํ•œ ์งˆ๋ฌธ, ์•„์ด๋””์–ด ๋ฐ ํ’€ ์š”์ฒญ์„ ์‹คํ–‰ ๋ฐ ํ…Œ์ŠคํŠธ/ํŒŒ์ผ๋ง/์ œ์ถœํ•˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํ”ผ๋“œ๋ฐฑ์€ ์ž‘์—…์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜๊ณ  ๊ณ„ํš์„ ์„ธ์šฐ๋Š” ๋ฐ ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๋ฐ ๋””์ž์ธ ๊ธฐ๋Šฅ.

์šฐ๋ฆฌ๊ฐ€ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์œ„ํ•ด ๊ทธ๋ฆฌ๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ•จ๊ป˜ โ€‹โ€‹์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ๋†๋‹ด์ด ์•„๋‹™๋‹ˆ๋‹ค ๐Ÿ˜œ

ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? WSL์— ๊ธฐ๋Šฅ์ ์ธ ๋งˆ์šฐ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ tmux ํŒจ๋„ ์ „ํ™˜, weechat & irssi , (n)vim ํด๋ฆญ, aptitude ํด๋ฆญ, htop ์—์„œ ์ฑ„๋„/์„œ๋ฒ„ ๋ณ€๊ฒฝ

ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? WSL์— ๊ธฐ๋Šฅ์ ์ธ ๋งˆ์šฐ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ tmux ํŒจ๋„ ์ „ํ™˜, weechat & irssi , (n)vim ํด๋ฆญ, aptitude ํด๋ฆญ, htop ์—์„œ ์ฑ„๋„/์„œ๋ฒ„ ๋ณ€๊ฒฝ

@dmxt ํ˜„์žฌ ์ €๋Š” ๋ชจ๋“  ํ„ฐ๋ฏธ๋„ ์˜ต์…˜ ์ค‘์—์„œ ๊ฐ€์žฅ ํ˜ธํ™˜์ด ์ž˜ ๋˜๋Š” wsltty๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๊ฐ€ ์ œ๊ณต๋˜๋ฉด ํ„ฐ๋ฏธ๋„๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? WSL์— ๊ธฐ๋Šฅ์ ์ธ ๋งˆ์šฐ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ tmux ํŒจ๋„ ์ „ํ™˜, weechat & irssi , (n)vim ํด๋ฆญ, aptitude ํด๋ฆญ, htop ์—์„œ ์ฑ„๋„/์„œ๋ฒ„ ๋ณ€๊ฒฝ

@dmxt ํ˜„์žฌ ์ €๋Š” ๋ชจ๋“  ํ„ฐ๋ฏธ๋„ ์˜ต์…˜ ์ค‘์—์„œ ๊ฐ€์žฅ ํ˜ธํ™˜์ด ์ž˜ ๋˜๋Š” wsltty๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๊ฐ€ ์ œ๊ณต๋˜๋ฉด ํ„ฐ๋ฏธ๋„๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ ๋Œ€์ค‘์—๊ฒŒ ์•Œ๋ ค์ง„ Windows์šฉ ํ„ฐ๋ฏธ๋„ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด ๋ณธ ํ›„ ํ˜„์žฌ๋กœ์„œ๋Š” wsltty๊ฐ€ ์ตœ๊ณ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ๊ณต์‹ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋„ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๊ฐ€์ด๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ์น˜ ์žˆ๊ฒŒ ๋” ๋‚˜์€ ๊ฒƒ์„ ์š”๊ตฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์›Œํฌํ”Œ๋กœ์™€ ๋„๊ตฌ์—์„œ ๋”ธ๊พน์งˆ ์—†์ด ์™„์ „ํ•œ ๋งˆ์šฐ์Šค ์ง€์›์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

I/O์—์„œ ์•ฝ๊ฐ„์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๋ฐœ๊ฒฌํ–ˆ๊ณ  WSL1 ์‹œ์Šคํ…œ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๋ฒ ์–ด ๋ฉ”ํƒˆ Linux๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ฉฐ ๋งˆ์šฐ์Šค ์ž…๋ ฅ์— 0ms์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@dmxt @offero XShell(์‹คํ—˜์  ๊ธฐ๋Šฅ์˜ ์‹ค์ œ ๋ช…๋ น์ค„ ๋˜๋Š” WSL๋กœ์˜ ssh)๋กœ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ๋งˆ์šฐ์Šค ์ง€์› ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งˆ์šฐ์Šค ์ง€์›์ด ์‹ฌํ•˜๊ฒŒ ํ•„์š”ํ•œ ์•ฑ์€ ๋ฏธ๋“œ๋‚˜์ž‡ ์ปค๋งจ๋” ์™€ ๋งˆ์ดํฌ๋กœ ์—๋””ํ„ฐ์ž…๋‹ˆ๋‹ค.

ConEmu์—์„œ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์ด ์ •ํ™•ํžˆ ์–ธ์ œ ๊ตฌํ˜„๋  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๋กœ๋“œ๋งต์ด๋‚˜ ํƒ€์ž„๋ผ์ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ถœ์‹œํ•˜๊ธฐ์— ์ƒ๋‹นํžˆ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. v1.0์ด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๊ณ  ์ถœ์‹œ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์กฐ๊ธˆ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜์€ ๋ฒ„์ €๋‹์ด ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ์ตœ์‹  Microsoft Store ๋ฒ„์ „์˜ Windows ํ„ฐ๋ฏธ๋„ ๋งˆ์šฐ์Šค ์ž…๋ ฅ์—์„œ

@fat0troll ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ, ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. set mouse=a ์žˆ๋Š” vim์—์„œ๋„ ๋งˆ์šฐ์Šค ์ž…๋ ฅ์€ ์ด์ „ conhost์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ Windows Terminal 1.0.1401.0์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

set nocompatible
syntax on
set number
set mouse=a
set backspace=indent,eol,start

ํ•ด๋‹น vim ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด vim ์ฐฝ ๋‚ด๋ถ€๋ฅผ ํด๋ฆญํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปค์„œ๋Š” ๋‚ด๊ฐ€ ํด๋ฆญํ•œ ์œ„์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. 1.0.1401.0, Windows ๋นŒ๋“œ 18368.836(์ด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ).

@kvnxiao ๋‚˜๋Š” ๋‹น์‹ ์ด OpenSSH_For_Windows_7.7์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ถ”์ธกํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(8.x์—์„œ ํ•ด๊ฒฐ๋จ).

๋งˆ์šฐ์Šค ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ ค๋Š” ๋ชจ๋“  VT ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์š”์ฆ˜์€ ๋ฒ„์ €๋‹์ด ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

๋ถˆ์นœ์ ˆํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

vim๊ณผ ๊ด€๋ จํ•˜์—ฌ Windows์šฉ์œผ๋กœ ๋นŒ๋“œ๋œ neovim์„ Windows ์‹คํ–‰ ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด vim์—์„œ ๋งˆ์šฐ์Šค ์ง€์›์ด ์ž‘๋™ํ•œ๋‹ค๊ณ  ๋งํ•œ๋‹ค๋ฉด(์˜ˆ: ssh / wsl ๋“ฑ์„ ํ†ตํ•ด), ๋‚˜๋Š” ๋‹น์‹ ์„ ์˜์‹ฌํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๊ฒƒ์€ "์™„์ „ํ•œ" ์ง€์›์ด ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์งˆ๋ฌธ:

ํ˜„์žฌ conhost๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ "์™„์ „ํ•œ" ๋งˆ์šฐ์Šค ์ง€์›์„ ์œ„ํ•œ ๋กœ๋“œ๋งต์— ๋ฌด์—‡์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” WT๋ฅผ ํ†ตํ•ด ๋งˆ์šฐ์Šค ์ž…๋ ฅ์„ ์ง€์›ํ•˜๋Š”(๊ทธ๋ฆฌ๊ณ  conhost์—์„œ ์ž‘์—…ํ•˜๋Š”) ์ผ๋ฐ˜ ํ„ฐ๋ฏธ๋„ ๊ธฐ๋ฐ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๋ ค๋Š” ๊ด€์ ์—์„œ ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Windows ์‹คํ–‰ ํŒŒ์ผ๋กœ ์ง์ ‘ ๋นŒ๋“œ๋œ ์—ฌ๋Ÿฌ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜/ํ„ฐ๋ฏธ๋„ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. conhost๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹คํ–‰์„ ์œ„ํ•ด ๋‘ ๋ฒˆ ํด๋ฆญํ•˜๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ Windows ํ„ฐ๋ฏธ๋„์„ ํ†ตํ•ด ์‹คํ–‰ํ•˜๋ฉด ํ‘œ์‹œ๋œ ํ…์ŠคํŠธ๋ฅผ ๋งˆ์šฐ์Šค๋กœ ์„ ํƒํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@niklaskorz ๋‚˜ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ์ฃผ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” ๊ด€๋ จ ์งˆ๋ฌธ์ด ์žˆ์„ ๋•Œ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์˜๊ฒฌ์„ ์ฐฌ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋Œ€ํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‹น์‹ ์ด ์™„์ „ํžˆ ๋งž์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ„ฐ๋ฏธ๋„์—์„œ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” Win32 ์ฝ˜์†” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์šฉ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹๋ณ„ํ•œ ์ด ์ž‘์—… ํ•ญ๋ชฉ์€ "ํ„ฐ๋ฏธ๋„ 1.x"(๋งˆ์ผ์Šคํ†ค)๋กœ ์˜ˆ์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ˜„์žฌ์™€ 2.0 ์‚ฌ์ด์— ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋ณด๋‹ค ๋” ์„ธ๋ฐ€ํ•œ ๊ฒฌ์ ์€ ์—†์Šต๋‹ˆ๋‹ค.

์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด ์ž‘์—… ํ•ญ๋ชฉ์ด 1.0์— ๋Œ€ํ•ด ๊ฒฝ์Ÿํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ์•„์‰ฝ์ง€๋งŒ ์–ธ์ œ ๊ฒฝ์Ÿํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฐ„์ ˆํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์œผ๋ฉฐ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค ๐Ÿ˜€.

FIWW, ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ƒˆ๋กœ์šด Powershell Out-ConsoleGridView (https://github.com/PowerShell/GraphicalTools)์ด ์ด์— ๋Œ€ํ•œ ํ‚ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์ž…๋‹ˆ๋‹ค. https://github.com/PowerShell/GraphicalTools/issues/95์—์„œ ๋งˆ์šฐ์Šค ๊ด€๋ จ ์ถ”์  ๋ฒ„๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Terminal.Gui (https://github.com/tig/gui.cs) ์œ„์— ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ WT์—์„œ ์ƒ๋™๊ฐ ์žˆ๊ฒŒ ๋งˆ์šฐ์Šค ์ง€์›์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Terminal.Gui ์šฉ ์ƒ˜ํ”Œ ์•ฑ์„ ์ƒˆ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ •๋ง ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ Terminal.Gui(https://github.com/tig/gui.cs)๋กœ ๋นŒ๋“œ๋œ GUI ์ฝ˜์†” ์•ฑ์— ๋Œ€ํ•œ ์ง„์ •ํ•œ ์‹คํŒจ์ž…๋‹ˆ๋‹ค.

@kvnxiao ๋‚˜๋Š” ๋‹น์‹ ์ด OpenSSH_For_Windows_7.7์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ถ”์ธกํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(8.x์—์„œ ํ•ด๊ฒฐ๋จ).

๋งˆ์šฐ์Šค ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ ค๋Š” ๋ชจ๋“  VT ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์š”์ฆ˜์€ ๋ฒ„์ €๋‹์ด ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

๋ถˆ์นœ์ ˆํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ openssh๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@kvnxiao ๋‚˜๋Š” ๋‹น์‹ ์ด OpenSSH_For_Windows_7.7์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ถ”์ธกํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(8.x์—์„œ ํ•ด๊ฒฐ๋จ).
๋งˆ์šฐ์Šค ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ ค๋Š” ๋ชจ๋“  VT ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์š”์ฆ˜์€ ๋ฒ„์ €๋‹์ด ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

๋ถˆ์นœ์ ˆํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ openssh๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ(์ดˆ์ฝœ๋ฆฟ์—์„œ Openssh ์„ค์น˜)์— ์„ค๋ช…๋œ ๊ฒƒ์„ ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://blog.frankfu.com.au/2019/03/21/moving-from-windows-1809s-openssh-to- openssh-ํœด๋Œ€์šฉ/

๋‚˜๋Š” ๋‹น์‹ ์ด OpenSSH_For_Windows_7.7์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ถ”์ธกํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(8.x์—์„œ ํ•ด๊ฒฐ๋จ).

๋งˆ์šฐ์Šค ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ ค๋Š” ๋ชจ๋“  VT ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

@DHowett ์ด ์ปจํ…์ŠคํŠธ์—์„œ OpenSSH_for_Windows_8.0p1, LibreSSL 2.6.5 ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ ๋‹ˆ๊นŒ?

ํ„ฐ๋ฏธ๋„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ tmux ๋งˆ์šฐ์Šค ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋œ Ubuntu ์‹œ์Šคํ…œ์— SSH๋กœ ์—ฐ๊ฒฐํ•˜์ง€๋งŒ ๋‚ด ๋งˆ์šฐ์Šค ์ž…๋ ฅ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ„ฐ๋ฏธ๋„ ์ž์ฒด๋งŒ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์„œ๋ฒ„๋ฅผ OpenSSH 8.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋„์›€์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ์ฐจ๋‹จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์•„, 8.x์˜ x ๋Š” 1์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 8.0 ๋นŒ๋“œ๋ฅผ ์ถœ์‹œํ–ˆ๋Š”์ง€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค.

์•„, 8.x์˜ x๋Š” 1์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 8.0 ๋นŒ๋“œ๋ฅผ ์ถœ์‹œํ–ˆ๋Š”์ง€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค.

ํ•œ ๋ฒˆ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํšจ๊ณผ๊ฐ€์žˆ๋‹ค! ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์•ˆํƒ€๊น๊ฒŒ๋„ MS๋Š” ์•„์ง Windows ํ„ฐ๋ฏธ๋„์—์„œ Win32 API์˜ ๋งˆ์šฐ์Šค ์ž…๋ ฅ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
(VT ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.)

๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ReadConsoleInputW ๋ฐ PeekConsoleInputW๋ฅผ ๊ต์ฒดํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.
Windows ํ„ฐ๋ฏธ๋„์—์„œ ๋งˆ์šฐ์Šค๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด

๋จผ์ € ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

SetConsoleMode(hin,  ENABLE_VIRTUAL_TERMINAL_INPUT);
SetConsoleMode(hout, ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
char *vt_mouse_input_enable_cmd  = "\x1b[?1000h\x1b[?1003h\x1b[?1006h";
DWORD written;
WriteConsoleA(hout, vt_mouse_input_enable_cmd, strlen(vt_mouse_input_enable_cmd), &written, NULL);

๊ทธ๋Ÿฌ๋ฉด ๋งˆ์šฐ์Šค ์ž…๋ ฅ์„ VT ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค(sgr-1006)(์˜ˆ: \x1b[<0;10;20M )๋กœ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ํ‚ค ์ž…๋ ฅ(์˜ˆ: ํ™”์‚ดํ‘œ ํ‚ค)์€ VT ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค(์˜ˆ: \x1b[A )๋กœ๋„ ์ˆ˜์‹ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์›์น˜ ์•Š๋Š” VT ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค๋ฅผ win32 API์˜ ํ‚ค ์ด๋ฒคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ถˆ์™„์ „ํ•ฉ๋‹ˆ๋‹ค.
(๊ฐ€์ƒ ํ‚ค ์ฝ”๋“œ์™€ ๊ฐ€์ƒ ์Šค์บ” ์ฝ”๋“œ๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ 0์ด ๋˜๋Š” ๋“ฑ)

๋‚ด ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.
https://gist.github.com/Hamayama/6add968870269f2426716fad79724b31
( PDC_read_console_input_w ๋ฐ PDC_peek_console_input_w ๋Š” ๋Œ€์ฒด ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. )

๋งˆ์šฐ์Šค ์ž…๋ ฅ์„ ์ œ์™ธํ•˜๊ณ  VT ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

char *vt_key_input_disable_cmd = "\x1b[?9XXXl";
DWORD written;
WriteConsoleA(hout, vt_key_input_disable_cmd, strlen(vt_key_input_disable_cmd), &written, NULL);

๋˜๋Š”

SetConsoleMode(hin, ENABLE_VIRTUAL_TERMINAL_MOUSE_INPUT_ONLY);

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฏธ๋ž˜์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์ƒ๊ฐ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ...

src/terminal/parser/InputStateMachineEngine.cpp: 391 (SGR VT ์‹œํ€€์Šค๋ฅผ INPUT_RECORD s๋กœ ๋ณ€ํ™˜)์—์„œ ๋งˆ์šฐ์Šค ์›€์ง์ž„์„ ์ถ”์ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ํ„ฐ๋ฏธ๋„์€ ConPTY์— ๋Œ€ํ•œ VT ์‹œํ€€์Šค๋ฅผ ๋ณด๋‚ด์ง€๋งŒ ConPTY๋Š” ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์˜ ์ƒํƒœ๋งŒ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค ์ขŒํ‘œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

src/terminal/parser/InputStateMachineEngine.cpp: 391 :

success = _UpdateSGRMouseButtonState(id, firstParameter, buttonState, eventFlags);
success = success && _WriteMouseEvent(parameters.at(1), parameters.at(2), buttonState, modifierState, eventFlags);

ํ˜„์žฌ ๋งˆ์šฐ์Šค ์ž…๋ ฅ ์ง€์› ์ƒํƒœ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ต์…˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ขŒํ‘œ ์ถ”์ ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋งˆ์šฐ์Šค ์›€์ง์ž„์ด ํด๋ž˜์‹ ์ฝ˜์†” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž‘๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

src/terminal/parser/InputStateMachineEngine.hpp: 172 :

+ size_t _mouseColumn = 0;
+ size_t _mouseLine = 0;

src/terminal/parser/InputStateMachineEngine.cpp: 391 :

- success = success && _WriteMouseEvent(parameters.at(1), parameters.at(2), buttonState, modifierState, eventFlags);
+ auto mouseColumn = parameters.at(1).value_or(0);
+ auto mouseLine = parameters.at(2).value_or(0);
+ auto isMoved = mouseColumn! = _mouseColumn || mouseLine! = _mouseLine;
+ if (isMoved)
+ {
+     _mouseColumn = mouseColumn;
+     _mouseLine = mouseLine;
+ }
+ success = (success || isMoved) && _WriteMouseEvent(mouseColumn, mouseLine, buttonState, modifierState, eventFlags);

์ฐธ๊ณ : ํด๋ž˜์‹ ์ฝ˜์†” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— SGR ํ˜•์‹์œผ๋กœ ๋งˆ์šฐ์Šค ์ถ”์ ์„ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œˆ๋„์šฐ ํŒŒ์›Œ์‰˜

PS C:\Users> [char]0x1b + "[?1003;1004;1006h"

๋ช…๋ น ํ”„๋กฌํ”„ํŠธ

C:\Users> echo Ctrl+[ [?1003;1004;1006h

๋งค๊ฐœ๋ณ€์ˆ˜
  • 1003 - ANY_EVENT_MOUSE_MODE
  • 1004 - ConPTY๋ฅผ ํ†ตํ•ด ํ„ฐ๋ฏธ๋„ ์ž์ฒด๋กœ ์‹œํ€€์Šค๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ชจ๋“œ(์˜ˆ: 1001 ๋˜๋Š” 9999 )
  • 1006 - SGR_EXTENDED_MODE

๊ฒฐ๊ณผ์ ์œผ๋กœ ํ„ฐ๋ฏธ๋„์€ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ConpTY๋กœ ๋ณด๋‚ด๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ํด๋ž˜์‹ ์ฝ˜์†” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด INPUT_RECORD ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์บ์น˜. ์ด :smile์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ ์ด๋™ํ•  ๋•Œ ์ด๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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