Xterm.js: рдмрдлрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдЬреБрд▓ре░ 2017  ┬╖  73рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: xtermjs/xterm.js

рд╕рдВрдХрдЯ

рдпрд╛рдж

рдЕрднреА рд╣рдорд╛рд░рд╛ рдмрдлрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рд▓реЗ рд░рд╣рд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдРрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЬреЛ рдмрдбрд╝реЗ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрдИ рдЯрд░реНрдорд┐рдирд▓ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 5000 рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рднрд░реЗ 160x24 рдЯрд░реНрдорд┐рдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдбреЗрдореЛ рд▓рдЧрднрдЧ 34mb рдореЗрдореЛрд░реА рд▓реЗрддрд╛ рд╣реИ (рджреЗрдЦреЗрдВ https://github.com/Microsoft/vscode/issues/29840#issuecomment-314539964), рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рд╣реИ рдФрд░ 1080p рдореЙрдирд┐рдЯрд░ рд╣реЛрдЧрд╛ рд╡реНрдпрд╛рдкрдХ рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдЯреНрд░реВрдХрд▓рд░ (https://github.com/sourcelair/xterm.js/issues/484) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреЛ 2 рдЕрддрд┐рд░рд┐рдХреНрдд number рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдореЛрд░реА рдЦрдкрдд рдХреЛ рд▓рдЧрднрдЧ рджреЛрдЧреБрдирд╛ рдХрд░ рджреЗрдЧрд╛ред рдмрдлрд░ рдХрд╛ред

рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдкрд╛рда рдХреА рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд╛рда рдХреЛ рддреЗрдЬреА рд╕реЗ рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрд╣ рдзреАрдорд╛ рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдбреЗрдЯрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ; рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдПрдХ рд╡рд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрддреА рд╣реИред рддреЛ рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдВрдЧреЗред рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА рдХреНрдпреЛрдВрдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд▓рд╛рдЗрди рдмрдлрд░ (рдХреНрд░рдо рдореЗрдВ) рд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ DOM рдХреЛ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рддреЗрдЬреА рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рд╣рдо xterm.js рдореЗрдВ рдФрд░ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЪрдпрди рдФрд░ рд▓рд┐рдВрдХ рдЬреИрд╕реА рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЦреАрдВрдЪрддреА рд╣реИрдВред рдлрд┐рд░ рд╕реЗ 160x24/5000 рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, 2014 рдХреЗ рдордзреНрдп рдореИрдХрдмреБрдХ рдкреНрд░реЛ рдкрд░ рдкреВрд░реЗ рдмрдлрд░ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдореЗрдВ 30-60ms рд▓рдЧрддреЗ рд╣реИрдВред

рднрд╡рд┐рд╖реНрдп рдХрд╛ рд╕рдорд░реНрдерди

рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдХреБрдЫ рд╡реНрдпреВ рдореЙрдбрд▓ рдкреЗрд╢ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдмрдлрд░ рдореЗрдВ рдХреБрдЫ рдпрд╛ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рдХреЛ рд░реАрдлреНрд▓реЛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (https://github.com/sourcelair) /xterm.js/issues/622) рдареАрдХ рд╕реЗ (https://github.com/sourcelair/xterm.js/pull/644#issuecomment-298058556) рдФрд░ рд╢рд╛рдпрдж рд╕реНрдХреНрд░реАрди рд░реАрдбрд░реНрд╕ (https://github.com) рдХрд╛ рдЙрдЪрд┐рдд рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ /sourcelair/xterm.js/issues/731)ред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЬрдм рд╕реНрдореГрддрд┐ рдХреА рдмрд╛рдд рд╣реЛ рддреЛ рдХреБрдЫ рд╡рд┐рдЧреНрдЧрд▓ рд░реВрдо рд╣реЛред

рдпрд╣ рдЪрд░реНрдЪрд╛ https://github.com/sourcelair/xterm.js/issues/484 рдореЗрдВ рд╢реБрд░реВ рд╣реБрдИ, рдпрд╣ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдЬрд╛рддреА рд╣реИ рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреА рд╣реИред

рдореИрдВ рд╕рдорд╛рдзрд╛рди 3 рдХреА рдУрд░ рдЭреБрдХ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрджрд┐ рд╕рдордп рд╣реИ рддреЛ рд╕рдорд╛рдзрд╛рди 5 рдХреА рдУрд░ рдмрдврд╝ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╕реБрдзрд╛рд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ! /cc @jerch , @mofux , @rauchg , @parrisk

1. рд╕рд░рд▓ рдЙрдкрд╛рдп

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдо рдЕрднреА рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрд╕ truecolor fg рдФрд░ bg рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред

// [0]: charIndex
// [1]: width
// [2]: attributes
// [3]: truecolor bg
// [4]: truecolor fg
type CharData = [string, number, number, number, number];

type LineData = CharData[];

рдкреЗрд╢реЗрд╡рд░реЛрдВ

  • рдмрд╣реБрдд рд╕рд░рд▓

рджреЛрд╖

  • рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд, рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдХреЛ рд▓рдЧрднрдЧ рджреЛрдЧреБрдирд╛ рдХрд░ рджреЗрдЧреА рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред

2. рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдЪрд╛рд░рдбрд╛рдЯрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВ

рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЗрди рдХреЗ рдмрдЬрд╛рдп рд▓рд╛рдЗрди рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╕реНрдЯреЛрд░ рдХрд░реЗрдЧрд╛, рдпрд╣ рд╕рдВрднрд╡рддрдГ рдЪрдпрди рдФрд░ рд▓рд┐рдВрдХрд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд▓рд╛рдн рджреЗрдЦреЗрдЧрд╛ рдФрд░ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рдордп рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреА рдкреВрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрдХ рддреНрд╡рд░рд┐рдд рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред

interface ILineData {
  // This would provide fast access to the entire line which is becoming more
  // and more important as time goes on (selection and links need to construct
  // this currently). This would need to reconstruct text whenever charData
  // changes though. We cannot lazily evaluate text due to the chars not being
  // stored in CharData
  text: string;
  charData: CharData[];
}

// [0]: charIndex
// [1]: attributes
// [2]: truecolor bg
// [3]: truecolor fg
type CharData = Int32Array;

рдкреЗрд╢реЗрд╡рд░реЛрдВ

  • рдЬрдм рднреА рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рд▓рд╛рдЗрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • Int32Array . рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рдЖрдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдореЗрдореЛрд░реА

рджреЛрд╖

  • рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдгреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреАрдорд╛, рдПрдХрд▓ рд╡рд░реНрдг рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

3. рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ

рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ред рдЪреВрдВрдХрд┐ рдХрднреА рднреА рдЕрддрд┐рд╡реНрдпрд╛рдкреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

type LineData = CharData[]

// [0]: The character
// [1]: The width
type CharData = [string, number];

class CharAttributes {
  public readonly _start: [number, number];
  public readonly _end: [number, number];
  private _data: Int32Array;

  // Getters pull data from _data (woo encapsulation!)
  public get flags(): number;
  public get truecolorBg(): number;
  public get truecolorFg(): number;
}

class Buffer extends CircularList<LineData> {
  // Sorted list since items are almost always pushed to end
  private _attributes: CharAttributes[];

  public getAttributesForRows(start: number, end: number): CharAttributes[] {
    // Binary search _attributes and return all visible CharAttributes to be
    // applied by the renderer
  }
}

рдкреЗрд╢реЗрд╡рд░реЛрдВ

  • рдЖрдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдореЗрдореЛрд░реА, рднрд▓реЗ рд╣реА рд╣рдо рдЯреНрд░реВрдХрд▓рд░ рдбреЗрдЯрд╛ рднреА рд╕реНрдЯреЛрд░ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ
  • рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рд╕реЗ рднрд┐рдиреНрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • рдПрдХ рд╕рд░рдгреА рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ ( .flags рдмрдЬрд╛рдп [0] )

рджреЛрд╖

  • рдХрд┐рд╕реА рдЕрдиреНрдп рд╢реНрд░реЗрдгреА рдХреЗ рдЕрдВрджрд░ рд╡рд░реНрдгреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрджрд▓рдирд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ

4. рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХреИрд╢ рдореЗрдВ рд░рдЦреЗрдВ

рдпрд╣рд╛рдБ рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рддрдереНрдп рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рдХрд┐рд╕реА рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рд╕рддреНрд░ рдореЗрдВ рдХрдИ рд╢реИрд▓рд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЬрд┐рддрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рдЙрддрдиреА рдХрдо рдирд╣реАрдВ рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдирдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

// [0]: charIndex
// [1]: width
type CharData = [string, number, CharAttributes];

type LineData = CharData[];

class CharAttributes {
  private _data: Int32Array;

  // Getters pull data from _data (woo encapsulation!)
  public get flags(): number;
  public get truecolorBg(): number;
  public get truecolorFg(): number;
}

interface ICharAttributeCache {
  // Never construct duplicate CharAttributes, figuring how the best way to
  // access both in the best and worst case is the tricky part here
  getAttributes(flags: number, fg: number, bg: number): CharAttributes;
}

рдкреЗрд╢реЗрд╡рд░реЛрдВ

  • рдЖрдЬ рдХреЗ рд╕рдорд╛рди рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рднрд▓реЗ рд╣реА рд╣рдо рдЯреНрд░реВрдХрд▓рд░ рдбреЗрдЯрд╛ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд░рд╣реЗ рд╣реЛрдВ
  • рдПрдХ рд╕рд░рдгреА рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ ( .flags рдмрдЬрд╛рдп [0] )

рджреЛрд╖

  • рд░реЗрдВрдЬ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрдо рдореЗрдореЛрд░реА рдмрдЪрдд

5. 3 рдФрд░ 4 . рдХрд╛ рд╣рд╛рдЗрдмреНрд░рд┐рдб

type LineData = CharData[]

// [0]: The character
// [1]: The width
type CharData = [string, number];

class CharAttributes {
  private _data: Int32Array;

  // Getters pull data from _data (woo encapsulation!)
  public get flags(): number;
  public get truecolorBg(): number;
  public get truecolorFg(): number;
}

interface CharAttributeEntry {
  attributes: CharAttributes,
  start: [number, number],
  end: [number, number]
}

class Buffer extends CircularList<LineData> {
  // Sorted list since items are almost always pushed to end
  private _attributes: CharAttributeEntry[];
  private _attributeCache: ICharAttributeCache;

  public getAttributesForRows(start: number, end: number): CharAttributeEntry[] {
    // Binary search _attributes and return all visible CharAttributeEntry's to
    // be applied by the renderer
  }
}

interface ICharAttributeCache {
  // Never construct duplicate CharAttributes, figuring how the best way to
  // access both in the best and worst case is the tricky part here
  getAttributes(flags: number, fg: number, bg: number): CharAttributes;
}

рдкреЗрд╢реЗрд╡рд░реЛрдВ

  • рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХреБрд╢рд▓
  • рдмрд╣реБрдд рдореЗрдореЛрд░реА рдХреБрд╢рд▓ рдЬрдм рдмрдлрд░ рдореЗрдВ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдмреНрд▓реЙрдХ рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреБрдЫ рд╢реИрд▓рд┐рдпреЛрдВ рд╕реЗ (рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛)
  • рдПрдХ рд╕рд░рдгреА рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ ( .flags рдмрдЬрд╛рдп [0] )

рджреЛрд╖

  • рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓, рдпрджрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ CharAttributes рдкреНрд░рддрд┐ рдмреНрд▓реЙрдХ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХреИрд╢ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
  • CharAttributeEntry рд╡рд╕реНрддреБ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрд░рд┐
  • рдХрд┐рд╕реА рдЕрдиреНрдп рд╢реНрд░реЗрдгреА рдХреЗ рдЕрдВрджрд░ рд╡рд░реНрдгреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрджрд▓рдирд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ

6. 2 рдФрд░ 3 . рдХрд╛ рд╣рд╛рдЗрдмреНрд░рд┐рдб

рдпрд╣ 3 рдХрд╛ рд╕рдорд╛рдзрд╛рди рд▓реЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд▓рд╛рдЗрди рдЯреЗрдХреНрд╕реНрдЯ рддрдХ рддреЗрдЬреА рд╕реЗ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдЖрд▓рд╕реА рдореВрд▓реНрдпрд╛рдВрдХрди рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рд╡рд░реНрдгреЛрдВ рдХреЛ CharData рдореЗрдВ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ,

type LineData = {
  text: string,
  CharData[]
}

// [0]: The character
// [1]: The width
type CharData = [string, number];

class CharAttributes {
  public readonly _start: [number, number];
  public readonly _end: [number, number];
  private _data: Int32Array;

  // Getters pull data from _data (woo encapsulation!)
  public get flags(): number;
  public get truecolorBg(): number;
  public get truecolorFg(): number;
}

class Buffer extends CircularList<LineData> {
  // Sorted list since items are almost always pushed to end
  private _attributes: CharAttributes[];

  public getAttributesForRows(start: number, end: number): CharAttributes[] {
    // Binary search _attributes and return all visible CharAttributes to be
    // applied by the renderer
  }

  // If we construct the line, hang onto it
  public getLineText(line: number): string;
}

рдкреЗрд╢реЗрд╡рд░реЛрдВ

  • рдЖрдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдореЗрдореЛрд░реА, рднрд▓реЗ рд╣реА рд╣рдо рдЯреНрд░реВрдХрд▓рд░ рдбреЗрдЯрд╛ рднреА рд╕реНрдЯреЛрд░ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ
  • рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рд╕реЗ рднрд┐рдиреНрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • рдПрдХ рд╕рд░рдгреА рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ ( .flags рдмрдЬрд╛рдп [0] )
  • рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рд╛рдЗрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрдХ рддреЗрдЬрд╝ рдкрд╣реБрдБрдЪ

рджреЛрд╖

  • рд▓рд╛рдЗрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдкрд░ рд▓рдЯрдХрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА
  • рдХрд┐рд╕реА рдЕрдиреНрдп рд╢реНрд░реЗрдгреА рдХреЗ рдЕрдВрджрд░ рд╡рд░реНрдгреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрджрд▓рдирд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ

рд╕рдорд╛рдзрд╛рди рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ

  • рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ Int32Array рдЕрдВрджрд░ рдПрдХ int рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ int рдХреЛ рдХрд┐рд╕реА рд╡рд░реНрдг рдореЗрдВ рд╡рд╛рдкрд╕ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред
areperformance typplan typproposal

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐:

  • [x] рдПрдХрд╛рдзрд┐рдХ рдмрдлрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдлреИрдХреНрдЯрд░ https://github.com/xtermjs/xterm.js/pull/1632
  • [x] TypedArray- рдЖрдзрд╛рд░рд┐рдд рдмрдлрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗрдВ https://github.com/xtermjs/xterm.js/pull/1641
  • [ ] рдЙрди рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
  • [ ] рдкреБрд░рд╛рдиреЗ рдмрдлрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣рдЯрд╛ рджреЗрдВ (рдЬрдм рд╣рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рдЬрд╛рдПрдВ рдХрд┐ рдирдпрд╛ рд╕реНрдерд┐рд░ рд╣реИ), рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдмрдлрд░ рддрдХ рдкрд╣реБрдВрдЪ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд┐рд░реНрдорд╛рдг рди рдХрд░реЗ: https://github.com/xtermjs/xterm.js/blob/ 8d16bb6ea2e90312b0efb28bee3f39d3995a906f/src/BufferLine.ts#L153 -L162

рдмрд╛рдж рдореЗрдВ:

рд╕рднреА 73 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдПрдХ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд┐рд╕реЗ рдЗрд╕рдореЗрдВ рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдбрд┐рд╕реНрдХ рдкрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕рдбрдм, рд╡реЗрдмрдПрд╕рдХреНрдпреВрдПрд▓ рдпрд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдмрдврд╝рд┐рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ред рдореИрдВ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ ред 3 рдЕрднреА рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрдВ рдЕрд╕рд▓реА рд░рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реБрдП рд╕реНрдореГрддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИред

рдЕрдЧрд░ рд╣рдо рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЪреАрдЬреЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд▓рддреА рд░рд╣рддреА рд╣реИрдВ, рддреЛ рд╣рдо 5 рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдпрд╛ рдЙрд╕ рд╕рдордп рд╣рдорд╛рд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

3. рдорд╣рд╛рди рд╣реИ .

@mofux , рдЬрдмрдХрд┐ рдореЗрдореЛрд░реА рдлрд╝реБрдЯрдкреНрд░рд┐рдВрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдХ-рд╕реНрдЯреЛрд░реЗрдЬ-рд╕рдорд░реНрдерд┐рдд рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдХреЛ рдиреАрдЪрд╛ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдбрд┐рд╕реНрдХ рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд╛рдВрдЧрддрд╛ рд╣реИред

рднрд╡рд┐рд╖реНрдп рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ:
рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рдЙрддрдирд╛ рд╣реА рдЕрдзрд┐рдХ WebWorker рд╣реЛрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдЯреНрдЯреА рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ, рд▓рд╛рдЗрди рдмрдлрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ, рд▓рд┐рдВрдХ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ, рдЦреЛрдЬ рдЯреЛрдХрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдФрд░ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдкреАрд▓ рдХрд░рдиреЗ рдХрд╛ рднрд╛рд░реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ рдпреВрдЖрдИ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдЕрд▓рдЧ рдкреГрд╖реНрдарднреВрдорд┐ рдзрд╛рдЧреЗ рдореЗрдВ рднрд╛рд░реА рдХрд╛рдо рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ 4.0 рд░рд┐рд▓реАрдЬ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЪрд░реНрдЪрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡реЗрдмрд╡рд░реНрдХрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ +100, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд╕реВрдЪреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рд╣рдо рд╕рдорд░реНрдерди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...

рдЬрдм рдореИрдВ Int32Array рдХрд╣рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рд░рдгреА рд╣реЛрдЧреА рдпрджрд┐ рдпрд╣ рдкрд░реНрдпрд╛рд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

@mofux рднрд╡рд┐рд╖реНрдп рдореЗрдВ WebWorker рд╕рд╛рде рдЕрдЪреНрдЫреА рд╕реЛрдЪ

@AndrienkoAleksandr рд╣рд╛рдБ рдЕрдЧрд░ рд╣рдо WebWorker рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдлреАрдЪрд░ рдбрд┐рдЯреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рд╡рд╛рд╣ рдЕрдЪреНрдЫреА рд╕реВрдЪреА :)

рдореИрдВ рднреА 3 рдХреА рдУрд░ рдЭреБрдХрддрд╛ рд╣реВрдВ [start, end] рд╕реВрдЪреА рдХреЛ рдиреАрдЪрд╛ рджрд┐рдЦрд╛рдПрдВрдЧреЗ) .

@AndrienkoAlexandr рд╣рд╛рдБ рдореБрдЭреЗ рд╡реЗрдмрд╡рд░реНрдХрд░ рд╡рд┐рдЪрд╛рд░ рднреА рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрдирдереНрд░реЗрдб рд╕реЗ _some_ рдмреЛрдЭ рдЙрдард╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ (рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдпрд╣ рд╕рднреА рд╡рд╛рдВрдЫрд┐рдд рд▓рдХреНрд╖реНрдп рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) _some_ рд╣реИ - рдЬреЗрдПрд╕ рднрд╛рдЧ рдЕрдм рд╕рднреА рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рдЗрддрдирд╛ рдмрдбрд╝рд╛ рд╕реМрджрд╛ рдирд╣реАрдВ рд╣реИ, xterm.js рдиреЗ рд╕рдордп рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рджрд░реНрд╢рди-рд╡рд╛рд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рд▓реЗрдЖрдЙрдЯрд┐рдВрдЧ/рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╣реИ ...

@mofux рдХреБрдЫ "рд╡рд┐рджреЗрд╢реА рд╕реНрдореГрддрд┐" рдХреЗ рд▓рд┐рдП рдкреЗрдЬрд┐рдВрдЧ рдЪреАрдЬрд╝ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреБрдЫ рдЙрдЪреНрдЪ рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ "рдЬрд┐рдореНрдореЗ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдЬреЗрдЯ рдЪреАрдЬрд╝" рдЬреЛ xterm.js рд╣реИред рдпрд╣ рдПрдХ рдПрдбрди рдЗрдореНрд╣реЛ рджреНрд╡рд╛рд░рд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдСрдлрдЯреЙрдкрд┐рдХ: рдХреНрдпрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдмрдирд╛рдо рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдмрдирд╛рдо asm.jsред рдореИрдВ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ - рдУрдПрдордЬреА, рдпрд╣ рд╕рд╛рдзрд╛рд░рдг рдЪрд░ рднрд╛рд░ рдФрд░ рд╕реЗрдЯ (рдПрдлрдПрдл рдкрд░ рдФрд░ рднреА рдЕрдзрд┐рдХ) рдХреЗ рд▓рд┐рдП 1 : 1,5 : 10 рдЬреИрд╕рд╛ рд╣реИред рдпрджрд┐ рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдЧрддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪреЛрдЯ рдкрд╣реБрдВрдЪрд╛рдиреЗ рд▓рдЧрддреА рд╣реИ, рддреЛ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП "asm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдореВрд▓рднреВрдд рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред рдФрд░ webassembly рдЕрднреА рддрдХ рдЬрд╣рд╛рдЬ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдСрдлрдЯреЙрдкрд┐рдХ: рдХреНрдпрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдмрдирд╛рдо рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдмрдирд╛рдо asm.jsред рдореИрдВ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ - рдУрдПрдордЬреА, рдпрд╣ рд╕рд╛рдзрд╛рд░рдг рдЪрд░ рднрд╛рд░ рдФрд░ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП 1: 1,5: 10 рдЬреИрд╕рд╛ рд╣реИ (рдПрдлрдПрдл рдкрд░ рдФрд░ рднреА рдЕрдзрд┐рдХ)

