git/contrib/vscode/init.sh
Derrick Stolee 85845580d9 vscode: improve tab size and wrapping
The contrib/vscode/init.sh script initializes the .vscode directory with
some helpful metadata so VS Code handles Git code better.

One big issue that VS Code has is detecting the tab width based on file
type. ".txt" files were not covered by this script before, so add them
with the appropriate tab widths. This prevents inserting spaces instead
of tabs and keeps the tab width to eight instead of four or two.

While we are here, remove the "editor.wordWrap" settings. The editor's
word wrap is only cosmetic: it does not actually insert newlines when
your typing goes over the column limit. This can make it appear like you
have properly wrapped code, but it is incorrect. Further, existing code
that is over the column limit is wrapped even if your editor window is
wider than the limit. This can make reading such code more difficult.
Without these lines, VS Code renders the lines accurately, without
"ghost" newlines.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-06-27 15:37:44 -07:00

379 lines
8.6 KiB
Bash
Executable file

#!/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.new <<\EOF ||
{
"C_Cpp.intelliSenseEngine": "Default",
"C_Cpp.intelliSenseEngineFallback": "Disabled",
"[git-commit]": {
"editor.wordWrap": "wordWrapColumn",
"editor.wordWrapColumn": 72
},
"[c]": {
"editor.detectIndentation": false,
"editor.insertSpaces": false,
"editor.tabSize": 8,
"files.trimTrailingWhitespace": true
},
"[txt]": {
"editor.detectIndentation": false,
"editor.insertSpaces": false,
"editor.tabSize": 8,
"files.trimTrailingWhitespace": true
},
"files.associations": {
"*.h": "c",
"*.c": "c"
},
"cSpell.ignorePaths": [
],
"cSpell.words": [
"DATAW",
"DBCACHED",
"DFCHECK",
"DTYPE",
"Hamano",
"HCAST",
"HEXSZ",
"HKEY",
"HKLM",
"IFGITLINK",
"IFINVALID",
"ISBROKEN",
"ISGITLINK",
"ISSYMREF",
"Junio",
"LPDWORD",
"LPPROC",
"LPWSTR",
"MSVCRT",
"NOARG",
"NOCOMPLETE",
"NOINHERIT",
"RENORMALIZE",
"STARTF",
"STARTUPINFOEXW",
"Schindelin",
"UCRT",
"YESNO",
"argcp",
"beginthreadex",
"committish",
"contentp",
"cpath",
"cpidx",
"ctim",
"dequote",
"envw",
"ewah",
"fdata",
"fherr",
"fhin",
"fhout",
"fragp",
"fsmonitor",
"hnsec",
"idents",
"includeif",
"interpr",
"iprog",
"isexe",
"iskeychar",
"kompare",
"mksnpath",
"mktag",
"mktree",
"mmblob",
"mmbuffer",
"mmfile",
"noenv",
"nparents",
"ntpath",
"ondisk",
"ooid",
"oplen",
"osdl",
"pnew",
"pold",
"ppinfo",
"pushf",
"pushv",
"rawsz",
"rebasing",
"reencode",
"repo",
"rerere",
"scld",
"sharedrepo",
"spawnv",
"spawnve",
"spawnvpe",
"strdup'ing",
"submodule",
"submodules",
"topath",
"topo",
"tpatch",
"unexecutable",
"unhide",
"unkc",
"unkv",
"unmark",
"unmatch",
"unsets",
"unshown",
"untracked",
"untrackedcache",
"unuse",
"upos",
"uval",
"vreportf",
"wargs",
"wargv",
"wbuffer",
"wcmd",
"wcsnicmp",
"wcstoutfdup",
"wdeltaenv",
"wdir",
"wenv",
"wenvblk",
"wenvcmp",
"wenviron",
"wenvpos",
"wenvsz",
"wfile",
"wfilename",
"wfopen",
"wfreopen",
"wfullpath",
"which'll",
"wlink",
"wmain",
"wmkdir",
"wmktemp",
"wnewpath",
"wotype",
"wpath",
"wpathname",
"wpgmptr",
"wpnew",
"wpointer",
"wpold",
"wpos",
"wputenv",
"wrmdir",
"wship",
"wtarget",
"wtemplate",
"wunlink",
"xcalloc",
"xgetcwd",
"xmallocz",
"xmemdupz",
"xmmap",
"xopts",
"xrealloc",
"xsnprintf",
"xutftowcs",
"xutftowcsn",
"xwcstoutf"
],
"cSpell.ignoreRegExpList": [
"\\\"(DIRC|FSMN|REUC|UNTR)\\\"",
"\\\\u[0-9a-fA-Fx]{4}\\b",
"\\b(filfre|frotz|xyzzy)\\b",
"\\bCMIT_FMT_DEFAULT\\b",
"\\bde-munge\\b",
"\\bGET_OID_DISAMBIGUATORS\\b",
"\\bHASH_RENORMALIZE\\b",
"\\bTREESAMEness\\b",
"\\bUSE_STDEV\\b",
"\\Wchar *\\*\\W*utfs\\W",
"cURL's",
"nedmalloc'ed",
"ntifs\\.h",
],
}
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.new <<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.new <<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": [],
"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) \
'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
'-DGIT_LOCALE_PATH="$(localedir_relative_SQ)"' \
'-DBINDIR="$(bindir_relative_SQ)"' \
'-DFALLBACK_RUNTIME_PREFIX="$(prefix_SQ)"' \
'-DDEFAULT_GIT_TEMPLATE_DIR="$(template_dir_SQ)"' \
'-DETC_GITCONFIG="$(ETC_GITCONFIG_SQ)"' \
'-DETC_GITATTRIBUTES="$(ETC_GITATTRIBUTES_SQ)"' \
'-DGIT_LOCALE_PATH="$(localedir_relative_SQ)"' \
'-DCURL_DISABLE_TYPECHECK', \
'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'; 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"
for file in .vscode/settings.json .vscode/tasks.json .vscode/launch.json
do
if test -f $file
then
if git diff --no-index --quiet --exit-code $file $file.new
then
rm $file.new
else
printf "The file $file.new has these changes:\n\n"
git --no-pager diff --no-index $file $file.new
printf "\n\nMaybe \`mv $file.new $file\`?\n\n"
fi
else
mv $file.new $file
fi
done