Xterm.js: xterm.js์—์„œ ์œ ๋‹ˆ์ฝ”๋“œ ์ฒ˜๋ฆฌ

์— ๋งŒ๋“  2018๋…„ 09์›” 25์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: xtermjs/xterm.js

#1707๋ถ€ํ„ฐ ์˜ฌ๋ฐ”๋ฅธ ์œ ๋‹ˆ์ฝ”๋“œ ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ชจํ‹ฐ์ฝ˜์œผ๋กœ ์ธํ•ด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ ์  ๋” ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์„ ์ข‹์•„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.์Šค๋งˆ์ผ:

์ œ์•ˆ:
๋ฉ‹์ง„ API ๋’ค์— ๋ฒ„์ „๋ณ„ ๋ฐ์ดํ„ฐ์™€ ๊ตฌํ˜„์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฒ„์ „์— ๋Œ€ํ•œ ๊ณต๊ธ‰์ž๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ˜„์žฌ wcwidth์— ๋Œ€ํ•œ ๋ฒ„์ „ ์ข…์† ๊ตฌํ˜„๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋Œ€๋žต์ ์ธ ์Šค์ผ€์น˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

interface IUnicodeProvider {
  supportedVersions(): string[];
  getVersion(): string;
  setVersion(version?: string);  // version optional for fallback behavior
  wcwidth(ucs: number): number;
  getStringCellWidth(s: string): number;
  ... // more to come with support of other unicode features
}

์ด์ƒ์ ์œผ๋กœ ๊ณต๊ธ‰์ž๋Š” ์ž์ฒด ํฌํ•จํ•˜๋ฏ€๋กœ ํ„ฐ๋ฏธ๋„์€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ ๋ฒ„์ „/๋กœ์ผ€์ผ์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ œ๊ณต์ž๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋‚ฎ์€ ์ˆ˜์ค€์˜ ํ•ญ๋ชฉ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ง€์›๋˜๋Š” ๋ฒ„์ „์—์„œ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ณต๊ธ‰์ž ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ์ •์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š”์ง€ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์„์—์„œ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” xterm.js์˜ ํฌ๊ธฐ์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ๋น„๋™๊ธฐ ์งˆ๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค(๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค - ๋Œ€๋ถ€๋ถ„์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์€ ๋™๊ธฐ์‹ atm์ž…๋‹ˆ๋‹ค). ์ „์ฒด ์œ ๋‹ˆ์ฝ”๋“œ ํ•ญ๋ชฉ์€ ๋ฒ„์ „ XY์šฉ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์• ๋“œ์˜จ์— ๋ฒˆ๋“ค๋กœ ํฌํ•จ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ† ๋ก ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
/cc @Tyriar , @bgw , @mofux , @dnfield

areparser typenhancement

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

https://github.com/xtermjs/xterm.js/pull/2568 ์˜ ์ƒˆ๋กœ์šด ์‹œ๋„ , ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์ถœ์‹œํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ๋” ์ ‘๊ทผํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

interface IUnicodeProvider {
  getVersion(): string;
  wcwidth(ucs: number): number;
  getStringCellWidth(s: string): number;
  ... // more to come with support of other unicode features
}

UnicodeProviderFactory.v11 ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋”ฉํ•  ๋•Œ ์กฐ๊ธˆ ๋” ์ข‹์„ ๊ฒƒ์ด์ง€๋งŒ ์–ด๋Š ์ชฝ์ด๋“  ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@dnfield ๋„ค ์–ด๋Š ์ชฝ์ด๋“  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ ์ˆ˜์ค€์—์„œ ์œ ํ˜• ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋Ÿฐํƒ€์ž„์— ๋ฒ„์ „ ์ „ํ™˜์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

// terminal ctor - create the provider
this.unicodeProvider = new UnicodeProvider();
...
// some code that knows whether to switch unicode versions
this.unicodeProvider.setVersion(xy);
...
// some unicode consumer - does not care about versions at all, just gets the right method
this.unicodeProvider.wcwidth(...)

