protected void addBashCompletions(String currentText, CompletionParameters parameters, ProcessingContext context, CompletionResultSet resultWithoutPrefix) { if (currentText == null || !currentText.startsWith("/")) { return; } PsiElement parentElement = parameters.getPosition().getParent(); String parentText = parentElement.getText(); if (parentText.startsWith("$HOME") || parentText.startsWith("~")) { return; } int invocationCount = parameters.getInvocationCount(); CompletionResultSet result = resultWithoutPrefix.withPrefixMatcher(new PathPrefixMatcher(currentText)); Predicate<File> incovationCountPredicate = file -> { //accept hidden file with more than one invocation //return file.isHidden() ? invocationCount >= 2 : true; boolean isHidden = file.isHidden() || file.getName().startsWith("."); return (isHidden && (invocationCount >= 2)) || ((invocationCount >= 1) && !isHidden); }; List<String> completions = CompletionUtil.completeAbsolutePath(currentText, createFileFilter().and(incovationCountPredicate)); result.addAllElements(CompletionProviderUtils.createPathItems(completions)); int validResultCount = computeResultCount(completions, result); if (validResultCount == 0 && invocationCount == 1) { //do hidden-completion now List<String> secondCompletions = CompletionUtil.completeAbsolutePath(currentText, createFileFilter()); result.addAllElements(CompletionProviderUtils.createPathItems(secondCompletions)); } if (invocationCount == 1) { result.addLookupAdvertisement("Press twice for hidden files"); } }
result.addLookupAdvertisement("Press twice for all built-in and system-wide commands");
@Override protected void addBashCompletions(String currentText, CompletionParameters parameters, ProcessingContext context, CompletionResultSet result) { PsiElement element = parameters.getPosition(); PsiElement original = parameters.getOriginalPosition(); BashVar varElement = PsiTreeUtil.getContextOfType(original, BashVar.class, false); boolean dollarPrefix = currentText != null && currentText.startsWith("$"); boolean insideExpansion = element.getParent() != null && element.getParent().getParent() instanceof BashParameterExpansion; if (varElement == null && !dollarPrefix && !insideExpansion) { return; } int invocationCount = parameters.getInvocationCount(); int resultLength = 0; // fixme Currently we only look into the current file if no original element is given, // fixme better: we should collect locals and the included vars from the original file if (varElement != null) { resultLength += addCollectedVariables(original, result, new BashVarVariantsProcessor(varElement)); } else { //not in a variable element, but collect all known variable names at this offset in the current file PsiElement lookupElement = original != null ? original : element; resultLength += addCollectedVariables(lookupElement, result, new BashVarVariantsProcessor(lookupElement)); } if (currentText != null && (dollarPrefix || insideExpansion) && (invocationCount >= 2 || resultLength == 0)) { Project project = element.getProject(); addBuiltInVariables(result, project); addGlobalVariables(result, project); } else { result.addLookupAdvertisement("Press twice for global variables"); } }