Skip to content

Instantly share code, notes, and snippets.

@mej
Forked from nandordudas/Advanced-setup.md
Created February 5, 2024 22:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mej/b725a1e7e1f2768f75950a06adbdfe3d to your computer and use it in GitHub Desktop.
Save mej/b725a1e7e1f2768f75950a06adbdfe3d to your computer and use it in GitHub Desktop.
Setup WSL 2 on Windows 11

Install Scoop a command-line installer for Windows

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
iex "& {$(irm get.scoop.sh)} -ScoopDir ${Env:USERPROFILE}\Scoop"
scoop install git
scoop bucket add extras
scoop install delta exiftool

Windows Package Manager and PowerShell

Install Powershell

winget upgrade --all --silent --include-unknown
winget install Microsoft.PowerShell
winget install Microsoft.PowerToys
Font settings

Monaspace, Maple mono, Nerd fonts

scoop bucket add nerd-fonts
scoop install --global Monaspace JetBrains-Mono Maple-Mono Maple-Mono-NF Meslo-NF-Mono
Customize Powershell

Oh My Posh and Terminal-Icons

Install-Module Terminal-Icons
winget install JanDeDobbeleer.OhMyPosh

Update Powershell profile setup.

winget install Microsoft.VisualStudioCode
code $PROFILE

Add Microsoft.PowerShell_profile.ps1 content and save the file.

Update Windows Terminal settings and set it as the default profile. Disable the logo on your PowerShell profile by adding -NoLogo after the command and save the changes, like \pwsh.exe -NoLogo - go to Settings/Defaults/Font face and set Maple Mono SC NF.

winget install Docker.DockerDesktop
winget install Microsoft.VisualStudioCode

If using Docker Desktop is not feasible or undesirable

# WSL already installed
sudo apt update --yes && sudo apt upgrade --yes
mkdir ~/Downloads && cd ~/Downloads
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh
sudo usermod -aG docker $USER
rm ~/Downloads/get-docker.sh
# If you encounter issues with Docker setup, consider deleting the ~/.docker folder both on the host and within WSL

Install Windows Subsystem for Linux (WSL)

Open Windows Terminal with Administrator permissions

Setup the new user. These commands are running in Powershell, not in WSL.

# Set up Ubuntu within WSL or choose a particular release, such as Ubuntu-22.04
wsl --install --distribution Ubuntu
Restart-Computer
# To rerun the previous command, use the up arrow key in the terminal, and WSL will update the kernel
wsl --install --distribution Ubuntu
wsl --update
wsl --user root apt update --yes
wsl --user root apt upgrade --yes
# Check system info
wsl lsb_release --all
# Set default distribution
wsl --list
wsl --set-default Ubuntu

Upgrade WSL optionally

# Prepare WSL image upgrade - cat /etc/os-release
sudo apt install update-manager-core
# Upgrade WSL image - use "-d" flag if necessary
sudo do-release-upgrade
sudo apt update --yes && sudo apt upgrade --yes
sudo apt install --yes zsh && sudo apt autoremove --yes

Tip

Add WSL config on the host

Check wslconfig. Restart WSL and Docker.

wsl --shutdown

Install recommended VS Code extensions

Remote containers

code --install-extension ms-vscode-remote.remote-containers
code --install-extension ms-vscode-remote.remote-wsl

Setup Git in WSL

Note

You don't need to setup Git on host but recommended to set email and name globally.

Use Windows Terminal or VS Code, or use WSL Bash.

Git config

Check Delta and exiftool.

# On WSL Ubuntu
delta_version=0.16.5
cd Downloads
curl -sLO "https://github.com/dandavison/delta/releases/download/${delta_version}/git-delta_${delta_version}_amd64.deb"
sudo dpkg --install git-delta_${delta_version}_amd64.deb
sudo apt install --yes exiftool
rm ~/Downloads/git-delta_${delta_version}_amd64.deb
# Arch
# sudo pacman -S git-delta perl-image-exiftool
Advanced Git setup

Please check git_config file below before run following script!

bash -c "$(curl -sSL https://gist.githubusercontent.com/nandordudas/a80971a3cf4a4563a26bc9aa3cfc8c00/raw/git_config)"

Folder specific Git configuration

git config --global --edit

[includeIf "gitdir:~/Code/Github/"]
  path = ~/Code/Github/.gitconfig

Add refspec