@jerch рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдо typedarrays 1:1 рд╕реЗ 1:5 рд╣реИ?

рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдкрдХрдбрд╝ - рдореЗрд░рд╛ рдорддрд▓рдм рдЧрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ 10:15:100 ред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдлрдПрдл рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рдгреА рд╕реЗ рдереЛрдбрд╝рд╛ рддреЗрдЬ рдереЗред asm рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдкрд░ js рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо 10 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ - FF, рд╡реЗрдмрдХрд┐рдЯ (рд╕рдлрд╛рд░реА), рдмреНрд▓рд┐рдВрдХ/V8 (рдХреНрд░реЛрдо, рдУрдкреЗрд░рд╛) рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред

@jerch рдХреВрд▓, рдмреЗрд╣рддрд░ рдореЗрдореЛрд░реА рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯрд╛рдЗрдкрдПрд░реЗ рд╕реЗ 50% рдХреА рдЧрддрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдирд┐рд╡реЗрд╢ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧреАред

рд╕реНрдореГрддрд┐ рдмрдЪрдд рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ - рд╢рд╛рдпрдж рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреЗ рд▓рд┐рдП width рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХреЗрдВред рдПрдХ рдХрдо рдЦрд░реНрдЪреАрд▓рд╛ wcwidth рд╕рдВрд╕реНрдХрд░рдг рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

@jerch рд╣рдореЗрдВ рдЗрд╕реЗ рдХрд╛рдлреА рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдпрд╛ рдХреБрдЫ рднреА рдЖрд▓рд╕реА рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рд░рд┐рдлреНрд▓реЛ рдЖрддрд╛ рд╣реИ рддреЛ рд╣рдореЗрдВ рдмрдлрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рднрд▓реЗ рд╣реА рдпрд╣ рддреЗрдЬрд╝ рдерд╛, рдлрд┐рд░ рднреА рд╣рдо рдЗрд╕реЗ рдЗрдзрд░-рдЙрдзрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рддреЛ 1 рдорд╛рди рд▓реЗрдВ:

type CharData = [string, number?]; // not sure if this is valid syntax

[
  // 'a'
  ['a'],
  // 'цЦЗ'
  ['цЦЗ', 2],
  // after wide
  ['', 0],
  ...
]

@ рдЯрд╛рдпрд░рд┐рдпрд░ рд╣рд╛рдБ - рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рд╣реИ, рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдкреАрдЖрд░ # 798 рдореЗрдВ рджреЗрдЦреЗрдВ
рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП 16k рдмрд╛рдЗрдЯреНрд╕ рдХреА рд▓рд╛рдЧрдд рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реНрдкреАрдбрдЕрдк 10 рд╕реЗ 15 рдЧреБрдирд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЕрднреА рднреА рдЬрд░реВрд░рдд рд╣реЛ рддреЛ рджреЛрдиреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╕рдВрднрд╡ рд╣реИред

рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рдХреБрдЫ рдФрд░ рдЭрдВрдбреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗ: https://github.com/sourcelair/xterm.js/issues/580

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░: рдЯрд░реНрдорд┐рдирд▓ рдХрд╛ рдХреЗрд╡рд▓ рдирд┐рдЪрд▓рд╛ рднрд╛рдЧ ( Terminal.ybase рд╕реЗ Terminal.ybase + Terminal.rows ) рдЧрддрд┐рд╢реАрд▓ рд╣реИред рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрдЯрд╛ рдмрдирд╛рддрд╛ рд╣реИ рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд┐рд░ рд╣реИ, рд╢рд╛рдпрдж рд╣рдо рдЗрд╕рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рд╣рд╛рд▓ рддрдХ рдирд╣реАрдВ рдкрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдбрд┐рд▓реАрдЯ рд▓рд╛рдЗрдиреНрд╕ (DL, CSI Ps M) рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рднреА рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдХреЛ рд╡рд╛рдкрд╕ рдиреАрдЪреЗ рдирд╣реАрдВ рд▓рд╛рддреА рд╣реИрдВ, рдмрд▓реНрдХрд┐ рджреВрд╕рд░реА рд▓рд╛рдЗрди рдбрд╛рд▓реЗрдВред рдЗрд╕реА рддрд░рд╣, рдКрдкрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ (SU, CSI Ps S) рдЖрдЗрдЯрдо рдХреЛ Terminal.scrollTop рдкрд░ рд╣рдЯрд╛рддрд╛ рд╣реИ рдФрд░ Terminal.scrollBottom рдкрд░ рдПрдХ рдЖрдЗрдЯрдо рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рдирд┐рдЪрд▓реЗ рдЧрддрд┐рд╢реАрд▓ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рд▓рд╛рдЗрди рдХреЛ рдмрд╛рд╣рд░ рдзрдХреЗрд▓рдиреЗ рдкрд░ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдкрд░ рдзрдХреЗрд▓рдиреЗ рд╕реЗ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рдВрд╢реЛрдзрди, рддреЗрдЬ рдкрд╣реБрдВрдЪ рдЖрджрд┐ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдПрдХ рдЕрднрд┐рд▓реЗрдЦреАрдп рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИред

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░: CharAttributeEntry рдХреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд░рдЦрдирд╛ рд╢рд╛рдпрдж рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдЧрд░ рдЯрд░реНрдорд┐рдирд▓ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ "рд░рд┐рдХреНрдд" рдкреИрдбрд┐рдВрдЧ рдХреЛ рджрд╛рдИрдВ рдУрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рди рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг:

screen shot 2017-08-07 at 8 51 52 pm

рд▓рд╛рд▓/рд╣рд░реЗ рд░рдВрдЧ рдХреЗ рдЕрдВрддрд░ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдЕрд╕реНрдерд┐рд░ "рд░рд┐рдХреНрдд" рдХрдХреНрд╖ рд╣реИрдВред

@ рдЯрд╛рдпрд░рд┐рдпрд░
рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдПрдЬреЗрдВрдбреЗ рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдореМрдХрд╛? рдХрдо рд╕реЗ рдХрдо рдЖрдЙрдЯрдкреБрдЯ рдЧрд╣рди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓ рдбреЗрдЯрд╛ рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХрд╛ рдмрд╣реБрдд рдореЗрдореЛрд░реА рдФрд░ рд╕рдордп рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдПрдХрд▓ рд╡рд░реНрдгреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ 2/3/4 рдХреЗ рдХреБрдЫ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдереНрд░реВрдкреБрдЯ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдВрдЧреЗред рд╕рд╛рде рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╕рд╣реЗрдЬрдирд╛ рд╕реНрдореГрддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг:
рдирдП рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рд╣рдо рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрдирдкреБрдЯ рд╡рд░реНрдгреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЙрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓реЗрдВрдЧреЗред рдЙрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ wcwidths рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╣рд╛рдБ рд╣рдореЗрдВ рдЕрднреА рднреА рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рд┐рдП) рдФрд░ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдФрд░ рд╕реНрдЯреЙрдкред рдбреЗрдЯрд╛ рдЖрдиреЗ рдкрд░ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реЗрд▓ рдореЙрдбрд▓ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред
рд╕рдорд╕реНрдпрд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм рдХреБрдЫ рдХрджрдо рдЙрдард╛рддрд╛ рд╣реИ рдФрд░ рдЯрд░реНрдорд┐рдирд▓ рдбреЗрдЯрд╛ рдХрд╛ рдбреНрд░рд┐рд▓-рдбрд╛рдЙрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд░реЗрдВрдбрд░рд░ рдпрд╛ рдХреБрдЫ рдПрд╕реНрдХреЗрдк рдЕрдиреБрдХреНрд░рдо/рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд░реНрд╕рд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ)ред рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╣рдореЗрдВ рдЕрднреА рднреА рд╕реЗрд▓ рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдЯрд░реНрдорд┐рдирд▓ рдХреЙрд▓рдо рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рднреАрддрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рд╕реНрдХреНрд░реЙрд▓ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрднреА рддрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХреИрд╢ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдлрд┐рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╕реНрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред)

@jerch рдореИрдВ рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдореЗрдВ рдкреНрд░рд╛рдЧ рдореЗрдВ рдПрдХ рджрд┐рди рдорд┐рд▓реВрдВрдЧрд╛ рдФрд░ рд╣рдо рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ/рд╢реБрд░реВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рдереЗ рдХрд┐ рдХреИрд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ

https://github.com/xtermjs/xterm.js/pull/1460#issuecomment -390500944 рд╕реЗ

рдЕрд╣рдВрдХрд╛рд░ рдереЛрдбрд╛ рдорд╣рдВрдЧрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рд░ рдХреЛ рджреЛ рдмрд╛рд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

@jerch рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрдлрд░ рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреА рддреЗрдЬрд╝ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдмрддрд╛рдПрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд░реНрдг рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ ArrayBuffer , рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЖрджрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдХреЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛрдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рд▓рд╛рдн рд▓реЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡реИрд╕реЗ рдореИрдВрдиреЗ рдЕрддреАрдд рдореЗрдВ ArrayBuffers рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:

  • рд╡реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ Array рд╕реЗ рдереЛрдбрд╝реЗ рдЦрд░рд╛рдм рд╣реИрдВ (рд╢рд╛рдпрдж рдЗрдВрдЬрди рд╡рд┐рдХреНрд░реЗрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЕрднреА рднреА рдХрдо рдЕрдиреБрдХреВрд▓рд┐рдд)
  • new UintXXArray [] рд╕рд╛рде рд╢рд╛рдмреНрджрд┐рдХ рд╕рд░рдгреА рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЦрд░рд╛рдм рд╣реИ
  • рд╡реЗ рдХрдИ рдмрд╛рд░ рднреБрдЧрддрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ (10 рдЧреБрдирд╛ рддрдХ) рдХреЛ рдкреНрд░реАрд▓реЛрдХ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдорд┐рд╢реНрд░рд┐рдд рд╕рд░рдгреА рдХреА рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдкреНрд░рдХреГрддрд┐ рджреГрд╢реНрдпреЛрдВ рдХреЗ рдкреАрдЫреЗ рднрд╛рд░реА рдЖрд╡рдВрдЯрди рдФрд░ рдЬреАрд╕реА рдХреЗ рдХрд╛рд░рдг рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЦрд╛рддреА рд╣реИ
  • рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рд░реВрдкрд╛рдВрддрд░рдг рд╕рднреА рд▓рд╛рдн рдЦрд╛рддрд╛ рд╣реИ - рдПрдХ рджрдпрд╛ рдЬреЗрдПрд╕ Uint16Array рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдХреЛ рдореВрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ TextEncoder рд╕рд╛рде рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдпреЛрдЧреНрдп)

ArrayBuffer рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рдирд┐рд╖реНрдХрд░реНрд╖ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд░реВрдкрд╛рдВрддрд░рдг рджрдВрдб рдХреЗ рдХрд╛рд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЯрд░реНрдорд┐рдирд▓ ArrayBuffer рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЛрдб-рдкреАрдЯреАрдИ рд╕реЗ рдЯрд░реНрдорд┐рдирд▓ рдбреЗрдЯрд╛ рддрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рдлреНрд░рдВрдЯрдПрдВрдб рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХрдИ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛), рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдкрд╛рджрди рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╕рд╛рдорд╛рди рдХреЛ рд╣рдореЗрд╢рд╛ рдЕрдВрддрд┐рдо uint16_t рд╕реЗ string рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рдЖрдЦрд┐рд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд░реНрдорд╛рдг рд╕рд╣реЗрдЬреЗ рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рд░рдирдЯрд╛рдЗрдо рдХреЛ рдЦрд╛рдПрдЧрд╛ - рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯрд░реНрдорд┐рдирд▓ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдмрджрд╕реВрд░рдд рд╕реА-рдИрд╢ рдЬрд╛рдирд╡рд░ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рддрд░реАрдХрд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред

TL;DR ArrayBuffer рдмреЗрд╣рддрд░ рд╣реИ рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдХреА рд╕рдм рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рдгрд┐рдпрд╛рдБ рдмреЗрд╣рддрд░ рд╣реИрдВред рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ ArrayBuffers рдореЗрдВ рдирд┐рдЪреЛрдбрд╝рдиреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

рдПрдХ рдирдпрд╛ рд╡рд┐рдЪрд╛рд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдЖрдпрд╛ рдерд╛, рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, espред рдмреБрд░рд╛ рд╡рд┐рднрд╛рдЬрди рдФрд░ рдЬреБрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдирдИ InputHandler.print рд╡рд┐рдзрд┐, wcwidth рдФрд░ рд▓рд╛рдЗрди рд╕реНрдЯреЙрдк рдХреЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рдЖрдкрдХреЗ рджреВрд╕рд░реЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ:

  • print рдЕрдм рдХрдИ рдЯрд░реНрдорд┐рдирд▓ рд▓рд╛рдЗрдиреЛрдВ рддрдХ рдкреВрд░реЗ рддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
  • рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреЙрдЗрдВрдЯрд░ рд╕реВрдЪреА рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ (рдХреЛрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрд╡рдВрдЯрди рдпрд╛ рдЬреАрд╕реА рдирд╣реАрдВ, рд╕реВрдЪреА рдЖрд╡рдВрдЯрди рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдПрдХ prealloc'd рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╡рд░реНрддрдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде
  • рдЕрдЧреНрд░рд┐рдо рдХрд░реНрд╕рд░ wcwidth(string) % cols
  • рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ \n (рд╣рд╛рд░реНрдб рд▓рд╛рдЗрди рдмреНрд░реЗрдХ): рдХрд░реНрд╕рд░ рдХреЛ рдПрдХ рд▓рд╛рдЗрди рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдВ, рдкреЙрдЗрдВрдЯрд░ рд╕реВрдЪреА рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣рд╛рд░реНрдб рдмреНрд░реЗрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ
  • рд░реИрдкрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕ рд▓рд╛рдЗрди рдУрд╡рд░рдлреНрд▓реЛ: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕реЙрдлреНрдЯ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ
  • рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ \r : рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рд╕рд╛рдордЧреНрд░реА (рд╡рд░реНрддрдорд╛рди рдХрд░реНрд╕рд░ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рд╡рд┐рд░рд╛рдо рддрдХ) рдХреЛ рдХреБрдЫ рдкрдВрдХреНрддрд┐ рдмрдлрд░ рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ
  • рдбреЗрдЯрд╛ рдКрдкрд░ рдХреА рддрд░рд╣ рдкреНрд░рд╡рд╛рд╣рд┐рдд рд╣реЛрддрд╛ рд╣реИ, \r рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХреЛрдИ рд╕реЗрд▓ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдФрд░ рди рд╣реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рднрд╛рдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  • рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрдм рддрдХ рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ cols x rows рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рд╡реЗ рдХреЗрд╡рд▓ рдПрдЯреАрдЖрд░ рдзреНрд╡рдЬ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рдЬреЛ рдкреВрд░реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ)

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ wcwidths рдЧреНрд░реИрдлреЗрдо рдПрд▓реНрдЧреЛ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд┐рдореЗрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдм рдЦрддрд░рдирд╛рдХ рднрд╛рдЧ 1 - рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХрд░реНрд╕рд░ рдХреЛ cols x rows рднреАрддрд░ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ:

  • рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдореЗрдВ cols рдкреАрдЫреЗ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдБ - рд╡рд░реНрддрдорд╛рди рдЯрд░реНрдорд┐рдирд▓ рд╕рд╛рдордЧреНрд░реА рдХреА рд╢реБрд░реБрдЖрдд
  • рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯрд░реНрдорд┐рдирд▓ рд▓рд╛рдЗрди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ
  • рдХреЗрд╡рд▓ рдПрдХ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рд╕реЗрд▓ рдореЙрдбрд▓ рдореЗрдВ рд╕рд╛рдорд╛рди рд▓реЛрдб рдХрд░реЗрдВ (рдЕрднреА рддрдХ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЪрд╛рд▓рд╛рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреЛрдЬреАрд╢рдирд┐рдВрдЧ рдХреЗ рд╕рд╛рде рднреА рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
  • рдмреБрд░рд╛ рдХрд╛рдо рдХрд░реЗрдВ: рдпрджрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╣рдо рднрд╛рдЧреНрдп рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдкреВрд░реНрдг рд╕реЗрд▓ рдореЙрдбрд▓ рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдкреНрд▓рд┐рдЯ рдПрдВрдб рдЗрдВрд╕рд░реНрдЯ рдореЙрдбрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдирд╛ рд╣реЛрдЧрд╛ (рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ)
  • рдбреЗрдЯрд╛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╡рд╛рд╣рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЕрдм рдЙрд╕ рдкреГрд╖реНрда рдХреЗ рдмрдлрд╝рд░ рдореЗрдВ рдЕрд╡рдХреНрд░рдорд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ attrs рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде

рдЕрдм рдЦрддрд░рдирд╛рдХ рднрд╛рдЧ 2 - рд░реЗрдВрдбрд░рд░ рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ:

  • рдереЛрдбрд╝реЗ рд░реЗрдВрдбрд░рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдореЗрдВ рд╕реЗрд▓ рдореЙрдбрд▓ рдореЗрдВ рдбреНрд░рд┐рд▓рдбрд╛рдЙрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рдПрдЯреНрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдлрд╝рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдкреЗрд╢реЗрд╡рд░реЛрдВ:

  • рдмрд╣реБрдд рддреЗрдЬрд╝ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣
  • рд╕рдмрд╕реЗ рдЖрдо InputHandler рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд - print
  • рдЯрд░реНрдорд┐рдирд▓ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рд░реАрдлреНрд▓реЛрдЗрдВрдЧ рд▓рд╛рдЗрдиреЗрдВ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ

рджреЛрд╖:

  • рд▓рдЧрднрдЧ рд╣рд░ рджреВрд╕рд░реЗ InputHandler рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рд╡рд╛рд╣ рдореЙрдбрд▓ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреБрдЫ рдордзреНрдпрд╡рд░реНрддреА рд╕реЗрд▓ рдЕрдореВрд░реНрддрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрд░реНрде рдореЗрдВ рдЦрддрд░рдирд╛рдХ рд╣реЛрдЧреА
  • рд░реЗрдВрдбрд░рд░ рдПрдХреАрдХрд░рдг рдЕрд╕реНрдкрд╖реНрдЯ (рдореЗрд░реЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдПрдЯреАрдПрдо)
  • рдРрдкреНрд╕ рдЬреИрд╕реЗ рд╢рд╛рдк рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЙрдирдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдЕрдзрд┐рдХ "рдЦрддрд░рдирд╛рдХ" рдЕрдиреБрдХреНрд░рдо рд╣реЛрддреЗ рд╣реИрдВ)

рд╡реИрд╕реЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдПрдХ рдореЛрдЯрд╛ рдорд╕реМрджрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧ рдпреЛрдЧреНрдп рдПрдЯреАрдПрдо рд╣реЛрдиреЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рд╡рд┐рд╡рд░рдг рдЕрднреА рддрдХ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдИрдПрд╕рдкреА "рдЦрддрд░рдирд╛рдХ" рднрд╛рдЧ рдХрдИ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЦрд░рд╛рдм рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХрд┐ рдмрдлрд░ рдХреЛ рдФрд░ рднреА рдЦрд░рд╛рдм рдЬреАрд╕реА рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрджрд┐ рдкреАрдкреА рдХреЗ рд╕рд╛рде рдиреАрдЪрд╛ рджрд┐рдЦрд╛рдирд╛)

@jerch

рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ ArrayBuffers рдореЗрдВ рдирд┐рдЪреЛрдбрд╝рдиреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЛрдирд╛рдХреЛ рдЕрдкрдиреЗ рдмрдлрд░ рдХреЛ ArrayBuffer s рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд╛рдлреА рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдмрд╣реБрдд рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред

рд╡рд┐рд╢реЗрд╖ рдмреБрд░рд╛ рд╡рд┐рднрд╛рдЬрди рдФрд░ рдЬреБрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ

рдЬреЛ рд▓реЛрдЧ?

рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдХреЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛрдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рд▓рд╛рдн рд▓реЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдХреЛ рд╡реНрдпреВрдкреЛрд░реНрдЯ рд╕реЗрдХреНрд╢рди рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдерд╛ред рдПрдХ рдмрд╛рд░ рдЬрдм рдХреЛрдИ рд▓рд╛рдЗрди рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдкрд░ рдЬрд╛рддреА рд╣реИ рддреЛ рдЙрд╕реЗ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк 2 CircularList рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреА рд▓рд╛рдЗрдиреЗрдВ рдХрднреА рдирд╣реАрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИрдВ, рдПрдХ рд╡рд┐рдкрд░реАрдд рдХреЗ рд▓рд┐рдПред

