Ace: рдРрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп 'рдЪреЗрдВрдЬ' рдИрд╡реЗрдВрдЯ рдЖрдЧ рд▓рдЧрддреА рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдирд╡ре░ 2011  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: ajaxorg/ace

рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП:

Editor.getSession().on('change', function() {
// рдХреБрдЫ рдХрд░реЛ
});

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

рдХреНрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреНрдпрд╛ рдХреЛрдИ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдпрд╛ рдХреЛрдИ рдЕрд▓рдЧ рдШрдЯрдирд╛ рд╣реИ рдЬреЛ рддрдм рд╕рдХреНрд░рд┐рдп рд╣реЛрддреА рд╣реИ рдЬрдм рд╕рдВрдкрд╛рджрдХ рдХрд╛ рдореВрд▓реНрдп рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ?
@gissues :{"рдЖрджреЗрд╢":33.540372670807756,"рд╕реНрдерд┐рддрд┐":"рдмреИрдХрд▓реЙрдЧ"}

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

рдпрд╛ рддреЛ https://github.com/ajaxorg/ace/issues/1547#issuecomment -22257510 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛

editor.on("change", function(e) {
  if (editor.curOp && editor.curOp.command.name) console.log("user change");
  else console.log("other change")
})

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

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдПрд╕реАрдИ рдХреЗ рд▓рд┐рдП рдХреЛрдбрдорд┐рд░рд░ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рд▓реЗрдХрд┐рди ACE рдХрд╛ рдХреЛрдб рдкрдврд╝рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреБрдЫ рд╣рдж рддрдХ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЪ рдмрдирд╛рдпрд╛ рд╣реИред рдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдирд╛ рдЕрднреА рднреА рдирд┐рдХрд╛рд▓ рджреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдмреВрд▓рд┐рдпрди рдкреНрд░реЙрдкрд░реНрдЯреА рдЬреЛрдбрд╝рд╛ рд╣реИ: userTyped. рдпрд╣ рд╕рд╣реА рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдЯрд╛рдЗрдк рдпрд╛ рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред рдЧрд▓рдд рдЕрдЧрд░ рдЗрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдХреНрд░реЛрдо рдореЗрдВ рдореЗрд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣ 0.2.0 рд╕реЗ ace-uncompressed.js рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╣реИ: http://dl.dropbox.com/u/310281/ace-patch.txt

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ 'рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХрд▓' рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдд: рдкреВрд░реНрдг рд╡рд┐рдЬреЗрдЯ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдЯреЗрдХреНрд╕реНрдЯ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ?)
рдФрд░ userTyped рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рдмрд╣реАрдЦрд╛рддрд╛ рдкрджреНрдзрддрд┐ рд╕рднреА рдЬрдЧрд╣ рдЬреБрдбрд╝ рдЬрд╛рддреА рд╣реИ

рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рдИрд╡реЗрдВрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдбреЛрдо "рдЗрдирдкреБрдЯ" рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдХрдВрдЯреЗрдирд░
рдпрд╛ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реЗрдЯрд╡реИрд▓реНрдпреВ рдХреЙрд▓ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдзреНрд╡рдЬ рдЬреЛрдбрд╝реЗрдВ (рдПрдбрд┐рдЯрд░.рдЬреЗрдПрд╕ рдореЗрдВ $blockScrolling рдХреЗ рд╕рдорд╛рди)
рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ 'рдкрд░рд┐рд╡рд░реНрддрди' рдШрдЯрдирд╛ рд╕рдордХрд╛рд▓рд┐рдХ рд╣реИ

рдпрд╛ рддреЛ https://github.com/ajaxorg/ace/issues/1547#issuecomment -22257510 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛

editor.on("change", function(e) {
  if (editor.curOp && editor.curOp.command.name) console.log("user change");
  else console.log("other change")
})

рдирд╛рдЗрдЯрд╡рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдирд┐рдкреЗрдЯ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреИрд╕реЗ jQuery рдХреЗ рд╕рд╛рде:

editor.getSession().on('change', function() {
    if ($(document.activeElement).closest("div").attr("id") == "editordiv") {
        console.log("editor was changed by user typing or copy paste");
    } else {
        console.log("editor was changed programmatically");
    }
})

рдХреБрдВрдЖ

