void (final Editor editor, final TemplateState templateState) { AtomicInteger maxEditedVariable = new AtomicInteger(-1); editor.getDocument().addDocumentListener(new DocumentListener() { @Override public void documentChanged(@NotNull DocumentEvent e) { maxEditedVariable.set(Math.max(maxEditedVariable.get(), templateState.getCurrentVariableNumber())); } }, templateState); templateState.addTemplateStateListener(new TemplateEditingAdapter() { @Override public void currentVariableChanged(@NotNull TemplateState templateState, Template template, int oldIndex, int newIndex) { maxEditedVariable.set(Math.max(maxEditedVariable.get(), oldIndex)); } @Override public void beforeTemplateFinished(@NotNull TemplateState state, Template template, boolean brokenOff) { if (brokenOff) { removeUntouchedArguments((TemplateImpl)template); } } private void removeUntouchedArguments(TemplateImpl template) { int firstUnchangedVar = maxEditedVariable.get() + 1; if (firstUnchangedVar >= template.getVariableCount()) return; TextRange startRange = templateState.getVariableRange(template.getVariableNameAt(firstUnchangedVar)); TextRange endRange = templateState.getVariableRange(template.getVariableNameAt(template.getVariableCount() - 1)); if (startRange == null || endRange == null) return; WriteCommandAction.runWriteCommandAction(editor.getProject(), () -> editor.getDocument().deleteString(startRange.getStartOffset(), endRange.getEndOffset())); } }); }