@Tyriar рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рд╣рд╛рдБ рдЪреВрдВрдХрд┐ рдпрд╣ рдХрд░реНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдХрднреА рднреА рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕реНрдХреНрд░реЙрд▓ рдЖрдЙрдЯ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдореЗрдореЛрд░реА рдХреЛ рд╕рд╣реЗрдЬ рд╕рдХрддрд╛ рд╣реИред

@ рдЯрд╛рдпрд░рд┐рдпрд░
ArrayBuffer рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдПрдХ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдЖрдЙрдЯрдкреБрдЯ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо)ред рдпрд╣ рд╣рд░ рдЬрдЧрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕реЗ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдиреЛрдб-рдкреАрдЯреАрдИ рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ рднреА рджреЗ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рд╣рдореЗрдВ рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ рднреА рджреЗ рд╕рдХрддрд╛ рд╣реИ)ред

рд╡рд┐рд╢реЗрд╖ рдмреБрд░рд╛ рд╡рд┐рднрд╛рдЬрди рдФрд░ рдЬреБрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ

рдЬреЛ рд▓реЛрдЧ?

рд╕рдВрдкреВрд░реНрдг рджреГрд╖реНрдЯрд┐рдХреЛрдг _minimize_ рд╡рд┐рднрд╛рдЬрди рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдмрдЪрдирд╛ рд╣реИ ред рдпрджрд┐ рдХреЛрдИ рднреА рдХрд░реНрд╕рд░ рдХреЛ рдмрдлрд░ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдореЗрдВ рдХреВрджрдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рддрд╛рд░ рдХрднреА рд╡рд┐рднрд╛рдЬрд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдФрд░ рд░реЗрдВрдбрд░рд░ рдХреЗ рдкрд╛рд╕ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдпрджрд┐ рд╕рдорд░реНрдерд┐рдд рд╣реЛ)ред рдХреЛрдИ рд╕реЗрд▓ рд╡рд┐рднрд╛рдЬрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЬреБрдбрд╝рддрд╛ рд╣реИред

@jerch рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдЧрд░ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдХреЛрдИ рд▓рд╛рдЗрди рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ рддреЛ рд╣рдо рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рднреА рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ? рдЙрд╕ рдкрд░ 100% рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдпрд╛ рднрд▓реЗ рд╣реА рдпрд╣ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛред

@ рдЯрд╛рдпрд░рд┐рдпрд░ рдЖрд╣ рдареАрдХ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЗрд╢реА xterm рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдЙрд╕ рдпрд╛ рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрд╕рдбреА/рдПрд╕рдпреВ рд╕реНрдХреНрд░реЙрд▓рдмрдлрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ "рд╕рдХреНрд░рд┐рдп" рдЯрд░реНрдорд┐рдирд▓ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдореЗрдВ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдореЛрдирд╛рдХреЛ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ ArrayBuffer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрддрд╛: рдмреНрд▓рд╢:

рд╣рдореНрдо рдмрд╕ TextEncoder/Decoder spec рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝реЗрдВ, ArrayBuffers рдХреЗ рд╕рд╛рде рдиреЛрдб-рдкреАрдЯреАрдЖрдИ рд╕реЗ рдлреНрд░рдВрдЯрдПрдВрдб рддрдХ рд╣рдо рдореВрд▓ рд░реВрдк рд╕реЗ utf-8 рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдП рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдХрдард┐рди рддрд░реАрдХреЗ рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред xterm.js utf-8 рдХреЛ рдЬрд╛рдЧрд░реВрдХ рдмрдирд╛рдирд╛? Idk, рдЗрд╕рдореЗрдВ рдЙрдЪреНрдЪ рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдордзреНрдпрд╡рд░реНрддреА рдХреЛрдбрдкреЙрдЗрдВрдЯ рдЧрдгрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреАред рдкреНрд░реЛрд╕рд╛рдЗрдб - рдпрд╣ рдПрдПрд╕рд╕реАрдЖрдИ рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред

@rebornix рдХреНрдпрд╛ рдЖрдк рд╣рдореЗрдВ рдХреБрдЫ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдореЛрдирд╛рдХреЛ рдмрдлрд░ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ?

рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рдирдП рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдВрдЦреНрдпрд╛рдПрдВ рджреА рдЧрдИ рд╣реИрдВ (рдЕрдкрдирд╛рдирд╛ рдЖрд╕рд╛рди рдерд╛):

  • UTF-8 (Uint8Array): print рдХрд╛рд░реНрд░рд╡рд╛рдИ 190 MB/s рд╕реЗ 290 MB/s рддрдХ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ
  • UTF-16 (Uint16Array): print рдХрд╛рд░реНрд░рд╡рд╛рдИ 190 MB/s рд╕реЗ 320 MB/s рддрдХ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдпреВрдЯреАрдПрдл -16 рдХрд╛рдлреА рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЙрдореНрдореАрдж рдереА рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред UTF-8 рдордзреНрдпрд╡рд░реНрддреА рдХреЛрдбрдкреЙрдЗрдВрдЯ рдЧрдгрдирд╛ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИред

рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ ls -lR /usr/lib ~ 4% рдЬреЗрдПрд╕ рд░рдирдЯрд╛рдЗрдо рдЦрд╛рддреА рд╣реИ (рд╣рдореЗрд╢рд╛ 100 рдПрдордПрд╕ рд╕реЗ рдиреАрдЪреЗ, InputHandler.parse рдореЗрдВ рд▓реВрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдореИрдВрдиреЗ рд░рд┐рд╡рд░реНрд╕ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ (рдпрд╣ рд╕реЗрд▓ рд╕реНрддрд░ рджреНрд╡рд╛рд░рд╛ рд╕реЗрд▓ рдкрд░ InputHandller.print рдореЗрдВ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдПрдЯреАрдПрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд╕рдордЧреНрд░ рд░рдирдЯрд╛рдЗрдо рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЦрд░рд╛рдм рд╣реИ (рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╕рдордп рд░реВрдкрд╛рдВрддрд░рдг рд╕рдордп рдХреА рднрд░рдкрд╛рдИ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред рдпрд╣ рддрдм рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЕрдиреНрдп рднрд╛рдЧ рднреА рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдЬрд╛рдЧрд░реВрдХ рд╣реЛрдВред

рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ ( ls -lR /usr/lib рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛):

рддрд╛рд░ рдХреЗ рд╕рд╛рде:
grafik

Uint16Array рдХреЗ рд╕рд╛рде:
grafik

EscapeSequenceParser.parse рд▓рд┐рдП рдЕрдВрддрд░ рдиреЛрдЯ рдХрд░реЗрдВ, рдЬреЛ рдПрдХ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╕рд░рдгреА (~30% рддреЗрдЬ) рд╕реЗ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддрд╛ рд╣реИред InputHandler.parse рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрджрддрд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬреАрд╕реА рдорд╛рдЗрдирд░ рдХреЛ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдХрд░рдирд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕рд░рдгреА рдХреЛ рджреВрд░ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реВрдВ)ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рдПрдХ рдФрд░ рдкрд╣рд▓реВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЬреАрд╕реА ~ 20% рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдлреНрд░реЗрдо (рд▓рд╛рд▓ рдзреНрд╡рдЬрд╛рдВрдХрд┐рдд) рд╕рднреА рдЬреАрд╕реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред

рдмрд╕ рдПрдХ рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рдХрдЯреНрдЯрд░рдкрдВрдереА рд╡рд┐рдЪрд╛рд░:

  1. рдЕрдкрдиреА рд╕рд░рдгреАрдмрдлрд░ рдЖрдзрд╛рд░рд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдмрдирд╛рдПрдВ, рдХреБрдЫ рдмрдбрд╝рд╛ (>5 рдПрдордмреА)
    рдпрджрд┐ рд╕рд░рдгреАрдмрдлрд╝рд░ рдореЗрдВ int8 рд╕реЗ int16 рд╕реЗ int32 рдкреНрд░рдХрд╛рд░ рдХреЗ 4 рдкрд╛рд░рджрд░реНрд╢реА рд╕реНрд╡рд┐рдЪ рдХреЗ рдЧреБрдгрдХреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рд╕рдВрднрд╡ рд╣реИред рдЖрд╡рдВрдЯрдХ Uint8Array рдкрд░ рдПрдХ рдирд┐рдГрд╢реБрд▓реНрдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рд╕реВрдЪрдХ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрд┐рдЯ рд╢рд┐рдлреНрдЯ рджреНрд╡рд╛рд░рд╛ Uint16Array рдпрд╛ Uint32Array рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  2. рдореЗрдореЛрд░реА рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ UTF-16 рдХреЗ рд▓рд┐рдП uint16_t рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреЗрдВред
  3. рдкрд╛рд░реНрд╕рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рдореЗрдореЛрд░реА рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде InputHandler рдореЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
  4. рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреЗ рдЕрдВрджрд░ рдЯрд░реНрдорд┐рдирд▓ рдбреЗрдЯрд╛ рдмрдлрд░ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд░рд┐рдВрдЧ рдмрдлрд░ рдРрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдПрдВ рдЬреИрд╕реЗ рдХрд┐ рджреЗрд╢реА рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рд╢рд╛рдпрдж рдЗрд╕ рддрд░рд╣ (рдЕрднреА рднреА рд╕реЗрд▓ рдЖрдзрд╛рд░рд┐рдд):
struct Cell {
    uint32_t *char_start;  // start pointer of cell content (JS with pointers hurray!)
    uint8_t length;        // length of content (8 bit here is sufficient)
    uint32_t attr;         // text attributes (might grow to hold true color someday)
    uint8_t width;         // wcwidth (maybe merge with other member, always < 4)
    .....                  // some other cell based stuff
}

рдкреЗрд╢реЗрд╡рд░реЛрдВ:

  • рдЬреЗрдПрд╕ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬреАрд╕реА рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ (рдХреЗрд╡рд▓ рдХреБрдЫ рд╕реНрдерд╛рдиреАрдп рд╡рд╕реНрддреБрдПрдВ рд╣реА рд░рд╣реЗрдВрдЧреА)
  • рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдХреЙрдкреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  • рд▓рдЧрднрдЧ рдХреЛрдИ malloc рдФрд░ free рд▓рд╛рдЧрдд (рдЖрд╡рдВрдЯрдХ/рдбреАрд▓реЛрдХреЗрдЯрд░ рдХреА рдЪрддреБрд░рд╛рдИ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ)
  • рдмрд╣реБрдд рд╕рд╛рд░реА рдореЗрдореЛрд░реА рдмрдЪрд╛рдПрдЧрд╛ (рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдореЛрд░реА рдУрд╡рд░рд╣реЗрдб рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ)

рджреЛрд╖:

  • рдХреИрд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЙрд░рд░ рд╢реЛ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ: рдЪреАрдЦ:
  • рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ, рдереЛрдбрд╝реЗ рд╕рдм рдХреБрдЫ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ
  • рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рддрдХ рдЧрддрд┐ рд▓рд╛рдн рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ

:рдореБрд╕реНрдХреБрд░рд╛рдУ:

рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рди рдордЬрд╝рд╛, рдереЛрдбрд╝реЗ рд╕рдм рдХреБрдЫ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ

рдпрд╣ рдореЛрдирд╛рдХреЛ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд░реАрдм рд╣реИ, рдореБрдЭреЗ рдпрд╣ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдпрд╛рдж рдЖрдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдЪрд░рд┐рддреНрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рд░рдгрдиреАрддрд┐ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ https://code.visualstudio.com/blogs/2017/02/08/syntax-highlighting-optimizations

рд╣рд╛рдБ, рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЙрддреНрддрд░ рдЬрд╣рд╛рдВ рдореЛрдирд╛рдХреЛ рдмрдлрд░ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рдмрд╣реБрдд рджреЗрд░ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред

рдПрд▓реЗрдХреНрд╕ рдФрд░ рдореИрдВ рдРрд░реЗ рдмрдлрд░ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реИрдВ рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп рдпрд╣ рд╣рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рджреЗрддрд╛ рд╣реИред рдХреБрдЫ рдЬрдЧрд╣реЛрдВ рдкрд░ рд╣рдо ArrayBuffer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

  • рдЯреЗрдХреНрд╕реНрдЯ рдмрдлрд╝рд░ рдореЗрдВ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдСрдлрд╝рд╕реЗрдЯ https://github.com/Microsoft/vscode/blob/rebornix/review/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts#L31 ред
  • рдСрдлрд╕реЗрдЯ <--> рд╕реНрдерд┐рддрд┐ рдорд╛рдирдЪрд┐рддреНрд░рдг https://github.com/Microsoft/vscode/blob/rebornix/review/src/vs/editor/common/viewModel/prefixSumComputer.ts#L26
  • рдЯреЛрдХрди https://github.com/Microsoft/vscode/blob/rebornix/review/src/vs/editor/common/model/textModelTokens.ts#L1 рдЗрд╕рдореЗрдВ рдЖрдкрдХреА рд░реБрдЪрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдо рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреВрд╕рд░реЗ рдереНрд░реЗрдб рдореЗрдВ рдЯреЛрдХрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдРрд░реЗ рдмрдлрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдЙрд╕реА рд╕рд░рдгреА рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реНрдпреВ рдореЙрдбрд▓ рдХреЗ рдмреИрдХрд┐рдВрдЧ рд╕реНрдЯреЛрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдПрдХ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдореЗрдВ рдЯреЛрдХрдирдирд╛рдЗрдЬрд╝рд░ (рдиреЛрдб-рдУрдирд┐рдЧреБрд░реБрдорд╛) рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдпреВрдЖрдИ рдХреЛрдб рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЯреЛрдХрди рдХреЛ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ SharedArrayBuffer рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рд╣рдо рдРрд░реЗ рдмрдлрд╝рд░ рдХреЗ рдмрдЬрд╛рдп рдЯреЗрдХреНрд╕реНрдЯ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ V8 рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ

  • рд╣рдо рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ/рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓реЗрдВ рдЬреЗрдПрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред V8 рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреИрд░реЗрдХреНрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдЗрдЯ рдпрд╛ рджреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
  • рд╣рдо рдЯреЗрдХреНрд╕реНрдЯ рдмрдлрд╝рд░ рдкрд░ рдмрд╣реБрдд рдмрд╛рд░ рд╕рдВрдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред
  • рд╣рдо рдиреЛрдбрдЬ рджреЗрд╢реА рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЬрдм рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╡реА 8 рдЗрдВрдЯрд░реНрдирд▓ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрдЪреА рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореИрдВрдиреЗ рдареЛрдХрд░ рдЦрд╛рдИ рд╣реИ рдЬреЛ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдФрд░/рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИ:

  • FlatJS (https://github.com/lars-t-hansen/flatjs) - рд╕рд░рдгреА рдмрдлрд░ рдЖрдзрд╛рд░рд┐рдд рдвреЗрд░ рдХреЗ рд╕рд╛рде рдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛ рднрд╛рд╖рд╛
  • http://2ality.com/2017/01/shared-array-buffer.html (ES2017 рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд, рд╕реНрдкреЗрдХреНрдЯрд░ рдХреЗ рдХрд╛рд░рдг рднрд╡рд┐рд╖реНрдп рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рдорд╛рдгреБ рдХреЗ рд╕рд╛рде рдЙрд╕ рдмрд╣реБрдд рд╣реА рдЖрд╢рд╛рдЬрдирдХ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛)
  • webassembly/asm.js (рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐? рдЕрднреА рддрдХ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп? рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреЗрдо рдПрдЖрдИ рдХреЗ рд▓рд┐рдП рд╕реА рд▓рд┐рдм рдХреЗ рд╕рд╛рде рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдПрдПрд╕рдПрдо.рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдПрдорд╕реНрдХреНрд░рд┐рдкреНрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)
  • https://github.com/AssemblyScript/assemblyscript

рдпрд╣рд╛рдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдПрдХ рддреНрд╡рд░рд┐рдд рд╣реИрдХ рд╣реИ рдХрд┐ рд╣рдо рдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ "рдорд░реНрдЬ" рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреЛрдб рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдмрдлрд░ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ (рд░рдирдЯрд╛рдЗрдо рдХреЛ рдиреБрдХрд╕рд╛рди рд╣реЛрдЧрд╛, рдЕрднреА рддрдХ рдХрд┐рддрдирд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдИрдПрд╕рдкреА рдЕрдЧреНрд░рднреВрдорд┐ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд▓рд┐рдП рдЖрд░рдЬреАрдмреА рдХреЗ рд╕рд╛рде рдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ (рдПрдХ рдмрд╛рд░ рд╕рдорд░реНрдерд┐рдд) xterm.js рдХреЛ рд╕реЗрд▓ рд▓реЗрдЖрдЙрдЯ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рджреНрд╡рд╛рд░рд╛ рдмрд╣реБрдд рд╕рд╛рд░реА рдореЗрдореЛрд░реА рдЦрд╛ рдЬрд╛рдПрдЧреАред рдХреЛрдб рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдпреЛрдЧреНрдп рд░реЗрдл-рдЧрд┐рдирддреА рдПрдЯрд▓рд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрдореНрд╣реЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рд╢рд╛рдпрдж рд╣реА 1M рд╕реЗ рдЕрдзрд┐рдХ рд╕реЗрд▓ рд╣реЛрдВрдЧреЗ, рдЬреЛ рдПрдЯрд▓рд╕ рдХреЛ 1M * entry_size рдмрдврд╝рд╛ рджреЗрдЧрд╛ рдпрджрд┐ рд╕рднреА рд╕реЗрд▓ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдВред

рд╕реЗрд▓ рдХреЛ рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдЯрд▓рд╕ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реЗрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдкреБрд░рд╛рдиреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдирдП рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдЯрд▓рд╕ рдЗрдВрдбреЗрдХреНрд╕ рдЯрд░реНрдорд┐рдирд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ рдФрд░ рдПрд╕рдЬреАрдЖрд░ рдореЗрдВ рд╣реА рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред

рдПрдЯрд▓рд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╕рднреА рд╕реЗрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рддрдХ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╡рд░реНрддрдорд╛рди рдЯрд░реНрдорд┐рдирд▓ рдмрдлрд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП 2 32 рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реИрдВ (рд╡рд░реНрддрдорд╛рди рдмрдлрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рдЖрд░рдЬреАрдмреА рдХреЗ рд╕рд╛рде 4) рдПрдЯрд▓рд╕ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ 32 рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рддрдХ рдХрдо рдХрд░ рджреЗрдЧрд╛ред рдПрдЯрд▓рд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдФрд░ рднреА рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

interface TextAttributes {
    flags: number;
    foreground: number;
    background: number;
}

const enum AtlasEntry {
    FLAGS = 1,
    FOREGROUND = 2,
    BACKGROUND = 3
}

class TextAttributeAtlas {
    /** data storage */
    private data: Uint32Array;
    /** flag lookup tree, not happy with that yet */
    private flagTree: any = {};
    /** holds freed slots */
    private freedSlots: number[] = [];
    /** tracks biggest idx to shortcut new slot assignment */
    private biggestIdx: number = 0;
    constructor(size: number) {
        this.data = new Uint32Array(size * 4);
    }
    private setData(idx: number, attributes: TextAttributes): void {
        this.data[idx] = 0;
        this.data[idx + AtlasEntry.FLAGS] = attributes.flags;
        this.data[idx + AtlasEntry.FOREGROUND] = attributes.foreground;
        this.data[idx + AtlasEntry.BACKGROUND] = attributes.background;
        if (!this.flagTree[attributes.flags])
            this.flagTree[attributes.flags] = [];
        if (this.flagTree[attributes.flags].indexOf(idx) === -1)
            this.flagTree[attributes.flags].push(idx);
    }

    /**
     * convenient method to inspect attributes at slot `idx`.
     * For better performance atlas idx and AtlasEntry
     * should be used directly to avoid number conversions.
     * <strong i="10">@param</strong> {number} idx
     * <strong i="11">@return</strong> {TextAttributes}
     */
    getAttributes(idx: number): TextAttributes {
        return {
            flags: this.data[idx + AtlasEntry.FLAGS],
            foreground: this.data[idx + AtlasEntry.FOREGROUND],
            background: this.data[idx + AtlasEntry.BACKGROUND]
        };
    }

    /**
     * Returns a slot index in the atlas for the given text attributes.
     * To be called upon attributes changes, e.g. by SGR.
     * NOTE: The ref counter is set to 0 for a new slot index, thus
     * values will get overwritten if not referenced in between.
     * <strong i="12">@param</strong> {TextAttributes} attributes
     * <strong i="13">@return</strong> {number}
     */
    getSlot(attributes: TextAttributes): number {
        // find matching attributes slot
        const sameFlag = this.flagTree[attributes.flags];
        if (sameFlag) {
            for (let i = 0; i < sameFlag.length; ++i) {
                let idx = sameFlag[i];
                if (this.data[idx + AtlasEntry.FOREGROUND] === attributes.foreground
                    && this.data[idx + AtlasEntry.BACKGROUND] === attributes.background) {
                    return idx;
                }
            }
        }
        // try to insert into a previously freed slot
        const freed = this.freedSlots.pop();
        if (freed) {
            this.setData(freed, attributes);
            return freed;
        }
        // else assign new slot
        for (let i = this.biggestIdx; i < this.data.length; i += 4) {
            if (!this.data[i]) {
                this.setData(i, attributes);
                if (i > this.biggestIdx)
                    this.biggestIdx = i;
                return i;
            }
        }
        // could not find a valid slot --> resize storage
        const data = new Uint32Array(this.data.length * 2);
        for (let i = 0; i < this.data.length; ++i)
            data[i] = this.data[i];
        const idx = this.data.length;
        this.data = data;
        this.setData(idx, attributes);
        return idx;
    }

    /**
     * Increment ref counter.
     * To be called for every terminal cell, that holds `idx` as text attributes.
     * <strong i="14">@param</strong> {number} idx
     */
    ref(idx: number): void {
        this.data[idx]++;
    }

    /**
     * Decrement ref counter. Once dropped to 0 the slot will be reused.
     * To be called for every cell that gets removed or reused with another value.
     * <strong i="15">@param</strong> {number} idx
     */
    unref(idx: number): void {
        this.data[idx]--;
        if (!this.data[idx]) {
            let treePart = this.flagTree[this.data[idx + AtlasEntry.FLAGS]];
            treePart.splice(treePart.indexOf(this.data[idx]), 1);
        }
    }
}

let atlas = new TextAttributeAtlas(2);
let a1 = atlas.getSlot({flags: 12, foreground: 13, background: 14});
atlas.ref(a1);
// atlas.unref(a1);
let a2 = atlas.getSlot({flags: 12, foreground: 13, background: 15});
atlas.ref(a2);
let a3 = atlas.getSlot({flags: 13, foreground: 13, background: 16});
atlas.ref(a3);
let a4 = atlas.getSlot({flags: 13, foreground: 13, background: 16});
console.log(atlas);
console.log(a1, a2, a3, a4);
console.log('a1', atlas.getAttributes(a1));
console.log('a2', atlas.getAttributes(a2));
console.log('a3', atlas.getAttributes(a3));
console.log('a4', atlas.getAttributes(a4));

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рд░рдирдЯрд╛рдЗрдо рдкреЗрдирд▓реНрдЯреА рд▓рдЧрднрдЧ рд╢реВрдиреНрдп рд╣реИ, рдореЗрд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП ls -lR /usr/lib рдпрд╣ ~2.3 s рдХреЗ рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ 1 рдорд┐рд╕реЗ рд╕реЗ рдХрдо рдЬреЛрдбрд╝рддрд╛ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╛рдЗрдб рдиреЛрдЯ - рдХрдорд╛рдВрдб 5 рдПрдордмреА рдбреЗрдЯрд╛ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП 64 рд╕реЗ рдХрдо рд╡рд┐рднрд┐рдиреНрди рдЯреЗрдХреНрд╕реНрдЯ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╕реНрд▓реЙрдЯ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж 20 рдПрдордмреА рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдмрдЪрдд рдХрд░реЗрдЧрд╛ред

рдмрдлрд░ рдореЗрдВ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреАрдЖрд░ рдмрдирд╛рдП (рджреЗрдЦреЗрдВ https://github.com/xtermjs/xterm.js/pull/1528#issue-196949371 рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдкреАрдЫреЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП):

  • рдкреАрдЖрд░ #1528 : рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдЯрд▓рд╕
  • рдкреАрдЖрд░ #1529 : рдмрдлрд░ рд╕реЗ wcwidth рдФрд░ charCode рд╣рдЯрд╛ рджреЗрдВ
  • рдкреАрдЖрд░ #1530 : рдмрдлрд░ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХреЛрдбрдкреЙрдЗрдВрдЯреНрд╕ / рд╕реЗрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдЗрдВрдбреЗрдХреНрд╕ рд╡реИрд▓реНрдпреВ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓реЗрдВ

@jerch рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдЯрд▓рд╕ рд╢рдмреНрдж рд╕реЗ рджреВрд░ рд░рд╣рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ "рдПрдЯрд▓рд╕" рдХрд╛ рдЕрд░реНрде рд╣рдореЗрд╢рд╛ "рдмрдирд╛рд╡рдЯ рдПрдЯрд▓рд╕" рд╣реЛред рд╕реНрдЯреЛрд░ рдпрд╛ рдХреИрд╢ рдЬреИрд╕рд╛ рдХреБрдЫ рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛?

рдУрд╣ рдареАрдХ рд╣реИ, "рдХреИрд╢" рдареАрдХ рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдкреАрдЖрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЛрдЯреЗ рд╕рд╛рд░рд╛рдВрд╢ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ рдкреАрдЖрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рднреА рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

рдкреНрд░рд╕реНрддрд╛рд╡:

  1. рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗрд▓ рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП AttributeCache рдмрдирд╛рдПрдВред рд╢реБрд░реБрдЖрддреА рд░реЗрдлрд░реА рдЧрд┐рдирддреА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП #1528 рджреЗрдЦреЗрдВ рдЬреЛ рдЕрд╕рд▓реА рд░рдВрдЧ рдЪрд╢реНрдорд╛ рднреА рд░рдЦ рд╕рдХрддрд╛ рд╣реИред рдХреИрд╢ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЯрд░реНрдорд┐рдирд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдмреАрдЪ рднреА рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХрдИ рдЯрд░реНрдорд┐рдирд▓ рдРрдк рдореЗрдВ рдЖрдЧреЗ рдХреА рдореЗрдореЛрд░реА рдХреЛ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛред
  2. рд▓рдШреБ рдЯрд░реНрдорд┐рдирд▓ рд╕рд╛рдордЧреНрд░реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП StringStorage рдмрдирд╛рдПрдВред # 1530 рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдкреЙрдЗрдВрдЯрд░ рдЕрд░реНрде рдХреЛ "рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ" рдХрд░рдХреЗ рд╕рд┐рдВрдЧрд▓ рдЪрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рд╕реЗ рднреА рдмрдЪрд╛рддрд╛ рд╣реИред wcwidth рдпрд╣рд╛рдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  3. рд╡рд░реНрддрдорд╛рди CharData рдХреЛ [number, string, number, number] рд╕реЗ [number, number] рд╕рд┐рдХреЛрдбрд╝реЗрдВ, рдЬрд╣рд╛рдВ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ (рдЗрдВрдбреЗрдХреНрд╕ рдирдВрдмрд░) рд╣реИрдВ:

    • AttributeCache рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐

    • StringStorage рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐

рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╣реБрдд рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ 32 рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рд╕рдордп рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдмрдЪрд╛рдПрдЧреАред StringStorage рд╕реВрдЪрдХ рдПрдХрд▓ рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпреВрдирд┐рдХреЛрдб рдХреЛрдбрдкреЙрдЗрдВрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ code CharData рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрдХ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ StringStorage.getString(idx) ред рдЪреМрдереЗ рдХреНрд╖реЗрддреНрд░ wcwidth рдХреЗ CharData рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ StringStorage.wcwidth(idx) (рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ)ред code рдФрд░ wcwidth рд╕реЗ CharData (#1529 рдореЗрдВ рдкрд░реАрдХреНрд╖рдг) рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рд╕реЗ рд▓рдЧрднрдЧ рдХреЛрдИ рд░рдирдЯрд╛рдЗрдо рдкреЗрдирд▓реНрдЯреА рдирд╣реАрдВ рд╣реИред

  1. рд╕рд┐рдХреБрдбрд╝реЗ рд╣реБрдП CharData рдХреЛ рдШрдиреЗ Int32Array рдЖрдзрд╛рд░рд┐рдд рдмрдлрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВред рд╕реНрдЯрдм рдХреНрд▓рд╛рд╕ (рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕реЗ рджреВрд░) рдХреЗ рд╕рд╛рде #1530 рдореЗрдВ рднреА рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЕрдВрддрд┐рдо рд▓рд╛рдн рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ:

    • рдЯрд░реНрдорд┐рдирд▓ рдмрдлрд░ рдХрд╛ 80% рдЫреЛрдЯрд╛ рдореЗрдореЛрд░реА рдлрд╝реБрдЯрдкреНрд░рд┐рдВрдЯ (5.5 рдПрдордмреА рд╕реЗ 0.75 рдПрдордмреА рддрдХ)

    • рдереЛрдбрд╝рд╛ рддреЗрдЬ (рдЕрднреА рддрдХ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ 20% - 30% рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ)

    • рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдмрд╣реБрдд рддреЗрдЬрд╝ - ls -lR /usr/lib рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рдирдЯрд╛рдЗрдо 1.3s рддрдХ рдЧрд┐рд░ рдЧрдпрд╛ (рдорд╛рд╕реНрдЯрд░ 2.1s рдкрд░ рд╣реИ) рдЬрдмрдХрд┐ рдкреБрд░рд╛рдирд╛ рдмрдлрд░ рдЕрднреА рднреА рдХрд░реНрд╕рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд╣реИ, рдПрдХ рдмрд╛рд░ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдореБрдЭреЗ рд░рдирдЯрд╛рдЗрдо 1s рд╕реЗ рдиреАрдЪреЗ рдЧрд┐рд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ

рдбрд╛рдЙрдирд╕рд╛рдЗрдб - рдЪрд░рдг 4 рдХрд╛рдлреА рдХрд╛рдо рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдмрдлрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдХреБрдЫ рдкреБрдирд░реНрд╡рд┐рдХреНрд░рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рд╣реЗ - 80% RAM рдмрдЪрд╛рдиреЗ рдФрд░ рдлрд┐рд░ рднреА рд░рдирдЯрд╛рдЗрдо рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛? :рдореБрд╕реНрдХреБрд░рд╛рдУ:

рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореИрдВрдиреЗ рдареЛрдХрд░ рдЦрд╛рдИ - рд╡рд░реНрддрдорд╛рди рдЦрд╛рд▓реА рд╕реЗрд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ред рдЗрдореНрд╣реЛ рдПрдХ рд╕реЗрд▓ рдореЗрдВ 3 рд░рд╛рдЬреНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдЦрд╛рд▓реА : рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрд▓ рд╕реНрдерд┐рддрд┐, рдЗрд╕рдореЗрдВ рдЕрднреА рддрдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рд╕рд╛рдордЧреНрд░реА рд╣рдЯрд╛ рджреА рдЧрдИ рд╣реИред рдЗрд╕рдХреА рдЪреМрдбрд╝рд╛рдИ 1 рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ blankLine рдФрд░ eraseChar , рд▓реЗрдХрд┐рди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рдеред
  • рд╢реВрдиреНрдп : рдкреВрд░реНрдг рдЪреМрдбрд╝рд╛рдИ рд╡рд╛рд▓реЗ рдЪрд╛рд░ рдХреЗ рдмрд╛рдж рд╕реЗрд▓, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рджреГрд╢реНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдХреЛрдИ рдЪреМрдбрд╝рд╛рдИ рдирд╣реАрдВ рд╣реИред
  • рд╕рд╛рдорд╛рдиреНрдп : рд╕реЗрд▓ рдореЗрдВ рдХреБрдЫ рд╕рд╛рдордЧреНрд░реА рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдХреА рджреГрд╢реНрдп рдЪреМрдбрд╝рд╛рдИ рд╣реЛрддреА рд╣реИ (1 рдпрд╛ 2, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдЕрд╕рд▓реА рдЧреНрд░реЗрдлреЗрдо/рдмреАрдбрд╝реА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ)

рд╕рдорд╕реНрдпрд╛ рдЬреЛ рдореИрдВ рдпрд╣рд╛рдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЦрд╛рд▓реА рд╕реЗрд▓ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрд▓ рд╕реЗ рдЕрд▓рдЧ рдЬрдЧрд╣ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ, рджреЛрдиреЛрдВ рдмрдлрд░ рд╕реНрддрд░ (рд╕рдорд╛рди рд╕рд╛рдордЧреНрд░реА, рд╕рдорд╛рди рдЪреМрдбрд╝рд╛рдИ) рдкрд░ рд╕рдорд╛рди рджрд┐рдЦрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдХреЛрдИ рднреА рд░реЗрдВрдбрд░рд░/рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдореЛрд░реНрдЪреЗ рдкрд░ рдЕрдЬреАрдм рд╕реНрдерд┐рддрд┐ рдкреИрджрд╛ рд╣реЛрдЧреАред рдИрдПрд╕рдкреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рджрд╛рд╣рд┐рдиреЗ рдЫреЛрд░ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдмреЛрдЭрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
15 рдХреЙрд▓реНрд╕ рд╡рд╛рд▓рд╛ рдПрдХ рдЯрд░реНрдорд┐рдирд▓, рдкрд╣рд▓реЗ рдХреБрдЫ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрдЙрдЯрдкреБрдЯ, рдЬреЛ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рд┐рдкрдЯрд╛ рд╣реБрдЖ рдерд╛:

1: 'H', 'e', 'l', 'l', 'o', ' ', 't', 'e', 'r', 'm', 'i', 'n', 'a', 'l', ' '
2: 'w', 'o', 'r', 'l', 'd', '!', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '

ls рд╕рд╛рде рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╕реВрдЪреА рдмрдирд╛рдо:

1: 'R', 'e', 'a', 'd', 'm', 'e', '.', 'm', 'd', ' ', ' ', ' ', ' ', ' ', ' '
2: 'f', 'i', 'l', 'e', 'A', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '

рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ 'рдЯрд░реНрдорд┐рдирд▓' рд╢рдмреНрдж рдХреЗ рдмрд╛рдж рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд╛рди рд╣реЛрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг 'Readme.md' рдХреЗ рдмрд╛рдж рдХрднреА рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рдЫреВрддрд╛ рд╣реИред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕реЗ рдмрдлрд░ рд╕реНрддрд░ рдкрд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдорд╛рдирдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрди рдкрд░ рдЯрд░реНрдорд┐рдирд▓ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдорд╛рди рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рдХрдорд░реЗ рдХреЛ рд╡реИрд╕реЗ рднреА рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ), рд▓реЗрдХрд┐рди рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдорд╛рдЙрд╕ рдЪрдпрди рдХреА рддрд░рд╣ рд╕рд╛рдордЧреНрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рд░рд┐рдлреНрд▓реЛ рдореИрдиреЗрдЬрд░ рдпрд╣ рдЕрдм рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХрд╣рд╛рдВ рд╕реЗ рдЖрддреЗ рд╣реИрдВред

рдХрдореЛрдмреЗрд╢ рдпрд╣ рдЕрдЧрд▓реЗ рдкреНрд░рд╢реНрди рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХреИрд╕реЗ рдХрд░реЗрдВ (рдЙрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдорд╛рддреНрд░рд╛ рдЬрд┐рдирдореЗрдВ рдмрд╛рдИрдВ рдУрд░ рд╕реЗ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ)? рдПрдХ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЦрд╛рд▓реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рджрд╛рдИрдВ рдУрд░ рд╕реЗ рдЧрд┐рдирддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реЗ рдКрдкрд░ рд╕реЗ рджреЛрд╣рд░рд╛ рдЕрд░реНрде рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡:
рдЗрдореНрд╣реЛ рдпрд╣ рдЦрд╛рд▓реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рди рдлрд┐рдХреНрд╕ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдЪрд╛рд░ рдпрд╛ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд░реЗрдВрдбрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реАрди рд░реЗрдВрдбрд░рд░ рднреА рдЗрд╕рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдЙрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдВрднрд╛рд▓рдирд╛ рди рдкрдбрд╝реЗ (рдЖрдЙрдЯрдкреБрдЯ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ)ред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдЗрд╕рдХреЗ рдКрдкрд░ рд▓рдкреЗрдЯреЗ рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП isWrapped рд╕рдорд╕реНрдпрд╛ рднреА рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ рд░реАрдлреНрд▓реЛрдЗрдВрдЧ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдпрд╛ рд╕рд╣реА рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдЪрдпрди рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрдореНрд╣реЛ рд╣рдо рдЗрд╕реЗ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдЯреАрдПрдо рд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@jerch рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдХрд╛рдо! :рд╕реНрдорд╛рдЗрд▓реА:

1 рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗрд▓ рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдЯреНрд░реАрдмреНрдпреВрдЯ рдХреИрд╢ рдмрдирд╛рдПрдВред рд╢реБрд░реБрдЖрддреА рд░реЗрдлрд░реА рдЧрд┐рдирддреА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП #1528 рджреЗрдЦреЗрдВ рдЬреЛ рдЕрд╕рд▓реА рд░рдВрдЧ рдЪрд╢реНрдорд╛ рднреА рд░рдЦ рд╕рдХрддрд╛ рд╣реИред рдХреИрд╢ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЯрд░реНрдорд┐рдирд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдмреАрдЪ рднреА рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХрдИ рдЯрд░реНрдорд┐рдирд▓ рдРрдк рдореЗрдВ рдЖрдЧреЗ рдХреА рдореЗрдореЛрд░реА рдХреЛ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛред

#1528 рдкрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдХреАрдВред

2 рд╢реЙрд░реНрдЯ рдЯрд░реНрдорд┐рдирд▓ рдХрдВрдЯреЗрдВрдЯ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╣реЛрд▓реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ StringStorage рдмрдирд╛рдПрдБред # 1530 рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдкреЙрдЗрдВрдЯрд░ рдЕрд░реНрде рдХреЛ "рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ" рдХрд░рдХреЗ рд╕рд┐рдВрдЧрд▓ рдЪрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рд╕реЗ рднреА рдмрдЪрд╛рддрд╛ рд╣реИред wcwidth рдпрд╣рд╛рдБ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

#1530 рдкрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдХреАрдВред

4 рд╕рд┐рдХреБрдбрд╝реЗ рд╣реБрдП рдЪрд╛рд░рдбрд╛рдЯрд╛ рдХреЛ рдПрдХ рд╕рдШрди Int32Array рдЖрдзрд╛рд░рд┐рдд рдмрдлрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдБред рд╕реНрдЯрдм рдХреНрд▓рд╛рд╕ (рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕реЗ рджреВрд░) рдХреЗ рд╕рд╛рде #1530 рдореЗрдВ рднреА рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЕрдВрддрд┐рдо рд▓рд╛рдн рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ:

рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдЪрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рд░рд┐рдлреНрд▓реЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╣рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдХрд╛рдЯ рджреЗрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдмрд╣реБрдд рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХреЗрдВ рдХрд┐ рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рдЪрд▓рддреА рд╣реИрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдмрд╛рд░ 3 рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореИрдВрдиреЗ рдареЛрдХрд░ рдЦрд╛рдИ - рд╡рд░реНрддрдорд╛рди рдЦрд╛рд▓реА рд╕реЗрд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ред рдЗрдореНрд╣реЛ рдПрдХ рд╕реЗрд▓ рдореЗрдВ 3 рд░рд╛рдЬреНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ

рдпрд╣рд╛рдВ рдПрдХ рдмрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЗрд╕ https://github.com/xtermjs/xterm.js/issues/1286 рд╕реЗ рдирд┐рдХрд▓рд╛ рд╣реИ, :+1: рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рд╕реЗрд▓ рдФрд░ "рд░рд┐рдХреНрдд" рд╕реЗрд▓ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдЗрд╕рдХреЗ рдКрдкрд░ рд▓рд┐рдкрдЯреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА isWrapped рд╕рдорд╕реНрдпрд╛ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд░реАрдлреНрд▓реЛрдЗрдВрдЧ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдпрд╛ рд╕рд╣реА рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдЪрдпрди рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрдореНрд╣реЛ рд╣рдо рдЗрд╕реЗ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдЯреАрдПрдо рд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЬрдм рд╣рдо https://github.com/xtermjs/xterm.js/issues/622 рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ isWrapped рджреВрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдкрддреНрд░ рд╕реВрдЪреА рдореЗрдВ рдХреЗрд╡рд▓ рдЕрд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред

рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдЪрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рд░рд┐рдлреНрд▓реЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╣рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдХрд╛рдЯ рджреЗрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдмрд╣реБрдд рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХреЗрдВ рдХрд┐ рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рдЪрд▓рддреА рд╣реИрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдмрд╛рд░ 3 рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рд╣рд╛рдВ, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╣реВрдВ (рдЕрднреА рднреА рдЗрд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдореЗрдВ рдордЬрд╛ рдЖрддрд╛ рд╣реИ)ред 1 рдФрд░ 2 рдХреЛ рдЪреЗрд░реА рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, 3 рдХреЛ 1 рдпрд╛ 2 рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред 4 рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рдмрдлрд░ рд▓реЗрдЖрдЙрдЯ рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдореГрддрд┐ рдмрдЪрдд рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  1. CircularList рдореЗрдВ 1 + 2 + 3 : 50% рдмрдЪрд╛рддрд╛ рд╣реИ (~ 5.5 рдПрдордмреА рдХрд╛ ~ 2.8 рдПрдордмреА)
  2. 1 + 2 + 3 + 4 рдЖрдзреЗ рд░рд╛рд╕реНрддреЗ - рдмрд╕ рд▓рд╛рдЗрди рдбреЗрдЯрд╛ рдХреЛ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдореЗрдВ рд░рдЦреЗрдВ рд▓реЗрдХрд┐рди рдкрдВрдХреНрддрд┐ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдПрдХреНрд╕реЗрд╕ рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣реЗрдВ: 82% (~ 0.9 рдПрдордмреА) рдмрдЪрд╛рддрд╛ рд╣реИ
  3. 1 + 2 + 3 + 4 рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдШрди рд╕рд░рдгреА: 87% (~ 0.7MB) рдмрдЪрд╛рддрд╛ рд╣реИ

1. рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдмрдбрд╝реЗ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрднреА рднреА рдЦрд░рд╛рдм рд╕реНрдХреЗрд▓рд┐рдВрдЧ рджрд┐рдЦрд╛рдПрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ https://github.com/xtermjs/xterm.js/pull/1530#issuecomment -403542479 рд▓реЗрдХрд┐рди рдХрдо рд╡рд┐рд╖рд╛рдХреНрдд рд╕реНрддрд░ рдкрд░
2. рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдХрдард┐рди (рд▓рд╛рдЗрди рд╕реНрддрд░ рдкрд░ рдХреБрдЫ рдФрд░ рд╕рдВрдХреЗрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди Buffer рдХреЗ рдЙрдЪреНрдЪ рдПрдкреАрдЖрдИ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдЧрд╛ред рдЗрдореНрд╣реЛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк - рдмрдбрд╝рд╛ рдореЗрдо рд╕реЗрд╡ рдФрд░ рдЕрднреА рднреА рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
3. рд╡рд┐рдХрд▓реНрдк 2 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 5% рдЕрдзрд┐рдХ рдореЗрдо рд╕реЗрд╡, рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рди, рд╕рднреА рдПрдкреАрдЖрдИ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдкреВрд░реНрдг рдХреЛрдб рдЖрдзрд╛рд░ред рдЗрдореНрд╣реЛ рдЕрдзрд┐рдХ рдЕрдХрд╛рджрдорд┐рдХ рд╣рд┐рдд рдХреЗ рд▓рд┐рдП рдпрд╛ рдЙрдмрд╛рдК рдмрд░рд╕рд╛рдд рдХреЗ рджрд┐рдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЛрдЧреНрдпред

@Tyriar рдореИрдВрдиреЗ webassembly рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЬрдВрдЧ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдФрд░ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореЗрд░реЗ рдЬрдВрдЧ рдХреЗ рдХреМрд╢рд▓ "рдЬрдВрдЧ рдЦрд╛рдП" рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрднреА рддрдХ рдЗрд╕рдореЗрдВ рдЧрд╣рд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдХрдордЬреЛрд░ рдЬрдВрдЧ рдХреЛрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо:

  • wasm рднрд╛рдЧ рдХреЗ рднреАрддрд░ рдбреЗрдЯрд╛ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдереЛрдбрд╝рд╛ рддреЗрдЬ (5 - 10%) рд╣реИред
  • JS рд╕реЗ wasm рдореЗрдВ рдХреЙрд▓ рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдКрдкрд░ рд╕реЗ рд╕рднреА рд▓рд╛рднреЛрдВ рдХреЛ рдЦрд╛ рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ ~ 20% рдзреАрдорд╛ рдерд╛ред
  • "рдмрд╛рдЗрдирд░реА" рдЬреЗрдПрд╕ рд╕рдордХрдХреНрд╖ рд╕реЗ рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдкрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рд╕рднреА рд╕рд╛рдорд╛рдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛)ред
  • JS <--> wasm рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рди рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JS рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреНрд▓реЛрдЯрдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛)ред
  • рд╣рдо JS рд╕реЗ wasm рдЕрдиреБрд╡рд╛рдж рд╕реЗ рдмрдЪ рдирд╣реАрдВ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ DOM рдФрд░ рдИрд╡реЗрдВрдЯ рд╡рд╣рд╛рдБ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдореБрдЦреНрдп рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВ (рдореЗрдо рдЦрдкрдд рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред

рдЬрдм рддрдХ рд╣рдо рдЬрдВрдЧ (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд╛рд╕рдо рд╕рдХреНрд╖рдо рднрд╛рд╖рд╛) рдореЗрдВ рдкреВрд░реЗ рдореБрдЦреНрдп рдХрд╛рдореЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддрдм рддрдХ рд╣рдо рд╡рд╛рд╕рдо рд▓реИрдВрдЧ рдЗрдореНрд╣реЛ рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдХреБрдЫ рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЖрдЬрдХрд▓ wasm рд▓реИрдВрдЧреНрд╕ рдХрд╛ рдПрдХ рдкреНрд▓рд╕ рдпрд╣ рддрдереНрдп рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдкрд╖реНрдЯ рдореЗрдореЛрд░реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рдмрдлрд░ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ TS/JS рдХреЗрдВрджреНрд░рд┐рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рдХреЛрдб рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪреНрдЪ рдЕрд╡рд░реЛрдз) рдореЗрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рднрд╛рд╖рд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реИред рдФрд░ wasm рдФрд░ JS рднреВрдорд┐ рдХреЗ рдмреАрдЪ рдЕрдиреБрд╡рд╛рдж рдХреА рд▓рд╛рдЧрддред

рдЯреАрдПрд▓; рдбреАрдЖрд░
xterm.js рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп JS рд╕рд╛рдорд╛рди рдЬреИрд╕реЗ DOM рдФрд░ рдИрд╡реЗрдВрдЯреНрд╕ рдореЗрдВ рд╡реЗрдм рдЕрд╕реЗрдВрдмрд▓реА рд╕реЗ рдХреБрдЫ рднреА рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХреЛрд░ рднрд╛рдЧреЛрдВ рдХреЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рднреАред

@jerch рдЕрдЪреНрдЫреА рдЬрд╛рдВрдЪ: рд╕реНрдорд╛рдЗрд▓реА:

JS рд╕реЗ wasm рдореЗрдВ рдХреЙрд▓ рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдКрдкрд░ рд╕реЗ рд╕рднреА рд▓рд╛рднреЛрдВ рдХреЛ рдЦрд╛ рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ ~ 20% рдзреАрдорд╛ рдерд╛ред

рдореЛрдирд╛рдХреЛ рдХреЗ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдпрд╣ ArrayBuffer s рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╣рд╛рдБ рднреА рд╕рдВрднрд╡ рд╣реЛ рд╣рдореЗрдВ perf рдФрд░ рд╕рд░рд▓рддрд╛ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрддреБрд▓рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЖрд╕рд╛рди, рдкреНрд░рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛)ред

@Tyriar RGB рдбреЗрдЯрд╛ рдХреЛ рд╣реЛрд▓реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдЯреНрд░реАрдмреНрдпреВрдЯрд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдмреАрдПрд╕рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрднреА рддрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЯрд░реНрдорд┐рдирд▓ рд╕рддреНрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рд░рдВрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдФрд░ рднреА рдЦрд░рд╛рдм рд╣реЛрдЧрд╛, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд░рдирдЯрд╛рдЗрдо рдбреНрд░реЙрдк-рдЗрди рд╣реЛ, рдЬрдм рд░рдВрдЧ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдереЙрд▓реНрдб рдХреЛ рдкрд╛рд░ рдХрд░ рдЬрд╛рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдлрд┐рд░ рд╕реЗ рдмрдврд╝ рдЬрд╛рдПрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдореЗрдореЛрд░реА рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдПрдХ рд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ (рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЛ рдиреБрдХрд╕рд╛рди рд╣реЛрдЧрд╛)ред
рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди fg рдФрд░ bg 256 рд░рдВрдЧреЛрдВ рдХрд╛ рдореВрд▓реНрдп 8 рдмрд┐рдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп 9 рдмрд┐рдЯ рдЖрдзрд╛рд░рд┐рдд рдХреНрдпреЛрдВ рд╣реИ? рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдпрд╣рд╛рдВ: https://github.com/xtermjs/xterm.js/blob/6691f809069a549b4808cd2e055398d2da15db37/src/InputHandler.ts#L1596
рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ attr рдХрд╛ рд╡рд░реНрддрдорд╛рди рдмрд┐рдЯ рд▓реЗрдЖрдЙрдЯ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧрд╕реНрдЯреЛрд░реЗрдЬ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП "рдбрдмрд▓ рдЕрд░реНрде" рдЬреИрд╕рд╛ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реНрдореГрддрд┐ рдХреЛ рдФрд░ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рднреЗрдж рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП attr рдХреЗ рдПрдордПрд╕рдмреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдмрд╛рдж рдореЗрдВ рдЖрдЧреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЭрдВрдбреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ FLAGS рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 7 рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рдХреНрдпрд╛ рд╣рдо рдЕрднреА рднреА рдХреБрдЫ рдореМрд▓рд┐рдХ рдЭрдВрдбреЗ рдЧрд╛рдпрдм рд╣реИрдВ рдЬреЛ рдЖрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ?

рдмрдлрд░ рдЯрд░реНрдо рдореЗрдВ 32 рдмрд┐рдЯ attr рдирдВрдмрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

# 256 indexed colors
32:       0 (no RGB color)
31..25:   flags (7 bits)
24..17:   fg (8 bits, see question above)
16..9:    bg
8..1:     unused

# RGB colors
32:       1 (RGB color)
31..25:   flags (7 bits)
24..1:    pointer to RGB data (address space is 2^24, which should be sufficient)

рдЗрд╕ рддрд░рд╣ рднрдВрдбрд╛рд░рдг рдХреЛ рдХреЗрд╡рд▓ рджреЛ 32 рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдЖрд░рдЬреАрдмреА рдбреЗрдЯрд╛ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрдмрдХрд┐ рдЭрдВрдбреЗ attr рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВред

@jerch рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдПрдХ рдИрдореЗрд▓ рднреЗрдЬрд╛ рд╣реИ, рд╢рд╛рдпрдж рд╕реНрдкреИрдо рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдлрд┐рд░ рд╕реЗ рдЦрд╛ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди fg рдФрд░ bg 256 рд░рдВрдЧреЛрдВ рдХрд╛ рдорд╛рди 8 рдмрд┐рдЯ рдХреЗ рдмрдЬрд╛рдп 9 рдмрд┐рдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХреНрдпреЛрдВ рд╣реИ? рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ fg/bg рд░рдВрдЧ (рдЬреЛ рдЧрд╣рд░рд╛ рдпрд╛ рд╣рд▓реНрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 257 рд░рдВрдЧ рд╣реИред

https://github.com/xtermjs/xterm.js/pull/756/files

рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ attr рдХрд╛ рд╡рд░реНрддрдорд╛рди рдмрд┐рдЯ рд▓реЗрдЖрдЙрдЯ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реИ:

19+:     flags (see `FLAGS` enum)
18..18:  default fg flag
17..10:  256 fg
9..9:    default bg flag
8..1:    256 bg

рдЖрдк рдкреБрд░рд╛рдиреЗ рдкреАрдЖрд░ https://github.com/xtermjs/xterm.js/pull/756/files рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВрдиреЗ рдЯреНрд░реВрдХрд▓рд░ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛:

/**
 * Character data, the array's format is:
 * - string: The character.
 * - number: The width of the character.
 * - number: Flags that decorate the character.
 *
 *        truecolor fg
 *        |   inverse
 *        |   |   underline
 *        |   |   |
 *   0b 0 0 0 0 0 0 0
 *      |   |   |   |
 *      |   |   |   bold
 *      |   |   blink
 *      |   invisible
 *      truecolor bg
 *
 * - number: Foreground color. If default bit flag is set, color is the default
 *           (inherited from the DOM parent). If truecolor fg flag is true, this
 *           is a 24-bit color of the form 0xxRRGGBB, if not it's an xterm color
 *           code ranging from 0-255.
 *
 *        red
 *        |       blue
 *   0x 0 R R G G B B
 *      |     |
 *      |     green
 *      default color bit
 *
 * - number: Background color. The same as foreground color.
 */
export type CharData = [string, number, number, number, number];

рддреЛ рдЗрд╕рдореЗрдВ рдореЗрд░реЗ 2 рдЭрдВрдбреЗ рдереЗ; рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП (рдЪрд╛рд╣реЗ рд╕рднреА рд░рдВрдЧ рдмрд┐рдЯреНрд╕ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рд╣реЛ) рдФрд░ рдПрдХ рдЯреНрд░реВрдХрд▓рд░ рдХреЗ рд▓рд┐рдП (рдЪрд╛рд╣реЗ 256 рдпрд╛ 16 рдорд┐рд▓рд┐рдЯреНрд░реА рдХрд▓рд░ рдХрд░рдирд╛ рд╣реЛ)ред

рдпрд╣ рдмрд╛рдж рдореЗрдВ рдЖрдЧреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЭрдВрдбреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ FLAGS рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 7 рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рдХреНрдпрд╛ рд╣рдо рдЕрднреА рднреА рдХреБрдЫ рдореМрд▓рд┐рдХ рдЭрдВрдбреЗ рдЧрд╛рдпрдм рд╣реИрдВ рдЬреЛ рдЖрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ?

рд╣рд╛рдВ, рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЭрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬрдЧрд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/xtermjs/xterm.js/issues/580, https://github.com/xtermjs/xterm.js/issues/1145, рдореИрдВ рдХрдо рд╕реЗ рдХрдо рдЫреЛрдбрд╝ рджреЗрдВ> рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ 3 рдмрд┐рдЯреНрд╕ рдХрд╣реЗрдВред

рдПрдЯреАрдЖрд░ рдХреЗ рдЕрдВрджрд░ рдкреЙрдЗрдВрдЯрд░ рдбреЗрдЯрд╛ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдФрд░ рдирдХреНрд╢рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрд░рдЬреАрдмреА рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рд░рдЦрддрд╛ рд╣реИ? mapAttrIdxToRgb: { [idx: number]: RgbData

@Tyriar рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдХреБрдЫ рджрд┐рди рдСрдирд▓рд╛рдЗрди рдирд╣реАрдВ рдереЗ рдФрд░ рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдИрдореЗрд▓ рд╕реНрдкреИрдо рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЦрд╛ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ? :рд╢рд░рдорд╛рдирд╛:

attrs рд╕рдВрдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЪрддреБрд░ рд▓реБрдХрдЕрдк рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рд╛ рдЧрдпрд╛ред рдЕрдВрддрд░рд┐рдХреНрд╖ рдФрд░ рдЦреЛрдЬ/рд╕рдореНрдорд┐рд▓рд┐рдд рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЖрд╢рд╛рдЬрдирдХ рдкреЗрдбрд╝ рдФрд░ рдПрдХ рд╕рд╕реНрддрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдХреАрдкреНрд▓рд┐рд╕реНрдЯ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд▓реЛрд▓ред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рди рддреЛ рдореЗрд░реА рд╕рд░рд▓ рд╕рд░рдгреА рдЦреЛрдЬ рд╕реЗ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ (рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рдмрдЧ?)
рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХреА рд╣реИ https://gist.github.com/jerch/ff65f3fb4414ff8ac84a947b3a1eec58 рд╕рд░рдгреА рдмрдирд╛рдо рдПрдХ рдмрд╛рдПрдВ рдЭреБрдХрд╛рд╡ рд╡рд╛рд▓реЗ рд▓рд╛рд▓-рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде, рдЬреЛ 10M рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рддрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рд▓рдЧрднрдЧ рдкреВрд░реНрдг рдкрддрд╛ рд╕реНрдерд╛рди рд╣реИ)ред рдПрд▓рдПрд▓рдЖрд░рдмреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрднреА рднреА рд╕рд░рдгреА рдмрд╣реБрдд рдЖрдЧреЗ рд╣реИ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдмреНрд░реЗрдХ-рдИрд╡рди рднреА рд▓рдЧрднрдЧ 10M рд╣реЛрдЧрд╛ред рдореЗрд░реЗ 7 рд╕рд╛рд▓ рдкреБрд░рд╛рдиреЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рднреА рдХрд░ рд╕рдХреЗ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ - рдореБрдЭреЗ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ/рдЯреЗрд╕реНрдЯ рдореЗрдВ рдХреБрдЫ рдмрдЧ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдВред

рдпрд╣рд╛рдВ рдХреБрдЫ рдкрд░рд┐рдгрд╛рдо рджрд┐рдП рдЧрдП рд╣реИрдВ (рдЪрд▓ рд░рд╣реЗ рдирдВрдмрд░реЛрдВ рдХреЗ рд╕рд╛рде):

prefilled             time for inserting 1000 * 1000 (summed up, ms)
items                 array        LLRB
100-10000             3.5 - 5      ~13
100000                ~12          ~15
1000000               8            ~18
10000000              20-25        21-28

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд░реИрдЦрд┐рдХ рд╕рд░рдгреА рдЦреЛрдЬ рдирд┐рдЪрд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреА рд╡реГрджреНрдзрд┐ рдирд╣реАрдВ рджрд┐рдЦрд╛рддреА рд╣реИ, рдпрд╣ ~ 4ms (рдХреИрд╢ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ) рдкрд░ рд╕реНрдерд┐рд░ 10k рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рддрдХ рд╣реИред 10M рдкрд░реАрдХреНрд╖рдг рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рдЦрд░рд╛рдм рд░рдирдЯрд╛рдЗрдо рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдореЗрдо рдкреЗрдЬрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдгред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдПрд╕ рдЬреЗрдЖрдИрдЯреА рдХреЗ рд╕рд╛рде рдорд╢реАрди рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реЛ рдФрд░ рд╕рднреА рдСрдкреНрдЯ/рдбрд┐рдкреНрдЯ рд╣реЛ рд░рд╣реЗ рд╣реЛрдВ, рдлрд┐рд░ рднреА рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдПрдХ рдЬрдЯрд┐рд▓рддрд╛ рдХрджрдо рдХреЛ рдЦрддреНрдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрд▓рдПрд▓рдЖрд░рдмреА рдПрдХ _n_ рдкрд░ рднрд╛рд░реА рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдУ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХ рднреА рдмрд┐рдВрджреБ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИ ( n) рдмрдирд╛рдо O(logn) рдКрдкрд░ рдХреА рдУрд░)

рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдЕрдВрддрд░ рдФрд░ рднреА рдмрджрддрд░ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ fg/bg рд░рдВрдЧ (рдЬреЛ рдЧрд╣рд░рд╛ рдпрд╛ рд╣рд▓реНрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 257 рд░рдВрдЧ рд╣реИред

рддреЛ рдпрд╣ 8 рдкреИрд▓реЗрдЯ рд░рдВрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ SGR 39 рдпрд╛ SGR 49 рд╣реИ?

рдПрдЯреАрдЖрд░ рдХреЗ рдЕрдВрджрд░ рдкреЙрдЗрдВрдЯрд░ рдбреЗрдЯрд╛ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдФрд░ рдирдХреНрд╢рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрд░рдЬреАрдмреА рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рд░рдЦрддрд╛ рд╣реИ? mapAttrIdxToRgb: { [idx: рд╕рдВрдЦреНрдпрд╛]: RgbData

рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕рдВрдХреЗрдд рдкреЗрд╢ рдХрд░реЗрдЧрд╛ред рдКрдкрд░ рджрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдЖрд░рдЬреАрдмреА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдПрдЯреАрдЖрд░ рдореЗрдВ рдЭрдВрдбреЗ рд░рдЦрдиреЗ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХрд╛ рднреА рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдЕрдВрддрд░ 1M рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП ~ 0.5ms рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдЬрдЯрд┐рд▓ attrs рд╕реЗрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп RGB рд╕реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЭрдВрдбреЗ рдХреЛ рд╕реНрдЯреЛрд░реЗрдЬ рдкрд░ рдХреЙрдкреА рдХрд░ рд▓реЗрдВред рдлрд┐рд░ рднреА рдореИрдВ рдкреНрд░рддреНрдпрдХреНрд╖ рдПрдЯреАрдЖрд░ рдмрдирд╛рдо рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдмреАрдЪ 32 рд╡реЗрдВ рдмрд┐рдЯ рднреЗрдж рдХреЗ рд▓рд┐рдП рдЬрд╛рдКрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреИрд░ рдЖрд░рдЬреАрдмреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднрдВрдбрд╛рд░рдг рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдмрдЪ рдЬрд╛рдПрдЧрд╛ред

рд╕рд╛рде рд╣реА рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ fg/bg рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ 8 рдкреИрд▓реЗрдЯ рд░рдВрдЧ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрдлрд░ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЯрд░реНрдорд┐рдирд▓ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рдВрдЧ рдореЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. SGR 39 + SGR 49 fg/bg рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рдВрдЧ (рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп)
  2. SGR 30-37 + SGR 40-47 fg/bg рдХреЗ рд▓рд┐рдП 8 рдХрдо рд░рдВрдЧ рдкреИрд▓реЗрдЯ (рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп)
  3. SGR 90-97 + SGR 100-107 fg/bg рдХреЗ рд▓рд┐рдП 8 рдЙрдЪреНрдЪ рд░рдВрдЧ рдкреИрд▓реЗрдЯ (рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп)
  4. SGR 38;5;n + SGR 48;5;n fg/bg рдХреЗ рд▓рд┐рдП 256 рдЕрдиреБрдХреНрд░рдорд┐рдд рдкреИрд▓реЗрдЯ (рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп)
  5. SGR 38;2;r;g;b + SGR 48;2;r;g;b fg/bg рдХреЗ рд▓рд┐рдП RGB (рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ)

рд╡рд┐рдХрд▓реНрдк 2.) рдФрд░ 3.) рдХреЛ рдПрдХ рдмрд╛рдЗрдЯ рдореЗрдВ рдПрдХ рд╕рд╛рде рдорд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрдиреНрд╣реЗрдВ рдПрдХ рдПрдХрд▓ 16 рд░рдВрдЧ fg/bg рдкреИрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реБрдП), 4.) 2 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИ рдФрд░ 5.) рдЕрдВрдд рдореЗрдВ 6 рдФрд░ рдмрд╛рдЗрдЯ рд▓реЗрдЧрд╛ред рд░рдВрдЧ рдореЛрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрднреА рднреА рдХреБрдЫ рдмрд┐рдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕реЗ рдмрдлрд░ рд╕реНрддрд░ рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

bits        for
2           fg color mode (0: default, 1: 16 palette, 2: 256, 3: RGB)
2           bg color mode (0: default, 1: 16 palette, 2: 256, 3: RGB)
8           fg color for 16 palette and 256
8           bg color for 16 palette and 256
10          flags (currently 7, 3 more reserved for future usage)
----
30

рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ 32 рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЗ 30 рдмрд┐рдЯ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдп рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП 2 рдмрд┐рдЯ рдореБрдХреНрдд рдЫреЛрдбрд╝ рджреЗрдВред 32 рд╡рд╛рдВ рдмрд┐рдЯ рдЧреИрд░ рдЖрд░рдЬреАрдмреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕реВрдЪрдХ рдмрдирд╛рдо рдкреНрд░рддреНрдпрдХреНрд╖ рдПрдЯреАрдЖрд░ рдзреНрд╡рдЬ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдПрдЯреАрдЖрд░ рдПрдХреНрд╕реЗрд╕ рдХреЛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд░реНрдЧ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдмрд╛рд╣рд░ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рди рд╣реЛ (рдЙрдкрд░реЛрдХреНрдд рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рджреЗрдЦреЗрдВ, рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TextAttributes рдХрдХреНрд╖рд╛ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ)ред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдХреБрдЫ рджрд┐рди рдСрдирд▓рд╛рдЗрди рдирд╣реАрдВ рдереЗ рдФрд░ рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдИрдореЗрд▓ рд╕реНрдкреИрдо рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЦрд╛ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ?

рдкреБрди: рднреЗрдЬ

рдУрд╣ рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рд╕рд░рдгреА рдмрдирд╛рдо рдПрд▓рдПрд▓рдЖрд░рдмреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рд╕рдВрдЦреНрдпрд╛рдПрдВ рдмрдХрд╡рд╛рд╕ рд╣реИрдВ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рд▓реВрдк рдореЗрдВ рдХреБрдЫ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рд╕реЗ рдЦрд░рд╛рдм рд╣реЛ рдЧрдпрд╛ рд╣реИред рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдУ (рдПрди) рдмрдирд╛рдо рдУ (рд▓реЙрдЧ рдПрди) рдХреЛ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ (1000 рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреЗрдЬ рд╣реЛ рд░рд╣рд╛ рд╣реИ)ред

рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐:

  • [x] рдПрдХрд╛рдзрд┐рдХ рдмрдлрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдлреИрдХреНрдЯрд░ https://github.com/xtermjs/xterm.js/pull/1632
  • [x] TypedArray- рдЖрдзрд╛рд░рд┐рдд рдмрдлрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗрдВ https://github.com/xtermjs/xterm.js/pull/1641
  • [ ] рдЙрди рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
  • [ ] рдкреБрд░рд╛рдиреЗ рдмрдлрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣рдЯрд╛ рджреЗрдВ (рдЬрдм рд╣рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рдЬрд╛рдПрдВ рдХрд┐ рдирдпрд╛ рд╕реНрдерд┐рд░ рд╣реИ), рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдмрдлрд░ рддрдХ рдкрд╣реБрдВрдЪ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд┐рд░реНрдорд╛рдг рди рдХрд░реЗ: https://github.com/xtermjs/xterm.js/blob/ 8d16bb6ea2e90312b0efb28bee3f39d3995a906f/src/BufferLine.ts#L153 -L162

рдмрд╛рдж рдореЗрдВ:

рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдЕрдиреБрдХреВрд▓рди рд╕рд░рдгреА-рдХреЗ-рд╕рд░рдгреА рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдлрд╝реНрд▓реИрдЯ рдХрд░рдирд╛ рд╣реИред рдпрд╛рдиреА _N_ рдХреЙрд▓рдо рдХреЗ BufferLine рдХреЗ рдмрдЬрд╛рдп _data _N_ CharData рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рд░рдгреА, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ CharData 4 рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ, рдмрд╕ рдПрдХ рд╣реА рд╣реИ _4*N_ рддрддреНрд╡реЛрдВ рдХреА рд╕рд░рдгреАред рдпрд╣ _N_ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд╡рд░рд╣реЗрдб рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреИрд╢ рдЗрд▓рд╛рдХреЗ рдореЗрдВ рднреА рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рддреЗрдЬрд╝ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдиреБрдХрд╕рд╛рди рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдФрд░ рдмрджрд╕реВрд░рдд рдХреЛрдб рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд▓рдЧрддрд╛ рд╣реИред

рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╡рд░реНрддреА рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП _data рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдПрдХ рд░рд╛рдЬреНрдпрд╡реНрдпрд╛рдкреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ред рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд░реИрдЦрд┐рдХ рд╕реНрдХреИрдирд┐рдВрдЧ рдмрд╣реБрдд рддреЗрдЬ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░рдгреА рдХреИрд╢ рдЗрд▓рд╛рдХреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реЛрддреА рд╣реИред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЖрдЙрдЯрдкреБрдЯ рддреЗрдЬрд╝ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рддрд┐рдкрд╛рджрди рд╣реЛрдЧрд╛ред

рд╕реНрдерд╛рди рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддрд┐ рд╕реЗрд▓ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдПрдХ рдлрд╛рдпрджрд╛ рд▓рдЪреАрд▓рд╛рдкрди рдмрдврд╝рд╛ рд╣реИ: рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ (рдЬреИрд╕реЗ 24-рдмрд┐рдЯ рд░рдВрдЧ), рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдпрд╛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди, рдЧреНрд▓рд┐рдлрд╝ рдпрд╛
рдиреЗрд╕реНрдЯреЗрдб рдбреЛрдо рддрддреНрд╡ред

рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП @PerBothner Thx! рд╣рд╛рдБ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд╕рд╛рде рдПрдХрд▓ рдШрдиреЗ рд╕рд░рдгреА рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛рдПрдБ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рдЗрд╕рдХрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдкреВрд░реЗ рдореЗрдореЛрд░реА рдЦрдВрдб (рдХреЙрдкреА рдУрд╡рд░) рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдпрд╛ рдПрдХ рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рдФрд░ рднрд╛рдЧреЛрдВ рдХреЛ рдкреБрди: рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдХрд╛рдлреА рдХреНрд╕реНрдк рд╣реИред рдФрд░ рдореЗрдо рд╕реЗрд╡рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдЗрдореНрд╣реЛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ (рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдХреБрдЫ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкреАрдЖрд░ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирдИ рдмрдлрд░ рд▓рд╛рдЗрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрдЪрдд рд▓рдЧрднрдЧ ~ 10% рдереА)ред

рдЖрдкрдХреА рджреВрд╕рд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рд╕реЗ рд▓рд┐рдкрдЯреА рд╣реБрдИ рд░реЗрдЦрд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдирдП рдмрдлрд░ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдкрдВрдХреНрддрд┐ рдПрдХреНрд╕ рдХреЙрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рд░реАрдлреНрд▓реЛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрдлрд░ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдорд╛рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣рд╛рдВ рд╡рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдЯрд░реНрдорд┐рдирд▓ рдХрд░рддреЗ рд╣реИрдВ - рдХрд░реНрд╕рд░ рдЕрдЧреНрд░рд┐рдо wcwidth рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ pty/termios рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд░рд╣рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдмрдлрд░ рд╕реНрддрд░ рдкрд░ рдХреЗрд╡рд▓ рд╕рд░реЛрдЧреЗрдЯ рдЬреЛрдбрд╝реЗ рдФрд░ рд╕рдВрдпреЛрдЬрди рд╡рд░реНрдгреЛрдВ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рдЕрдиреНрдп "рдЙрдЪреНрдЪ рд╕реНрддрд░" рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рдирд┐рдпрдо рд░реЗрдВрдбрд░рд░ рдореЗрдВ рдХреИрд░реЗрдХреНрдЯрд░ рдЬреЙрдЗрдирд░ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ https://github.com/xtermjs/xterm-addon-ligatures for ligatures рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдореЗрд░реЗ рдкрд╛рд╕ рд╢реБрд░реБрдЖрддреА рдмрдлрд░ рд╕реНрддрд░ рдкрд░ рдпреВрдирд┐рдХреЛрдб рдЧреНрд░реЗрдлреЗрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдЦреБрд▓рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рд╕реНрддрд░ рдкрд░ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреАрдЯреАрдЖрдИ рдмреИрдХрдПрдВрдб рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреА рдХреЛрдИ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ (рдХреНрдпрд╛ рдХреЛрдИ рд╣реИ?) рдФрд░ рд╣рдо рдЕрдЬреАрдм рдЪрд╛рд░ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ . рд╡рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ BIDI рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд░реНрд╕рд░/рд╕реЗрд▓ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдВрдбрд░рд░ рдЪрд░рдг рдореЗрдВ рдЧреНрд░реЗрдлреЗрдо рдФрд░ BIDI рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рдбреЛрдо рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИ, рдореБрдЭреЗ рд╡рд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рддреНрдпрдХреНрд╖ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реЗрдВрдбрд░рд░ рдмреИрдХрдПрдВрдб (рдбреАрдУрдПрдо, рдХреИрдирд╡рд╛рд╕ 2 рдбреА рдФрд░ рдирдпрд╛ рдЪрдордХрджрд╛рд░ рд╡реЗрдмрдЧреНрд▓ рд░реЗрдВрдбрд░рд░) рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рд╕рднреА рд░реЗрдВрдбрд░рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдУрд╡рд░рд▓реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ (рдХреЗрд╡рд▓ рдбреЛрдо рд░реЗрдВрдбрд░рд░ рд╣реЛрдЧрд╛ рдЗрд╕реЗ рд╕реАрдзреЗ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ)ред рд╣рдореЗрдВ рдЙрд╕ рд╕рд╛рдорд╛рди рдФрд░ рдЙрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд░ рд╕реНрддрд░ рдкрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдкреАрдЖрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рд░реЗрдВрдбрд░рд░ рдЧрдВрджрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛/рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдкрдХреА рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

_ "рдЬрдм рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рдХрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдкреВрд░реЗ рдореЗрдореЛрд░реА рдЦрдВрдб (рдХреЙрдкреА рдУрд╡рд░) рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдпрд╛ рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рдФрд░ рднрд╛рдЧреЛрдВ рдХреЛ рдкреБрди: рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдирд╛ рд╣реИред"

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ: рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ _N_ рддрддреНрд╡реЛрдВ рдХреА рдмрдЬрд╛рдп _4*N_ рддрддреНрд╡реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛?

рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рддрд╛рд░реНрдХрд┐рдХ (рдЕрд▓рд┐рдЦрд┐рдд) рд░реЗрдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрдХреНрд╖реЛрдВ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 180-рд╡рд░реНрдг рдХреА рд░реЗрдЦрд╛ рдФрд░ 80-рд╕реНрддрдВрдн рдЪреМрдбрд╝рд╛ рдЯрд░реНрдорд┐рдирд▓ рдорд╛рди рд▓реЗрдВред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди _4*180_-рддрддреНрд╡ _data рдмрдлрд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ 3 BufferLine рдЙрджрд╛рд╣рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ BufferLine рдореЗрдВ рдПрдХ рдкреНрд░рд╛рд░рдВрдн рдСрдлрд╕реЗрдЯ рднреА рд╣реЛрдЧрд╛ред

рд╡реИрд╕реЗ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдмрдбрд╝реА рд╕рд░рдгреА рдореЗрдВ рд╕рдм рдХреБрдЫ рдерд╛ рдЬреЛ [cols] x [rows] x [needed single cell space] рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рддреЛ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрднреА рднреА рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдКрдВрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд╕рд╛рде "рдХреИрдирд╡рд╛рд╕" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЗрдирдкреБрдЯ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрдореЛрд░реА рдХреБрд╢рд▓ рдФрд░ рддреЗрдЬрд╝ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА insertCell / deleteCell рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрдХ рдЖрдХрд╛рд░ рдРрд╕рд╛ рдХрд░реЗрдЧрд╛), рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдкреАрдЫреЗ рдХреА рдкреВрд░реА рдореЗрдореЛрд░реА рдЬрд╣рд╛рдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реЛрддреА рд╣реИ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЫреЛрдЯреЗ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ (<10k) рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рднреА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ> 100k рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЛрд╕реНрдЯреЙрдкрд░ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╕рд░рдгреА рдЗрдВрдк рдХреЛ рдЕрднреА рднреА рдЙрди рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╡рд┐рд╖рд╛рдХреНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд▓рд╛рдЗрди рдПрдВрдб рддрдХ рд▓реЗ рдЬрд╛рдирд╛ рд╣реИред
рдореИрдВрдиреЗ рдорд╣рдВрдЧреА рдкрд╛рд░рд┐рдпреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдЖрдЙрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рдмрдХрд╡рд╛рд╕ рдореЗрдореЛрд░реА рд╢рд┐рдлреНрдЯ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХреНрд╖реЗрддреНрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рд╣реЙрдЯ рдЯрд░реНрдорд┐рдирд▓ рдкрдВрдХреНрддрд┐рдпреЛрдВ" рд╕реЗ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рд╕рдмрд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ terminal.rows ) рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рд╡реЗ рд╣реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд░реНрд╕рд░ рдЬрдВрдк рдФрд░ рдЗрдВрд╕рд░реНрдЯ/рдбрд┐рд▓реАрдЯ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓рд╛ рдЧрдпрд╛ред

рдХрдИ рдмрдлрд░ рд▓рд╛рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореЗрдореЛрд░реА рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рд░реИрдкрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЕрднреА рддрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реЗрдл рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рдЪрдп рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЕрдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рдореЗрдореЛрд░реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рд░реЗрдл рдХрд╛рдЙрдВрдЯрд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢реЛрд╕реНрдЯреЙрдкрд░ рдерд╛ рдФрд░ рдЬреАрд╕реА рднреВрдорд┐ рдореЗрдВ рдЧрд▓рдд рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ред (рдЖрджрд┐рдо рдХреЗ рд▓рд┐рдП #1633 рджреЗрдЦреЗрдВ)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рд╕реНрдкрд╖реНрдЯ рдореЗрдореЛрд░реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╡рд░реНрддрдорд╛рди "рдореЗрдореЛрд░реА рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд░рд╛рдмрд░ рдереА, рдореБрдЭреЗ рдмреЗрд╣рддрд░ рдХреИрд╢ рдЗрд▓рд╛рдХреЗ рдХреЗ рдХрд╛рд░рдг рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЙрдореНрдореАрдж рдереА, рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдПрдХреНрд╕рдк рджреНрд╡рд╛рд░рд╛ рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬреЗрдПрд╕ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдореЗрдВ рдореЗрдо рд╣реИрдВрдбрд▓рд┐рдВрдЧред

рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рдбреЛрдо рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИ, рдореБрдЭреЗ рд╡рд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рддреНрдпрдХреНрд╖ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реЗрдВрдбрд░рд░ рдмреИрдХрдПрдВрдб (рдбреАрдУрдПрдо, рдХреИрдирд╡рд╛рд╕ 2 рдбреА рдФрд░ рдирдпрд╛ рдЪрдордХрджрд╛рд░ рд╡реЗрдмрдЧреНрд▓ рд░реЗрдВрдбрд░рд░) рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рд╕рднреА рд░реЗрдВрдбрд░рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдУрд╡рд░рд▓реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ (рдХреЗрд╡рд▓ рдбреЛрдо рд░реЗрдВрдбрд░рд░ рд╣реЛрдЧрд╛ рдЗрд╕реЗ рд╕реАрдзреЗ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ)ред

рдпрд╣ рдереЛрдбрд╝рд╛ рд╣рдЯрдХрд░ рд╡рд┐рд╖рдп рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрддрдГ рд╣рдореЗрдВ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХреЗ рднреАрддрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝реЗ DOM рдиреЛрдбреНрд╕ рд╣реИрдВ рдЬреЛ рдХреИрдирд╡рд╛рд╕ рд░реЗрдВрдбрд░ рд▓реЗрдпрд░реНрд╕ рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рддрд░рд╣ рдЙрдкрднреЛрдХреНрддрд╛ рдПрдЪрдЯреАрдПрдордПрд▓ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ "рд╕рдЬрд╛рдиреЗ" рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрдирд╡рд╛рд╕ рдПрдкреАрдЖрдИ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рддрд╛рд░реНрдХрд┐рдХ (рдЕрд▓рд┐рдЦрд┐рдд) рд░реЗрдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрдХреНрд╖реЛрдВ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 180-рд╡рд░реНрдг рдХреА рд░реЗрдЦрд╛ рдФрд░ 80-рд╕реНрддрдВрдн рдЪреМрдбрд╝рд╛ рдЯрд░реНрдорд┐рдирд▓ рдорд╛рди рд▓реЗрдВред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ 3 рдмрдлрд╝рд░рд▓рд╛рдЗрди рдЙрджрд╛рд╣рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рд╕рдорд╛рди 4*180-рддрддреНрд╡ _рдбреЗрдЯрд╛ рдмрдлрд╝рд░ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдмрдлрд╝рд░рд▓рд╛рдЗрди рдореЗрдВ рдПрдХ рдкреНрд░рд╛рд░рдВрдн рдСрдлрд╕реЗрдЯ рднреА рд╣реЛрдЧрд╛ред

рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд░реАрдлреНрд▓реЛ рдХреА рдпреЛрдЬрдирд╛ https://github.com/xtermjs/xterm.js/issues/622#issuecomment -375403572 рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХреА рдЧрдИ рд╣реИ, рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд▓рд┐рдЦрд┐рдд рдмрдлрд░ рдФрд░ рдлрд┐рд░ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рджреГрд╢реНрдп рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ рдХрд┐рд╕реА рднреА рд▓рд╛рдЗрди рддрдХ рддреЗрдЬреА рд╕реЗ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдирдИ рд▓рд╛рдЗрдиреЗрдВ (рдХреНрд╖реИрддрд┐рдЬ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдХреВрд▓рди)ред

рдШрдиреЗ рд╕рд░рдгреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЕрд▓рд┐рдЦрд┐рдд рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдХреЗ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдЧрдбрд╝рдмрдбрд╝реА рдЬреЛ рддрдм рдЖрддреА рд╣реИ рдЬрдм рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдКрдкрд░ рд╕реЗ рдЫрдВрдЯрдиреА рдХреА рдЬрд╛рддреА рд╣реИ рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдмрдлрд░ред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдРрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рддрдм рддрдХ рдЧреМрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ #791 рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рдФрд░ рд╣рдо #622 рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдкреАрдЖрд░ #1796 рдХреЗ рд╕рд╛рде рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реБрдЖ рдРрд░реЗ рд╕рдкреЛрд░реНрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд░рд▓ рдЖрдЧреЗ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рджреНрд╡рд╛рд░ рдЦреЛрд▓рддрд╛ рд╣реИ, рджреВрд╕рд░реА рдУрд░ рдЕрдиреНрдп рдЗрдирдкреБрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреАред

рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ Uint16Array рд╕рд╛рде рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬреЗрдПрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рди рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЦреЗрд▓ рдХреЛ UCS2/UTF16 рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкрд╛рд░реНрд╕рд░ UTF32 (UTF8 рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ) рдХреЛ рднреА рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рд░рдгреА рдЖрдзрд╛рд░рд┐рдд рдЯрд░реНрдорд┐рдирд▓ рдмрдлрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ UTF32 рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, UTF16 -> UTF32 рд░реВрдкрд╛рдВрддрд░рдг InputHandler.print ред рдпрд╣рд╛рдБ рд╕реЗ рдХрдИ рджрд┐рд╢рд╛рдПрдБ рд╕рдВрднрд╡ рд╣реИрдВ:

  • рд╕рднреА UTF16 рдмрдирд╛рдПрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЯрд░реНрдорд┐рдирд▓ рдмрдлрд░ рдХреЛ UTF16 рдореЗрдВ рднреА рдмрджрд▓ рджреЗрдВ
    рд╣рд╛рдБ рдЕрднреА рднреА рдпрд╣ рддрдп рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рд╕рдбрд╝рдХ рдпрд╣рд╛рдБ рд▓реЗрдиреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдмрдлрд░ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдЖрдпрд╛, рдХрд┐ рдПрдХ 32 рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪрд╛рд░рдХреЛрдб + wcwidth + рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрди рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ (рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рджреЗрддреА рд╣реИ, рдЬрдмрдХрд┐ 16 рдмрд┐рдЯ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреАрдорддреА рдЪрд╛рд░рдХреЛрдб рдмрд┐рдЯреНрд╕ рдХрд╛ рддреНрдпрд╛рдЧ рдХрд┐рдП рдмрд┐рдирд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ UTF16 рдмрдлрд░ рдХреЗ рд╕рд╛рде рднреА рдЕрднреА рднреА UTF32 рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ wcwidth рдпреВрдирд┐рдХреЛрдб рдХреЛрдбрдкреЙрдЗрдВрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ UTF16 рдЖрдзрд╛рд░рд┐рдд рдмрдлрд░ рдХрдо рдЪрд╛рд░рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдмрдЪрд╛рдПрдЧрд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ BMP рдкреНрд▓реЗрди рдЪрд╛рд░рдХреЛрдб рд╕реЗ рдЕрдзрд┐рдХ рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрднреА рднреА рдХреБрдЫ рдЬрд╛рдВрдЪ рдХреА рдЬрд░реВрд░рдд рд╣реИред
  • рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдПрдВ UTF32
    рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдмрд╕ рд╕рднреА рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ 32 рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдмрджрд▓реЗрдВред рдбрд╛рдЙрдирд╕рд╛рдЗрдб - UTF16 рд╕реЗ UTF32 рд░реВрдкрд╛рдВрддрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдВрдкреВрд░реНрдг рдЗрдирдкреБрдЯ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдмрдЪрдиреЗ рдХреЗ рдХреНрд░рдо рдЬреЛ рдХрднреА рднреА рдХрд┐рд╕реА рднреА рдЪрд╛рд░рдХреЛрдб> 255 рд╕реЗ рдирд╣реАрдВ рдмрдиреЗ рд╣реЛрдВрдЧреЗред
  • wcwidth UTF16 рдХреЛ рд╕рдВрдЧрдд рдмрдирд╛рдПрдВ
    рд╣рд╛рдБ рдЕрдЧрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпреВрдЯреАрдПрдл 16 рдЯрд░реНрдорд┐рдирд▓ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ рддреЛ рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпреВрдЯреАрдПрдл 8 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдкрд╛рд░реНрд╕рд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореВрд▓ рдпреВрдЯреАрдПрдл 8 рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдордзреНрдпрд╡рд░реНрддреА рд╡рд░реНрдг рд╕реА 1 рдирд┐рдпрдВрддреНрд░рдг рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпреВрдЯреАрдПрдл 8 рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдордзреНрдпрд╡рд░реНрддреА рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдЪрд┐рдд рд╕реНрдЯреНрд░реАрдо рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдмреБрд░рд╛ рд╣реИ рдФрд░ рдЗрдореНрд╣реЛ рдХреЛ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред UTF8 рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЬрдЧрд╣ рдЖрд╕рд╛рди рдХреЛрдбрдкреЙрдЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП UTF32 рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдХреЗ рд╕рд╛рдеред

рд╕рдВрднрд╛рд╡рд┐рдд рдпреВрдЯреАрдПрдл 8 рдЗрдирдкреБрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рдореЛрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдерд╛ред рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреИрдирд╡рд╛рд╕ рд░реЗрдВрдбрд░рд░ рдХреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдЧрд╛рдореА рд╡реЗрдмрдЧреНрд▓ рд░реЗрдВрдбрд░рд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ред рдореЗрд░реЗ ls -lR /usr/lib рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:

  • рд╡рд░реНрддрдорд╛рди рдорд╛рд╕реНрдЯрд░ + рд╡реЗрдмрдЧреНрд▓ рд░реЗрдВрдбрд░рд░:
    grafik

  • рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд╢рд╛рдЦрд╛, #1796, #1811 рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдФрд░ рд╡реЗрдмрдЧреНрд▓ рд░реЗрдВрдбрд░рд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ:
    grafik

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд╢рд╛рдЦрд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рднрдВрдбрд╛рд░рдг рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпреВрдЯреАрдПрдл 8 рд╕реЗ рдпреВрдЯреАрдПрдл 32 рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рддрд╛ рд╣реИ (рд░реВрдкрд╛рдВрддрд░рдг ~ 30 рдПрдордПрд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИ)ред рд╕реНрдкреАрдбрдЕрдк рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрдирдкреБрдЯ рдкреНрд░рд╡рд╛рд╣, EscapeSequenceParser.parse (120 рдПрдордПрд╕ рдмрдирд╛рдо 35 рдПрдордПрд╕) рдФрд░ InputHandler.print (350 рдПрдордПрд╕ рдмрдирд╛рдо 75 рдПрдордПрд╕) рдХреЗ рджреМрд░рд╛рди 2 рдЧрд░реНрдо рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ .charCodeAt рдХреЙрд▓ рдХреЛ рд╕рд╣реЗрдЬрдХрд░ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рд╕реНрд╡рд┐рдЪ рд╕реЗ рдмрд╣реБрдд рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдЗрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ UTF16 рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдЯрд╛рдЗрдк рдПрд░реЗ рд╕реЗ рднреА рдХреА - EscapeSequenceParser.parse рдереЛрдбрд╝рд╛ рддреЗрдЬ рд╣реИ (~ 25 ms) рд▓реЗрдХрд┐рди InputHandler.print рдЖрд╡рд╢реНрдпрдХ рд╕рд░реЛрдЧреЗрдЯ рдкреЗрдпрд░рд┐рдВрдЧ рдФрд░ рдХреЛрдбрдкреЙрдЗрдВрдЯ рд▓реБрдХрдЕрдк рдХреЗ рдХрд╛рд░рдг wcwidth рдкреАрдЫреЗ рд░рд╣ рдЬрд╛рддрд╛ рд╣реИ
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕ рд╕реАрдорд╛ рдкрд░ рд╣реВрдВ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо ls рдбреЗрдЯрд╛ (рдПрд╕рдПрд╕рдбреА рдХреЗ рд╕рд╛рде i7) рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдкреНрд░рд╛рдкреНрдд рд╕реНрдкреАрдбрдЕрдк рд░рди рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕рдордп рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рд╕рд╛рд░рд╛рдВрд╢:
рдЗрдореНрд╣реЛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдЗрдирдкреБрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЬреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рдмрдлрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдпреВрдЯреАрдПрдл 8 рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ + рдпреВрдЯреАрдПрдл 32 рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реИред рдЬрдмрдХрд┐ UTF8 рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯрд░реНрдорд┐рдирд▓ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдмрд╛рдЗрдЯ рдкреИрдХрд░реЗрдЯ рд╣реИ рдФрд░ Terminal.write рддрдХ рдмрдлрд╝рд░реНрд╕ рдХреА рдХрдИ рдкрд░рддреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ pty рд╕реЗ рдмрдХрд╡рд╛рд╕ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ, UTF32 рдЖрдзрд╛рд░рд┐рдд рдмрдлрд░ рдбреЗрдЯрд╛ рдХреЛ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз UTF16 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдлрд╝реБрдЯрдкреНрд░рд┐рдВрдЯ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдЬрдмрдХрд┐ UTF16 рдЕрдзрд┐рдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЪрд╛рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖:
рд╣рдореЗрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП UTF32 рдЖрдзрд╛рд░рд┐рдд рдмрдлрд░ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ UTF8 рдЗрдирдкреБрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдФрд░ рдЗрдВрдЯреАрдЧреНрд░реЗрдЯрд░реНрд╕ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рдЖрдИрдкреАрд╕реА рддрдВрддреНрд░ BASE64 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ JSON рд░реИрдкрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдкреВрд░реНрдг рдкреНрд░рдпрд╛рд╕реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдХрд╛рд░ рдХрд░реЗрдЧрд╛)ред

рдЖрдЧрд╛рдореА рд╕рдЪреНрдЪреЗ рд░рдВрдЧ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдмрдлрд░ рд▓реЗрдЖрдЙрдЯ:

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рд░рдгреА рдЖрдзрд╛рд░рд┐рдд рдмрдлрд░ рд▓реЗрдЖрдЙрдЯ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ (рдПрдХ рд╕реЗрд▓):

|    uint32_t    |    uint32_t    |    uint32_t    |
|      attrs     |    codepoint   |     wcwidth    |

рдЬрд╣рд╛рдВ attrs рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЭрдВрдбреЗ + 9 рдмрд┐рдЯ рдЖрдзрд╛рд░рд┐рдд рдПрдлрдЬреА рдФрд░ рдмреАрдЬреА рд░рдВрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред codepoint 21 рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (UTF32 рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо 0x10FFFF рд╣реИ) + 1 рдмрд┐рдЯ рд╕рдВрдпреЛрдЬрди рд╡рд░реНрдгреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ wcwidth 2 рдмрд┐рдЯреНрд╕ (0-2 рд╕реЗ рд▓реЗрдХрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд░рдЬреАрдмреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдмрд┐рдЯреНрд╕ рдХреЛ рдПрдХ рдмреЗрд╣рддрд░ рдкреИрдХреЗрдЯ рдореЗрдВ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реИ:

  • wcwidth рдХреЛ codepoint рдЕрдкреНрд░рдпреБрдХреНрдд рдЙрдЪреНрдЪ рдмрд┐рдЯреНрд╕ рдореЗрдВ рдбрд╛рд▓реЗрдВ
  • 32 рдмрд┐рдЯ рдХреЗ рд╕рд╛рде рдПрдЯреАрдЖрд░ рдХреЛ рдПрдлрдЬреА рдФрд░ рдмреАрдЬреА рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ, рдЕрдкреНрд░рдпреБрдХреНрдд рдмрд┐рдЯреНрд╕ рдореЗрдВ рдЭрдВрдбреЗ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВ
|             uint32_t             |        uint32_t         |        uint32_t         |
|              content             |            FG           |            BG           |
| comb(1) wcwidth(2) codepoint(21) | flags(8) R(8) G(8) B(8) | flags(8) R(8) G(8) B(8) |

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдПрдХреНрд╕реЗрд╕ рдФрд░ рдЕрдзрд┐рдХрддрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рддрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╕реНрддреА рдкрд╣реБрдВрдЪ рд╣реИред 2 рдмрд┐рдЯ рдСрдкрд░реЗрд╢рди (рдФрд░/рдпрд╛ + рд╢рд┐рдлреНрдЯ)ред

рдореЗрдореЛрд░реА рдлрд╝реБрдЯрдкреНрд░рд┐рдВрдЯ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐ рд╕реЗрд▓ 12 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЕрднреА рднреА рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИред UTF16 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдФрд░ attr рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдХреБрдЫ рд░рдирдЯрд╛рдЗрдо рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

|        uint16_t        |              uint16_t               |
|    BMP codepoint(16)   | comb(1) wcwidth(2) attr pointer(13) |

рдЕрдм рд╣рдо 4 рдмрд╛рдЗрдЯреНрд╕ рдкреНрд░рддрд┐ рд╕реЗрд▓ + attrs рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬрдЧрд╣ рддрдХ рдиреАрдЪреЗ рд╣реИрдВред рдЕрдм attrs рдХреЛ рдЕрдиреНрдп рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдкреБрдирд░реНрдирд╡реАрдиреАрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдп рдорд┐рд╢рди рдкреВрд░рд╛ рд╣реБрдЖ! - рдПрд╣рдо, рдПрдХ рд╕реЗрдХрдВрдб ...

рд╕реНрдореГрддрд┐ рдкрджрдЪрд┐рд╣реНрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреАрддрддрд╛ рд╣реИред рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреАрди рдкреНрд░рдореБрдЦ рдХрд╛рд░рдХ рд╣реИрдВ рдЬреЛ рд░рдирдЯрд╛рдЗрдо рдХреЛ рдмрд╣реБрдд рдмрдврд╝рд╛рддреЗ рд╣реИрдВ:

  • рдПрдЯреАрдЖрд░ рдЕрдкреНрд░рддреНрдпрдХреНрд╖
    attr рдкреЙрдЗрдВрдЯрд░ рдХреЛ рджреВрд╕рд░реЗ рдбреЗрдЯрд╛ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рд▓реБрдХрдЕрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  • рдПрдЯреАрдЖрд░ рдорд┐рд▓рд╛рди
    рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдХрдорд░реЗ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдПрдЯреАрдЖрд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╣реЗрдЬреЗ рдЧрдП рдПрдЯреАрдЖрд░ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдмреЛрдЭрд┐рд▓ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИ, рд╕рднреА рдореМрдЬреВрджрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рджреЗрдЦрдХрд░ рдПрдХ рд╕реАрдзрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдУ (рдПрди) рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдЧрдП рдПрди рдПрдЯреАрдЖрд░ рдХреЗ рд▓рд┐рдП рд╣реИ, рдореЗрд░реЗ рдЖрд░рдмреА рдкреЗрдбрд╝ рдХреЗ рдкреНрд░рдпреЛрдЧ рдУ (рд▓реЙрдЧ рдПрди) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрднреА рднреА рдУ (рд▓реЙрдЧ рдПрди) рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рд▓рдЧрднрдЧ рдХреЛрдИ рд╕реНрдореГрддрд┐ рд▓рд╛рдн рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдУ (1) рдХреЗ рд╕рд╛рде 32 рдмрд┐рдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рдПрдХреНрд╕реЗрд╕ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдкреЗрдбрд╝ рдХреЗ рдкрд╛рд╕ рд╕рд╣реЗрдЬреЗ рдЧрдП рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд░рд╛рдм рд░рдирдЯрд╛рдЗрдо рд╣реЛрддрд╛ рд╣реИ (рдореЗрд░реЗ рдЖрд░рдмреА рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╣рдж рддрдХ рд▓рдЧрднрдЧ 100 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░рддрд╛ рд╣реИ)ред
  • UTF16 рд╕рд░реЛрдЧреЗрдЯ рдкреЗрдпрд░рд┐рдВрдЧ
    16 рдмрд┐рдЯ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдХреЛрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП UTF16 рдХреЛ рдиреАрдЪрд╛ рджрд┐рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдиреЗ рд░рдирдЯрд╛рдЗрдо рдкреЗрдирд▓реНрдЯреА рдХреЛ рднреА рдкреЗрд╢ рдХрд┐рдпрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдмреАрдПрдордкреА рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрдбрдкреЙрдЗрдВрдЯ рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╣реЛрддреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рдЕрдХреЗрд▓реЗ рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдХреЛрдбрдкреЙрдЗрдВрдЯ рдПрдХ рд╕рд░реЛрдЧреЗрдЯ рдЬреЛрдбрд╝реА рдмрдирд╛ рджреЗрдЧрд╛ ~ 50 рдПрдордПрд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдХрд╛рдореБрдХрддрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдореГрддрд┐ рдмрдЪрдд рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд BufferLine рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреА рд╢рд╛рдЦрд╛ (рдКрдкрд░ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ) рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛:

grafik

рд╣рд╛рдБ, рд╣рдо рдереЛрдбрд╝реЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдордиреЗ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдпреВрдЯреАрдПрдл 8 + рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ред рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ ~ 1.5 рдПрдордмреА рд╕реЗ рдШрдЯрдХрд░ ~ 0.7 рдПрдордмреА рд╣реЛ рдЧрдпрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ 87 рд╕реЗрд▓ рдФрд░ 1000 рд▓рд╛рдЗрди рд╕реНрдХреНрд░реЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдбреЗрдореЛ рдРрдк)ред

рдпрд╣рд╛рдБ рд╕реЗ рд╕реНрдореГрддрд┐ рдмрдирд╛рдо рдЧрддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдмрд╛рдд рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреЗрдПрд╕ рд╕рд░рдгреА рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдХреЗ рдмрд╣реБрдд рдореЗрдореЛрд░реА рдмрдЪрд╛рдИ рд╣реИ (рд╕реА ++ рдвреЗрд░ рдХреЗ рд▓рд┐рдП ~ 5.6 рдПрдордмреА рд╕реЗ ~ 1.5 рдПрдордмреА рддрдХ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд░реАрд▓реЗ рдЬреЗрдПрд╕ рд╣реАрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдЬреАрд╕реА рдХреЛ рдХрд╛рдЯ рд░рд╣рд╛ рд╣реИ) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рддреЗрдЬ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдмрд╛рд░ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдПрдХ рджрдмрд╛рд╡ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддрдм рднреА рд╣рдо рдпрд╣рд╛рдВ рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЕрдиреБрд╕рд╛рд░ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдмрдлрд░ рд▓реЗрдЖрдЙрдЯ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдЪрд▓реЛ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рд╕реНрдореГрддрд┐ рдЦрдкрдд рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрд╕рдВрднрд╡ рд╣реЛ рд╕рдВрдХреЗрдд рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рдФрд░ рдмрджрд▓рд╛рд╡ рд╣реИрдВ рдЬреЛ рд▓реЛрдЧреЛрдВ (рдореЗрд░реЗ рд╕рд╣рд┐рдд) рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдХрдард┐рди рдмрдирд╛рддреЗ рд╣реИрдВ - рдФрд░ рдЗрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдиреЗ рдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╕реЗ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред IMO рдПрдХ рдФрд░ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдореЗрдореЛрд░реА рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЗрд╕реЗ рдЙрдЪрд┐рдд рдирд╣реАрдВ рдард╣рд░рд╛рддрд╛ рд╣реИред

рдлрд┐рд░ рднреА, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рдЕрднреНрдпрд╛рд╕реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╕реАрдЦрдиреЗ рдХрд╛ рдЖрдирдВрдж рд▓реЗ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕реЗ рдЗрддрдиреЗ рдЕрдЪреНрдЫреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

@mofux рд╣рд╛рдБ рдпрд╣ рд╕рдЪ рд╣реИ - рдХреЛрдб рдЬрдЯрд┐рд▓рддрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ (UTF16 рд╕рд░реЛрдЧреЗрдЯ рдЖрдЧреЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ
рдФрд░ рдЪреВрдВрдХрд┐ 32 рдмрд┐рдЯ рд▓реЗрдЖрдЙрдЯ рдЬреНрдпрд╛рджрд╛рддрд░ рдлреНрд▓реИрдЯ рдореЗрдореЛрд░реА рд╣реИ (рдХреЗрд╡рд▓ рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЛ рд╕рдВрдХреЗрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ), рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рди рд╕рдВрднрд╡ рд╣реИрдВ (# 1811 рдХрд╛ рднреА рд╣рд┐рд╕реНрд╕рд╛, рдЕрднреА рддрдХ рд░реЗрдВрдбрд░рд░ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рдПрдХ attr рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдлрд╛рдпрджрд╛ рд╣реИ: рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИред рдЖрдк рдПрдиреЛрдЯреЗрд╢рди, рдЧреНрд▓рд┐рдлрд╝ рдпрд╛ рдХрд╕реНрдЯрдо рдкреЗрдВрдЯрд┐рдВрдЧ рдирд┐рдпрдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рд▓рд┐рдВрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдВрднрд╡рддрдГ-рдХреНрд▓реАрдирд░ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдПрдХ ICellPainter рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЕрдкрдиреЗ рд╕реЗрд▓ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдЖрдк рдХрд╕реНрдЯрдо рдЧреБрдгреЛрдВ рдХреЛ рднреА рд▓рдЯрдХрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рддрд┐ рдмрдлрд╝рд░рд▓рд╛рдЗрди рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ: рдПрдХ Uint32Array, рдФрд░ ICellPainter рд╕рд░рдгреА, рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рддрддреНрд╡ рдХреЗ рд╕рд╛рдеред рд╡рд░реНрддрдорд╛рди ICellPainter рдкрд╛рд░реНрд╕рд░ рд╕реНрдерд┐рддрд┐ рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рд░рдВрдЧ/рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдмрджрд▓рддреА, рддрдм рддрдХ рдЖрдк рдЙрд╕реА ICellPainter рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╕реЗрд▓ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдЧреБрдг рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ ICellPainter рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ (рдпрджрд┐ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рдЖрдк рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░рдВрдЧ/рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП ICellPainter рдХреЛ рдкреВрд░реНрд╡-рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХрдо рд╕реЗ рдХрдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рдВрдЧреЛрдВ/рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╡рд╕реНрддреБ рд╣реИред

рд╢реИрд▓реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди (рдЬреИрд╕реЗ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдЧреНрд░рднреВрдорд┐/рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ рдмрджрд▓рдирд╛) рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛, рд╕рдВрдмрдВрдзрд┐рдд ICellPainter рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдХреВрд▓рди рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХрд▓-рдЪреМрдбрд╝рд╛рдИ рдФрд░ рджреЛрдЧреБрдиреЗ-рдЪреМрдбрд╝рд╛рдИ рд╡рд╛рд▓реЗ рд╡рд░реНрдгреЛрдВ (рдпрд╛ рд╢реВрдиреНрдп-рдЪреМрдбрд╝рд╛рдИ рд╡рд╛рд▓реЗ рд╡рд░реНрдг) рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди ICellPainter рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред (рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ Uint32Array рддрддреНрд╡ рдореЗрдВ 2 рдмрд┐рдЯ рдмрдЪрд╛рддрд╛ рд╣реИред) Uint32Array рдореЗрдВ 11 рдЙрдкрд▓рдмреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд┐рдЯреНрд╕ рд╣реИрдВ (рдпрджрд┐ рд╣рдо рдмреАрдПрдордкреА рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЕрдзрд┐рдХ)ред рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп/рдЙрдкрдпреЛрдЧреА рд░рдВрдЧ/рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп ICellPainter рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ ICellPainter рд╕рд░рдгреА рдХреЛ рдЖрд▓рд╕реА рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпрд╛рдиреА рдХреЗрд╡рд▓ рддрднреА рдЬрдм рд▓рд╛рдЗрди рдореЗрдВ рдХреБрдЫ рд╕реЗрд▓ рдХреЛ "рдХрдо-рд╕рд╛рдорд╛рдиреНрдп" ICellPainter рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХреЛрдИ рдЧреИрд░-рдмреАрдПрдордкреА рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП _combined рд╕рд░рдгреА рдХреЛ рднреА рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ ICellPainter рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред (рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЧреИрд░-рдмреАрдПрдордкреА рд╡рд░реНрдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп ICellPainter рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдЯреНрд░реЗрдбрдСрдлрд╝ рд╣реИред)

@PerBothner рд╣рд╛рдБ рдПрдХ

рдореИрдВрдиреЗ рдХрдИ рдЯреЗрд╕реНрдЯрдмреЗрдб рдореЗрдВ рдЬреЛ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдЙрд╕ рдкрд░ рдХреБрдЫ рдиреЛрдЯреНрд╕:

  • рд╕реЗрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рд╛рдордЧреНрд░реА
    рд╕реА ++ рд╕реЗ рдЦреБрдж рдХреЛ рдЖрдХрд░ рдореИрдВрдиреЗ рд╕реА ++ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХреАред рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреЙрдЗрдВрдЯрд░ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдПрдХ рд╕рд┐рдВрдЧрд▓ рдЪрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рдерд╛ред рдХрд┐рддрдирд╛ рдмреЗрдХрд╛рд░ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдЕрдиреБрдХреВрд▓рди рдкрддреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдбрдкреЙрдЗрдВрдЯ рдХреЛ рд╕реАрдзреЗ рд╕рд╣реЗрдЬрдХрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдерд╛ (рдЬреЗрдПрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реА/рд╕реА ++ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди)ред рдпрд╣ рдкреНрд░рддрд┐ рд╕реЗрд▓ 12 рдмрд╛рдЗрдЯреНрд╕ (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ 8 рдмрд╛рдЗрдЯреНрд╕ рдкреЙрдЗрдВрдЯрд░ + 4 рдмрд╛рдЗрдЯреНрд╕, 32 рдмрд┐рдЯ wchar_t рдХреЗ рд╕рд╛рде 64 рдмрд┐рдЯ) рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реБрдП рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреА рдкрд╣реБрдВрдЪ рдХреЛ рд▓рдЧрднрдЧ рджреЛрдЧреБрдирд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред рд╕рд┐рдбреЗрдиреЛрдЯ - рдпрд╣рд╛рдВ рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдЖрдзрд╛ рдХреИрд╢ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ (рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдХрд╛рд░рдг рдХреИрд╢ рдЫреВрдЯ рдЬрд╛рддрд╛ рд╣реИ)ред рдпрд╣ рд╕реЗрд▓ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдХрд╛рдордХрд╛рдЬ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ - рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдерд╛ рдЬрдм codepoint рдореЗрдВ рд╕рдВрдпреБрдХреНрдд рдмрд┐рдЯ рд╕реЗрдЯ рдерд╛ (рдмреЗрд╣рддрд░ рдХреИрд╢ рдЗрд▓рд╛рдХреЗ рдХреЗ рдХрд╛рд░рдг рдпрд╣рд╛рдВ рдкрд╣реБрдВрдЪ рддреЗрдЬ рдереА, рд╡рд╛рд▓рдЧреНрд░рд┐рдВрдб рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рдЬреЗрдПрд╕ рдХреЛ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреВ рдирдВрдмрд░ рд░реВрдкрд╛рдВрддрд░рдг (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрднреА рднреА рддреЗрдЬ) рдХреЗ рдХрд╛рд░рдг рдЧрддрд┐ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рдореЗрдо рдХреА рдмрдЪрдд рдФрд░ рднреА рдЕрдзрд┐рдХ рдереА (рдЬреЗрдПрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдмрдВрдзрди рдХрдХреНрд╖ рдХреЗ рдХрд╛рд░рдг рдЕрдиреБрдорд╛рди)ред рд╕рдорд╕реНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ StringStorage , рдЬреЗрдПрд╕ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдПрдВрдЯреАрдкреИрдЯрд░реНрдиред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╡рд┐рдХрдлрд┐рдХреНрд╕ _combined рдСрдмреНрдЬреЗрдХреНрдЯ рдерд╛, рдЬреЛ GC рдХреЛ рдХреНрд▓реАрдирдЕрдк рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА рдмрджрд▓рдиреЗ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ рдФрд░ рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╕реЗрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ (рдЗрд╕реЗ рдЧреНрд░реИрдлреЗрдореНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЬрд▓реНрдж рд╣реА рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрд┐рд╕реА рдмреИрдХрдПрдВрдб рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ)ред рддреЛ рдпрд╣ рд╕реЗрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реЗрд▓ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рд╕реНрдерд╛рди рд╣реИред
  • attrs
    attrs рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ "рдмрдбрд╝рд╛ рд╕реЛрдЪрдирд╛" рд╢реБрд░реВ рдХрд┐рдпрд╛ - рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ AttributeStorage рдХреЗ рд╕рд╛рде рд╕рднреА рдЯрд░реНрдорд┐рдирд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА attrs рдХреЗ рд▓рд┐рдП (рджреЗрдЦреЗрдВ https://github.com/jerch/xterm.js/tree/AttributeStorage)ред рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рд╣рд╛рдЬ рд╕реЗ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореБрдЦреНрдпрддрдГ рдХреНрдпреЛрдВрдХрд┐ рдкреАрдкреАрдПрд▓ рд╕рдЪреНрдЪреЗ рд░рдВрдЧ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рднреА рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рджрд░реНрд╢рди рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдерд╛ - рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд░реЗрдлрд░реА рдЧрд┐рдирддреА рдХреЗ рдХрд╛рд░рдг (рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЛ рдЗрд╕ рд╡рд┐рджреЗрд╢реА рдореЗрдореЛрд░реА рдореЗрдВ рджреЛ рдмрд╛рд░ рджреЗрдЦрдирд╛ рдкрдбрд╝рддрд╛ рдерд╛) рдФрд░ рдПрдЯреАрдЖрд░ рдорд┐рд▓рд╛рдиред рдФрд░ рдЬрдм рдореИрдВрдиреЗ рдЬреЗрдПрд╕ рдХреЛ рд░реЗрдл рдЪреАрдЬ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддреЛ рдпрд╣ рдЧрд▓рдд рд▓рдЧрд╛ - рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВрдиреЗ "рд╕реНрдЯреЙрдк" рдмрдЯрди рджрдмрд╛рдпрд╛ред рдЗрд╕ рдмреАрдЪ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдордиреЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╕рд░рдгреА рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реА рдореЗрдореЛрд░реА рдФрд░ рдЬреАрд╕реА рдХреЙрд▓ рдХреЛ рдмрдЪрд╛рдпрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рдлреНрд▓реИрдЯ рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рдпрд╣рд╛рдВ рдЗрд╕рдХреА рдЧрддрд┐ рд▓рд╛рдн рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
    рдореИрдВрдиреЗ yday (рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА) рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ https://github.com/jerch/xterm.js/tree/AttributeStorage рд╕реЗ рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде attrs рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рд╕реНрддрд░ рдкрд░ рдПрдХ рджреВрд╕рд░реА рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╕рд░рдгреА рдереА (рдЖрдкрдХреЗ ICellPainter рд╡рд┐рдЪрд╛рд░ рдХреА рддрд░рд╣ рдмрд╣реБрдд рдХреБрдЫ) ) рдЦреИрд░ рдкрд░рд┐рдгрд╛рдо рдЖрд╢рд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдлреНрд▓реИрдЯ 32 рдмрд┐рдЯ рд▓реЗрдЖрдЙрдЯ рдХреА рдУрд░ рдЭреБрдХ рд░рд╣рд╛ рд╣реВрдВред

рдЕрдм рдпрд╣ рдлреНрд▓реИрдЯ 32 рдмрд┐рдЯ рд▓реЗрдЖрдЙрдЯ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрд╕рд╛рдорд╛рдиреНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рд╕рддреНрдпред рдЦреИрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдорд╛рд░реНрдХрд░ рд╣реИрдВ (рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрднреА рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ), рдФрд░ рд╣рд╛рдБ - рдмрдлрд░ рдореЗрдВ рдЕрднреА рднреА рдореБрдлреНрдд рдмрд┐рдЯреНрд╕ рд╣реИрдВ (рдЬреЛ рднрд╡рд┐рд╖реНрдп рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЭрдВрдбреЗ рдФрд░ рдРрд╕реЗ)ред

рдореЗрд░реЗ рд▓рд┐рдП рдЯреАрдмреАрдПрдЪ рдпрд╣ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдПрдЯреАрдЖрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд╕рд╛рде 16 рдмрд┐рдЯ рд▓реЗрдЖрдЙрдЯ рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ, рдореЗрдореЛрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрдирд╛ рдЕрднреА рднреА рдПрдХ рдмрдбрд╝реА рдмрд╛рдд рд╣реИ (espред рдЬрдм рдкреАрдкреАрдПрд▓ рд╕реНрдХреНрд░реЙрд▓ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ> 10k), рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдкреЗрдирд▓реНрдЯреА рдФрд░ рдХреЛрдб рдЬрдЯрд┐рд▓рддрд╛ рдЕрдзрд┐рдХ рд╡рдЬрди рдЙрдЪреНрдЪ рдореЗрдо рдХреЛ рдПрдЯреАрдПрдо рдЗрдореНрд╣реЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХреНрдпрд╛ рдЖрдк ICellPainter рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдм рддрдХ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реЛред

рдбреЛрдордЯрд░реНрдо рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдХреНрд╖рдо рдХреА рдЧрдИ рд╕рдореГрджреНрдз рдмрд╛рддрдЪреАрдд рдХреЛ рд╕рдХреНрд╖рдо рдФрд░ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдерд╛ред рд╡реЗрдм рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рддреЗрдЬрд╝ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рд╣реЛрдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реЛрдЧреАред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ xterm.js (рдЬреИрд╕реЗ IDEs рдХреЗ рд▓рд┐рдП REPLs) рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╕рд░рд▓ рдкрд╛рда рд╕реЗ рдкрд░реЗ рдЬрд╛рдХрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред Xterm.js рдЧрддрд┐ рдкрдХреНрд╖ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд░рддрд╛ рд╣реИ (рдХреНрдпрд╛ рдХреЛрдИ рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд░рд╣рд╛ рд╣реИ?), рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓реЛрдЧ рдЯреНрд░реВрдХрд▓рд░ рдФрд░ рдПрдореНрдмреЗрдбреЗрдб рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреА рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ )ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рдЪреАрд▓реЗрдкрди рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдереЛрдбрд╝рд╛ рдХрдо рдзреНрдпрд╛рди рджреЗрдирд╛ рд╕рд╛рд░реНрдердХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

_"рдХреНрдпрд╛ рдЖрдк ICellPainter рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?"_

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, ICellPainter рдЪрд░рд┐рддреНрд░ рдХреЛрдб/рдорд╛рди рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдкреНрд░рддрд┐-рд╕реЗрд▓ рдбреЗрдЯрд╛

interface ICellPainter {
    drawOnCanvas(ctx: CanvasRenderingContext2D, code: number, x: number, y: number);
    // transitional - to avoid allocating IGlyphIdentifier we should replace
    //  uses by pair of ICellPainter and code.  Also, a painter may do custom rendering,
    // such that there is no 'code' or IGlyphIdentifier.
    asGlyph(code: number): IGlyphIdentifier;
    width(): number; // in pixels for flexibility?
    height(): number;
    clone(): ICellPainter;
}

рд╕реЗрд▓ рдХреЛ ICellPainter рдореЗрдВ рдореИрдк рдХрд░рдирд╛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдмрдлрд╝рд░рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ ICellPainter рд╕рд░рдгреА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рд╕реЗрд▓ 8-рдмрд╛рдЗрдЯ рдкреЙрдЗрдВрдЯрд░ (рдХрдо рд╕реЗ рдХрдо) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ _combined рд╕рд░рдгреА рдХреЛ ICellPainter рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реИ: рдпрджрд┐ IS_COMBINED_BIT_MASK рд╕реЗрдЯ рд╣реИ, рддреЛ ICellPainter рдореЗрдВ рд╕рдВрдпреБрдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдПрдХ рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдХреВрд▓рди Uint32Array рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ: рдпрд╣ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рд╕рдВрдХреЗрдд рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдерд╛рди рдмрдЪрд╛рддрд╛ рд╣реИред

рдореИрдВ рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдореЛрдирд╛рдХреЛ-рд╕рдВрдкрд╛рджрдХ рдХреА рддрд░рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛)ред рдмрдлрд╝рд░ рдореЗрдВ рдРрд╕реА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рдЖрдкрдХреЛ decorations рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЖрдк рдПрдХ рдкрдВрдХреНрддрд┐/рд╕реНрддрдВрдн рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП рд╕рдЬрд╛рд╡рдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЙрд╕ рд╕реАрдорд╛ рддрдХ рдЯрд┐рдХреЗрдЧрд╛:

// decorations are buffer-dependant (we need to know which buffer to decorate)
const decoration = buffer.createDecoration({
  type: 'link',
  data: 'https://www.google.com',
  range: { startRow: 2, startColumn: 5, endRow: 2, endColumn: 25 }
});

рдмрд╛рдж рдореЗрдВ рдПрдХ рд░реЗрдВрдбрд░рд░ рдЙрди рд╕рдЬрд╛рд╡рдЯреЛрдВ рдХреЛ рдЙрдард╛ рд╕рдХрддрд╛ рдерд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

рдХреГрдкрдпрд╛ рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдореЛрдирд╛рдХреЛ-рд╕рдВрдкрд╛рджрдХ рдПрдкреАрдЖрдИ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
https://microsoft.github.io/monaco-editor/playground.html#interacting -with-the-editor-line-and-inline-decorations

рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рдЕрдВрджрд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдореЛрдирд╛рдХреЛ рджреГрд╢реНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ (рдЕрдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдмреАрдЪ) рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
https://microsoft.github.io/monaco-editor/playground.html#interacting -with-the-editor-listening-to-mouse-events

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдФрд░ рд╕реНрдХреЗрдЪрдЕрдк рдХреЗ рд▓рд┐рдП @PerBothner Thxред рдЙрд╕ рдкрд░ рдХреБрдЫ рдиреЛрдЯреНрд╕ред

рд╣рдо рдЕрдВрддрддрдГ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрдирдкреБрдЯ рдЪреЗрди + рдмрдлрд░ рдХреЛ рд╡реЗрдмрд╡рд░реНрдХрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрдлрд░ рдПрдХ рдЕрдореВрд░реНрдд рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рд╣рдо рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдпрд╛ рдХрд┐рд╕реА рднреА рдбреЛрдо рдиреЛрдбреНрд╕ рдХреА рддрд░рд╣ рдХрд┐рд╕реА рднреА рд░реЗрдВрдбрд░/рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбреЛрдордЯрд░реНрдо рдХреЗ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдЬрд╝рд░реВрд░рддреЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рдПрдХ рдЙрдиреНрдирдд рдЖрдВрддрд░рд┐рдХ рдорд╛рд░реНрдХрд░ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣рд╛рдВ рдореЛрдирд╛рдХреЛ/vscode (рд╡реЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ @mofux рдХреЗ рд▓рд┐рдП thx) рд╕реЗ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрд░ рдмрдлрд░ рдХреЛ рдЕрд╕рд╛рдорд╛рдиреНрдп рдЪреАрдЬреЛрдВ рд╕реЗ рд╕рд╛рдл рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╢рд╛рдпрдж рд╣рдореЗрдВ рдПрдХ рдирдП рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рд░реНрдХрд░ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП?

рдореИрдВ рдЕрднреА рднреА 16 рдмрд┐рдЯ рд▓реЗрдЖрдЙрдЯ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВред рдЪреВрдВрдХрд┐ рдПрдХ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдЕрднреА рддрдХ рджрдмрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рд╣рдо 3.11 рд╕реЗ рдкрд╣рд▓реЗ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рджреЗрдЦ рдкрд╛рдПрдВрдЧреЗ), рдореИрдВ рдЗрд╕реЗ рдХреБрдЫ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд░рд╣реВрдВрдЧрд╛ (рдпрд╣ рдЕрднреА рднреА 32 рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЧрд╣рди рд╕рдорд╛рдзрд╛рди рд╣реИ)ред

|             uint32_t             |        uint32_t         |        uint32_t         |
|              content             |            FG           |            BG           |
| comb(1) wcwidth(2) codepoint(21) | flags(8) R(8) G(8) B(8) | flags(8) R(8) G(8) B(8) |

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдХрд░реАрдм рдХреБрдЫ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рдмрд╛рдж рдореЗрдВ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЙрдардирд╛ рдФрд░ рджреМрдбрд╝рдирд╛ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрдХреЗрдд рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдИрдПрдордУ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдЯрд░реНрдорд┐рдирд▓ рд╕рддреНрд░ рдореЗрдВ рдХрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред

рдореИрдВ рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдореЛрдирд╛рдХреЛ-рд╕рдВрдкрд╛рджрдХ рдХреА рддрд░рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛)ред рдмрдлрд░ рдореЗрдВ рдРрд╕реА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рдЖрдкрдХреЛ рд╕рдЬрд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЖрдк рдПрдХ рдкрдВрдХреНрддрд┐/рд╕реНрддрдВрдн рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП рд╕рдЬрд╛рд╡рдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЙрд╕ рд╕реАрдорд╛ рддрдХ рдЯрд┐рдХреЗрдЧрд╛:

рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдЬрд╛рддреЗ рд╣реБрдП рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдерд╛ рдХрд┐ рдПрдореНрдмреЗрдбрд░реНрд╕ рдХреЛ рдбреАрдУрдПрдо рддрддреНрд╡реЛрдВ рдХреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдП рддрд╛рдХрд┐ рдХрд╕реНрдЯрдо рдЪреАрдЬреЛрдВ рдХреЛ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХреЗред рдореИрдВ рдЗрд╕ рд╕рдордп 3 рдЪреАрдЬреЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

  • рдбреНрд░рд╛ рд▓рд┐рдВрдХ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ (рд╕рд░рд▓ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ)
  • рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рдорд╛рд░реНрдХрд░реЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЬреИрд╕реЗ * рдпрд╛ рдХреБрдЫ
  • рдХреБрдЫ рд╣реБрдЖ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ "рдлрд╝реНрд▓реИрд╢" рдХрд░рдиреЗ рджреЗрдВ

рдЗрди рд╕рднреА рдХреЛ рдПрдХ рдУрд╡рд░рд▓реЗ рдХреЗ рд╕рд╛рде рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдкреАрдЖрдИ рд╣реИ (рдПрдХ рдбреЛрдо рдиреЛрдб рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛) рдФрд░ рд░реЗрдВрдбрд░рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдПрдореНрдмреЗрдбрд░реНрд╕ рдХреЛ рдпрд╣ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ рдЙрддрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рдЕрдЧреНрд░рднреВрдорд┐ рд░рдВрдЧ рдХреИрд╕реЗ рдЦреАрдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВред


@jerch рдореИрдВ рдЗрд╕реЗ 3.11.0 рдореАрд▓ рдХреЗ рдкрддреНрдерд░ рдкрд░ рд░рдЦреВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдЬреЗрдПрд╕ рд╕рд░рдгреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред https://github.com/xtermjs/xterm.js/pull/1796 рдХреЛ рднреА рддрдм рдорд░реНрдЬ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрджреНрджрд╛ рд╣рдореЗрд╢рд╛ рдмрдлрд░ рдХреЗ рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЪрд░реНрдЪрд╛рдПрдВ рд╢рд╛рдпрдж https://github.com/xtermjs/xterm.js/issues/484 рдФрд░ https://github.com/xtermjs/xterm.js/issues/1852 рдкрд░ рдмреЗрд╣рддрд░ рд╣реЛрдВрдЧреАред (рд╕рдЬрд╛рд╡рдЯ рдХреА рд╕рдорд╕реНрдпрд╛ рди рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛)ред

@ рдЯрд╛рдпрд░рд┐рдпрд░ рд╡реВрдЯ - рдЕрдВрдд рдореЗрдВ рдмрдВрдж: рдкрд╕реАрдирд╛_рд╕реНрдорд╛рдЗрд▓:

ЁЯОЙ ЁЯХ║ ЁЯН╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