in core/src/main/java/com/taobao/arthas/core/shell/cli/CompletionUtils.java [89:161]
public static boolean completeFilePath(Completion completion) {
List<CliToken> tokens = completion.lineTokens();
String token = tokens.get(tokens.size() - 1).value();
if (token.startsWith("-") || StringUtils.isBlank(token)) {
return false;
}
File dir = null;
String partName = "";
if (StringUtils.isBlank(token)) {
dir = new File("").getAbsoluteFile();
token = "";
} else if (isEndOfDirectory(token)) {
dir = new File(token);
} else {
File parent = new File(token).getAbsoluteFile().getParentFile();
if (parent != null && parent.exists()) {
dir = parent;
partName = new File(token).getName();
}
}
File tokenFile = new File(token);
String tokenFileName = null;
if (isEndOfDirectory(token)) {
tokenFileName = "";
} else {
tokenFileName = tokenFile.getName();
}
if (dir == null) {
return false;
}
File[] listFiles = dir.listFiles();
ArrayList<String> names = new ArrayList<>();
if (listFiles != null) {
for (File child : listFiles) {
if (child.getName().startsWith(partName)) {
if (child.isDirectory()) {
names.add(child.getName() + "/");
} else {
names.add(child.getName());
}
}
}
}
if (names.size() == 1 && isEndOfDirectory(names.get(0))) {
String name = names.get(0);
// 这个函数补全后不会有空格,并且只能传入要补全的内容
completion.complete(name.substring(tokenFileName.length()), false);
return true;
}
String prefix = null;
if (isEndOfDirectory(token)) {
prefix = token;
} else {
prefix = token.substring(0, token.length() - new File(token).getName().length());
}
ArrayList<String> namesWithPrefix = new ArrayList<>();
for (String name : names) {
namesWithPrefix.add(prefix + name);
}
// 这个函数需要保留前缀
CompletionUtils.complete(completion, namesWithPrefix);
return true;
}