$(document.activeElement).closest("div").attr("id") == "editordiv"

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

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

рдпрд╛ рддреЛ https://github.com/ajaxorg/ace/issues/1547#issuecomment -22257510 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдпрд╛ https://github.com/ajaxorg/ace/issues/503#issuecomment -44525640

рдХреНрдпрд╛ рдореИрдВ #1547 рдХрд╛ рдЙрдкрдпреЛрдЧ applyDeltas рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ? рдФрд░ #503 рдХреЗ рд╕рд╛рде, рдХреЙрдкреА/рдкреЗрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп рдЧреНрд░реМрдмрд┐рд╕ рд╕рд╣реА рдерд╛ (рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рднреА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?)

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рд┐рдВрдХрд┐рдВрдЧ рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ - рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрднреА рддрдХ рдЦрд╛рд░рд┐рдЬ рди рдХрд░реЗрдВ :)

рдореИрдВрдиреЗ рдЕрднреА рдХреЛрд╢рд┐рд╢ рдХреА

editor.on("change", function(e) {
  if (editor.curOp && editor.curOp.command.name) console.log("user change");
  else console.log("other change")
});

рд╢рдмреНрджрд╢рдГ рдФрд░ рдЬрдм рдореИрдВрдиреЗ рдЪрд┐рдкрдХрд╛рдпрд╛, рддреЛ рдЙрд╕рдиреЗ рдХрд╣рд╛ "рдЕрдиреНрдп рдкрд░рд┐рд╡рд░реНрддрди"ред рдореИрдВ рд╕рдлрд╛рд░реА 9.0.1 рдкрд░ рд╣реВрдВред рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕рдорд░реНрдерд┐рдд рдордВрдЪ рд╣реИ?

рд╢рд╛рдпрдж рдЖрдк рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
#1547 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рдбреЗрд▓реНрдЯрд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк {silent:true} рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ applyDeltas(delta, {silent:true}) рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдореБрдЭреЗ рдЕрдм рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рднрд▓реЗ рд╣реА рдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдирд╛ рд╕рдордХрд╛рд▓рд┐рдХ рд╣реЛ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдорд╡рд░реНрддреА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реНрдерд╛рдиреАрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╕рдордп "рдЪреБрдк" рд▓реЙрдХ рд░рд┐рдореЛрдЯ рдбреЗрд▓реНрдЯрд╛ рдХреЛ рд▓реЙрдХ рдХрд░ рджреЗрдЧрд╛ .

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдереАред
рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП

silent = true
editor.session.setValue("some text");
silent = false

рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╢реНрд░реЛрддрд╛ рдореЗрдВ

if (silent) return

рдЗрддрдирд╛ рдореМрди рдЖрдкрдХреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рдЪрд░ рд╣реИ, рди рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рдЬрд┐рд╕реЗ рдЖрдк рдЗрдХреНрдХрд╛-рджреБрдХреНрдХрд╛ рдХрд░рддреЗ рд╣реИрдВред

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

рд╣рд╛рдВ, рдореИрдВ рдЬрд┐рд╕ рдмрдЧ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣рд╛ рдерд╛, рд╡рд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреАрдЖрдИ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рдерд╛ред рдРрд╕ рдЗрдХреНрдХрд╛ рд╣реИ - рдореИрдВ рдПрдХ рдХреЗрдВрджреНрд░реАрдп рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдордиреНрд╡рд┐рдд рдПрдХ рд╣реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ (рд╕рд╣рдпреЛрдЧреА) рд╕рдВрдкрд╛рджрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╡рд░реНрддреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд╛рд▓рди рдкрд░рд┐рд╡рд░реНрддрди рдирд╛рдордХ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ; рдРрд╕ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдХрд╛рдлреА рдмрд╛рд╣рд░ред рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП: https://en.wikipedia.org/wiki/Operational_transformationред

рдЖрдкрдХреЗ рдорд╣рд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдХрд╛рд░рдг рд╣реБрдИ рдХрд┐рд╕реА рднреА рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ: / рд╣рд╛рд╣рд╛!

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

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

RickStrahl picture RickStrahl  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xfix picture xfix  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BoasE picture BoasE  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dimroc picture dimroc  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

STRd6 picture STRd6  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