Я пытаюсь реализовать редактор кода на своем сайте реагирования, мне нужно реализовать довольно хорошее автодополнение для Python. Столкнулся с проблемой, заключающейся в том, что я не придумал, как добавить сюда какие-то готовые решения (честно говоря, пока даже не нашел). Говоря о моих собственных попытках, я попытался решить эту проблему, добавив своего провайдера: autocompletion({ override: [customCompletionProvider] }),.
А также его код:
Помимо того, что моя версия работает, мягко говоря, не очень хорошо, она еще и переопределяет базовое автодополнение, потерять которое не хотелось бы.
А еще код компонента:
Я пытаюсь реализовать редактор кода на своем сайте реагирования, мне нужно реализовать довольно хорошее автодополнение для Python. Столкнулся с проблемой, заключающейся в том, что я не придумал, как добавить сюда какие-то готовые решения (честно говоря, пока даже не нашел). Говоря о моих собственных попытках, я попытался решить эту проблему, добавив своего провайдера: autocompletion({ override: [customCompletionProvider] }),. А также его код: [code] const customCompletionProvider = (context) => { const word = context.matchBefore(/\w*/);
const code = context.state.doc.toString();
// detect variables in code const variableDeclarationPattern = /(\w+)\s*=\s*(.+)/g; let match; while ((match = variableDeclarationPattern.exec(code)) !== null) { const [_, varName, varValue] = match; if (/['"]/.test(varValue)) variables[varName] = "str"; else if (/\[.*\]/.test(varValue)) variables[varName] = "list"; else if (/\(.*\)/.test(varValue)) variables[varName] = "tuple"; else if (/\{.*\}/.test(varValue)) variables[varName] = "dict"; else if (/[-+]?\d+/.test(varValue)) variables[varName] = "int"; else if (/[-+]?\d*\.\d+/.test(varValue)) variables[varName] = "float"; }
// method call through dot? => const dotMatch = context.matchBefore(/\w+\.\w*/); if (dotMatch) { const [variable, methodStart] = dotMatch.text.split(".");
[/code] Помимо того, что моя версия работает, мягко говоря, не очень хорошо, она еще и переопределяет базовое автодополнение, потерять которое не хотелось бы. А еще код компонента: [code] ;
[/code] Также я использую onUpdateExtension: [code] const onUpdateExtension = EditorView.updateListener.of((update) => { if (update.docChanged) { const { state } = update.view; const doc = state.doc.toString(); const lastChar = doc[doc.length - 1];
if (lastChar === ".") { startCompletion(update.view); } } });
[/code] PS: моя основная цель — добавить подсказки для переменных методов сразу после ввода точки