From: Johannes Schindelin <johannes.schinde...@gmx.de>

VS Code is a lightweight but powerful source code editor which runs on
your desktop and is available for Windows, macOS and Linux. Among other
languages, it has support for C/C++ via an extension, which offers to
not only build and debug the code, but also Intellisense, i.e.
code-aware completion and similar niceties.

This patch adds a script that helps set up the environment to work
effectively with VS Code: simply run the Unix shell script
contrib/vscode/init.sh, which creates the relevant files, and open the
top level folder of Git's source code in VS Code.

Signed-off-by: Johannes Schindelin <johannes.schinde...@gmx.de>
---
 .gitignore                    |   1 +
 contrib/vscode/.gitattributes |   1 +
 contrib/vscode/README.md      |  14 +++
 contrib/vscode/init.sh        | 165 ++++++++++++++++++++++++++++++++++
 4 files changed, 181 insertions(+)
 create mode 100644 contrib/vscode/.gitattributes
 create mode 100644 contrib/vscode/README.md
 create mode 100755 contrib/vscode/init.sh

diff --git a/.gitignore b/.gitignore
index 388cc4bee..592e8f879 100644
--- a/.gitignore
+++ b/.gitignore
@@ -206,6 +206,7 @@
 /config.mak.autogen
 /config.mak.append
 /configure
+/.vscode/
 /tags
 /TAGS
 /cscope*