The +refs/merge-requests/*:refs/remotes/origin/merge-requests/* refspec tells Git to fetch all merge requests from the remote repository. The * wildcard matches all merge requests, and the :refs/remotes/origin/merge-requests/* part tells Git to store the fetched merge requests in the refs/remotes/origin/merge-requests/* namespace.

GitLab repositories

git config --add remote.origin.fetch "+refs/merge-requests/*:refs/remotes/origin/merge-requests/*"

The +refs/pull/*/head:refs/remotes/pull_requests/* refspec tells Git to fetch the heads of all pull requests from the remote repository. The refs/pull/*/head part matches the heads of all pull requests, and the :refs/remotes/pull_requests/* part tells Git to store the fetched heads in the refs/remotes/pull_requests/* namespace.

GitHub repositories

git config --add remote.origin.fetch "+refs/pull/*/head:refs/remotes/pull_requests/*"

The +refs/pull-requests/*/from:refs/remotes/origin/pr/* refspec tells Git to fetch the from branches of all pull requests from the remote repository. The refs/pull-requests/*/from part matches the from branches of all pull requests, and the :refs/remotes/origin/pr/* part tells Git to store the fetched branches in the refs/remotes/origin/pr/* namespace.

BitBucket repositories

git config --add remote.origin.fetch "+refs/pull-requests/*/from:refs/remotes/origin/pr/*"

Setup zsh

Oh-My-Zsh, Powerlevel 10k, Fast syntax highlight and Zsh completions

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
plugins_path="${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins"
git config --global url."https://github.com/".insteadOf gh:
git clone gh:z-shell/F-Sy-H "${plugins_path}/F-Sy-H"
git clone gh:zsh-users/zsh-autosuggestions "${plugins_path}/zsh-autosuggestions"
sed -ie "s/plugins=.*/plugins=(git F-Sy-H zsh-autosuggestions)/g" ~/.zshrc
source ~/.zshrc

Advanced Git setup (or winget install GnuPG.Gpg4win)

GPG for Win, sharing GPG keys and about commit signature verification

Please check what sudo does before installing it, or simply use the terminal as an administrator and execute the command without it.

scoop install sudo
sudo scoop install gpg4win
# Restarting the computer is recommended, but even signing off is sufficient
Logoff

Log back into WSL. Enjoy.

