Skip to content

Commit a9e56b8

Browse files
authored
Merge pull request microsoft#56670 from segevfiner/shell-completions
code command completions for Bash & Zsh
2 parents dcb3c33 + c0895eb commit a9e56b8

6 files changed

Lines changed: 122 additions & 2 deletions

File tree

build/gulpfile.hygiene.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ const copyrightFilter = [
114114
'!resources/linux/snap/snapcraft.yaml',
115115
'!resources/linux/snap/electron-launch',
116116
'!resources/win32/bin/code.js',
117+
'!resources/completions/**',
117118
'!extensions/markdown-language-features/media/highlight.css',
118119
'!extensions/html-language-features/server/src/modes/typescript/*',
119120
'!extensions/*/server/bin/*'

build/gulpfile.vscode.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,8 @@ function packageTask(platform, arch, opts) {
385385
.pipe(electron(_.extend({}, config, { platform, arch, ffmpegChromium: true })))
386386
.pipe(filter(['**', '!LICENSE', '!LICENSES.chromium.html', '!version']));
387387

388+
result = es.merge(result, gulp.src('resources/completions/**', { base: '.' }));
389+
388390
if (platform === 'win32') {
389391
result = es.merge(result, gulp.src('resources/win32/bin/code.js', { base: 'resources/win32' }));
390392

build/gulpfile.vscode.linux.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ function prepareDebPackage(arch) {
5353
const icon = gulp.src('resources/linux/code.png', { base: '.' })
5454
.pipe(rename('usr/share/pixmaps/' + product.applicationName + '.png'));
5555

56+
const bash_completion = gulp.src('resources/completions/bash/code')
57+
.pipe(rename('usr/share/bash-completion/completions/code'));
58+
59+
const zsh_completion = gulp.src('resources/completions/zsh/_code')
60+
.pipe(rename('usr/share/zsh/vendor-completions/_code'));
61+
5662
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
5763
.pipe(rename(function (p) { p.dirname = 'usr/share/' + product.applicationName + '/' + p.dirname; }));
5864

@@ -87,7 +93,7 @@ function prepareDebPackage(arch) {
8793
.pipe(replace('@@UPDATEURL@@', product.updateUrl || '@@UPDATEURL@@'))
8894
.pipe(rename('DEBIAN/postinst'));
8995

90-
const all = es.merge(control, postinst, postrm, prerm, desktops, appdata, icon, code);
96+
const all = es.merge(control, postinst, postrm, prerm, desktops, appdata, icon, bash_completion, zsh_completion, code);
9197

9298
return all.pipe(vfs.dest(destination));
9399
};
@@ -137,6 +143,12 @@ function prepareRpmPackage(arch) {
137143
const icon = gulp.src('resources/linux/code.png', { base: '.' })
138144
.pipe(rename('BUILD/usr/share/pixmaps/' + product.applicationName + '.png'));
139145

146+
const bash_completion = gulp.src('resources/completions/bash/code')
147+
.pipe(rename('BUILD/usr/share/bash-completion/completions/code'));
148+
149+
const zsh_completion = gulp.src('resources/completions/zsh/_code')
150+
.pipe(rename('BUILD/usr/share/zsh/site-functions/_code'));
151+
140152
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
141153
.pipe(rename(function (p) { p.dirname = 'BUILD/usr/share/' + product.applicationName + '/' + p.dirname; }));
142154

@@ -157,7 +169,7 @@ function prepareRpmPackage(arch) {
157169
const specIcon = gulp.src('resources/linux/rpm/code.xpm', { base: '.' })
158170
.pipe(rename('SOURCES/' + product.applicationName + '.xpm'));
159171

160-
const all = es.merge(code, desktops, appdata, icon, spec, specIcon);
172+
const all = es.merge(code, desktops, appdata, icon, bash_completion, zsh_completion, spec, specIcon);
161173

162174
return all.pipe(vfs.dest(getRpmBuildPath(rpmArch)));
163175
};

resources/completions/bash/code

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
_code()
2+
{
3+
local cur prev words cword split
4+
_init_completion -s || return
5+
6+
_expand || return
7+
8+
case $prev in
9+
-d|--diff)
10+
_filedir
11+
return
12+
;;
13+
-a|--add|--user-data-dir|--extensions-dir)
14+
_filedir -d
15+
return
16+
;;
17+
-g|--goto)
18+
compopt -o nospace
19+
_filedir
20+
return
21+
;;
22+
--locale)
23+
COMPREPLY=( $( compgen -W 'de en en-US es fr it ja ko ru zh-CN zh-TW bg hu pt-br tr' ) )
24+
return
25+
;;
26+
--install-extension|--uninstall-extension)
27+
_filedir vsix
28+
return
29+
;;
30+
--log)
31+
COMPREPLY=( $( compgen -W 'critical error warn info debug trace off' ) )
32+
return
33+
;;
34+
--folder-uri|--disable-extension|--max-memory)
35+
# argument required but no completions available
36+
return 0
37+
;;
38+
--enable-proposed-api)
39+
# argument optional but no completions available
40+
;;
41+
esac
42+
43+
$split && return
44+
45+
if [[ $cur == -* ]]; then
46+
COMPREPLY=( $( compgen -W '-d --diff --folder-uri -a --add -g
47+
--goto -n --new-window -r --reuse-window -w --wait --locale=
48+
--user-data-dir -v --version -h --help --extensions-dir
49+
--list-extensions --show-versions --install-extension
50+
--uninstall-extension --enable-proposed-api --verbose --log -s
51+
--status -p --performance --prof-startup --disable-extensions
52+
--disable-extension --inspect-extensions
53+
--inspect-brk-extensions --disable-gpu --upload-logs
54+
--max-memory=' -- "$cur") )
55+
[[ $COMPREPLY == *= ]] && compopt -o nospace
56+
return
57+
fi
58+
59+
_filedir
60+
} &&
61+
complete -F _code code

resources/completions/zsh/_code

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#compdef code
2+
3+
local arguments
4+
5+
arguments=(
6+
'(-d --diff)'{-d,--diff}'[compare two files with each other]:file to compare:_files:file to compare with:_files'
7+
\*'--folder-uri[open a window with given folder uri(s)]:folder uri: '
8+
\*{-a,--add}'[add folder(s) to the last active window]:directory:_directories'
9+
'(-g --goto)'{-g,--goto}'[open a file at the path on the specified line and column position]:file\:line[\:column]:_files -r \:'
10+
'(-n --new-window -r --reuse-window)'{-n,--new-window}'[force to open a new window]'
11+
'(-n --new-window -r --reuse-window)'{-r,--reuse-window}'[force to open a file or folder in an already opened window]'
12+
'(-w --wait)'{-w,--wait}'[wait for the files to be closed before returning]'
13+
'--locale=[the locale to use (e.g. en-US or zh-TW)]:locale (e.g. en-US or zh-TW):(de en en-US es fr it ja ko ru zh-CN zh-TW bg hu pt-br tr)'
14+
'--user-data-dir[specify the directory that user data is kept in]:directory:_directories'
15+
'(- *)'{-v,--version}'[print version]'
16+
'(- *)'{-h,--help}'[print usage]'
17+
'--extensions-dir[set the root path for extensions]:root path:_directories'
18+
'--list-extensions[list the installed extensions]'
19+
'--show-versions[show versions of installed extensions, when using --list-extension]'
20+
'--install-extension[install an extension]:id or path:_files -g "*.vsix(-.)"'
21+
'--uninstall-extension[uninstall an extension]:id or path:_files -g "*.vsix(-.)"'
22+
'--enable-proposed-api[enables proposed API features for extensions]::extension id: '
23+
'--verbose[print verbose output (implies --wait)]'
24+
'--log[log level to use]:level [info]:(critical error warn info debug trace off)'
25+
'(-s --status)'{-s,--status}'[print process usage and diagnostics information]'
26+
'(-p --performance)'{-p,--performance}'[start with the "Developer: Startup Performance" command enabled]'
27+
'--prof-startup[run CPU profiler during startup]'
28+
'(--disable-extension --disable-extensions)--disable-extensions[disable all installed extensions]'
29+
\*'--disable-extension[disable an extension]:extension id: '
30+
'--inspect-extensions[allow debugging and profiling of extensions]'
31+
'--inspect-brk-extensions[allow debugging and profiling of extensions with the extension host being paused after start]'
32+
'--disable-gpu[disable GPU hardware acceleration]'
33+
'--upload-logs[upload logs from current session to a secure endpoint]:confirm:(iConfirmLogsUpload)'
34+
'--max-memory=[max memory size for a window (in Mbytes)]:size (Mbytes)'
35+
'*:file or directory:_files'
36+
)
37+
38+
_arguments -s -S $arguments

resources/linux/rpm/code.spec.template

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,14 @@ Visual Studio Code is a new choice of tool that combines the simplicity of a cod
1818
mkdir -p %{buildroot}/usr/share/@@NAME@@
1919
mkdir -p %{buildroot}/usr/share/applications
2020
mkdir -p %{buildroot}/usr/share/pixmaps
21+
mkdir -p %{buildroot}/usr/share/bash-completion/completions
22+
mkdir -p %{buildroot}/usr/share/zsh/site-functions
2123
cp -r usr/share/@@NAME@@/* %{buildroot}/usr/share/@@NAME@@
2224
cp -r usr/share/applications/@@NAME@@.desktop %{buildroot}/usr/share/applications
2325
cp -r usr/share/applications/@@NAME@@-url-handler.desktop %{buildroot}/usr/share/applications
2426
cp -r usr/share/pixmaps/@@NAME@@.png %{buildroot}/usr/share/pixmaps
27+
cp usr/share/bash-completion/completions/code %{buildroot}/usr/share/bash-completion/completions/code
28+
cp usr/share/zsh/site-functions/_code %{buildroot}/usr/share/zsh/site-functions/_code
2529

2630
%post
2731
# Remove the legacy bin command if this is the stable build
@@ -54,3 +58,5 @@ fi
5458
/usr/share/applications/@@NAME@@.desktop
5559
/usr/share/applications/@@NAME@@-url-handler.desktop
5660
/usr/share/pixmaps/@@NAME@@.png
61+
/usr/share/bash-completion/completions/code
62+
/usr/share/zsh/site-functions/_code

0 commit comments

Comments
 (0)