์ผ์ง: 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 ์์ฑ์ ํตํด ์์ฑ๋ ์์์๊ฒ ์ ๋ฌํฉ๋๋ค.
์๋
ํ์ธ์ @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
๊ฐ ์
๋ ฅ ๋ฒํผ์ ์ถ๊ฐ๋ฉ๋๋ค. ์
๋ ฅ ๋ฒํผ์ ์์ผ๋ฉด ์ฐ๊ฒฐ๋ ์ฝ์ ํด๋ผ์ด์ธํธ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ์์ ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.
๋ด๊ฐ ์ฃผ์ํ ์ :
INPUT_RECORD
์คํธ๋ฆผ์ด ์๋๋ผ ๋ฌธ์ ์คํธ๋ฆผ์ ๋ฐ์ต๋๋ค. ์ฐ๊ฒฐ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด VT ๋ง์ฐ์ค ๋ชจ๋์ธ ๊ฒฝ์ฐ conhost์ ํน์ ์ง์ ์์ ํด๋น ๋ง์ฐ์ค INPUT_RECORD
๋ฅผ ๋ฌธ์ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๋ ค๊ณ ์๋ํฉ๋๋ค. ๋ง์ฐ์ค ์ด๋ฒคํธ๊ฐ ๋ฒํผ์ ์๊ธฐ _์ ์_ ๋ฒ์ญ์ ์ํํ๋ฉด ์์ ์์
์ด VT ์์ฉ ํ๋ก๊ทธ๋จ์์ ์๋ํ์ง ์์ ์ ์์ต๋๋ค(์ฝ๊ธฐ: wsl
). ๊ทธ๋ฐ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๋ ๋ง์ฐ์ค์์ ๋ฒ์ญ ์๋์ง ํ์ธํด์ผํฉ๋๋ค INPUT_RECORD
VT-์ธ์ฝ๋ฉ ๋ง์ฐ์ค ์ด๋ฒคํธ๊ฐ์ ์ํด ์์ฑ ๋ ๋ง์ฐ์ค ์ด๋ฒคํธ๋ฅผ ์๋์ผ๋ก ์ํ InputStateMachineEngine
.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_MODE1004
- ConPTY๋ฅผ ํตํด ํฐ๋ฏธ๋ ์์ฒด๋ก ์ํ์ค๋ฅผ ์ ๋ฌํ๋ ์ง์๋์ง ์๋ ๋ชจ๋(์: 1001
๋๋ 9999
)1006
- SGR_EXTENDED_MODE๊ฒฐ๊ณผ์ ์ผ๋ก ํฐ๋ฏธ๋์ ๋ง์ฐ์ค ์ด๋ฒคํธ๋ฅผ ConpTY๋ก ๋ณด๋ด๊ธฐ ์์ํ๊ณ ํด๋์ ์ฝ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด INPUT_RECORD
์์ฑ์ ์์ํฉ๋๋ค.
์ข์ ์บ์น. ์ด :smile์ ์ง์ํ๊ธฐ ์ํด ์ค์ ๋ก ์ด๋ํ ๋ ์ด๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฐธ๊ณ ๋ก ์ด ๋ฌธ์ ๋ฅผ ์กฐ์ฌํ๊ณ ์๋ ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์(/cc @SamuelEnglad!)์ ์ํด ๊ณต์์ ์ผ๋ก ๊ฐ๋ฐํ์์ ์์ ์ ์์ฝํ์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๋น์ ์ ๋ฐ์ ๋ฐ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!