#!/usr/bin/env bash
set -euo pipefail
main() {
CONFIG_FILE="$HOME/.gitconfig"
backup_config() {
if [ -e "$CONFIG_FILE" ]; then
cp "$CONFIG_FILE" "$CONFIG_FILE-$(date +%F_%T).bak"
fi
}
exists() {
command -v "$1" &>/dev/null
}
confirm() {
local title="$1"
echo -n "$title (Y/n): "
while read -rn 1 -s answer; do
answer="${answer:-Y}"
case $answer in
[Yy]*) echo "Confirmed."; return 0 ;;
[Nn]*) echo "Canceled."; return 1 ;;
*) echo "Invalid input. Please enter 'Yy' or 'Nn'." ;;
esac
done
}
get_secret_keys() {
local email="$1"
if [[ -n "${cache[$email]}" ]]; then
echo "${cache[$email]}"
return
fi
local result
result=$(gpg --list-secret-keys "$email" 2>/dev/null | sed -n '2s/.*\(.\{16\}\)$/\1/p')
cache["$email"]=$result
echo "$result"
}
backup_config
read -rp "Enter your email: " email
read -rp "Enter your name: " name
declare -A cache=([$email]="")
git config --global advice.detachedHead false
if confirm "Do you prefer rebasing instead of merging?"; then
git config --global branch.autoSetupRebase always
git config --global pull.rebase merges
else
git config --global branch.autoSetupRebase never
git config --global pull.rebase false
fi
git config --global color.pager true
git config --global color.ui true
git config --global color.branch.current "yellow reverse"
git config --global color.branch.local yellow
git config --global color.branch.remote green
git config --global color.branch.commit "227 bold"
git config --global color.branch.frag "magenta bold"
git config --global color.branch.meta 227
git config --global color.branch.new "green bold"
git config --global color.branch.old "red bold 52"
git config --global color.branch.whitespace "red reverse"
git config --global color.diff-highlight.newHighlight "green bold 22"
git config --global color.diff-highlight.newNormal "green bold"
git config --global color.diff-highlight.oldHighlight "red bold 52"
git config --global color.diff-highlight.oldNormal "red bold"
git config --global color.status.added yellow
git config --global color.status.changed green
git config --global color.status.untracked cyan
git config --global core.abbrev 12
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then
git config --global core.autocrlf true
else
git config --global core.autocrlf input
fi
git config --global core.fsmonitor true
git config --global core.quotePath false
git config --global core.untrackedCache true
git config --global core.whitespace "fix,-indent-with-non-tab,trailing-space,cr-at-eol"
# git config --global credential.helper "cache --timeout 3600" # Security enhancement
if confirm "Do you want to set up delta (colorized git diff viewer)?"; then
if exists "delta" && exists "exiftool"; then
git config --global core.pager delta # https://github.com/dandavison/delta
git config --global delta.commit-decoration-style "bold yellow box ul"
git config --global delta.file-style "bold yellow ul"
git config --global delta.hunk-header-decoration-style "yellow box"
git config --global delta.line-numbers true
git config --global delta.minus-color "#340001"
git config --global delta.plus-color "#012800"
git config --global delta.side-by-side true
git config --global delta.whitespace-error-style "22 reverse"
git config --global diff.exif.textconv exiftool # sudo apt install --yes exiftool
git config --global initeractive.diffFilter "delta --color-only"
else
echo "Delta and exiftool binaries are required but not found."
fi
fi
git config --global diff.algorithm histogram
git config --global diff.colorMoved default
git config --global diff.indentHeuristic true
git config --global diff.mnemonicPrefix true
git config --global diff.renames copies
git config --global difftool.prompt false
git config --global feature.experimental true
git config --global fetch.prune true
git config --global fetch.pruneTags true
git config --global fetch.writeCommitGraph true
git config --global gc.cruftPacks true
git config --global grep.cloumn true
git config --global grep.fullName true
git config --global grep.lineNumber true
git config --global init.defaultBranch main
git config --global initeractive.singleKey true
git config --global maintenance.auto false
git config --global maintenance.strategy incremental
git config --global merge.conflictStyle diff3
git config --global merge.ff only
git config --global mergetool.prompt false
git config --global pack.writeReverseIndex true
git config --global push.autoSetupRemote true
git config --global push.default simple
git config --global push.followTags true
git config --global push.useForceIfIncludes true
git config --global rebase.abbreviateCommands true
git config --global rebase.autoSquash true
git config --global rebase.autoStash true
git config --global rebase.updateRefs true
git config --global rerere.autoUpdate true
git config --global rerere.enabled true
git config --global revert.reference true
git config --global status.showUntrackedFiles all
git config --global tag.sort version:refname
git config --global transfer.fsckObjects true
git config --global url."https://bitbucket.org/".insteadOf bb:
git config --global url."https://github.com/".insteadOf gh:
git config --global url."https://gitlab.com/".insteadOf gl:
if confirm "Do you want to set up GPG key for signing commits?"; then
local existing_key
existing_key=$(get_secret_keys "$email")
if [ -n "$existing_key" ]; then
echo "GPG key already exists for the specified email."
else
gpg --quick-generate-key "$name <$email>" "ed25519/cert,sign+cv25519/encr"
existing_key=$(get_secret_keys "$email")
fi
echo "If the GPG key is not already present, add it to the remote - run 'gpg --armor --export $existing_key'."
git config --global commit.gpgSign true
git config --global tag.forceSignAnnotated true
git config --global tag.gpgSign true
git config --global user.signingKey "$existing_key"
fi
if exists "code"; then
git config --global core.editor "code --wait"
git config --global diff.tool default-difftool
git config --global difftool.default-difftool.cmd "code --wait --diff \$LOCAL \$REMOTE"
git config --global merge.tool code
git config --global mergetool.code.cmd "code --wait --merge \$REMOTE \$LOCAL \$BASE \$MERGED"
fi
git config --global user.email "$email"
git config --global user.name "$name"
git config --global user.useConfigOnly true
git config --list --show-origin # Reload Git configuration
echo "Git configuration completed!"
}
main
{
// Place your global snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
// Placeholders with the same ids are connected.
"Print to console": {
"scope": "typescript",
"prefix": "clog",
"body": ["console.log($0) // eslint-disable-line no-console"],
"description": "Log output to the console"
},
"Variable - const or let": {
"scope": "typescript,typescriptreact,vue",
"prefix": "$",
"body": ["${1|const,let|} ${3:{ username \\}} = ${2:{ username: 'John' \\}}"],
"description": "Create hoisted variable"
},
"Export module": {
"scope": "typescript,typescriptreact",
"prefix": "ex",
"body": ["export ${2:{ default as ${3:Component} \\}} from '$1'"],
"description": "Export module"
},
"Import module": {
"scope": "typescript,typescriptreact,vue",
"prefix": "im",
"body": ["import ${2:{ ${3:resolve} \\}} from '${1:node:path}'"],
"description": "Import module"
},
"Vitest it": {
"scope": "typescript,typescriptreact",
"prefix": "spec",
"body": [
"it('${1:should does not do much}', () => {",
" // arrange",
" ${2:const mockValue = true}",
"",
" // act and assert",
" ${4:expect(mockValue).toBeTruthy()}",
"})"
],
"description": "Create spec"
},
"Vitest describe": {
"scope": "typescript,typescriptreact",
"prefix": "suite",
"body": [
"describe('${1:${TM_FILENAME_BASE/^(.*)\\.spec$/${1:/pascalcase}/}}', () => {",
" ${2:spec}",
"",
" it.todo('should satisfy test case in the future')",
"})"
],
"description": "Create suite with optional spec"
}
}
{
"editor.inlayHints.enabled": "offUnlessPressed",
"editor.inlayHints.fontFamily": "Monaspace Radon",
/* */
"javascript.inlayHints.variableTypes.enabled": true,
"javascript.inlayHints.enumMemberValues.enabled": true,
"javascript.inlayHints.functionLikeReturnTypes.enabled": true,
"javascript.inlayHints.parameterNames.enabled": "all",
"javascript.inlayHints.parameterTypes.enabled": true,
"javascript.inlayHints.propertyDeclarationTypes.enabled": true
}
[
{ "key": "shift+alt+right", "command": "-cursorWordEndRightSelect", "when": "editorTextFocus" },
{ "key": "shift+alt+left", "command": "-cursorWordStartLeftSelect", "when": "editorTextFocus" },
{ "key": "ctrl ctrl", "command": "workbench.action.showCommands", "when": "editorTextFocus" },
{ "key": "shift shift", "command": "workbench.action.quickOpen", "when": "editorTextFocus" }
]
function Initialize-Environment {
<#
.SYNOPSIS
Initialize user environment in PowerShell
.DESCRIPTION
The Initialize-Environment script configures Oh My Posh, initialize
PSReadLine and Terminal-Icons.
.EXAMPLE
Initialize-Environment
Initialize PowerShell user environment, you can get themes with
Get-PoshThemes command.
#>
[CmdletBinding()]
param (
# Set default theme as aliens, which can be overrided by the caller
[Parameter()]
[Alias('t')]
[string]$OhMyPoshTheme = "aliens"
)
Set-StrictMode -Version Latest
Try {
# Get Oh My Posh Config
$OhMyPoshConfig = "${Env:LOCALAPPDATA}\Programs\oh-my-posh\themes\${OhMyPoshTheme}.omp.json"
# Validate if Oh My Posh Config Exists
if(-not (Test-Path -Path $OhMyPoshConfig -ErrorAction SilentlyContinue)) {
throw "Oh My Posh config file doesn't exist at the path: $OhMyPoshConfig."
}
# Initialize Oh My Posh
oh-my-posh init pwsh --config $OhMyPoshConfig | Invoke-Expression
# Define the array of required modules
$requiredModules = 'PSReadLine', 'Terminal-Icons'
# Check if required modules are installed
foreach ($module in $requiredModules) {
if(-not(Get-Module -ListAvailable -Name $module)) {
throw "Module $module is not installed."
}
# Import required modules
Import-Module -Name $module
}
# Set PSReadLine options
Set-PSReadLineOption -EditMode Windows -PredictionSource History
} Catch {
Write-Error "Failed to initialize the environment: $($_.Exception.Message)"
exit 1
}
}
function Update-SystemPackages {
<#
.SYNOPSIS
Update various system packages
.DESCRIPTION
The Update-SystemPackages script updates various system packages, using
Scoop, winget and WSL and performs system operations based on passed
parameters.
.PARAMETER RestartComputer
Restart the computer after performing updates
.PARAMETER LogOffUser
Log off the user after performing updates
.PARAMETER ShutdownComputer
Shutdown the computer after performing updates
.EXAMPLE
Update-SystemPackages -RestartComputer or -r
Update system packages and restart the computer afterwards.
#>
[CmdletBinding()]
param (
[switch]$RestartComputer,
[switch]$LogOffUser,
[switch]$ShutdownComputer
)
Set-StrictMode -Version Latest
Try {
# Update Scoop packages
scoop update --all --quiet
scoop cleanup --all --cache
scoop cache rm --all
# Upgrade Windows packages
winget upgrade --all --silent
# Update WSL packages
wsl --update
wsl --user root -- sh -c 'apt update --yes && apt upgrade --yes && apt autoremove --yes'
} Catch {
Write-Error "Failed to update packages: $($_.Exception.Message)"
exit 1
}
# Perform system actions if specified
if ($RestartComputer) {
Restart-Computer
}
if ($LogOffUser) {
Logoff
}
if ($ShutdownComputer) {
shutdown -s -t 0
}
}
# Set an alias for the Update-SystemPackages function
Set-Alias -Name upb -Value Update-SystemPackages
# Initialize the environment
Initialize-Environment -t '1_shell' # wholespace
{
/* */
"breadcrumbs.enabled": false,
/* */
"debug.onTaskErrors": "debugAnyway",
/* */
"diffEditor.experimental.showEmptyDecorations": true,
"diffEditor.experimental.showMoves": true,
"diffEditor.ignoreTrimWhitespace": false,
/* */
"editor.accessibilitySupport": "off",
"editor.codeActionsOnSave": { "source.fixAll": "explicit", "source.organizeImports": "never" },
"editor.cursorBlinking": "phase",
"editor.cursorSmoothCaretAnimation": "explicit",
"editor.cursorStyle": "underline-thin",
"editor.detectIndentation": false,
"editor.emptySelectionClipboard": false,
"editor.find.addExtraSpaceOnTop": false,
"editor.find.autoFindInSelection": "multiline",
"editor.fontFamily": "Monaspace Neon, Monaspace Argon, Maple Mono, JetBrains Mono, Cascadia Code, Consolas, monospace",
"editor.fontLigatures": "'ss01', 'ss02', 'ss03', 'ss04', 'ss04', 'ss05', 'ss06', 'ss07', 'ss08', 'calt', 'liga', 'dlig'",
"editor.fontWeight": "normal",
"editor.formatOnSave": true,
"editor.formatOnSaveMode": "modificationsIfAvailable",
"editor.guides.bracketPairs": "active",
"editor.guides.bracketPairsHorizontal": false,
"editor.guides.indentation": false,
"editor.hover.sticky": true,
"editor.insertSpaces": true,
"editor.inlineSuggest.enabled": true,
"editor.linkedEditing": true,
"editor.minimap.enabled": false,
"editor.occurrencesHighlight": "multiFile",
"editor.quickSuggestions": { "comments": "off", "other": "inline", "strings": "inline" },
"editor.renderWhitespace": "boundary",
"editor.rulers": [
{ "color": "#4f8f3140", "column": 80 },
{ "color": "#a5551f40", "column": 120 }
],
"editor.selectionHighlight": false,
"editor.smoothScrolling": true,
"editor.stickyScroll.enabled": true,
"editor.suggest.selectionMode": "whenQuickSuggestion",
"editor.suggest.showStatusBar": true,
"editor.suggest.snippetsPreventQuickSuggestions": false,
"editor.suggestSelection": "first",
"editor.tabCompletion": "onlySnippets",
"editor.tabSize": 2,
"editor.tokenColorCustomizations": {
"textMateRules": [
{
"scope": [
"comment",
"constant",
"entity.name.type.class",
"keyword",
"storage.modifier",
"storage.type.class.js"
],
"settings": { "fontStyle": "italic" }
},
{
"scope": [
"constant.numeric.css",
"constant.numeric.decimal.js",
"constant.numeric.json",
"invalid",
"keyword.operator",
"keyword.other.unit.px.css"
],
"settings": { "fontStyle": "" }
}
]
},
"editor.wordWrapColumn": 120,
"editor.wordWrap": "off",
"editor.wrappingIndent": "deepIndent",
/* */
"emmet.showSuggestionsAsSnippets": true,
"emmet.syntaxProfiles": {
"jsx": {
"markup.attributes": { "class*": "className" },
"markup.valuePrefix": { "class*": "styles" }
}
},
"emmet.triggerExpansionOnTab": false,
/* */
"explorer.compactFolders": false,
"explorer.confirmDelete": false,
"explorer.confirmDragAndDrop": false,
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.expand": false,
"explorer.fileNesting.patterns": {
"*.asax": "$(capture).*.cs, $(capture).*.vb",
"*.ascx": "$(capture).*.cs, $(capture).*.vb",
"*.ashx": "$(capture).*.cs, $(capture).*.vb",
"*.aspx": "$(capture).*.cs, $(capture).*.vb",
"*.axaml": "$(capture).axaml.cs",
"*.bloc.dart": "$(capture).event.dart, $(capture).state.dart",
"*.c": "$(capture).h",
"*.cc": "$(capture).hpp, $(capture).h, $(capture).hxx",
"*.cjs": "$(capture).cjs.map, $(capture).*.cjs, $(capture)_*.cjs",
"*.component.ts": "$(capture).component.html, $(capture).component.spec.ts, $(capture).component.css, $(capture).component.scss, $(capture).component.sass, $(capture).component.less",
"*.cpp": "$(capture).hpp, $(capture).h, $(capture).hxx",
"*.cs": "$(capture).*.cs",
"*.cshtml": "$(capture).cshtml.cs",
"*.csproj": "*.config, *proj.user, appsettings.*, bundleconfig.json",
"*.css": "$(capture).css.map, $(capture).*.css",
"*.cxx": "$(capture).hpp, $(capture).h, $(capture).hxx",
"*.dart": "$(capture).freezed.dart, $(capture).g.dart",
"*.ex": "$(capture).html.eex, $(capture).html.heex, $(capture).html.leex",
"*.fs": "$(capture).fs.js, $(capture).fs.js.map, $(capture).fs.jsx, $(capture).fs.ts, $(capture).fs.tsx, $(capture).fs.rs, $(capture).fs.php, $(capture).fs.dart",
"*.go": "$(capture)_test.go",
"*.java": "$(capture).class",
"*.js": "$(capture).js.map, $(capture).*.js, $(capture)_*.js",
"*.jsx": "$(capture).js, $(capture).*.jsx, $(capture)_*.js, $(capture)_*.jsx, $(capture).less, $(capture).module.less",
"*.master": "$(capture).*.cs, $(capture).*.vb",
"*.mjs": "$(capture).mjs.map, $(capture).*.mjs, $(capture)_*.mjs",
"*.module.ts": "$(capture).resolver.ts, $(capture).controller.ts, $(capture).service.ts",
"*.mts": "$(capture).mts.map, $(capture).*.mts, $(capture)_*.mts",
"*.pubxml": "$(capture).pubxml.user",
"*.resx": "$(capture).*.resx, $(capture).designer.cs, $(capture).designer.vb",
"*.tex": "$(capture).acn, $(capture).acr, $(capture).alg, $(capture).aux, $(capture).bbl, $(capture).blg, $(capture).fdb_latexmk, $(capture).fls, $(capture).glg, $(capture).glo, $(capture).gls, $(capture).idx, $(capture).ind, $(capture).ist, $(capture).lof, $(capture).log, $(capture).lot, $(capture).out, $(capture).pdf, $(capture).synctex.gz, $(capture).toc, $(capture).xdv",
"*.ts": "$(capture).js, $(capture).d.ts.map, $(capture).*.ts, $(capture)_*.js, $(capture)_*.ts",
"*.tsx": "$(capture).ts, $(capture).*.tsx, $(capture)_*.ts, $(capture)_*.tsx, $(capture).less, $(capture).module.less, $(capture).scss, $(capture).module.scss",
"*.vbproj": "*.config, *proj.user, appsettings.*, bundleconfig.json",
"*.vue": "$(capture).*.ts, $(capture).*.js, $(capture).story.vue",
"*.xaml": "$(capture).xaml.cs",
"+layout.svelte": "+layout.ts,+layout.ts,+layout.js,+layout.server.ts,+layout.server.js,+layout.gql",
"+page.svelte": "+page.server.ts,+page.server.js,+page.ts,+page.js,+page.gql",
".clang-tidy": ".clang-format, .clangd, compile_commands.json",
".env": "*.env, .env.*, .envrc, env.d.ts",
".gitignore": ".gitattributes, .gitmodules, .gitmessage, .mailmap, .git-blame*",
".project": ".classpath",
"BUILD.bazel": "*.bzl, *.bazel, *.bazelrc, bazel.rc, .bazelignore, .bazelproject, WORKSPACE",
"CMakeLists.txt": "*.cmake, *.cmake.in, .cmake-format.yaml, CMakePresets.json, CMakeCache.txt",
"Cargo.toml": ".clippy.toml, .rustfmt.toml, cargo.lock, clippy.toml, cross.toml, rust-toolchain.toml, rustfmt.toml",
"Dockerfile": "*.dockerfile, .devcontainer.*, .dockerignore, compose.*, docker-compose.*, dockerfile*",
"I*.cs": "$(capture).cs",
"Pipfile": ".editorconfig, .flake8, .isort.cfg, .python-version, Pipfile, Pipfile.lock, requirements*.in, requirements*.pip, requirements*.txt, tox.ini",
"README*": "AUTHORS, Authors, BACKERS*, Backers*, CHANGELOG*, CITATION*, CODEOWNERS, CODE_OF_CONDUCT*, CONTRIBUTING*, CONTRIBUTORS, COPYING*, CREDITS, Changelog*, Citation*, Code_Of_Conduct*, Codeowners, Contributing*, Contributors, Copying*, Credits, GOVERNANCE.MD, Governance.md, HISTORY.MD, History.md, LICENSE*, License*, MAINTAINERS, Maintainers, README*, Readme*, SECURITY.MD, SPONSORS*, Security.md, Sponsors*, authors, backers*, changelog*, citation*, code_of_conduct*, codeowners, contributing*, contributors, copying*, credits, governance.md, history.md, license*, maintainers, readme*, security.md, sponsors*",
"Readme*": "AUTHORS, Authors, BACKERS*, Backers*, CHANGELOG*, CITATION*, CODEOWNERS, CODE_OF_CONDUCT*, CONTRIBUTING*, CONTRIBUTORS, COPYING*, CREDITS, Changelog*, Citation*, Code_Of_Conduct*, Codeowners, Contributing*, Contributors, Copying*, Credits, GOVERNANCE.MD, Governance.md, HISTORY.MD, History.md, LICENSE*, License*, MAINTAINERS, Maintainers, README*, Readme*, SECURITY.MD, SPONSORS*, Security.md, Sponsors*, authors, backers*, changelog*, citation*, code_of_conduct*, codeowners, contributing*, contributors, copying*, credits, governance.md, history.md, license*, maintainers, readme*, security.md, sponsors*",
"artisan": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, server.php, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, webpack.mix.js, windi.config.*",
"astro.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"composer.json": ".php*.cache, composer.lock, phpunit.xml*, psalm*.xml",
"default.nix": "shell.nix",
"deno.json*": "*.env, .env.*, .envrc, api-extractor.json, deno.lock, env.d.ts, import-map.json, import_map.json, jsconfig.*, tsconfig.*, tsdoc.*",
"flake.nix": "flake.lock",
"gatsby-config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, gatsby-browser.*, gatsby-node.*, gatsby-ssr.*, gatsby-transformer.*, histoire.config.*, htmlnanorc.*, i18n.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"gemfile": ".ruby-version, gemfile.lock",
"go.mod": ".air*, go.sum",
"go.work": "go.work.sum",
"hatch.toml": ".editorconfig, .flake8, .isort.cfg, .python-version, hatch.toml, requirements*.in, requirements*.pip, requirements*.txt, tox.ini",
"mix.exs": ".credo.exs, .dialyzer_ignore.exs, .formatter.exs, .iex.exs, .tool-versions, mix.lock",
"next.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, next-env.d.ts, next-i18next.config.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"nuxt.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .nuxtignore, .nuxtrc, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"package.json": ".browserslist*, .circleci*, .commitlint*, .cz-config.js, .czrc, .dlint.json, .dprint.json*, .editorconfig, .eslint*, .firebase*, .flowconfig, .github*, .gitlab*, .gitmojirc.json, .gitpod*, .huskyrc*, .jslint*, .knip.*, .lintstagedrc*, .markdownlint*, .node-version, .nodemon*, .npm*, .nvmrc, .pm2*, .pnp.*, .pnpm*, .prettier*, .release-please*.json, .releaserc*, .sentry*, .simple-git-hooks*, .stackblitz*, .styleci*, .stylelint*, .tazerc*, .textlint*, .tool-versions, .travis*, .versionrc*, .vscode*, .watchman*, .xo-config*, .yamllint*, .yarnrc*, Procfile, apollo.config.*, appveyor*, azure-pipelines*, biome.json, bower.json, build.config.*, bun.lockb, commitlint*, crowdin*, dangerfile*, dlint.json, dprint.json*, electron-builder.*, eslint*, firebase.json, grunt*, gulp*, jenkins*, knip.*, lerna*, lint-staged*, nest-cli.*, netlify*, nodemon*, npm-shrinkwrap.json, nx.*, package-lock.json, package.nls*.json, phpcs.xml, pm2.*, pnpm*, prettier*, pullapprove*, pyrightconfig.json, release-please*.json, release-tasks.sh, release.config.*, renovate*, rollup.config.*, rspack*, simple-git-hooks*, sonar-project.properties, stylelint*, tslint*, tsup.config.*, turbo*, typedoc*, unlighthouse*, vercel*, vetur.config.*, webpack*, workspace.json, xo.config.*, yarn*",
"pubspec.yaml": ".metadata, .packages, all_lint_rules.yaml, analysis_options.yaml, build.yaml, pubspec.lock, pubspec_overrides.yaml",
"pyproject.toml": ".editorconfig, .flake8, .isort.cfg, .pdm-python, .pdm.toml, .python-version, MANIFEST.in, Pipfile, Pipfile.lock, hatch.toml, pdm.lock, poetry.lock, pyproject.toml, requirements*.in, requirements*.pip, requirements*.txt, setup.cfg, setup.py, tox.ini",
"quasar.conf.js": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, quasar.extensions.json, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"readme*": "AUTHORS, Authors, BACKERS*, Backers*, CHANGELOG*, CITATION*, CODEOWNERS, CODE_OF_CONDUCT*, CONTRIBUTING*, CONTRIBUTORS, COPYING*, CREDITS, Changelog*, Citation*, Code_Of_Conduct*, Codeowners, Contributing*, Contributors, Copying*, Credits, GOVERNANCE.MD, Governance.md, HISTORY.MD, History.md, LICENSE*, License*, MAINTAINERS, Maintainers, README*, Readme*, SECURITY.MD, SPONSORS*, Security.md, Sponsors*, authors, backers*, changelog*, citation*, code_of_conduct*, codeowners, contributing*, contributors, copying*, credits, governance.md, history.md, license*, maintainers, readme*, security.md, sponsors*",
"remix.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, remix.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"requirements.txt": ".editorconfig, .flake8, .isort.cfg, .python-version, requirements*.in, requirements*.pip, requirements*.txt, tox.ini",
"rush.json": ".browserslist*, .circleci*, .commitlint*, .cz-config.js, .czrc, .dlint.json, .dprint.json*, .editorconfig, .eslint*, .firebase*, .flowconfig, .github*, .gitlab*, .gitmojirc.json, .gitpod*, .huskyrc*, .jslint*, .knip.*, .lintstagedrc*, .markdownlint*, .node-version, .nodemon*, .npm*, .nvmrc, .pm2*, .pnp.*, .pnpm*, .prettier*, .release-please*.json, .releaserc*, .sentry*, .simple-git-hooks*, .stackblitz*, .styleci*, .stylelint*, .tazerc*, .textlint*, .tool-versions, .travis*, .versionrc*, .vscode*, .watchman*, .xo-config*, .yamllint*, .yarnrc*, Procfile, apollo.config.*, appveyor*, azure-pipelines*, biome.json, bower.json, build.config.*, bun.lockb, commitlint*, crowdin*, dangerfile*, dlint.json, dprint.json*, electron-builder.*, eslint*, firebase.json, grunt*, gulp*, jenkins*, knip.*, lerna*, lint-staged*, nest-cli.*, netlify*, nodemon*, npm-shrinkwrap.json, nx.*, package-lock.json, package.nls*.json, phpcs.xml, pm2.*, pnpm*, prettier*, pullapprove*, pyrightconfig.json, release-please*.json, release-tasks.sh, release.config.*, renovate*, rollup.config.*, rspack*, simple-git-hooks*, sonar-project.properties, stylelint*, tslint*, tsup.config.*, turbo*, typedoc*, unlighthouse*, vercel*, vetur.config.*, webpack*, workspace.json, xo.config.*, yarn*",
"setup.cfg": ".editorconfig, .flake8, .isort.cfg, .python-version, MANIFEST.in, requirements*.in, requirements*.pip, requirements*.txt, setup.cfg, tox.ini",
"setup.py": ".editorconfig, .flake8, .isort.cfg, .python-version, MANIFEST.in, requirements*.in, requirements*.pip, requirements*.txt, setup.cfg, setup.py, tox.ini",
"shims.d.ts": "*.d.ts",
"svelte.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, houdini.config.*, htmlnanorc.*, i18n.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, mdsvex.config.js, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vite.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"vite.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"vue.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*"
},
/* */
"extensions.autoUpdate": "onlyEnabledExtensions", /* This setting has an application scope and can be set only in the user settings file. */
/* */
"files.autoSave": "onWindowChange",
"files.encoding": "utf8",
"files.eol": "\n", /* lf */
"files.insertFinalNewline": true,
"files.trimFinalNewlines": true,
"files.trimTrailingWhitespace": true,
/* */
"git.allowForcePush": true,
"git.allowNoVerifyCommit": true,
"git.alwaysShowStagedChangesResourceGroup": true,
"git.autofetch": false,
"git.autoStash": true,
"git.branchProtection": ["develop", "main", "master"],
"git.confirmForcePush": false,
"git.confirmNoVerifyCommit": false,
"git.confirmSync": false,
"git.enableCommitSigning": true,
"git.enableSmartCommit": true,
"git.fetchOnPull": true,
"git.followTagsWhenSync": true,
"git.pruneOnFetch": true,
"git.pullBeforeCheckout": true,
"git.untrackedChanges": "separate",
/* */
"problems.showCurrentInStatus": true,
/* */
"scm.defaultViewMode": "tree",
"scm.diffDecorationsGutterWidth": 2,
/* */
"search.exclude": {
"**/.git": true,
"**/.github": true,
"**/.gitlab": true,
"**/.nuxt": true,
"**/.output": true,
"**/.pnpm": true,
"**/.turbo": true,
"**/.vscode": true,
"**/.yarn": true,
"**/bower_components": true,
"**/build/**": true,
"**/CHANGELOG*": true,
"**/dist/**": true,
"**/LICENSE*": true,
"**/logs": true,
"**/node_modules": true,
"**/package-lock.json": true,
"**/pnpm-lock.yaml": true,
"**/public": true,
"**/tmp": true,
"**/yarn.lock": true
},
"search.mode": "newEditor",
"search.searchOnType": true,
"search.seedWithNearestWord": true,
"search.showLineNumbers": false,
"search.useIgnoreFiles": true,
/* */
"task.reconnection": true,
/* */
"telemetry.telemetryLevel": "off", /* This setting has an application scope and can be set only in the user settings file. */
/* */
"terminal.integrated.autoReplies": { "[oh-my-zsh] Would you like to update? [Y/n]": "Y\r" },
"terminal.integrated.cursorBlinking": true,
"terminal.integrated.cursorStyle": "underline",
"terminal.integrated.defaultProfile.linux": "zsh",
"terminal.integrated.fontFamily": "Maple Mono SC NF, MesloLGS NF, JetBrains Mono, Cascadia Mono, Consolas, monospace",
"terminal.integrated.fontWeight": 400,
"terminal.integrated.persistentSessionReviveProcess": "never",
"terminal.integrated.smoothScrolling": true,
"terminal.integrated.stickyScroll.enabled": true,
/* */
"typescript.inlayHints.enumMemberValues.enabled": true,
"typescript.inlayHints.functionLikeReturnTypes.enabled": true,
"typescript.inlayHints.parameterNames.enabled": "all",
"typescript.inlayHints.parameterTypes.enabled": true,
"typescript.inlayHints.propertyDeclarationTypes.enabled": true,
"typescript.inlayHints.variableTypes.enabled": true,
"typescript.preferences.preferTypeOnlyAutoImports": true,
"typescript.updateImportsOnFileMove.enabled": "always",
/* */
"window.autoDetectColorScheme": true,
"window.dialogStyle": "custom", /* This setting has an application scope and can be set only in the user settings file. */
"window.menuBarVisibility": "compact", /* This setting has an application scope and can be set only in the user settings file. */
/* */
"workbench.colorTheme": "Vitesse Dark", /* antfu.theme-vitesse */
"workbench.editor.closeOnFileDelete": true,
"workbench.editor.doubleClickTabToToggleEditorGroupSizes": "off",
"workbench.editor.highlightModifiedTabs": true,
"workbench.editor.limit.enabled": true,
"workbench.editor.limit.perEditorGroup": true,
"workbench.editor.limit.value": 8,
"workbench.editor.tabActionCloseVisibility": false,
"workbench.iconTheme": "file-icons", /* file-icons.file-icons */
"workbench.layoutControl.enabled": false,
"workbench.list.smoothScrolling": true,
"workbench.productIconTheme": "icons-carbon", /* antfu.icons-carbon */
"workbench.sideBar.location": "right",
"workbench.startupEditor": "none",
"workbench.tips.enabled": false,
"workbench.tree.indent": 10,
/* SonarSource.sonarlint-vscode */
"sonarlint.disableTelemetry": true
"sonarlint.rules": {
"javascript:S3776": {
"level": "on",
/* https://sonarcloud.io/organizations/sonarsource/rules?open=javascript%3AS3776&q=javascript%3AS3776 */
"parameters": { "threshold": 5 }
}
},
/* streetsidesoftware.code-spell-checker */
"cSpell.allowCompoundWords": true,
"cSpell.language": "en,en-US",
/* usernamehw.errorlens */
"errorLens.excludeBySource": [
"cSpell",
"eslint"
],
"errorLens.fontStyleItalic": true,
"errorLens.fontWeight": "100"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment