@@ -2,17 +2,18 @@ import {statsIn, resolveDirectory, directoryName} from "../../utils/Common";
2
2
import { styles , Suggestion } from "./Suggestions" ;
3
3
import { FileInfo , SuggestionContext , AutocompletionProvider } from "../../Interfaces" ;
4
4
import * as Path from "path" ;
5
+ import * as modeToPermissions from "mode-to-permissions" ;
5
6
6
7
function escapePath ( path : string ) {
7
8
return path . replace ( / \s / g, "\\ " ) ;
8
9
}
9
10
10
- export const filesSuggestions = ( filter : ( info : FileInfo ) => boolean ) => async ( context : SuggestionContext , directory = context . environment . pwd ) : Promise < Suggestion [ ] > => {
11
- const tokenDirectory = directoryName ( context . argument . value ) ;
11
+ const filesSuggestions = ( filter : ( info : FileInfo ) => boolean ) => async ( tokenValue : string , directory : string ) : Promise < Suggestion [ ] > => {
12
+ const tokenDirectory = directoryName ( tokenValue ) ;
12
13
const directoryPath = resolveDirectory ( directory , tokenDirectory ) ;
13
14
const stats = await statsIn ( directoryPath ) ;
14
15
15
- return stats . filter ( filter ) . map ( info => {
16
+ return stats . filter ( info => info . stat . isDirectory ( ) || filter ( info ) ) . map ( info => {
16
17
if ( info . stat . isDirectory ( ) ) {
17
18
return new Suggestion ( ) . withValue ( escapePath ( Path . join ( tokenDirectory , info . name + Path . sep ) ) ) . withDisplayValue ( info . name + Path . sep ) . withStyle ( styles . directory ) ;
18
19
} else {
@@ -21,8 +22,14 @@ export const filesSuggestions = (filter: (info: FileInfo) => boolean) => async(c
21
22
} ) ;
22
23
} ;
23
24
24
- export const anyFilesSuggestions = filesSuggestions ( ( ) => true ) ;
25
- export const directoriesSuggestions = filesSuggestions ( info => info . stat . isDirectory ( ) ) ;
25
+ const filesSuggestionsProvider =
26
+ ( filter : ( info : FileInfo ) => boolean ) =>
27
+ ( context : SuggestionContext , directory = context . environment . pwd ) : Promise < Suggestion [ ] > =>
28
+ filesSuggestions ( filter ) ( context . argument . value , directory ) ;
29
+
30
+ export const executableFilesSuggestions = filesSuggestions ( info => info . stat . isFile ( ) && modeToPermissions ( info . stat . mode ) . execute . owner ) ;
31
+ export const anyFilesSuggestionsProvider = filesSuggestionsProvider ( ( ) => true ) ;
32
+ export const directoriesSuggestionsProvider = filesSuggestionsProvider ( info => info . stat . isDirectory ( ) ) ;
26
33
27
34
export const environmentVariableSuggestions = async ( context : SuggestionContext ) : Promise < Suggestion [ ] > => {
28
35
if ( context . argument . value . startsWith ( "$" ) ) {
0 commit comments