Skip to content
This repository was archived by the owner on May 21, 2019. It is now read-only.

Commit a57d0e3

Browse files
committed
Fix the issue when file suggesion would suggest itself again at the end of files. Fixes #410.
1 parent 527f2d8 commit a57d0e3

File tree

6 files changed

+26
-24
lines changed

6 files changed

+26
-24
lines changed

src/Autocompletion.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
import {commandDescriptions} from "./plugins/autocompletion_providers/Executable";
88
import {description, style, styles} from "./plugins/autocompletion_providers/Suggestions";
99
import {makeAlias} from "./plugins/autocompletion_providers/Alias";
10-
import {file} from "./plugins/autocompletion_providers/File";
10+
import {relativeFilePath} from "./plugins/autocompletion_providers/File";
1111
import {compose, mapObject} from "./utils/Common";
1212
import {command} from "./plugins/autocompletion_providers/Command";
1313
import Aliases from "./Aliases";
@@ -17,7 +17,7 @@ import {environmentVariable} from "./plugins/autocompletion_providers/Environmen
1717
export const makeGrammar = (aliases: Dictionary<string>) => {
1818
const exec = sequence(
1919
choice(mapObject(commandDescriptions, (key, value) => decorate(string(key), compose(description(value), style(styles.executable))))),
20-
optionalContinuation(many1(choice([file, environmentVariable])))
20+
optionalContinuation(many1(choice([relativeFilePath, environmentVariable])))
2121
);
2222

2323
const sudo = sequence(executable("sudo"), command);

src/plugins/autocompletion_providers/Cd.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import {executable, sequence, decorate, string, noisySuggestions, runtime, choice} from "../../Parser";
2-
import {directoryAlias, fileInDirectoryGenerator} from "./Common";
2+
import {directoryAlias, pathPart} from "./Common";
33
import {expandHistoricalDirectory} from "../../Command";
44
import {description, styles, style} from "./Suggestions";
55
import * as _ from "lodash";
6+
import {relativeDirectoryPath} from "./File";
67

78
const historicalDirectory = runtime(async (context) =>
89
noisySuggestions(
@@ -19,7 +20,7 @@ const historicalDirectory = runtime(async (context) =>
1920
const cdpathDirectory = runtime(
2021
async (context) => {
2122
const directoriesToBe = context.environment.cdpath(context.directory).map(async (directory) => {
22-
const file = await fileInDirectoryGenerator(directory, info => info.stat.isDirectory());
23+
const file = await pathPart(directory, info => info.stat.isDirectory());
2324

2425
if (directory === context.directory) {
2526
return file;
@@ -36,4 +37,5 @@ export const cd = sequence(decorate(executable("cd"), description("Change the wo
3637
historicalDirectory,
3738
directoryAlias,
3839
cdpathDirectory,
40+
relativeDirectoryPath,
3941
]));

src/plugins/autocompletion_providers/Common.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
decorate,
88
noisySuggestions,
99
Parser,
10-
withoutSuggestions,
10+
withoutSuggestions, runtime, many1,
1111
} from "../../Parser";
1212
import {styles, style} from "./Suggestions";
1313
import {FileInfo} from "../../Interfaces";
@@ -24,19 +24,24 @@ export const directoryAlias = noisySuggestions(
2424
])
2525
);
2626

27-
export const fileInDirectoryGenerator = async(directory: string, filter: (info: FileInfo) => boolean) => {
27+
const fileName = (name: string) => decorate(string(name), suggestion => suggestion.withDisplayValue(name).withValue(suggestion.value.replace(/\s/g, "\\ ")));
28+
29+
export const pathPart = async(directory: string, filter: (info: FileInfo) => boolean) => {
2830
const stats = await statsIn(directory);
2931

3032
return choice(stats.filter(filter).map(info => {
31-
const file = decorate(string(info.name), suggestion => suggestion.withDisplayValue(info.name).withValue(info.name.replace(/\s/g, "\\ ")));
32-
3333
if (info.stat.isDirectory()) {
34-
return changingContextDirectory(
35-
info.name.startsWith(".") ? noisySuggestions(decorate(append("/", file), style(styles.directory))) : decorate(append("/", file), style(styles.directory))
36-
);
34+
const styledDirectory = decorate(fileName(`${info.name}/`), style(styles.directory));
35+
return changingContextDirectory(info.name.startsWith(".") ? noisySuggestions(styledDirectory) : styledDirectory);
3736
} else {
38-
const styled = decorate(file, style(styles.file(info)));
37+
const styled = decorate(fileName(info.name), style(styles.file(info)));
3938
return info.name.startsWith(".") ? noisySuggestions(styled) : styled;
4039
}
4140
}));
4241
};
42+
43+
export const pathInCurrentDirectory = (filter: (info: FileInfo) => boolean) => many1(
44+
runtime(
45+
async(context) => choice([directoryAlias].concat(await pathPart(context.directory, filter)))
46+
)
47+
);
Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
import {directoryAlias, fileInDirectoryGenerator} from "./Common";
2-
import {choice, runtime, many1} from "../../Parser";
1+
import {pathInCurrentDirectory} from "./Common";
32

4-
// TODO: shouldn't behave like that https://dl.dropboxusercontent.com/spa/dlqheu39w0arg9q/1t71rcbn.png
5-
export const file = many1(
6-
runtime(
7-
async (context) => choice([directoryAlias].concat(await fileInDirectoryGenerator(context.directory, () => true)))
8-
)
9-
);
3+
export const relativeFilePath = pathInCurrentDirectory(() => true);
4+
export const relativeDirectoryPath = pathInCurrentDirectory(info => info.stat.isDirectory());

src/plugins/autocompletion_providers/Git.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
} from "../../Parser";
66
import {description, command, styles, style} from "./Suggestions";
77
import {compose} from "../../utils/Common";
8-
import {file} from "./File";
8+
import {relativeFilePath} from "./File";
99

1010
// class File extends Suggestion {
1111
// constructor(protected _line: string) {
@@ -173,7 +173,7 @@ const branchesExceptCurrent = decorate(
173173
);
174174

175175
const gitCommand = choice([
176-
sequence(decorate(token(string("add")), compose(command, description("Add file contents to the index."))), many1(file)),
176+
sequence(decorate(token(string("add")), compose(command, description("Add file contents to the index."))), many1(relativeFilePath)),
177177
decorate(string("am"), compose(command, description("Apply a series of patches from a mailbox."))),
178178
decorate(string("archive"), compose(command, description("Create an archive of files from a named tree."))),
179179
decorate(string("bisect"), compose(command, description("Find by binary search the change that introduced a bug."))),
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import {string, token, spacesWithoutSuggestion, many, sequence, noisySuggestions, choice} from "../../Parser";
2-
import {file} from "./File";
2+
import {relativeFilePath} from "./File";
33

44
const redirectToken = choice([
55
noisySuggestions(sequence(many(spacesWithoutSuggestion), token(string(">")))),
66
noisySuggestions(sequence(many(spacesWithoutSuggestion), token(string(">>")))),
77
]);
88

9-
export const redirect = sequence(redirectToken, file);
9+
export const redirect = sequence(redirectToken, relativeFilePath);

0 commit comments

Comments
 (0)