์ด๋Ÿฐ ์‹์œผ๋กœ this.unicodeProvider ๋Š” ๋ฒ„์ „ ๋ณ€๊ฒฝ ํ›„ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ํ„ฐ๋ฏธ๋„ ์ธ์Šคํ„ด์Šค์—์„œ ๊ฐ’๋น„์‹ผ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#1707์˜ ํ† ๋ก ์—์„œ ์–ป์€ ๊ฒƒ:

  • ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๋‘ ๊ฐ€์ง€ wcwidth ํ…Œ์ด๋ธ” ๋ฒ„์ „์„ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „๊ณผ @dnfield์—์„œ ๋งŒ๋“  ์ƒˆ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.
  • @gnachman ์ด ์ง€์ ํ–ˆ๋“ฏ์ด ๋ชจํ˜ธํ•œ ๋ฌธ์ž๋Š” ๋ฌธ์ œ๊ฐ€ ๋  ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋Œ€๋ถ€๋ถ„์˜ ์•ฑ์—์„œ ์ ˆ๋ฐ˜ ๋„ˆ๋น„๋กœ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋ฏธ ๋ ˆ๊ฑฐ์‹œ ํ…Œ์ด๋ธ”์—์„œ ์ˆ˜ํ–‰, ์ƒˆ ํ…Œ์ด๋ธ”๋กœ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•จ).
  • ์œ ๋‹ˆ์ฝ”๋“œ ๋ฒ„์ „์— ๋Œ€ํ•œ ์ƒˆ ์ „์—ญ ์˜ต์…˜์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์˜ต์…˜์€ ํ†ตํ•ฉ์ž๊ฐ€ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋Ÿฐํƒ€์ž„ ๋ณ€๊ฒฝ์„ ์œ„ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„ํ‘œ์ค€ ์‹œํ€€์Šค๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„์ง ์„ค์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ๋‹ˆ์ฝ”๋“œ ๋ฒ„์ „์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค ์ƒ์„ฑ์„ ์—ฐ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ๋กœ์„œ๋Š” ๋งค์ง ์œ ๋‹ˆ์ฝ”๋“œ ๋ฒ„์ „ ์ถ”์ธก๊ธฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์— ๊ทธ๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์–ด์จŒ๋“  xterm.js ์™ธ๋ถ€์— ์žˆ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์กฐ์ง์— ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Œ).
  • ๋ฏธ๋ž˜์—๋Š” xterm,js์˜ ํŒจํ‚ค์ง€ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์œ ๋‹ˆ์ฝ”๋“œ ์• ๋“œ์˜จ์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ TS ์ฝ”๋“œ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

#1714์—์„œ ์ตœ์ดˆ์˜ ๊ฐ€๋Šฅํ•œ ํ™”์‹ ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. #1707์—์„œ ์ƒˆ ํ…Œ์ด๋ธ”์„ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ดœ์ฐฎ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค(@dnfield).

๊ดœ์ฐฎ์•„์š”!

https://github.com/xtermjs/xterm.js/pull/1714 ๊ฐ€ ์ด์— ๋Œ€ํ•œ ์ข‹์€ ์ฐธ๊ณ  ์ž๋ฃŒ์ด์ง€๋งŒ ์ƒˆ๋กœ์šด ์• ๋“œ์˜จ ๋ชจ๋ธ ์ดํ›„ ์—ฌ๋Ÿฌ ์• ๋“œ์˜จ์„ ์ถœ์‹œํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค(https://github.com/xtermjs/xterm. js/issues/1128)์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ž„๋ฒ ๋”๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฒ„์ „์„ ์„ ํƒํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”. ์ตœ๊ทผ์— Windows๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋กœ๊น…์˜ ์ผ๋ถ€ ์ธก๋ฉด์„ ์ด๋ชจํ‹ฐ์ฝ˜์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” Node.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/xtermjs/xterm.js/pull/2568 ์˜ ์ƒˆ๋กœ์šด ์‹œ๋„ , ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์ถœ์‹œํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@jerch #2568์ด ๋ณ‘ํ•ฉ๋˜์–ด ์ด๊ฒƒ์„ ๋‹ซํž˜์ด๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Tyriar Yepp, ํ›„์† ์กฐ์น˜๋„ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค :smile_cat: --> #2668

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