executeEdits сбрасывает мой диапазон операций редактирования - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь выполнить базовое воспроизведение событий в Monaco Editor, однако всякий раз, когда я передаю редактирование в executeEdits, оно всегда сбрасывает range моего редактирования в { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 } (это то, что я получаюесли я console.log сообщение после вызов executeEdits).По сути, любой текст, который я пытаюсь вставить или заменить, всегда заканчивается в начале первой строки и фактически вводит текст в обратном порядке.

typing in reverse

import * as React from 'react'
import * as monaco from 'monaco-editor'

import { PlayerContext } from './player-context'

const defaultOptions = {
  minimap: {
    enabled: false
  }
}

export default class MonacoEditor extends React.Component {
  static contextType = PlayerContext

  handleMessage = message => {
    this._editor.executeEdits('', [
      { ...message, forceMoveMarkers: true }
    ])
  }

  componentDidMount() {
    const { path, value, language, ...options } = this.props
    const model = monaco.editor.createModel(value, language, path)
    this._editor = monaco.editor.create(this._node, {
      ...defaultOptions,
      ...options
    })
    this._editor.setModel(model)
    this.context.addMessageHandler('didChange', this.handleMessage)
  }

  componentWillUnmount() {
    this._editor && this._editor.dispose()
    this.context.removeMessageHandler('didChange', this.handleMessage)
  }

  render() {
    return <div style={{ height: 500 }} ref={c => (this._node = c)} />
  }
}

Я использую реагирование для рендеринга редактора Monaco, как показано выше.Контекст предоставляет объект, который в основном позволяет мне подписываться на события воспроизведения, объект message, переданный в handleMessage, имеет форму IIdentifiedSingleEditOperation

{
  range: {
    startLineNumber: 0, 
    startColumn: 47, 
    endLineNumber: 0, 
    endColumn: 47
  },
  text: '!'
}

Почему Монако сбрасываетсямой диапазон операций редактирования?

1 Ответ

0 голосов
/ 06 января 2019

В документации на IIdentifiedSingleEditOperation указано свойство range:

Диапазон для замены.Это может быть пустым для эмуляции простой вставки.

Таким образом, вы можете просто пропустить пустой объект и операция редактирования будет добавлена.

Однако документация по Range классу гласит, что номера строк и столбцы начинаются с 1, а не с 0. Это и тот факт, что данный диапазон должен описывать часть текста, которая должна быть заменена , а неположение, в котором должна быть добавлена ​​операция, приводит к тому, что Монако заменяет (недействительный) диапазон.

...