Проблемы с автоматическим отступом внутреннего режима codemirror - PullRequest
0 голосов
/ 15 января 2019

У меня возникли проблемы с получением codemirror для применения правильного автоиндентирования к внутренним режимам в смешанном режиме.

Вы можете увидеть живую версию режима (и как он не работает) здесь: https://extremely -alpha.iodide.io / notebooks / 216 / но вкратце идея состоит в том, чтобы иметь возможность использовать разделители блоков в стиле matlab для переключения между языками, подобными этому:

%% js
[1,2,3].forEach(i => {
  console.log(i)
})

%% py
for i in range(5):
    for j in range(10):
        print i+j

%% css
div#foo {
    border: 1px solid pink
}

Как видно из ссылки на мой пример, подсветка синтаксиса работает нормально, но вы также заметите, что отступ не работает должным образом.

Код для этого режима кодового зеркала здесь, на github . Он основан на смешанном режиме html codemirror .

Я попытался добавить copyState в свой код, снова следуя смешанному режиму html -

copyState: state => {
    let local;
    if (state.localState) {
      console.log("state.localState copied");
      local = CodeMirror.copyState(state.localMode, state.localState);
    }
    return {
      token: state.token,
      localMode: state.localMode,
      localState: local
    };
  },

- но это приводит к другому типу странного поведения отступов и не заканчивается работой.

Я уже давно бьюсь об этом, и мне не удалось собрать его вместе через Google, API и форумы, поэтому любая помощь будет принята с благодарностью! Спасибо!

1 Ответ

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

на случай, если кто-нибудь столкнется с этой проблемой в будущем: оказывается, что режимы codemirror обычно не имеют встроенных разумных настроек по умолчанию или, по крайней мере, они не загружаются по умолчанию при использовании CodeMirror.getMode(...). В моем случае мне пришлось поменять с

const innerModes = {
  js: CodeMirror.getMode({}, { name: "javascript" }),
  py: CodeMirror.getMode({}, { name: "python" }),
  md: CodeMirror.getMode({}, { name: "markdown" }),
  css: CodeMirror.getMode({}, { name: "css" }),
  raw: CodeMirror.getMode({}, { name: "text/plain" }),
  fetch: CodeMirror.getMode({}, { name: "fetch" })
};

до:

const innerModes = {
  js: CodeMirror.getMode(
    { indentUnit: 2, statementIndent: 2 },
    { name: "javascript" }
  ),
  py: CodeMirror.getMode(
    { indentUnit: 4, hangingIndent: 4 },
    { name: "python" }
  ),
  md: CodeMirror.getMode({}, { name: "markdown" }),
  css: CodeMirror.getMode({ indentUnit: 2 }, { name: "css" }),
  raw: CodeMirror.getMode({}, { name: "text/plain" }),
  fetch: CodeMirror.getMode({}, { name: "fetch" })
};

Это предотвратило прохождение NaN s из функции отступа подрежимов.

...