diff --git a/contrib/vscode/.gitattributes b/contrib/vscode/.gitattributes
new file mode 100644
index 000000000..e89f2236e
--- /dev/null
+++ b/contrib/vscode/.gitattributes
@@ -0,0 +1 @@
+init.sh whitespace=-indent-with-non-tab
diff --git a/contrib/vscode/README.md b/contrib/vscode/README.md
new file mode 100644
index 000000000..8202d6203
--- /dev/null
+++ b/contrib/vscode/README.md
@@ -0,0 +1,14 @@
+Configuration for VS Code
+=========================
+
+[VS Code](https://code.visualstudio.com/) is a lightweight but powerful source
+code editor which runs on your desktop and is available for
+[Windows](https://code.visualstudio.com/docs/setup/windows),
+[macOS](https://code.visualstudio.com/docs/setup/mac) and
+[Linux](https://code.visualstudio.com/docs/setup/linux). Among other languages,
+it has [support for C/C++ via an 
extension](https://github.com/Microsoft/vscode-cpptools).
+
+To start developing Git with VS Code, simply run the Unix shell script called
+`init.sh` in this directory, which creates the configuration files in
+`.vscode/` that VS Code consumes. `init.sh` needs access to `make` and `gcc`,
+so run the script in a Git SDK shell if you are using Windows.
diff --git a/contrib/vscode/init.sh b/contrib/vscode/init.sh
new file mode 100755
index 000000000..3cc93243f
--- /dev/null
+++ b/contrib/vscode/init.sh
@@ -0,0 +1,165 @@
+#!/bin/sh
+
+die () {
+       echo "$*" >&2
+       exit 1
+}
+
+cd "$(dirname "$0")"/../.. ||
+die "Could not cd to top-level directory"
+
+mkdir -p .vscode ||
+die "Could not create .vscode/"
+
+# General settings
+
+cat >.vscode/settings.json <<\EOF ||
+{
+    "C_Cpp.intelliSenseEngine": "Default",
+    "C_Cpp.intelliSenseEngineFallback": "Disabled",
+    "files.associations": {
+        "*.h": "c",
+        "*.c": "c"
+    }
+}
+EOF
+die "Could not write settings.json"
+
+# Infer some setup-specific locations/names
+
+GCCPATH="$(which gcc)"
+GDBPATH="$(which gdb)"
+MAKECOMMAND="make -j5 DEVELOPER=1"
+OSNAME=
+X=
+case "$(uname -s)" in
+MINGW*)
+       GCCPATH="$(cygpath -am "$GCCPATH")"
+       GDBPATH="$(cygpath -am "$GDBPATH")"
+       MAKE_BASH="$(cygpath -am /git-cmd.exe) --command=usr\\\\bin\\\\bash.exe"
+       MAKECOMMAND="$MAKE_BASH -lc \\\"$MAKECOMMAND\\\""
+       OSNAME=Win32
+       X=.exe
+       ;;
+Linux)
+       OSNAME=Linux
+       ;;
+Darwin)
+       OSNAME=macOS
+       ;;
+esac
+
+# Default build task
+
+cat >.vscode/tasks.json <<EOF ||
+{
+    // See https://go.microsoft.com/fwlink/?LinkId=733558
+    // for the documentation about the tasks.json format
+    "version": "2.0.0",
+    "tasks": [
+        {
+            "label": "make",
+            "type": "shell",
+            "command": "$MAKECOMMAND",
+            "group": {
+                "kind": "build",
+                "isDefault": true
+            }
+        }
+    ]
+}
+EOF
+die "Could not install default build task"
+
+# Debugger settings
+
+cat >.vscode/launch.json <<EOF ||
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit:
+    // https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "(gdb) Launch",
+            "type": "cppdbg",
+            "request": "launch",
+            "program": "\${workspaceFolder}/git$X",
+            "args": [],
+            "stopAtEntry": false,
+            "cwd": "\${workspaceFolder}",
+            "environment": [],
+            "externalConsole": true,
+            "MIMode": "gdb",
+            "miDebuggerPath": "$GDBPATH",
+            "setupCommands": [
+                {
+                    "description": "Enable pretty-printing for gdb",
+                    "text": "-enable-pretty-printing",
+                    "ignoreFailures": true
+                }
+            ]
+        }
+    ]
+}
+EOF
+die "Could not write launch configuration"
+
+# C/C++ extension settings
+
+make -f - OSNAME=$OSNAME GCCPATH="$GCCPATH" vscode-init \
+       >.vscode/c_cpp_properties.json <<\EOF ||
+include Makefile
+
+vscode-init:
+       @mkdir -p .vscode && \
+       incs= && defs= && \
+       for e in $(ALL_CFLAGS); do \
+               case "$$e" in \
+               -I.) \
+                       incs="$$(printf '% 16s"$${workspaceRoot}",\n%s' \
+                               "" "$$incs")" \
+                       ;; \
+               -I/*) \
+                       incs="$$(printf '% 16s"%s",\n%s' \
+                               "" "$${e#-I}" "$$incs")" \
+                       ;; \
+               -I*) \
+                       incs="$$(printf '% 16s"$${workspaceRoot}/%s",\n%s' \
+                               "" "$${e#-I}" "$$incs")" \
+                       ;; \
+               -D*) \
+                       defs="$$(printf '% 16s"%s",\n%s' \
+                               "" "$$(echo "$${e#-D}" | sed 's/"/\\&/g')" \
+                               "$$defs")" \
+                       ;; \
+               esac; \
+       done && \
+       echo '{' && \
+       echo '    "configurations": [' && \
+       echo '        {' && \
+       echo '            "name": "$(OSNAME)",' && \
+       echo '            "intelliSenseMode": "clang-x64",' && \
+       echo '            "includePath": [' && \
+       echo "$$incs" | sort | sed '$$s/,$$//' && \
+       echo '            ],' && \
+       echo '            "defines": [' && \
+       echo "$$defs" | sort | sed '$$s/,$$//' && \
+       echo '            ],' && \
+       echo '            "browse": {' && \
+       echo '                "limitSymbolsToIncludedHeaders": true,' && \
+       echo '                "databaseFilename": "",' && \
+       echo '                "path": [' && \
+       echo '                    "$${workspaceRoot}"' && \
+       echo '                ]' && \
+       echo '            },' && \
+       echo '            "cStandard": "c11",' && \
+       echo '            "cppStandard": "c++17",' && \
+       echo '            "compilerPath": "$(GCCPATH)"' && \
+       echo '        }' && \
+       echo '    ],' && \
+       echo '    "version": 4' && \
+       echo '}'
+EOF
+die "Could not write settings for the C/C++ extension"
-- 
gitgitgadget

Reply via email to