meu suplemento vs2008 para textformatting é terrivelmente lento
-
21-08-2019 - |
Pergunta
i escreveu um pequeno suplemento, que faz alguma formatação do meu código C #. nos suplementos método Exec i faça o seguinte
try {
TextSelection selection = (EnvDTE.TextSelection)_applicationObject.ActiveDocument.Selection;
String foo = String.Empty;
if (!text.IsEmpty) {
foo = someCoolObjectThatFormatsText.Format(selection.Text);
selection.Text = foo; // here everything gets painfully slow :-(
}
}
catch (Exception) {
throw;
}
quando a linha com o código "SelectedText.Text = foobar"; é chamada, VS reconstrói cada linha da etapa de seleção a passo. Você pode facilmente vê-lo fazer este passo. Mas eu não entendo, por que é que lento.
Alguma dica? TIA
Solução
JFTR: Eu tive que usar TextSelection.Insert (...), mas também obter estúdios profundidade visual de recuo, eu também tive que mexer com o texto selecionado para abranger a seleção também sobre a primeira e última linha completa:
TextSelection text = (EnvDTE.TextSelection)_applicationObject.ActiveDocument.Selection;
text.SmartFormat(); // sets the correct indention als studio
/* the following lines will expand the selection to whole lines: */
int lineSpan = text.BottomPoint.Line - text.TopPoint.Line;
text.MoveToPoint(text.TopPoint,false);
text.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn,false);
text.LineDown(true,lineSpan);
text.EndOfLine(true);
/* and now my custom textformatting */
text.Insert(someCoolObjectThatFormatsText.Format(text.Text),(int)vsInsertFlags.vsInsertFlagsContainNewText);
text.Collapse();
Eu realmente não sei wether esta é uma boa maneira de textselections alter mas funciona bem e é muito mais rápido do que o código suplemento originais
Outras dicas
Eu não tenho trabalhado com suplementos, mas já que você pediu apenas para um 'dica', aqui é meu.
Tente desativar atualização da tela antes de fazer a tarefa.
Além disso, o arquivo de ajuda diz:
"Quando a propriedade Text é definida, o valor de texto é inserido na frente do texto selecionado e, em seguida, entrou em colapso, semelhante ao que acontece quando o texto é colado em um documento. Note que esta propriedade se comporta exatamente como quando digitação quando o editor está na inserção (isto é, não sobrescrever) mode. Qualquer texto após o caractere 128th é truncado. "
Isso parece implicar que a variável não é ovewritten como esperado, mas anexado em vez disso e, em seguida, o texto anterior é removido. Tentar esvaziar a variável primeiro e ver se ele muda nada.
Além disso, considere o uso do PasteMethod para substituir o texto em vez de atribuir.