This commit is contained in:
Brian Zalewski 2022-11-30 01:26:34 -05:00
parent dd7934711b
commit 0927bd690e
77 changed files with 6991 additions and 696 deletions

View file

@ -0,0 +1,30 @@
<?xml version="1.0"?>
<!--
** DO NOT EDIT THIS FILE.
** If you make changes to this file while any VirtualBox related application
** is running, your changes will be overwritten later, without taking effect.
** Use VBoxManage or the VirtualBox Manager GUI to make changes.
-->
<VirtualBox xmlns="http://www.virtualbox.org/" version="1.12-linux">
<Global>
<ExtraData>
<ExtraDataItem name="GUI/Details/Elements" value="general,system,preview,display,storage,audio,network,usb,sharedFolders,description"/>
<ExtraDataItem name="GUI/GroupDefinitions/" value="n=GLOBAL"/>
<ExtraDataItem name="GUI/LastItemSelected" value="n=GLOBAL"/>
<ExtraDataItem name="GUI/LastWindowPosition" value="341,164,683,404"/>
<ExtraDataItem name="GUI/SplitterSizes" value="226,456"/>
<ExtraDataItem name="GUI/Toolbar" value="false"/>
<ExtraDataItem name="GUI/Tools/LastItemsSelected" value="Welcome,Details"/>
<ExtraDataItem name="GUI/UpdateCheckCount" value="2"/>
<ExtraDataItem name="GUI/UpdateDate" value="1 d, 2021-12-15, stable, 6.1.30"/>
</ExtraData>
<MachineRegistry/>
<NetserviceRegistry>
<DHCPServers>
<DHCPServer networkName="HostInterfaceNetworking-vboxnet0" IPAddress="192.168.56.100" networkMask="255.255.255.0" lowerIP="192.168.56.101" upperIP="192.168.56.254" enabled="1"/>
</DHCPServers>
</NetserviceRegistry>
<SystemProperties defaultMachineFolder="C:\Users\{{ .user.username }}\.local\virtualbox" defaultHardDiskFormat="VDI" VRDEAuthLibrary="VBoxAuth" webServiceAuthLibrary="VBoxAuth" LogHistoryCount="3" proxyMode="0" exclusiveHwVirt="true"/>
<USBDeviceFilters/>
</Global>
</VirtualBox>

View file

@ -94,4 +94,3 @@ if [ "$BASH_SUPPORT" = 'true' ]; then
complete -C vault vault
fi
fi

View file

@ -0,0 +1,43 @@
{
"recommendations": [
"chrmarti.regex",
"DavidAnson.vscode-markdownlint",
"dbaeumer.vscode-eslint",
"eamodio.gitlens",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode",
"ericadamski.carbon-now-sh",
"formulahendry.code-runner",
"GitHub.vscode-pull-request-github",
"GitLab.gitlab-workflow",
"GoogleCloudTools.cloudcode",
"HashiCorp.terraform",
"hediet.vscode-drawio",
"IBM.output-colorizer",
"Kelvin.vscode-sshfs",
"mads-hartmann.bash-ide-vscode",
"ms-azuretools.vscode-docker",
"ms-kubernetes-tools.vscode-kubernetes-tools",
"ms-vscode-remote.remote-containers",
"ms-vscode-remote.remote-ssh",
"ms-vscode-remote.remote-wsl",
"ms-vscode.PowerShell",
"MS-vsliveshare.vsliveshare",
"MS-vsliveshare.vsliveshare-audio",
"philnash.ngrok-for-vscode",
"PKief.material-icon-theme",
"redhat.ansible",
"redhat.vscode-yaml",
"richie5um2.vscode-sort-json",
"Rubymaniac.vscode-paste-and-indent",
"shd101wyy.markdown-preview-enhanced",
"softwaredotcom.swdc-vscode",
"timonwong.shellcheck",
"tyriar.sort-lines",
"usernamehw.errorlens",
"valentjn.vscode-ltex",
"vsls-contrib.codetour",
"vsls-contrib.gistfs",
"wayou.vscode-todo-highlight"
]
}

View file

@ -0,0 +1 @@
The Betelgeuse VS Code theme created using [themer.dev](https://themer.dev).

View file

@ -0,0 +1,48 @@
<svg width="400px" height="400px" viewBox="0 0 400 400" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient x1="0%" y1="50%" x2="100%" y2="50%" id="shadeGradientLight">
<stop stop-color="#e5e6e7" offset="0%"></stop>
<stop stop-color="#cccdcf" offset="16.67%"></stop>
<stop stop-color="#b2b4b7" offset="33.33%"></stop>
<stop stop-color="#999ba0" offset="50%"></stop>
<stop stop-color="#7f8288" offset="66.67%"></stop>
<stop stop-color="#666970" offset="83.33%"></stop>
<stop stop-color="#4c5058" offset="100%"></stop>
</linearGradient>
<linearGradient x1="0%" y1="50%" x2="100%" y2="50%" id="shadeGradientDark">
<stop stop-color="#2f323e" offset="0%"></stop>
<stop stop-color="#474b56" offset="16.67%"></stop>
<stop stop-color="#60646f" offset="33.33%"></stop>
<stop stop-color="#797c87" offset="50%"></stop>
<stop stop-color="#9295a0" offset="66.67%"></stop>
<stop stop-color="#aaaeb8" offset="83.33%"></stop>
<stop stop-color="#c3c7d1" offset="100%"></stop>
</linearGradient>
</defs>
<g id="light">
<rect fill="#ffffff" x="0" y="0" width="400" height="200"></rect>
<rect fill="#ff4972" x="28" y="28" width="74" height="37"></rect>
<rect fill="#dcdfe4" x="118" y="28" width="74" height="37"></rect>
<rect fill="#ffff80" x="208" y="28" width="74" height="37"></rect>
<rect fill="#95ffc3" x="298" y="28" width="74" height="37"></rect>
<rect fill="#24e5ff" x="28" y="81" width="74" height="37"></rect>
<rect fill="#a0dbff" x="118" y="81" width="74" height="37"></rect>
<rect fill="#4c5058" x="208" y="81" width="74" height="37"></rect>
<rect fill="#eb71ad" x="298" y="81" width="74" height="37"></rect>
<rect fill="url(#shadeGradientLight)" x="28" y="134" width="344" height="37"></rect>
</g>
<g id="dark" transform="translate(0.000000, 200.000000)">
<rect fill="#161925" x="0" y="0" width="400" height="200"></rect>
<rect fill="#ed254e" x="28" y="28" width="74" height="37"></rect>
<rect fill="#dcdfe4" x="118" y="28" width="74" height="37"></rect>
<rect fill="#f9dc5c" x="208" y="28" width="74" height="37"></rect>
<rect fill="#71f79f" x="298" y="28" width="74" height="37"></rect>
<rect fill="#00c1e4" x="28" y="81" width="74" height="37"></rect>
<rect fill="#7cb7ff" x="118" y="81" width="74" height="37"></rect>
<rect fill="#c3c7d1" x="208" y="81" width="74" height="37"></rect>
<rect fill="#c74d89" x="298" y="81" width="74" height="37"></rect>
<rect fill="url(#shadeGradientDark)" x="28" y="134" width="344" height="37"></rect>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -0,0 +1,28 @@
{
"name": "betelgeuse-vscode",
"displayName": "Betelgeuse VS Code Theme",
"description": "Betelgeuse theme generated by Themer.dev",
"version": "2.4.0",
"publisher": "Megabyte Labs",
"engines": {
"vscode": "^1.14.0"
},
"categories": [
"Themes"
],
"icon": "icon.svg",
"contributes": {
"themes": [
{
"label": "Betelgeuse Dark",
"uiTheme": "vs-dark",
"path": "themes/themer-dark-color-theme.json"
},
{
"label": "Betelgeuse Light",
"uiTheme": "vs",
"path": "themes/themer-light-color-theme.json"
}
]
}
}

View file

@ -0,0 +1,614 @@
{
"name": "Betelgeuse Dark",
"type": "dark",
"colors": {
"focusBorder": "#c3c7d1",
"foreground": "#c3c7d1",
"widget.shadow": "#161925",
"selection.background": "#474b56",
"descriptionForeground": "#aaaeb8",
"errorForeground": "#ed254e",
"icon.foreground": "#aaaeb8",
"sash.hoverBorder": "#7cb7ff",
"textBlockQuote.background": "#2f323e",
"textBlockQuote.border": "#2f323e",
"textCodeBlock.background": "#161925",
"textLink.activeForeground": "#00c1e4",
"textLink.foreground": "#7cb7ff",
"textPreformat.foreground": "#dcdfe4",
"textSeparator.foreground": "#797c87",
"button.background": "#7cb7ff",
"button.foreground": "#161925",
"button.hoverBackground": "#00c1e4",
"button.secondaryForeground": "#161925",
"button.secondaryBackground": "#aaaeb8",
"button.secondaryHoverBackground": "#9295a0",
"checkbox.background": "#7cb7ff",
"checkbox.foreground": "#161925",
"checkbox.border": "#2f323e",
"dropdown.background": "#2f323e",
"dropdown.listBackground": "#2f323e",
"dropdown.border": "#2f323e",
"dropdown.foreground": "#aaaeb8",
"input.background": "#2f323e",
"input.border": "#2f323e",
"input.foreground": "#aaaeb8",
"input.placeholderForeground": "#474b56",
"inputOption.activeBackground": "#474b56",
"inputOption.activeBorder": "#00c1e4",
"inputOption.activeForeground": "#c3c7d1",
"inputValidation.errorBackground": "#2f323e",
"inputValidation.errorForeground": "#ed254e",
"inputValidation.errorBorder": "#ed254e",
"inputValidation.infoBackground": "#2f323e",
"inputValidation.infoForeground": "#7cb7ff",
"inputValidation.infoBorder": "#7cb7ff",
"inputValidation.warningBackground": "#2f323e",
"inputValidation.warningForeground": "#dcdfe4",
"inputValidation.warningBorder": "#dcdfe4",
"scrollbar.shadow": "#161925",
"scrollbarSlider.activeBackground": "#9295a07f",
"scrollbarSlider.background": "#60646f7f",
"scrollbarSlider.hoverBackground": "#797c877f",
"badge.foreground": "#161925",
"badge.background": "#c3c7d1",
"progressBar.background": "#71f79f",
"list.activeSelectionBackground": "#c3c7d133",
"list.activeSelectionForeground": "#c3c7d1",
"list.dropBackground": "#2f323e",
"list.focusBackground": "#60646f3f",
"list.focusForeground": "#c3c7d1",
"list.highlightForeground": "#f9dc5c",
"list.hoverBackground": "#2f323e33",
"list.hoverForeground": "#c3c7d1",
"list.inactiveSelectionBackground": "#474b563f",
"list.inactiveSelectionForeground": "#aaaeb8",
"list.inactiveFocusBackground": "#2f323e3f",
"list.invalidItemForeground": "#ed254e",
"list.errorForeground": "#ed254e",
"list.warningForeground": "#f9dc5c",
"listFilterWidget.background": "#2f323e",
"listFilterWidget.outline": "#7cb7ff",
"listFilterWidget.noMatchesOutline": "#ed254e",
"list.filterMatchBackground": "#f9dc5c33",
"list.filterMatchBorder": "#f9dc5c33",
"tree.indentGuidesStroke": "#2f323e",
"list.deemphasizedForeground": "#797c87",
"activityBar.background": "#161925",
"activityBar.dropBorder": "#7cb7ff",
"activityBar.foreground": "#9295a0",
"activityBar.inactiveForeground": "#797c87",
"activityBar.border": "#161925",
"activityBarBadge.background": "#c3c7d1",
"activityBarBadge.foreground": "#161925",
"activityBar.activeBorder": "#aaaeb8",
"activityBar.activeBackground": "#2f323e33",
"activityBar.activeFocusBorder": "#c3c7d1",
"sideBar.background": "#161925",
"sideBar.foreground": "#aaaeb8",
"sideBar.border": "#2f323e",
"sideBar.dropBackground": "#2f323e3f",
"sideBarTitle.foreground": "#9295a0",
"sideBarSectionHeader.background": "#474b56",
"sideBarSectionHeader.foreground": "#aaaeb8",
"sideBarSectionHeader.border": "#161925",
"minimap.findMatchHighlight": "#f9dc5c",
"minimap.selectionHighlight": "#7cb7ff80",
"minimap.errorHighlight": "#ed254e80",
"minimap.warningHighlight": "#dcdfe480",
"minimap.background": "#161925",
"minimapSlider.background": "#2f323e33",
"minimapSlider.hoverBackground": "#474b5633",
"minimapSlider.activeBackground": "#60646f33",
"minimapGutter.addedBackground": "#71f79f80",
"minimapGutter.modifiedBackground": "#f9dc5c80",
"minimapGutter.deletedBackground": "#ed254e80",
"editorGroup.border": "#2f323e",
"editorGroup.dropBackground": "#474b567f",
"editorGroupHeader.noTabsBackground": "#161925",
"editorGroupHeader.tabsBackground": "#161925",
"editorGroupHeader.tabsBorder": "#161925",
"editorGroupHeader.border": "#161925",
"editorGroup.emptyBackground": "#161925",
"editorGroup.focusedEmptyBorder": "#2f323e",
"tab.activeBackground": "#161925",
"tab.unfocusedActiveBackground": "#161925",
"tab.activeForeground": "#aaaeb8",
"tab.border": "#161925",
"tab.lastPinnedBorder": "#c74d89",
"tab.inactiveBackground": "#2f323e",
"tab.unfocusedInactiveBackground": "#2f323e",
"tab.inactiveForeground": "#60646f",
"tab.unfocusedActiveForeground": "#60646f",
"tab.unfocusedInactiveForeground": "#474b56",
"tab.hoverBackground": "#2f323e80",
"tab.unfocusedHoverBackground": "#2f323e80",
"tab.hoverForeground": "#9295a0",
"tab.unfocusedHoverForeground": "#797c87",
"tab.activeModifiedBorder": "#f9dc5c",
"tab.inactiveModifiedBorder": "#f9dc5c",
"tab.unfocusedActiveModifiedBorder": "#f9dc5c",
"tab.unfocusedInactiveModifiedBorder": "#f9dc5c",
"editorPane.background": "#161925",
"editor.background": "#161925",
"editor.foreground": "#c3c7d1",
"editorLineNumber.foreground": "#474b56",
"editorLineNumber.activeForeground": "#797c87",
"editorCursor.background": "#161925",
"editorCursor.foreground": "#c3c7d1",
"editor.selectionBackground": "#7cb7ff33",
"editor.selectionForeground": "#c3c7d1",
"editor.inactiveSelectionBackground": "#7cb7ff33",
"editor.selectionHighlightBackground": "#2f323e",
"editor.wordHighlightBackground": "#c3c7d133",
"editor.wordHighlightStrongBackground": "#c74d8933",
"editor.findMatchBackground": "#f9dc5c3f",
"editor.findMatchHighlightBackground": "#f9dc5c33",
"editor.findRangeHighlightBackground": "#2f323e",
"editor.hoverHighlightBackground": "#474b567f",
"editor.lineHighlightBackground": "#161925",
"editor.lineHighlightBorder": "#2f323e",
"editorLink.activeForeground": "#00c1e4",
"editor.rangeHighlightBackground": "#f9dc5c33",
"editor.symbolHighlightBackground": "#c3c7d133",
"editorWhitespace.foreground": "#2f323e",
"editorIndentGuide.background": "#2f323e",
"editorIndentGuide.activeBackground": "#474b56",
"editorRuler.foreground": "#2f323e",
"editorCodeLens.foreground": "#9295a0",
"editorLightBulb.foreground": "#f9dc5c",
"editorLightBulbAutoFix.foreground": "#7cb7ff",
"editorBracketMatch.background": "#2f323e",
"editorBracketMatch.border": "#474b56",
"editorBracketHighlight.foreground1": "#c3c7d1",
"editorBracketHighlight.foreground2": "#f9dc5c",
"editorBracketHighlight.foreground3": "#00c1e4",
"editorBracketHighlight.foreground4": "#c3c7d1",
"editorBracketHighlight.foreground5": "#71f79f",
"editorBracketHighlight.foreground6": "#7cb7ff",
"editorBracketHighlight.unexpectedBracket": "#ed254e",
"editor.foldBackground": "#2f323e66",
"editorOverviewRuler.border": "#2f323e",
"editorOverviewRuler.findMatchForeground": "#f9dc5cbf",
"editorOverviewRuler.rangeHighlightForeground": "#474b56bf",
"editorOverviewRuler.selectionHighlightForeground": "#2f323ebf",
"editorOverviewRuler.wordHighlightForeground": "#474b56bf",
"editorOverviewRuler.wordHighlightStrongForeground": "#60646fbf",
"editorOverviewRuler.modifiedForeground": "#f9dc5c7f",
"editorOverviewRuler.addedForeground": "#71f79f7f",
"editorOverviewRuler.deletedForeground": "#ed254e7f",
"editorOverviewRuler.errorForeground": "#ed254e7f",
"editorOverviewRuler.warningForeground": "#dcdfe47f",
"editorOverviewRuler.infoForeground": "#7cb7ff7f",
"editorOverviewRuler.bracketMatchForeground": "#60646f",
"editorError.foreground": "#ed254e",
"editorError.border": "#c3c7d1",
"editorWarning.foreground": "#dcdfe4",
"editorWarning.border": "#aaaeb8",
"editorInfo.foreground": "#7cb7ff",
"editorInfo.border": "#9295a0",
"editorHint.foreground": "#c74d89",
"editorHint.border": "#797c87",
"problemsErrorIcon.foreground": "#ed254e",
"problemsWarningIcon.foreground": "#dcdfe4",
"problemsInfoIcon.foreground": "#7cb7ff",
"editorUnnecessaryCode.opacity": "#0000007f",
"editorGutter.background": "#161925",
"editorGutter.modifiedBackground": "#f9dc5c",
"editorGutter.addedBackground": "#71f79f",
"editorGutter.deletedBackground": "#ed254e",
"editorGutter.commentRangeForeground": "#60646f",
"editorGutter.foldingControlForeground": "#9295a0",
"diffEditor.insertedTextBackground": "#71f79f20",
"diffEditor.removedTextBackground": "#ed254e20",
"diffEditor.border": "#2f323e",
"diffEditor.diagonalFill": "#2f323e7f",
"editorWidget.foreground": "#aaaeb8",
"editorWidget.background": "#2f323e",
"editorWidget.border": "#2f323e",
"editorWidget.resizeBorder": "#7cb7ff",
"editorSuggestWidget.background": "#2f323e",
"editorSuggestWidget.border": "#2f323e",
"editorSuggestWidget.foreground": "#aaaeb8",
"editorSuggestWidget.highlightForeground": "#c74d89",
"editorSuggestWidget.selectedBackground": "#474b56",
"editorHoverWidget.foreground": "#aaaeb8",
"editorHoverWidget.background": "#2f323e",
"editorHoverWidget.border": "#2f323e",
"editorHoverWidget.statusBarBackground": "#7cb7ff33",
"debugExceptionWidget.background": "#2f323e",
"debugExceptionWidget.border": "#2f323e",
"editorMarkerNavigation.background": "#2f323e",
"editorMarkerNavigationError.background": "#ed254e",
"editorMarkerNavigationWarning.background": "#dcdfe4",
"editorMarkerNavigationInfo.background": "#7cb7ff",
"peekView.border": "#c74d89",
"peekViewEditor.background": "#2f323e7f",
"peekViewEditorGutter.background": "#2f323e7f",
"peekViewEditor.matchHighlightBackground": "#f9dc5c7f",
"peekViewResult.background": "#2f323e",
"peekViewResult.fileForeground": "#aaaeb8",
"peekViewResult.lineForeground": "#474b56",
"peekViewResult.matchHighlightBackground": "#f9dc5c",
"peekViewResult.selectionBackground": "#60646f",
"peekViewResult.selectionForeground": "#c3c7d1",
"peekViewTitle.background": "#2f323e",
"peekViewTitleDescription.foreground": "#9295a0",
"peekViewTitleLabel.foreground": "#c3c7d1",
"merge.currentHeaderBackground": "#00c1e44c",
"merge.currentContentBackground": "#00c1e44c",
"merge.incomingHeaderBackground": "#7cb7ff4c",
"merge.incomingContentBackground": "#7cb7ff4c",
"merge.border": "#797c87",
"merge.commonContentBackground": "#c3c7d14c",
"merge.commonHeaderBackground": "#c3c7d14c",
"editorOverviewRuler.currentContentForeground": "#00c1e4",
"editorOverviewRuler.incomingContentForeground": "#7cb7ff",
"editorOverviewRuler.commonContentForeground": "#c3c7d1",
"panel.background": "#161925",
"panel.border": "#2f323e",
"panel.dropBorder": "#7cb7ff",
"panelTitle.activeBorder": "#60646f",
"panelTitle.activeForeground": "#aaaeb8",
"panelTitle.inactiveForeground": "#797c87",
"panelSection.border": "#2f323e",
"panelSection.dropBackground": "#2f323e3f",
"panelSectionHeader.background": "#474b56",
"panelSectionHeader.foreground": "#aaaeb8",
"panelSectionHeader.border": "#161925",
"imagePreview.border": "#2f323e",
"statusBar.background": "#7cb7ff",
"statusBar.foreground": "#161925",
"statusBar.border": "#161925",
"statusBar.debuggingBackground": "#dcdfe4",
"statusBar.debuggingForeground": "#161925",
"statusBar.debuggingBorder": "#161925",
"statusBar.noFolderBackground": "#c3c7d1",
"statusBar.noFolderForeground": "#161925",
"statusBar.noFolderBorder": "#161925",
"statusBarItem.activeBackground": "#00c1e4",
"statusBarItem.hoverBackground": "#71f79f",
"statusBarItem.prominentBackground": "#00c1e4",
"statusBarItem.prominentHoverBackground": "#71f79f",
"statusBarItem.remoteBackground": "#00c1e4",
"statusBarItem.remoteForeground": "#161925",
"statusBarItem.errorBackground": "#ed254e",
"statusBarItem.errorForeground": "#161925",
"titleBar.activeBackground": "#161925",
"titleBar.activeForeground": "#9295a0",
"titleBar.inactiveBackground": "#161925",
"titleBar.inactiveForeground": "#60646f",
"menubar.selectionForeground": "#c3c7d1",
"menubar.selectionBackground": "#2f323e",
"menu.foreground": "#aaaeb8",
"menu.background": "#161925",
"menu.selectionForeground": "#c3c7d1",
"menu.selectionBackground": "#2f323e",
"menu.separatorBackground": "#474b56",
"notificationCenterHeader.foreground": "#aaaeb8",
"notificationCenterHeader.background": "#474b56",
"notificationToast.border": "#60646f",
"notifications.foreground": "#c3c7d1",
"notifications.background": "#2f323e",
"notifications.border": "#60646f",
"notificationLink.foreground": "#7cb7ff",
"notificationsErrorIcon.foreground": "#ed254e",
"notificationsWarningIcon.foreground": "#dcdfe4",
"notificationsInfoIcon.foreground": "#7cb7ff",
"extensionButton.prominentForeground": "#161925",
"extensionButton.prominentBackground": "#7cb7ff",
"extensionButton.prominentHoverBackground": "#00c1e4",
"extensionBadge.remoteBackground": "#c74d89",
"extensionBadge.remoteForeground": "#161925",
"pickerGroup.border": "#474b56",
"pickerGroup.foreground": "#797c87",
"quickInput.background": "#2f323e",
"quickInput.foreground": "#c3c7d1",
"quickInputTitle.background": "#474b56",
"terminal.background": "#161925",
"terminal.foreground": "#aaaeb8",
"terminal.ansiBlack": "#161925",
"terminal.ansiBlue": "#7cb7ff",
"terminal.ansiBrightBlack": "#2f323e",
"terminal.ansiBrightBlue": "#7cb7ff",
"terminal.ansiBrightCyan": "#00c1e4",
"terminal.ansiBrightGreen": "#00c1e4",
"terminal.ansiBrightMagenta": "#c74d89",
"terminal.ansiBrightRed": "#dcdfe4",
"terminal.ansiBrightWhite": "#c3c7d1",
"terminal.ansiBrightYellow": "#f9dc5c",
"terminal.ansiCyan": "#00c1e4",
"terminal.ansiGreen": "#71f79f",
"terminal.ansiMagenta": "#c74d89",
"terminal.ansiRed": "#ed254e",
"terminal.ansiWhite": "#aaaeb8",
"terminal.ansiYellow": "#f9dc5c",
"terminal.selectionBackground": "#7cb7ff7f",
"terminalCursor.background": "#2f323e",
"terminalCursor.foreground": "#9295a0",
"debugToolBar.background": "#2f323e",
"debugToolBar.border": "#474b56",
"editor.stackFrameHighlightBackground": "#00c1e43f",
"editor.focusedStackFrameHighlightBackground": "#71f79f3f",
"debugView.exceptionLabelForeground": "#f9dc5c",
"debugView.exceptionLabelBackground": "#2f323e",
"debugView.stateLabelForeground": "#7cb7ff",
"debugView.stateLabelBackground": "#2f323e",
"debugView.valueChangedHighlight": "#f9dc5c33",
"debugTokenExpression.name": "#7cb7ff",
"debugTokenExpression.value": "#c3c7d1",
"debugTokenExpression.string": "#71f79f",
"debugTokenExpression.boolean": "#c3c7d1",
"debugTokenExpression.number": "#c74d89",
"debugTokenExpression.error": "#ed254e",
"testing.iconFailed": "#dcdfe4",
"testing.iconErrored": "#ed254e",
"testing.iconPassed": "#71f79f",
"testing.runAction": "#7cb7ff",
"testing.iconQueued": "#00c1e4",
"testing.iconUnset": "#9295a0",
"testing.iconSkipped": "#797c87",
"testing.peekBorder": "#60646f",
"testing.message.error.decorationForeground": "#ed254e",
"testing.message.error.lineBackground": "#ed254e3f",
"testing.message.warning.decorationForeground": "#dcdfe4",
"testing.message.warning.lineBackground": "#dcdfe43f",
"testing.message.info.decorationForeground": "#7cb7ff",
"testing.message.info.lineBackground": "#7cb7ff3f",
"testing.message.hint.decorationForeground": "#c74d89",
"testing.message.hint.lineBackground": "#c74d893f",
"welcomePage.background": "#161925",
"welcomePage.buttonBackground": "#2f323e",
"welcomePage.buttonHoverBackground": "#474b56",
"welcomePage.progress.background": "#7cb7ff",
"welcomePage.progress.foreground": "#161925",
"walkThrough.embeddedEditorBackground": "#161925",
"scm.providerBorder": "#474b56",
"gitDecoration.addedResourceForeground": "#71f79f",
"gitDecoration.modifiedResourceForeground": "#f9dc5c",
"gitDecoration.stageModifiedResourceForeground": "#00c1e4",
"gitDecoration.deletedResourceForeground": "#ed254e",
"gitDecoration.stageDeletedResourceForeground": "#ed254e",
"gitDecoration.untrackedResourceForeground": "#c3c7d1",
"gitDecoration.ignoredResourceForeground": "#60646f",
"gitDecoration.conflictingResourceForeground": "#00c1e4",
"gitDecoration.submoduleResourceForeground": "#c74d89",
"settings.headerForeground": "#c3c7d1",
"settings.modifiedItemIndicator": "#00c1e4",
"settings.dropdownBackground": "#2f323e",
"settings.dropdownForeground": "#aaaeb8",
"settings.dropdownListBorder": "#474b56",
"settings.checkboxBackground": "#7cb7ff",
"settings.checkboxForeground": "#161925",
"settings.checkboxBorder": "#7cb7ff",
"settings.textInputBackground": "#2f323e",
"settings.textInputForeground": "#aaaeb8",
"settings.numberInputBackground": "#2f323e",
"settings.numberInputForeground": "#aaaeb8",
"settings.focusedRowBackground": "#161925",
"notebook.focusedRowBorder": "#c3c7d1",
"notebook.rowHoverBackground": "#2f323e7f",
"breadcrumb.foreground": "#9295a0",
"breadcrumb.background": "#161925",
"breadcrumb.focusForeground": "#aaaeb8",
"breadcrumb.activeSelectionForeground": "#c3c7d1",
"breadcrumbPicker.background": "#161925",
"editor.snippetTabstopHighlightBackground": "#2f323e7f",
"editor.snippetFinalTabstopHighlightBackground": "#474b567f",
"symbolIcon.arrayForeground": "#c74d89",
"symbolIcon.booleanForeground": "#c3c7d1",
"symbolIcon.classForeground": "#7cb7ff",
"symbolIcon.colorForeground": "#00c1e4",
"symbolIcon.constantForeground": "#71f79f",
"symbolIcon.constructorForeground": "#c3c7d1",
"symbolIcon.enumeratorForeground": "#00c1e4",
"symbolIcon.enumeratorMemberForeground": "#7cb7ff",
"symbolIcon.eventForeground": "#dcdfe4",
"symbolIcon.fieldForeground": "#ed254e",
"symbolIcon.fileForeground": "#aaaeb8",
"symbolIcon.folderForeground": "#9295a0",
"symbolIcon.functionForeground": "#c3c7d1",
"symbolIcon.interfaceForeground": "#ed254e",
"symbolIcon.keyForeground": "#f9dc5c",
"symbolIcon.keywordForeground": "#7cb7ff",
"symbolIcon.methodForeground": "#00c1e4",
"symbolIcon.moduleForeground": "#00c1e4",
"symbolIcon.namespaceForeground": "#7cb7ff",
"symbolIcon.nullForeground": "#ed254e",
"symbolIcon.numberForeground": "#dcdfe4",
"symbolIcon.objectForeground": "#c3c7d1",
"symbolIcon.operatorForeground": "#ed254e",
"symbolIcon.packageForeground": "#dcdfe4",
"symbolIcon.propertyForeground": "#00c1e4",
"symbolIcon.referenceForeground": "#dcdfe4",
"symbolIcon.snippetForeground": "#9295a0",
"symbolIcon.stringForeground": "#71f79f",
"symbolIcon.structForeground": "#7cb7ff",
"symbolIcon.textForeground": "#c3c7d1",
"symbolIcon.typeParameterForeground": "#7cb7ff",
"symbolIcon.unitForeground": "#f9dc5c",
"symbolIcon.variableForeground": "#dcdfe4",
"debugIcon.breakpointForeground": "#ed254e",
"debugIcon.breakpointDisabledForeground": "#797c87",
"debugIcon.breakpointUnverifiedForeground": "#9295a0",
"debugIcon.breakpointCurrentStackframeForeground": "#71f79f",
"debugIcon.breakpointStackframeForeground": "#f9dc5c",
"debugIcon.startForeground": "#71f79f",
"debugIcon.pauseForeground": "#7cb7ff",
"debugIcon.stopForeground": "#ed254e",
"debugIcon.disconnectForeground": "#dcdfe4",
"debugIcon.restartForeground": "#c74d89",
"debugIcon.stepOverForeground": "#c3c7d1",
"debugIcon.stepIntoForeground": "#c3c7d1",
"debugIcon.stepOutForeground": "#c3c7d1",
"debugIcon.continueForeground": "#71f79f",
"debugIcon.stepBackForeground": "#c3c7d1",
"debugConsole.infoForeground": "#7cb7ff",
"debugConsole.warningForeground": "#dcdfe4",
"debugConsole.errorForeground": "#ed254e",
"debugConsole.sourceForeground": "#c3c7d1",
"debugConsoleInputIcon.foreground": "#797c87",
"notebook.cellBorderColor": "#2f323e3f",
"notebook.focusedEditorBorder": "#2f323e",
"notebookStatusSuccessIcon.foreground": "#71f79f",
"notebookStatusErrorIcon.foreground": "#ed254e",
"notebookStatusRunningIcon.foreground": "#7cb7ff",
"notebook.outputContainerBackgroundColor": "#161925",
"notebook.cellToolbarSeparator": "#2f323e3f",
"notebook.focusedCellBackground": "#2f323e7f",
"notebook.cellHoverBackground": "#2f323e3f",
"notebook.focusedCellBorder": "#c3c7d1",
"notebook.focusedCellShadow": "#0000003f",
"notebook.selectedCellBorder": "#797c87",
"notebook.cellStatusBarItemHoverBackground": "#2f323e3f",
"notebook.cellInsertionIndicator": "#71f79f",
"notebookScrollbarSlider.background": "#60646f7f",
"notebookScrollbarSlider.hoverBackground": "#797c877f",
"notebookScrollbarSlider.activeBackground": "#9295a07f",
"notebook.symbolHighlightBackground": "#c3c7d13f",
"notebook.inactiveFocusedCellBorder": "#9295a0",
"charts.foreground": "#aaaeb8",
"charts.lines": "#60646f",
"charts.red": "#ed254e",
"charts.blue": "#7cb7ff",
"charts.yellow": "#f9dc5c",
"charts.orange": "#dcdfe4",
"charts.green": "#71f79f",
"charts.purple": "#c3c7d1"
},
"tokenColors": [
{
"settings": {
"background": "#161925",
"foreground": "#aaaeb8",
"selectionBorder": "#9295a0",
"findHighlight": "#f9dc5c",
"findHighlightForeground": "#161925",
"activeGuide": "#dcdfe4",
"bracketsForeground": "#aaaeb87F",
"bracketsOptions": "stippled_underline",
"bracketsContentsForeground": "#aaaeb87F",
"tagsOptions": "stippled_underline"
}
},
{
"name": "Comment",
"scope": "comment",
"settings": {
"foreground": "#60646f"
}
},
{
"name": "Constant",
"scope": "constant",
"settings": {
"foreground": "#c74d89"
}
},
{
"name": "Entity",
"scope": "entity",
"settings": {
"foreground": "#00c1e4"
}
},
{
"name": "Invalid",
"scope": "invalid",
"settings": {
"foreground": "#ed254e"
}
},
{
"name": "Keyword",
"scope": "keyword",
"settings": {
"foreground": "#c3c7d1"
}
},
{
"name": "Storage",
"scope": "storage",
"settings": {
"foreground": "#c74d89"
}
},
{
"name": "String",
"scope": "string",
"settings": {
"foreground": "#71f79f"
}
},
{
"name": "Support",
"scope": "support",
"settings": {
"foreground": "#00c1e4"
}
},
{
"name": "Variable",
"scope": "variable",
"settings": {
"foreground": "#c3c7d1"
}
},
{
"name": "Markup Heading",
"scope": "markup.heading",
"settings": {
"foreground": "#00c1e4"
}
},
{
"name": "Markup Deleted",
"scope": "markup.deleted",
"settings": {
"foreground": "#ed254e"
}
},
{
"name": "Markup Inserted",
"scope": "markup.inserted",
"settings": {
"foreground": "#71f79f"
}
},
{
"name": "Markup Changed",
"scope": "markup.changed",
"settings": {
"foreground": "#f9dc5c"
}
},
{
"name": "Markup Underline",
"scope": "markup.underline",
"settings": {
"fontStyle": "underline"
}
},
{
"name": "Markup Underline Link",
"scope": "markup.underline.link",
"settings": {
"foreground": "#7cb7ff"
}
},
{
"name": "Markup List",
"scope": "markup.list",
"settings": {
"foreground": "#c3c7d1"
}
},
{
"name": "Markup Raw",
"scope": "markup.raw",
"settings": {
"foreground": "#c74d89"
}
}
]
}

View file

@ -0,0 +1,614 @@
{
"name": "Betelgeuse Light",
"type": "light",
"colors": {
"focusBorder": "#4c5058",
"foreground": "#4c5058",
"widget.shadow": "#4c505866",
"selection.background": "#cccdcf",
"descriptionForeground": "#666970",
"errorForeground": "#ff4972",
"icon.foreground": "#666970",
"sash.hoverBorder": "#a0dbff",
"textBlockQuote.background": "#e5e6e7",
"textBlockQuote.border": "#e5e6e7",
"textCodeBlock.background": "#ffffff",
"textLink.activeForeground": "#24e5ff",
"textLink.foreground": "#a0dbff",
"textPreformat.foreground": "#dcdfe4",
"textSeparator.foreground": "#999ba0",
"button.background": "#a0dbff",
"button.foreground": "#ffffff",
"button.hoverBackground": "#24e5ff",
"button.secondaryForeground": "#ffffff",
"button.secondaryBackground": "#666970",
"button.secondaryHoverBackground": "#7f8288",
"checkbox.background": "#a0dbff",
"checkbox.foreground": "#ffffff",
"checkbox.border": "#e5e6e7",
"dropdown.background": "#e5e6e7",
"dropdown.listBackground": "#e5e6e7",
"dropdown.border": "#e5e6e7",
"dropdown.foreground": "#666970",
"input.background": "#e5e6e7",
"input.border": "#e5e6e7",
"input.foreground": "#666970",
"input.placeholderForeground": "#cccdcf",
"inputOption.activeBackground": "#cccdcf",
"inputOption.activeBorder": "#24e5ff",
"inputOption.activeForeground": "#4c5058",
"inputValidation.errorBackground": "#e5e6e7",
"inputValidation.errorForeground": "#ff4972",
"inputValidation.errorBorder": "#ff4972",
"inputValidation.infoBackground": "#e5e6e7",
"inputValidation.infoForeground": "#a0dbff",
"inputValidation.infoBorder": "#a0dbff",
"inputValidation.warningBackground": "#e5e6e7",
"inputValidation.warningForeground": "#dcdfe4",
"inputValidation.warningBorder": "#dcdfe4",
"scrollbar.shadow": "#4c505866",
"scrollbarSlider.activeBackground": "#7f82887f",
"scrollbarSlider.background": "#b2b4b77f",
"scrollbarSlider.hoverBackground": "#999ba07f",
"badge.foreground": "#ffffff",
"badge.background": "#4c5058",
"progressBar.background": "#95ffc3",
"list.activeSelectionBackground": "#4c505833",
"list.activeSelectionForeground": "#4c5058",
"list.dropBackground": "#e5e6e7",
"list.focusBackground": "#b2b4b73f",
"list.focusForeground": "#4c5058",
"list.highlightForeground": "#ffff80",
"list.hoverBackground": "#e5e6e733",
"list.hoverForeground": "#4c5058",
"list.inactiveSelectionBackground": "#cccdcf3f",
"list.inactiveSelectionForeground": "#666970",
"list.inactiveFocusBackground": "#e5e6e73f",
"list.invalidItemForeground": "#ff4972",
"list.errorForeground": "#ff4972",
"list.warningForeground": "#ffff80",
"listFilterWidget.background": "#e5e6e7",
"listFilterWidget.outline": "#a0dbff",
"listFilterWidget.noMatchesOutline": "#ff4972",
"list.filterMatchBackground": "#ffff8033",
"list.filterMatchBorder": "#ffff8033",
"tree.indentGuidesStroke": "#e5e6e7",
"list.deemphasizedForeground": "#999ba0",
"activityBar.background": "#ffffff",
"activityBar.dropBorder": "#a0dbff",
"activityBar.foreground": "#7f8288",
"activityBar.inactiveForeground": "#999ba0",
"activityBar.border": "#ffffff",
"activityBarBadge.background": "#4c5058",
"activityBarBadge.foreground": "#ffffff",
"activityBar.activeBorder": "#666970",
"activityBar.activeBackground": "#e5e6e733",
"activityBar.activeFocusBorder": "#4c5058",
"sideBar.background": "#ffffff",
"sideBar.foreground": "#666970",
"sideBar.border": "#e5e6e7",
"sideBar.dropBackground": "#e5e6e73f",
"sideBarTitle.foreground": "#7f8288",
"sideBarSectionHeader.background": "#cccdcf",
"sideBarSectionHeader.foreground": "#666970",
"sideBarSectionHeader.border": "#ffffff",
"minimap.findMatchHighlight": "#ffff80",
"minimap.selectionHighlight": "#a0dbff80",
"minimap.errorHighlight": "#ff497280",
"minimap.warningHighlight": "#dcdfe480",
"minimap.background": "#ffffff",
"minimapSlider.background": "#e5e6e733",
"minimapSlider.hoverBackground": "#cccdcf33",
"minimapSlider.activeBackground": "#b2b4b733",
"minimapGutter.addedBackground": "#95ffc380",
"minimapGutter.modifiedBackground": "#ffff8080",
"minimapGutter.deletedBackground": "#ff497280",
"editorGroup.border": "#e5e6e7",
"editorGroup.dropBackground": "#cccdcf7f",
"editorGroupHeader.noTabsBackground": "#ffffff",
"editorGroupHeader.tabsBackground": "#ffffff",
"editorGroupHeader.tabsBorder": "#ffffff",
"editorGroupHeader.border": "#ffffff",
"editorGroup.emptyBackground": "#ffffff",
"editorGroup.focusedEmptyBorder": "#e5e6e7",
"tab.activeBackground": "#ffffff",
"tab.unfocusedActiveBackground": "#ffffff",
"tab.activeForeground": "#666970",
"tab.border": "#ffffff",
"tab.lastPinnedBorder": "#eb71ad",
"tab.inactiveBackground": "#e5e6e7",
"tab.unfocusedInactiveBackground": "#e5e6e7",
"tab.inactiveForeground": "#b2b4b7",
"tab.unfocusedActiveForeground": "#b2b4b7",
"tab.unfocusedInactiveForeground": "#cccdcf",
"tab.hoverBackground": "#e5e6e780",
"tab.unfocusedHoverBackground": "#e5e6e780",
"tab.hoverForeground": "#7f8288",
"tab.unfocusedHoverForeground": "#999ba0",
"tab.activeModifiedBorder": "#ffff80",
"tab.inactiveModifiedBorder": "#ffff80",
"tab.unfocusedActiveModifiedBorder": "#ffff80",
"tab.unfocusedInactiveModifiedBorder": "#ffff80",
"editorPane.background": "#ffffff",
"editor.background": "#ffffff",
"editor.foreground": "#4c5058",
"editorLineNumber.foreground": "#cccdcf",
"editorLineNumber.activeForeground": "#999ba0",
"editorCursor.background": "#ffffff",
"editorCursor.foreground": "#4c5058",
"editor.selectionBackground": "#a0dbff33",
"editor.selectionForeground": "#4c5058",
"editor.inactiveSelectionBackground": "#a0dbff33",
"editor.selectionHighlightBackground": "#e5e6e7",
"editor.wordHighlightBackground": "#4c505833",
"editor.wordHighlightStrongBackground": "#eb71ad33",
"editor.findMatchBackground": "#ffff803f",
"editor.findMatchHighlightBackground": "#ffff8033",
"editor.findRangeHighlightBackground": "#e5e6e7",
"editor.hoverHighlightBackground": "#cccdcf7f",
"editor.lineHighlightBackground": "#ffffff",
"editor.lineHighlightBorder": "#e5e6e7",
"editorLink.activeForeground": "#24e5ff",
"editor.rangeHighlightBackground": "#ffff8033",
"editor.symbolHighlightBackground": "#4c505833",
"editorWhitespace.foreground": "#e5e6e7",
"editorIndentGuide.background": "#e5e6e7",
"editorIndentGuide.activeBackground": "#cccdcf",
"editorRuler.foreground": "#e5e6e7",
"editorCodeLens.foreground": "#7f8288",
"editorLightBulb.foreground": "#ffff80",
"editorLightBulbAutoFix.foreground": "#a0dbff",
"editorBracketMatch.background": "#e5e6e7",
"editorBracketMatch.border": "#cccdcf",
"editorBracketHighlight.foreground1": "#4c5058",
"editorBracketHighlight.foreground2": "#ffff80",
"editorBracketHighlight.foreground3": "#24e5ff",
"editorBracketHighlight.foreground4": "#4c5058",
"editorBracketHighlight.foreground5": "#95ffc3",
"editorBracketHighlight.foreground6": "#a0dbff",
"editorBracketHighlight.unexpectedBracket": "#ff4972",
"editor.foldBackground": "#e5e6e766",
"editorOverviewRuler.border": "#e5e6e7",
"editorOverviewRuler.findMatchForeground": "#ffff80bf",
"editorOverviewRuler.rangeHighlightForeground": "#cccdcfbf",
"editorOverviewRuler.selectionHighlightForeground": "#e5e6e7bf",
"editorOverviewRuler.wordHighlightForeground": "#cccdcfbf",
"editorOverviewRuler.wordHighlightStrongForeground": "#b2b4b7bf",
"editorOverviewRuler.modifiedForeground": "#ffff807f",
"editorOverviewRuler.addedForeground": "#95ffc37f",
"editorOverviewRuler.deletedForeground": "#ff49727f",
"editorOverviewRuler.errorForeground": "#ff49727f",
"editorOverviewRuler.warningForeground": "#dcdfe47f",
"editorOverviewRuler.infoForeground": "#a0dbff7f",
"editorOverviewRuler.bracketMatchForeground": "#b2b4b7",
"editorError.foreground": "#ff4972",
"editorError.border": "#4c5058",
"editorWarning.foreground": "#dcdfe4",
"editorWarning.border": "#666970",
"editorInfo.foreground": "#a0dbff",
"editorInfo.border": "#7f8288",
"editorHint.foreground": "#eb71ad",
"editorHint.border": "#999ba0",
"problemsErrorIcon.foreground": "#ff4972",
"problemsWarningIcon.foreground": "#dcdfe4",
"problemsInfoIcon.foreground": "#a0dbff",
"editorUnnecessaryCode.opacity": "#0000007f",
"editorGutter.background": "#ffffff",
"editorGutter.modifiedBackground": "#ffff80",
"editorGutter.addedBackground": "#95ffc3",
"editorGutter.deletedBackground": "#ff4972",
"editorGutter.commentRangeForeground": "#b2b4b7",
"editorGutter.foldingControlForeground": "#7f8288",
"diffEditor.insertedTextBackground": "#95ffc320",
"diffEditor.removedTextBackground": "#ff497220",
"diffEditor.border": "#e5e6e7",
"diffEditor.diagonalFill": "#e5e6e77f",
"editorWidget.foreground": "#666970",
"editorWidget.background": "#e5e6e7",
"editorWidget.border": "#e5e6e7",
"editorWidget.resizeBorder": "#a0dbff",
"editorSuggestWidget.background": "#e5e6e7",
"editorSuggestWidget.border": "#e5e6e7",
"editorSuggestWidget.foreground": "#666970",
"editorSuggestWidget.highlightForeground": "#eb71ad",
"editorSuggestWidget.selectedBackground": "#cccdcf",
"editorHoverWidget.foreground": "#666970",
"editorHoverWidget.background": "#e5e6e7",
"editorHoverWidget.border": "#e5e6e7",
"editorHoverWidget.statusBarBackground": "#a0dbff33",
"debugExceptionWidget.background": "#e5e6e7",
"debugExceptionWidget.border": "#e5e6e7",
"editorMarkerNavigation.background": "#e5e6e7",
"editorMarkerNavigationError.background": "#ff4972",
"editorMarkerNavigationWarning.background": "#dcdfe4",
"editorMarkerNavigationInfo.background": "#a0dbff",
"peekView.border": "#eb71ad",
"peekViewEditor.background": "#e5e6e77f",
"peekViewEditorGutter.background": "#e5e6e77f",
"peekViewEditor.matchHighlightBackground": "#ffff807f",
"peekViewResult.background": "#e5e6e7",
"peekViewResult.fileForeground": "#666970",
"peekViewResult.lineForeground": "#cccdcf",
"peekViewResult.matchHighlightBackground": "#ffff80",
"peekViewResult.selectionBackground": "#b2b4b7",
"peekViewResult.selectionForeground": "#4c5058",
"peekViewTitle.background": "#e5e6e7",
"peekViewTitleDescription.foreground": "#7f8288",
"peekViewTitleLabel.foreground": "#4c5058",
"merge.currentHeaderBackground": "#24e5ff4c",
"merge.currentContentBackground": "#24e5ff4c",
"merge.incomingHeaderBackground": "#a0dbff4c",
"merge.incomingContentBackground": "#a0dbff4c",
"merge.border": "#999ba0",
"merge.commonContentBackground": "#4c50584c",
"merge.commonHeaderBackground": "#4c50584c",
"editorOverviewRuler.currentContentForeground": "#24e5ff",
"editorOverviewRuler.incomingContentForeground": "#a0dbff",
"editorOverviewRuler.commonContentForeground": "#4c5058",
"panel.background": "#ffffff",
"panel.border": "#e5e6e7",
"panel.dropBorder": "#a0dbff",
"panelTitle.activeBorder": "#b2b4b7",
"panelTitle.activeForeground": "#666970",
"panelTitle.inactiveForeground": "#999ba0",
"panelSection.border": "#e5e6e7",
"panelSection.dropBackground": "#e5e6e73f",
"panelSectionHeader.background": "#cccdcf",
"panelSectionHeader.foreground": "#666970",
"panelSectionHeader.border": "#ffffff",
"imagePreview.border": "#e5e6e7",
"statusBar.background": "#a0dbff",
"statusBar.foreground": "#ffffff",
"statusBar.border": "#ffffff",
"statusBar.debuggingBackground": "#dcdfe4",
"statusBar.debuggingForeground": "#ffffff",
"statusBar.debuggingBorder": "#ffffff",
"statusBar.noFolderBackground": "#4c5058",
"statusBar.noFolderForeground": "#ffffff",
"statusBar.noFolderBorder": "#ffffff",
"statusBarItem.activeBackground": "#24e5ff",
"statusBarItem.hoverBackground": "#95ffc3",
"statusBarItem.prominentBackground": "#24e5ff",
"statusBarItem.prominentHoverBackground": "#95ffc3",
"statusBarItem.remoteBackground": "#24e5ff",
"statusBarItem.remoteForeground": "#ffffff",
"statusBarItem.errorBackground": "#ff4972",
"statusBarItem.errorForeground": "#ffffff",
"titleBar.activeBackground": "#ffffff",
"titleBar.activeForeground": "#7f8288",
"titleBar.inactiveBackground": "#ffffff",
"titleBar.inactiveForeground": "#b2b4b7",
"menubar.selectionForeground": "#4c5058",
"menubar.selectionBackground": "#e5e6e7",
"menu.foreground": "#666970",
"menu.background": "#ffffff",
"menu.selectionForeground": "#4c5058",
"menu.selectionBackground": "#e5e6e7",
"menu.separatorBackground": "#cccdcf",
"notificationCenterHeader.foreground": "#666970",
"notificationCenterHeader.background": "#cccdcf",
"notificationToast.border": "#b2b4b7",
"notifications.foreground": "#4c5058",
"notifications.background": "#e5e6e7",
"notifications.border": "#b2b4b7",
"notificationLink.foreground": "#a0dbff",
"notificationsErrorIcon.foreground": "#ff4972",
"notificationsWarningIcon.foreground": "#dcdfe4",
"notificationsInfoIcon.foreground": "#a0dbff",
"extensionButton.prominentForeground": "#ffffff",
"extensionButton.prominentBackground": "#a0dbff",
"extensionButton.prominentHoverBackground": "#24e5ff",
"extensionBadge.remoteBackground": "#eb71ad",
"extensionBadge.remoteForeground": "#ffffff",
"pickerGroup.border": "#cccdcf",
"pickerGroup.foreground": "#999ba0",
"quickInput.background": "#e5e6e7",
"quickInput.foreground": "#4c5058",
"quickInputTitle.background": "#cccdcf",
"terminal.background": "#ffffff",
"terminal.foreground": "#666970",
"terminal.ansiBlack": "#ffffff",
"terminal.ansiBlue": "#a0dbff",
"terminal.ansiBrightBlack": "#e5e6e7",
"terminal.ansiBrightBlue": "#a0dbff",
"terminal.ansiBrightCyan": "#24e5ff",
"terminal.ansiBrightGreen": "#24e5ff",
"terminal.ansiBrightMagenta": "#eb71ad",
"terminal.ansiBrightRed": "#dcdfe4",
"terminal.ansiBrightWhite": "#4c5058",
"terminal.ansiBrightYellow": "#ffff80",
"terminal.ansiCyan": "#24e5ff",
"terminal.ansiGreen": "#95ffc3",
"terminal.ansiMagenta": "#eb71ad",
"terminal.ansiRed": "#ff4972",
"terminal.ansiWhite": "#666970",
"terminal.ansiYellow": "#ffff80",
"terminal.selectionBackground": "#a0dbff7f",
"terminalCursor.background": "#e5e6e7",
"terminalCursor.foreground": "#7f8288",
"debugToolBar.background": "#e5e6e7",
"debugToolBar.border": "#cccdcf",
"editor.stackFrameHighlightBackground": "#24e5ff3f",
"editor.focusedStackFrameHighlightBackground": "#95ffc33f",
"debugView.exceptionLabelForeground": "#ffff80",
"debugView.exceptionLabelBackground": "#e5e6e7",
"debugView.stateLabelForeground": "#a0dbff",
"debugView.stateLabelBackground": "#e5e6e7",
"debugView.valueChangedHighlight": "#ffff8033",
"debugTokenExpression.name": "#a0dbff",
"debugTokenExpression.value": "#4c5058",
"debugTokenExpression.string": "#95ffc3",
"debugTokenExpression.boolean": "#4c5058",
"debugTokenExpression.number": "#eb71ad",
"debugTokenExpression.error": "#ff4972",
"testing.iconFailed": "#dcdfe4",
"testing.iconErrored": "#ff4972",
"testing.iconPassed": "#95ffc3",
"testing.runAction": "#a0dbff",
"testing.iconQueued": "#24e5ff",
"testing.iconUnset": "#7f8288",
"testing.iconSkipped": "#999ba0",
"testing.peekBorder": "#b2b4b7",
"testing.message.error.decorationForeground": "#ff4972",
"testing.message.error.lineBackground": "#ff49723f",
"testing.message.warning.decorationForeground": "#dcdfe4",
"testing.message.warning.lineBackground": "#dcdfe43f",
"testing.message.info.decorationForeground": "#a0dbff",
"testing.message.info.lineBackground": "#a0dbff3f",
"testing.message.hint.decorationForeground": "#eb71ad",
"testing.message.hint.lineBackground": "#eb71ad3f",
"welcomePage.background": "#ffffff",
"welcomePage.buttonBackground": "#e5e6e7",
"welcomePage.buttonHoverBackground": "#cccdcf",
"welcomePage.progress.background": "#a0dbff",
"welcomePage.progress.foreground": "#ffffff",
"walkThrough.embeddedEditorBackground": "#ffffff",
"scm.providerBorder": "#cccdcf",
"gitDecoration.addedResourceForeground": "#95ffc3",
"gitDecoration.modifiedResourceForeground": "#ffff80",
"gitDecoration.stageModifiedResourceForeground": "#24e5ff",
"gitDecoration.deletedResourceForeground": "#ff4972",
"gitDecoration.stageDeletedResourceForeground": "#ff4972",
"gitDecoration.untrackedResourceForeground": "#4c5058",
"gitDecoration.ignoredResourceForeground": "#b2b4b7",
"gitDecoration.conflictingResourceForeground": "#24e5ff",
"gitDecoration.submoduleResourceForeground": "#eb71ad",
"settings.headerForeground": "#4c5058",
"settings.modifiedItemIndicator": "#24e5ff",
"settings.dropdownBackground": "#e5e6e7",
"settings.dropdownForeground": "#666970",
"settings.dropdownListBorder": "#cccdcf",
"settings.checkboxBackground": "#a0dbff",
"settings.checkboxForeground": "#ffffff",
"settings.checkboxBorder": "#a0dbff",
"settings.textInputBackground": "#e5e6e7",
"settings.textInputForeground": "#666970",
"settings.numberInputBackground": "#e5e6e7",
"settings.numberInputForeground": "#666970",
"settings.focusedRowBackground": "#ffffff",
"notebook.focusedRowBorder": "#4c5058",
"notebook.rowHoverBackground": "#e5e6e77f",
"breadcrumb.foreground": "#7f8288",
"breadcrumb.background": "#ffffff",
"breadcrumb.focusForeground": "#666970",
"breadcrumb.activeSelectionForeground": "#4c5058",
"breadcrumbPicker.background": "#ffffff",
"editor.snippetTabstopHighlightBackground": "#e5e6e77f",
"editor.snippetFinalTabstopHighlightBackground": "#cccdcf7f",
"symbolIcon.arrayForeground": "#eb71ad",
"symbolIcon.booleanForeground": "#4c5058",
"symbolIcon.classForeground": "#a0dbff",
"symbolIcon.colorForeground": "#24e5ff",
"symbolIcon.constantForeground": "#95ffc3",
"symbolIcon.constructorForeground": "#4c5058",
"symbolIcon.enumeratorForeground": "#24e5ff",
"symbolIcon.enumeratorMemberForeground": "#a0dbff",
"symbolIcon.eventForeground": "#dcdfe4",
"symbolIcon.fieldForeground": "#ff4972",
"symbolIcon.fileForeground": "#666970",
"symbolIcon.folderForeground": "#7f8288",
"symbolIcon.functionForeground": "#4c5058",
"symbolIcon.interfaceForeground": "#ff4972",
"symbolIcon.keyForeground": "#ffff80",
"symbolIcon.keywordForeground": "#a0dbff",
"symbolIcon.methodForeground": "#24e5ff",
"symbolIcon.moduleForeground": "#24e5ff",
"symbolIcon.namespaceForeground": "#a0dbff",
"symbolIcon.nullForeground": "#ff4972",
"symbolIcon.numberForeground": "#dcdfe4",
"symbolIcon.objectForeground": "#4c5058",
"symbolIcon.operatorForeground": "#ff4972",
"symbolIcon.packageForeground": "#dcdfe4",
"symbolIcon.propertyForeground": "#24e5ff",
"symbolIcon.referenceForeground": "#dcdfe4",
"symbolIcon.snippetForeground": "#7f8288",
"symbolIcon.stringForeground": "#95ffc3",
"symbolIcon.structForeground": "#a0dbff",
"symbolIcon.textForeground": "#4c5058",
"symbolIcon.typeParameterForeground": "#a0dbff",
"symbolIcon.unitForeground": "#ffff80",
"symbolIcon.variableForeground": "#dcdfe4",
"debugIcon.breakpointForeground": "#ff4972",
"debugIcon.breakpointDisabledForeground": "#999ba0",
"debugIcon.breakpointUnverifiedForeground": "#7f8288",
"debugIcon.breakpointCurrentStackframeForeground": "#95ffc3",
"debugIcon.breakpointStackframeForeground": "#ffff80",
"debugIcon.startForeground": "#95ffc3",
"debugIcon.pauseForeground": "#a0dbff",
"debugIcon.stopForeground": "#ff4972",
"debugIcon.disconnectForeground": "#dcdfe4",
"debugIcon.restartForeground": "#eb71ad",
"debugIcon.stepOverForeground": "#4c5058",
"debugIcon.stepIntoForeground": "#4c5058",
"debugIcon.stepOutForeground": "#4c5058",
"debugIcon.continueForeground": "#95ffc3",
"debugIcon.stepBackForeground": "#4c5058",
"debugConsole.infoForeground": "#a0dbff",
"debugConsole.warningForeground": "#dcdfe4",
"debugConsole.errorForeground": "#ff4972",
"debugConsole.sourceForeground": "#4c5058",
"debugConsoleInputIcon.foreground": "#999ba0",
"notebook.cellBorderColor": "#e5e6e73f",
"notebook.focusedEditorBorder": "#e5e6e7",
"notebookStatusSuccessIcon.foreground": "#95ffc3",
"notebookStatusErrorIcon.foreground": "#ff4972",
"notebookStatusRunningIcon.foreground": "#a0dbff",
"notebook.outputContainerBackgroundColor": "#ffffff",
"notebook.cellToolbarSeparator": "#e5e6e73f",
"notebook.focusedCellBackground": "#e5e6e77f",
"notebook.cellHoverBackground": "#e5e6e73f",
"notebook.focusedCellBorder": "#4c5058",
"notebook.focusedCellShadow": "#0000003f",
"notebook.selectedCellBorder": "#999ba0",
"notebook.cellStatusBarItemHoverBackground": "#e5e6e73f",
"notebook.cellInsertionIndicator": "#95ffc3",
"notebookScrollbarSlider.background": "#b2b4b77f",
"notebookScrollbarSlider.hoverBackground": "#999ba07f",
"notebookScrollbarSlider.activeBackground": "#7f82887f",
"notebook.symbolHighlightBackground": "#4c50583f",
"notebook.inactiveFocusedCellBorder": "#7f8288",
"charts.foreground": "#666970",
"charts.lines": "#b2b4b7",
"charts.red": "#ff4972",
"charts.blue": "#a0dbff",
"charts.yellow": "#ffff80",
"charts.orange": "#dcdfe4",
"charts.green": "#95ffc3",
"charts.purple": "#4c5058"
},
"tokenColors": [
{
"settings": {
"background": "#ffffff",
"foreground": "#666970",
"selectionBorder": "#7f8288",
"findHighlight": "#ffff80",
"findHighlightForeground": "#ffffff",
"activeGuide": "#dcdfe4",
"bracketsForeground": "#6669707F",
"bracketsOptions": "stippled_underline",
"bracketsContentsForeground": "#6669707F",
"tagsOptions": "stippled_underline"
}
},
{
"name": "Comment",
"scope": "comment",
"settings": {
"foreground": "#b2b4b7"
}
},
{
"name": "Constant",
"scope": "constant",
"settings": {
"foreground": "#eb71ad"
}
},
{
"name": "Entity",
"scope": "entity",
"settings": {
"foreground": "#24e5ff"
}
},
{
"name": "Invalid",
"scope": "invalid",
"settings": {
"foreground": "#ff4972"
}
},
{
"name": "Keyword",
"scope": "keyword",
"settings": {
"foreground": "#4c5058"
}
},
{
"name": "Storage",
"scope": "storage",
"settings": {
"foreground": "#eb71ad"
}
},
{
"name": "String",
"scope": "string",
"settings": {
"foreground": "#95ffc3"
}
},
{
"name": "Support",
"scope": "support",
"settings": {
"foreground": "#24e5ff"
}
},
{
"name": "Variable",
"scope": "variable",
"settings": {
"foreground": "#4c5058"
}
},
{
"name": "Markup Heading",
"scope": "markup.heading",
"settings": {
"foreground": "#24e5ff"
}
},
{
"name": "Markup Deleted",
"scope": "markup.deleted",
"settings": {
"foreground": "#ff4972"
}
},
{
"name": "Markup Inserted",
"scope": "markup.inserted",
"settings": {
"foreground": "#95ffc3"
}
},
{
"name": "Markup Changed",
"scope": "markup.changed",
"settings": {
"foreground": "#ffff80"
}
},
{
"name": "Markup Underline",
"scope": "markup.underline",
"settings": {
"fontStyle": "underline"
}
},
{
"name": "Markup Underline Link",
"scope": "markup.underline.link",
"settings": {
"foreground": "#a0dbff"
}
},
{
"name": "Markup List",
"scope": "markup.list",
"settings": {
"foreground": "#4c5058"
}
},
{
"name": "Markup Raw",
"scope": "markup.raw",
"settings": {
"foreground": "#eb71ad"
}
}
]
}

View file

@ -0,0 +1,48 @@
[
{
"key": "tab",
"command": "selectNextQuickFix",
"when": "editorFocus && quickFixWidgetVisible"
},
{
"key": "shift+tab",
"command": "selectPrevQuickFix",
"when": "editorFocus && quickFixWidgetVisible"
},
{
"key": "tab",
"command": "selectNextSuggestion",
"when": "editorTextFocus && suggestWidgetMultipleSuggestions && suggestWidgetVisible"
},
{
"key": "shift+tab",
"command": "selectPrevSuggestion",
"when": "editorTextFocus && suggestWidgetMultipleSuggestions && suggestWidgetVisible"
},
{
"key": "ctrl+j",
"command": "editor.action.inlineSuggest.commit",
"when": "inlineSuggestionHasIndentationLessThanTabSize && inlineSuggestionVisible && !editorTabMovesFocus"
},
{
"key": "tab",
"command": "-editor.action.inlineSuggest.commit",
"when": "inlineSuggestionHasIndentationLessThanTabSize && inlineSuggestionVisible && !editorTabMovesFocus"
},
{
"key": "alt+right",
"command": "workbench.action.nextEditor"
},
{
"key": "ctrl+pagedown",
"command": "-workbench.action.nextEditor"
},
{
"key": "alt+left",
"command": "workbench.action.previousEditor"
},
{
"key": "ctrl+pageup",
"command": "-workbench.action.previousEditor"
}
]

View file

@ -0,0 +1,170 @@
{
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json5]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[toml]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[yaml]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"codetour.customTourDirectory": ".config/codetour.yml",
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.fontFamily": "'Hack Nerd Font', Menlo, Monaco, 'Courier New', monospace",
"editor.formatOnPaste": false,
"editor.formatOnSave": true,
"editor.inlineSuggest.enabled": true,
"editor.minimap.enabled": false,
"editor.scrollBeyondLastLine": false,
"eslint.alwaysShowStatus": true,
"eslint.format.enable": true,
"eslint.lintTask.enable": true,
"eslint.lintTask.options": "-c package.json --no-eslintrc --cache --cache-location .cache/eslintcache .",
"eslint.packageManager": "pnpm",
"eslint.validate": [
"html",
"javascript",
"javascriptreact",
"json",
"jsonc",
"json5",
"markdown",
"toml",
"typescript",
"typescriptreact",
"vue",
"yaml"
],
"explorer.confirmDelete": false,
"extensions.ignoreRecommendations": true,
"files.trimTrailingWhitespace": true,
"git.autofetch": true,
"git.autoStash": true,
"github.codespaces.showPerformanceExplorer": true,
"gitlab.showPipelineUpdateNotifications": true,
"gitlens.showWelcomeOnInstall": false,
"gitlens.showWhatsNewAfterUpgrades": false,
"go.lintFlags": ["--fast"],
"go.lintTool": "golangci-lint",
"html.format.endWithNewline": true,
"html.format.indentHandlebars": true,
"html.format.indentInnerHtml": true,
"html.format.templating": true,
"javascript.format.semicolons": "remove",
"javascript.suggest.completeFunctionCalls": true,
"ltex.additionalRules.enablePickyRules": true,
"ltex.completionEnabled": true,
"markdown-preview-enhanced.previewTheme": "solarized-light.css",
"material-icon-theme.showWelcomeMessage": false,
"merge-conflict.autoNavigateNextConflict.enabled": true,
"npm.enableRunFromFolder": true,
"npm.packageManager": "pnpm",
"prettier.printWidth": 120,
"prettier.singleQuote": true,
"python.languageServer": "Pylance",
"security.workspace.trust.banner": "never",
"security.workspace.trust.enabled": false,
"telemetry.telemetryLevel": "crash",
"terminal.integrated.sendKeybindingsToShell": true,
"typescript.enablePromptUseWorkspaceTsdk": true,
"typescript.format.semicolons": "remove",
"typescript.implementationsCodeLens.enabled": true,
"typescript.inlayHints.enumMemberValues.enabled": true,
"typescript.inlayHints.functionLikeReturnTypes.enabled": true,
"typescript.inlayHints.parameterTypes.enabled": true,
"typescript.inlayHints.variableTypes.enabled": true,
"typescript.preferences.quoteStyle": "single",
"typescript.referencesCodeLens.enabled": true,
"typescript.referencesCodeLens.showOnAllFunctions": true,
"typescript.suggest.completeFunctionCalls": true,
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.updateImportsOnFileMove.enabled": "always",
"vim.enableNeovim": true,
"vim.handleKeys": {
"<C-b>": false,
"<C-f>": false
},
"vim.leader": "<space>",
"vim.neovimPath": "/usr/bin/nvim",
"vim.normalModeKeyBindings": [
{
"before": ["<C-n>"],
"commands": [":nohl"]
},
{
"before": ["leader", "w"],
"commands": ["workbench.action.files.save"]
},
{
"before": ["leader", "b", "d"],
"commands": ["workbench.action.closeActiveEditor"]
},
{
"before": ["leader", "l", "n"],
"commands": ["editor.action.marker.next"]
},
{
"before": ["leader", "l", "p"],
"commands": ["editor.action.marker.prev"]
}
],
"vscode-neovim.neovimClean": true,
"vscode-neovim.neovimExecutablePaths.linux": "/usr/bin/nvim",
"vsicons.dontShowNewVersionMessage": true,
"window.menuBarVisibility": "toggle",
"workbench.colorCustomizations": {
"terminal.foreground": "#708284",
"terminal.background": "#001e27",
"terminal.ansiBlack": "#002831",
"terminal.ansiBlue": "#2176c7",
"terminal.ansiCyan": "#259286",
"terminal.ansiGreen": "#738a05",
"terminal.ansiMagenta": "#c61c6f",
"terminal.ansiRed": "#d11c24",
"terminal.ansiWhite": "#eae3cb",
"terminal.ansiYellow": "#a57706",
"terminal.ansiBrightBlack": "#475b62",
"terminal.ansiBrightBlue": "#708284",
"terminal.ansiBrightCyan": "#819090",
"terminal.ansiBrightGreen": "#475b62",
"terminal.ansiBrightMagenta": "#5956ba",
"terminal.ansiBrightRed": "#bd3613",
"terminal.ansiBrightWhite": "#fcf4dc",
"terminal.ansiBrightYellow": "#536870",
"terminal.selectionBackground": "#002831",
"terminalCursor.foreground": "#708284"
},
"workbench.colorTheme": "Betelgeuse Dark",
"workbench.iconTheme": "sweet-vscode-icons",
"workbench.startupEditor": "readme",
"workbench.welcomePage.walkthroughs.openOnInstall": false,
"yaml.format.printWidth": 160,
"yaml.format.singleQuote": true
}

View file

@ -0,0 +1 @@

View file

@ -1 +1 @@
color_theme="betelgeuse"
color_theme="Betelgeuse"

11
.config/bat/config Normal file
View file

@ -0,0 +1,11 @@
# Set the theme to "TwoDark"
--theme="TwoDark"
# Show line numbers, Git modifications and file header (but no grid)
--style="numbers,changes,header"
# Use italic text on the terminal (not supported on all terminals)
--italic-text=always
# Use C++ syntax for Arduino .ino files
--map-syntax "*.ino:C++"

1
.config/brew/whalebrew Normal file
View file

@ -0,0 +1 @@

View file

@ -0,0 +1,11 @@
# enable wayland
--ozone-platform-hint=auto
# force GPU acceleration
--enable-gpu-rasterization
--enable-zero-copy
# enable vulkan
--use-vulkan
--enable-features=UseOzonePlatform,WebRTCPipeWireCapturer,VaapiVideoDecoder,VaapiVideoEncoder,WebUIDarkMode,WaylandWindowDecorations
# custom settings
--force-dark-mode
--password-store=basic

14
.config/crontab/config Normal file
View file

@ -0,0 +1,14 @@
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin
# 0 8 * * 0 $HOME/.scripts/domingobot.sh 2>&1 >> $HOME/.log/cron.log
# * * * * * command to be executed
# ┯ ┯ ┯ ┯ ┯
# │ │ │ │ │
# │ │ │ │ ╰───── day of week (0 - 6) (Sunday=0)
# │ │ │ ╰─────── month (1 - 12)
# │ │ ╰───────── day of month (1 - 31)
# │ ╰─────────── hour (0 - 23)
# ╰───────────── min (0 - 59)

View file

@ -0,0 +1,2 @@
[global]
load_dotenv = true

6
.config/fd/ignore Normal file
View file

@ -0,0 +1,6 @@
# EXCLUDE BACKUP FILES
*.bak
# EXCLUDE LIBRARIES ON MACOS
/Library/**
/Users/Library/**

View file

@ -0,0 +1 @@
seccomp !chroot

View file

@ -0,0 +1,14 @@
include whitelist-runuser-common.inc
dbus-user.talk org.freedesktop.Notifications
dbus-user.talk org.freedesktop.portal.Desktop
ignore noroot
whitelist ${RUNUSER}/pipewire-0
whitelist /usr/share/pipewire/client.conf
dbus-user.talk org.freedesktop.portal.*
whitelist ${HOME}/pictures
whitelist ${HOME}/go
whitelist ${HOME}/git
whitelist ${HOME}/documents
whitelist ${HOME}/work
whitelist /usr/share/pipewire/

View file

@ -0,0 +1,12 @@
whitelist ${HOME}
whitelist ${HOME}/.local/share
noblacklist ${HOME}
noblacklist ${PATH}/bash
noblacklist ${PATH}/fish
ignore private-bin
ignore private-cache
ignore private-dev
ignore private-tmp
ignore noroot
ignore nosound
ignore noexec /tmp

View file

@ -0,0 +1,4 @@
# noblacklist ${HOME}
# noblacklist ${HOME}/.ssh/
# include allow-ssh.inc
# whitelist /tmp/ssh-*

View file

@ -0,0 +1,14 @@
include whitelist-runuser-common.inc
dbus-user.talk org.freedesktop.Notifications
dbus-user.talk org.freedesktop.portal.Desktop
ignore noroot
whitelist ${RUNUSER}/pipewire-0
whitelist /usr/share/pipewire/client.conf
dbus-user.talk org.freedesktop.portal.*
whitelist ${HOME}/pictures
whitelist ${HOME}/go
whitelist ${HOME}/git
whitelist ${HOME}/documents
whitelist ${HOME}/work
whitelist /usr/share/pipewire/

View file

@ -0,0 +1,13 @@
noblacklist ${PATH}/bash
noblacklist ${PATH}/csh
noblacklist ${PATH}/dash
noblacklist ${PATH}/fish
noblacklist ${PATH}/ksh
noblacklist ${PATH}/sh
noblacklist ${PATH}/tclsh
noblacklist ${PATH}/tcsh
noblacklist ${PATH}/zsh
ignore private-bin
ignore private-cache
ignore private-dev
ignore private-tmp

View file

@ -0,0 +1,19 @@
noblacklist /var/mail
noblacklist /var/spool/mail
whitelist /var/mail
whitelist /var/spool/mail
writable-var
noblacklist ${PATH}/bash
noblacklist ${PATH}/csh
noblacklist ${PATH}/dash
noblacklist ${PATH}/fish
noblacklist ${PATH}/ksh
noblacklist ${PATH}/sh
noblacklist ${PATH}/tclsh
noblacklist ${PATH}/tcsh
noblacklist ${PATH}/zsh
ignore private-bin
ignore private-cache
ignore private-dev
ignore private-tmp

0
.config/git/attributes Normal file
View file

View file

@ -0,0 +1,14 @@
# <type>[optional scope]: <description>  (not more than 72 chars)
# <BLANK NEWLINE>
# [optional body]  (not more than 72 chars)
# <BLANK NEWLINE>
# [optional footer(s)]  (not more than 72 chars)
#-------------------------------EXAMPLE----------------------------------
# feat!(frontend): new button added in dashboard
#
# A new "Follow Us" button is added in your Account dashboard.
# If you don't see it, please delete your browser cache and reload the
# webpage.
#
# BREAKING CHANGE: this button replaces the custom button you have,
# you need to reconfigure your custom button.

30
.config/git/ignore Normal file
View file

@ -0,0 +1,30 @@
# COMPILED SOURCE
*.o
*.so
*.com
*.dll
*.exe
*.class
# BINARY ARCHIVE FILES
*.7z
*.gz
*.dmg
*.iso
*.jar
*.rar
*.tar
*.zip
*.war
# LOGS
*.log
# OS RELATED FILES
._*
.Trashes
Thumbs.db
.DS_Store
.DS_Store?
ehthumbs.db
.Spotlight-V100

View file

@ -4,7 +4,7 @@ gtk-button-images=1
gtk-cursor-theme-name=Betelgeuse
gtk-decoration-layout=icon:minimize,maximize,close
gtk-enable-animations=1
gtk-font-name=Montserrat Medium, Medium 10
gtk-font-name=Montserrat Medium, Medium 11
gtk-icon-theme-name=Betelgeuse
gtk-menu-images=1
gtk-modules=appmenu-gtk-module

70
.config/k9s/plugin.yml Normal file
View file

@ -0,0 +1,70 @@
plugin:
# dive image layers
dive:
shortCut: d
confirm: false
description: "Dive image"
scopes:
- containers
command: dive
background: false
args:
- $COL-IMAGE
# get all resources in a namespace using the krew get-all plugin
get-all:
shortCut: g
confirm: false
description: get-all
scopes:
- all
command: sh
background: false
args:
- -c
- "kubectl get-all -n $NAMESPACE | less"
edit-secret:
shortCut: Ctrl-X
confirm: false
description: "Edit Decoded Secret"
scopes:
- secrets
command: kubectl
background: false
args:
- modify-secret
- --namespace
- $NAMESPACE
- --context
- $CONTEXT
- $NAME
# View resource logs using stern
stern:
shortCut: Ctrl-L
confirm: false
description: "Logs <Stern>"
scopes:
- pods
command: stern
background: false
args:
- --tail
- 50
- $FILTER
- -n
- $NAMESPACE
- --context
- $CONTEXT
# watch events on selected resources
# requires linux "watch" command
# change '-n' to adjust refresh time in seconds
watch-events:
shortCut: Shift-E
confirm: false
description: Get Events
scopes:
- all
command: sh
background: false
args:
- -c
- "watch -n 5 kubectl get events --context $CONTEXT --namespace $NAMESPACE --field-selector involvedObject.name=$NAME"

44
.config/mimeapps.list Normal file
View file

@ -0,0 +1,44 @@
[Default Applications]
application/json=text.desktop
application/pdf=pdf.desktop
application/x-extension-htm=firefox.desktop
application/x-extension-html=firefox.desktop
application/x-extension-shtml=firefox.desktop
application/x-extension-xht=firefox.desktop
application/x-extension-xhtml=firefox.desktop
application/x-xpinstall=firefox.desktop
application/xhtml+xml=firefox.desktop
application/xml=firefox.desktop
image/bmp=imv.desktop
image/gif=imv.desktop
image/heif=imv.desktop
image/jpeg=imv.desktop
image/png=imv.desktop
image/tiff=imv.desktop
image/vnd.zbrush.pcx=imv.desktop
image/x-portable-anymap=imv.desktop
image/x-portable-bitmap=imv.desktop
image/x-portable-graymap=imv.desktop
image/x-portable-pixmap=imv.desktop
image/x-tga=imv.desktop
image/x-xbitmap=imv.desktop
text/html=firefox.desktop
text/html=text.desktop
text/plain=text.desktop
text/tcl=text.desktop
text/x-c++hdr=text.desktop
text/x-c++src=text.desktop
text/x-chdr=text.desktop
text/x-csrc=text.desktop
text/x-google-video-pointer=text.desktop
text/x-java=text.desktop
text/x-makefile=text.desktop
text/x-moc=text.desktop
text/x-pascal=text.desktop
text/x-tex=text.desktop
x-scheme-handler/chrome=firefox.desktop
x-scheme-handler/http=firefox.desktop
x-scheme-handler/http=firefox.desktop
x-scheme-handler/https=firefox.desktop
x-scheme-handler/https=firefox.desktop
x-scheme-handler/terminal=kitty.desktop

View file

@ -0,0 +1,6 @@
cache=${XDG_CACHE_HOME}/npm
init.license=MIT
init.version=0.0.1
init-module=${XDG_CONFIG_HOME}/npm/config/npm-init.js
prefix=${XDG_DATA_HOME}/npm
store-dir=${XDG_DATA_HOME}/pnpm-store

View file

@ -0,0 +1,111 @@
{
"$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json",
"console_title_template": "{{if .Segments.Git.RepoName}} {{.Segments.Git.RepoName}} {{else}} {{.Folder}} {{end}}",
"blocks": [
{
"type": "prompt",
"alignment": "left",
"newline": true,
"segments": [
{
"type": "session",
"foreground": "#757575",
"properties": {
"display_host": true
},
"style": "plain",
"template": "\u250c {{ if .SSHSession }}\uf817 {{ end }}{{ .UserName }}@{{ .HostName }} "
},
{
"type": "path",
"background": "#91ddff",
"foreground": "#100e23",
"powerline_symbol": "\ue0b0",
"properties": {
"style": "agnoster_full"
},
"style": "powerline",
"template": " {{ .Path }} "
},
{
"type": "git",
"style": "powerline",
"powerline_symbol": "\ue0b0",
"foreground": "#100e23",
"background": "#95ffa4",
"background_templates": [
"{{ if or (.Working.Changed) (.Staging.Changed) }}#ff9248{{ end }}",
"{{ if and (gt .Ahead 0) (gt .Behind 0) }}#f26d50{{ end }}",
"{{ if gt .Ahead 0 }}#89d1dc{{ end }}",
"{{ if gt .Behind 0 }}#c5b6ad{{ end }}"
],
"template": " {{ .HEAD }}{{if .BranchStatus }} {{ .BranchStatus }}{{ end }}{{ if .Working.Changed }} {{ .Working.String }}{{ end }}{{ if and (.Working.Changed) (.Staging.Changed) }} \u2502{{ end }}{{ if .Staging.Changed }} {{ .Staging.String }}{{ end }}{{ if gt .StashCount 0 }} {{ .StashCount }}{{ end }} ",
"properties": {
"branch_ahead_icon": "\u2191",
"branch_behind_icon": "\u2193",
"branch_gone": "\u2262",
"branch_icon": "\ue0a0 ",
"branch_identical_icon": "\u2261",
"cherry_pick_icon": "\u2713 ",
"commit_icon": "\u25b7 ",
"fetch_stash_count": true,
"fetch_status": true,
"merge_icon": "\u25f4 ",
"no_commits_icon": "[no commits]",
"rebase_icon": "\u2c62 ",
"tag_icon": "\u25b6 ",
"untracked_modes": {
"/Users/user/Projects/oh-my-posh/": "no"
}
}
},
{
"type": "terraform",
"background": "#ffee58",
"foreground": "#100e23",
"powerline_symbol": "\ue0b0",
"style": "powerline",
"template": " {{ .WorkspaceName }}{{ if .Version }} {{ .Version }}{{ end }} "
},
{
"type": "exit",
"background": "#ff8080",
"foreground": "#ffffff",
"powerline_symbol": "\ue0b0",
"style": "powerline",
"template": " {{ if gt .Code 0 }}error{{ else }}\uf42e{{ end }} "
},
{
"type": "time",
"foreground": "#689f38",
"properties": {
"time_format": "15:04:05"
},
"style": "plain",
"template": " <#757575,>|</> {{ .CurrentDate | date .Format }}"
}
]
},
{
"type": "prompt",
"alignment": "left",
"newline": true,
"segments": [
{
"type": "text",
"foreground": "#757575",
"style": "plain",
"template": "\u2514"
},
{
"type": "text",
"foreground": "#ffffff",
"style": "plain",
"template": "$"
}
]
}
],
"final_space": true,
"version": 2
}

View file

@ -0,0 +1,126 @@
{
"$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json",
"blocks": [
{
"alignment": "left",
"segments": [
{
"background": "#2e9599",
"foreground": "#ffffff",
"leading_diamond": "\ue0b6",
"powerline_symbol": "\ue0b0",
"style": "diamond",
"template": "\uf91c {{ .HostName }} ",
"type": "session"
},
{
"background": "#D51111",
"foreground": "#ffffff",
"powerline_symbol": "\ue0b0",
"properties": {
"home_icon": "\uf46d",
"folder_separator_icon": " <transparent>\ue0b1</> ",
"folder_icon": "\uf115",
"style": "agnoster"
},
"style": "powerline",
"template": " {{ path .Path .Location }} ",
"type": "path"
},
{
"background": "#c19c00",
"background_templates": [
"{{ if or (.Working.Changed) (.Staging.Changed) }}#FFEB3B{{ end }}",
"{{ if and (gt .Ahead 0) (gt .Behind 0) }}#FFA300{{ end }}",
"{{ if gt .Ahead 0 }}#FF7070{{ end }}",
"{{ if gt .Behind 0 }}#90F090{{ end }}"
],
"foreground": "#000000",
"powerline_symbol": "\ue0b0",
"properties": {
"fetch_stash_count": true,
"fetch_status": true,
"fetch_upstream_icon": true
},
"style": "powerline",
"template": " \uf113 {{ .HEAD }}{{if .BranchStatus }} {{ .BranchStatus }}{{ end }}{{ if .Working.Changed }} \uf044 {{ .Working.String }}{{ end }}{{ if and (.Working.Changed) (.Staging.Changed) }} |{{ end }}{{ if .Staging.Changed }} \uf046 {{ .Staging.String }}{{ end }}{{ if gt .StashCount 0 }} \uf692 {{ .StashCount }}{{ end }} ",
"type": "git"
}
],
"type": "prompt"
},
{
"alignment": "right",
"segments": [
{
"background": "#303030",
"foreground": "#3C873A",
"leading_diamond": "\ue0b6",
"properties": {
"fetch_package_manager": true,
"npm_icon": " <#cc3a3a>\ue5fa</> ",
"yarn_icon": " <#348cba>\uf61a</>"
},
"style": "diamond",
"template": "\ue718 {{ if .PackageManagerIcon }}{{ .PackageManagerIcon }} {{ end }}{{ .Full }}",
"trailing_diamond": "\ue0b4 ",
"type": "node"
},
{
"background": "#306998",
"foreground": "#FFE873",
"leading_diamond": "\ue0b6",
"style": "diamond",
"template": "\ue235 {{ if .Error }}{{ .Error }}{{ else }}{{ if .Venv }}{{ .Venv }} {{ end }}{{ .Full }}{{ end }}",
"trailing_diamond": "\ue0b4 ",
"type": "python"
},
{
"background": "#ffffff",
"foreground": "#06aad5",
"leading_diamond": "\ue0b6",
"style": "diamond",
"template": "\ufcd1 {{ if .Error }}{{ .Error }}{{ else }}{{ .Full }}{{ end }}",
"trailing_diamond": "\ue0b4 ",
"type": "go"
},
{
"background": "#2e9599",
"foreground": "#fff",
"background_templates": [
"{{ if gt .Code 0 }}#D51111{{ end }}"
],
"leading_diamond": "\ue0b6",
"properties": {
"time_format": "_2, 15:04:05"
},
"style": "diamond",
"template": " \uf5ef {{ .CurrentDate | date .Format }} ",
"trailing_diamond": "\ue0b4",
"type": "time"
}
],
"type": "prompt"
},
{
"alignment": "left",
"newline": true,
"segments": [
{
"foreground": "#FFF",
"foreground_templates": [
"{{ if gt .Code 0 }}#D51111{{ end }}"
],
"style": "plain",
"template": " \uf0a4 ",
"type": "text"
}
],
"type": "prompt"
}
],
"console_title_template": "{{ .Folder }}",
"final_space": true,
"osc99": true,
"version": 2
}

188
.config/pgcli/config Normal file
View file

@ -0,0 +1,188 @@
# vi: ft=dosini
[main]
# Enables context sensitive auto-completion. If this is disabled the all
# possible completions will be listed.
smart_completion = True
# Display the completions in several columns. (More completions will be
# visible.)
wider_completion_menu = False
# Multi-line mode allows breaking up the sql statements into multiple lines. If
# this is set to True, then the end of the statements must have a semi-colon.
# If this is set to False then sql statements can't be split into multiple
# lines. End of line (return) is considered as the end of the statement.
multi_line = False
# If multi_line_mode is set to "psql", in multi-line mode, [Enter] will execute
# the current input if the input ends in a semicolon.
# If multi_line_mode is set to "safe", in multi-line mode, [Enter] will always
# insert a newline, and [Esc] [Enter] or [Alt]-[Enter] must be used to execute
# a command.
multi_line_mode = psql
# Destructive warning mode will alert you before executing a sql statement
# that may cause harm to the database such as "drop table", "drop database"
# or "shutdown".
destructive_warning = True
# Enables expand mode, which is similar to `\x` in psql.
expand = False
# Enables auto expand mode, which is similar to `\x auto` in psql.
auto_expand = False
# If set to True, table suggestions will include a table alias
generate_aliases = False
# log_file location.
# In Unix/Linux: ~/.config/pgcli/log
# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\log
# %USERPROFILE% is typically C:\Users\{username}
log_file = default
# keyword casing preference. Possible values "lower", "upper", "auto"
keyword_casing = auto
# casing_file location.
# In Unix/Linux: ~/.config/pgcli/casing
# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\casing
# %USERPROFILE% is typically C:\Users\{username}
casing_file = default
# If generate_casing_file is set to True and there is no file in the above
# location, one will be generated based on usage in SQL/PLPGSQL functions.
generate_casing_file = False
# Casing of column headers based on the casing_file described above
case_column_headers = True
# history_file location.
# In Unix/Linux: ~/.config/pgcli/history
# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\history
# %USERPROFILE% is typically C:\Users\{username}
history_file = default
# Default log level. Possible values: "CRITICAL", "ERROR", "WARNING", "INFO"
# and "DEBUG". "NONE" disables logging.
log_level = INFO
# Order of columns when expanding * to column list
# Possible values: "table_order" and "alphabetic"
asterisk_column_order = table_order
# Whether to qualify with table alias/name when suggesting columns
# Possible values: "always", never" and "if_more_than_one_table"
qualify_columns = if_more_than_one_table
# When no schema is entered, only suggest objects in search_path
search_path_filter = False
# Default pager.
# By default 'PAGER' environment variable is used
# pager = less -SRXF
# Timing of sql statments and table rendering.
timing = True
# Table format. Possible values: psql, plain, simple, grid, fancy_grid, pipe,
# ascii, double, github, orgtbl, rst, mediawiki, html, latex, latex_booktabs,
# textile, moinmoin, jira, vertical, tsv, csv.
# Recommended: psql, fancy_grid and grid.
table_format = psql
# Syntax Style. Possible values: manni, igor, xcode, vim, autumn, vs, rrt,
# native, perldoc, borland, tango, emacs, friendly, monokai, paraiso-dark,
# colorful, murphy, bw, pastie, paraiso-light, trac, default, fruity
syntax_style = default
# Keybindings:
# When Vi mode is enabled you can use modal editing features offered by Vi in the REPL.
# When Vi mode is disabled emacs keybindings such as Ctrl-A for home and Ctrl-E
# for end are available in the REPL.
vi = True
# Error handling
# When one of multiple SQL statements causes an error, choose to either
# continue executing the remaining statements, or stopping
# Possible values "STOP" or "RESUME"
on_error = STOP
# Set threshold for row limit. Use 0 to disable limiting.
row_limit = 1000
# Skip intro on startup and goodbye on exit
less_chatty = True
# Postgres prompt
# \t - Current date and time
# \u - Username
# \h - Short hostname of the server (up to first '.')
# \H - Hostname of the server
# \d - Database name
# \p - Database port
# \i - Postgres PID
# \# - "@" sign if logged in as superuser, '>' in other case
# \n - Newline
# \dsn_alias - name of dsn alias if -D option is used (empty otherwise)
# \x1b[...m - insert ANSI escape sequence
# eg: prompt = '\x1b[35m\u@\x1b[32m\h:\x1b[36m\d>'
prompt = '\u@\h:\d> '
# Number of lines to reserve for the suggestion menu
min_num_menu_lines = 4
# Character used to left pad multi-line queries to match the prompt size.
multiline_continuation_char = ''
# The string used in place of a null value.
null_string = '<null>'
# manage pager on startup
enable_pager = True
# Use keyring to automatically save and load password in a secure manner
keyring = False
# Custom colors for the completion menu, toolbar, etc.
[colors]
completion-menu.completion.current = 'bg:#ffffff #000000'
completion-menu.completion = 'bg:#008888 #ffffff'
completion-menu.meta.completion.current = 'bg:#44aaaa #000000'
completion-menu.meta.completion = 'bg:#448888 #ffffff'
completion-menu.multi-column-meta = 'bg:#aaffff #000000'
scrollbar.arrow = 'bg:#003333'
scrollbar = 'bg:#00aaaa'
selected = '#ffffff bg:#6666aa'
search = '#ffffff bg:#4444aa'
search.current = '#ffffff bg:#44aa44'
bottom-toolbar = 'bg:#222222 #aaaaaa'
bottom-toolbar.off = 'bg:#222222 #888888'
bottom-toolbar.on = 'bg:#222222 #ffffff'
search-toolbar = 'noinherit bold'
search-toolbar.text = 'nobold'
system-toolbar = 'noinherit bold'
arg-toolbar = 'noinherit bold'
arg-toolbar.text = 'nobold'
bottom-toolbar.transaction.valid = 'bg:#222222 #00ff5f bold'
bottom-toolbar.transaction.failed = 'bg:#222222 #ff005f bold'
# style classes for colored table output
output.header = "#00ff5f bold"
output.odd-row = ""
output.even-row = ""
# Named queries are queries you can execute by name.
[named queries]
# DSN to call by -D option
[alias_dsn]
# example_dsn = postgresql://[user[:password]@][netloc][:port][/dbname]
# Format for number representation
# for decimal "d" - 12345678, ",d" - 12,345,678
# for float "g" - 123456.78, ",g" - 123,456.78
[data_formats]
decimal = ""
float = ""

View file

@ -0,0 +1,24 @@
---
plasmoids:
- name: Application Title
link: https://store.kde.org/p/1199712/
- name: Command Output
link: https://store.kde.org/p/1166510/
- name: Compact Shutdown
link: https://store.kde.org/p/1483671
- name: Configurable Button
link: https://store.kde.org/p/1297839
- name: Event Calendar
link: https://store.kde.org/p/998901
- name: Netspeed Widget
link: https://store.kde.org/p/998895/
- name: Server Status
link: https://store.kde.org/p/1190292
- name: Plasma Configuration Saver
link: https://store.kde.org/p/1298955/
- name: Webslice
link: https://store.kde.org/p/998902
- name: Window Title
link: https://store.kde.org/p/1274218/
- name: Wunderground Extended
link: https://store.kde.org/p/1756638/

View file

@ -1,2 +1,2 @@
[Theme]
name=Betelgeuse
name=Betelgeuse

View file

@ -0,0 +1,29 @@
{{- if and (ne .user.CLOUDFLARE_ACCESS_KEY_ID "") (ne .user.CLOUDFLARE_SECRET_ACCESS_KEY "") (ne .user.CLOUDFLARE_R2_ACCOUNT_ID "") }}
#!/usr/bin/env bash
# Consider https://github.com/dustinsand/blockinfile
CONFIG_FILE="$HOME/.config/rclone/rclone.conf"
if cat "$CONFIG_FILE" | grep '# MEGABYTE LABS MANAGED r2-user'; then
# TODO: Remove old block
START_LINE="$(echo `grep -n -m 1 "# MEGABYTE LABS MANAGED r2-user" .zshrc | cut -f1 -d ":"`)"
END_LINE="$(echo `grep -n -m 1 "# MEGABYTE LABS MANAGED r2-user" .zshrc | cut -f1 -d ":"`)"
if command -v gsed > /dev/null; then
gsed -i "$START_LINE,$END_LINEd" "$CONFIG_FILE"
else
sed -i "$START_LINE,$END_LINEd" "$CONFIG_FILE"
fi
fi
tee -a "$CONFIG_FILE" > /dev/null <<EOT
# MEGABYTE LABS MANAGED r2-user
[r2-user]
type = s3
provider = Cloudflare
access_key_id = {{ .user.CLOUDFLARE_ACCESS_KEY_ID }}
secret_access_key = {{ .user.CLOUDFLARE_SECRET_ACCESS_KEY }}
region = auto
endpoint = https://{{ .user.CLOUDFLARE_R2_ACCOUNT_ID }}.r2.cloudflarestorage.com
acl = private
# MEGABYTE LABS MANAGED r2-user
EOT
{{- end }}

46
.config/readline/inputrc Normal file
View file

@ -0,0 +1,46 @@
## SMARTER TAB-COMPLETION (Readline bindings) ##
# Perform file completion in a case insensitive fashion
set completion-ignore-case on
# Treat hyphens and underscores as equivalent
set completion-map-case on
# Display matches for ambiguous patterns at first tab press
set show-all-if-ambiguous on
# Immediately add a trailing slash when autocompleting symlinks to directories
set mark-symlinked-directories on
# Use the text that has already been typed as the prefix for searching through
# commands (basically more intelligent Up/Down behavior)
"\e[A": history-search-backward
"\e[B": history-search-forward
# Do not autocomplete hidden files unless the pattern explicitly begins with a dot
set match-hidden-files off
# Show all autocomplete results at once
set page-completions off
# If there are more than 200 possible completions for a word, ask to show them all
set completion-query-items 200
# Show extra file information when completing, like `ls -F` does
set visible-stats on
# Be more intelligent when autocompleting by also looking at the text after
# the cursor. For example, when the current line is "cd ~/src/mozil", and
# the cursor is on the "z", pressing Tab will not autocomplete it to "cd
# ~/src/mozillail", but to "cd ~/src/mozilla". (This is supported by the
# Readline used by Bash 4.)
set skip-completed-text on
# Allow UTF-8 input and output, instead of showing stuff like $'\0123\0456'
set input-meta on
set output-meta on
set convert-meta off
# Use Alt/Meta + Delete to delete the preceding word
"\e[3;3~": kill-word

21
.config/ripgrep/config Normal file
View file

@ -0,0 +1,21 @@
# Don't let ripgrep vomit really long lines to my terminal, and show a preview.
--max-columns=150
--max-columns-preview
# Add my 'web' type.
--type-add
web:*.{html,css,js}*
# Using glob patterns to include/exclude files or folders
--glob=!git/*
# or
--glob
!git/*
# Set the colors.
--colors=line:none
--colors=line:style:bold
# Because who cares about case!?
--smart-case

25
.config/shell/.private Normal file
View file

@ -0,0 +1,25 @@
#!/usr/bin/env bash
export LEXICON_CLOUDFLARE_USERNAME={{ .user.CLOUDFLARE_USERNAME }}
export ANSIBLE_GALAXY_TOKEN=""
export ANSIBLE_VAULT_PASSWORD=""
export CLOUDSDK_CORE_PROJECT={{ .user.CLOUDSDK_CORE_PROJECT }}
export GCE_SERVICE_ACCOUNT_EMAIL={{ .user.GCE_SERVICE_ACCOUNT_EMAIL }}
export GCE_CREDENTIALS_FILE={{ .user.GCE_CREDENTIALS_FILE }}
export DOCKERHUB_TOKEN=""
export DOCKERHUB_REGISTRY_PASSWORD="$DOCKERHUB_TOKEN"
export GH_TOKEN=""
export GITHUB_TOKEN="$GH_TOKEN"
export GL_TOKEN=""
export GITLAB_TOKEN="$GL_TOKEN"
export HEROKU_API_KEY=""
export LEXICON_CLOUDFLARE_TOKEN=""
export NPM_TOKEN=""
export PYPI_TOKEN=""
export SNAPCRAFT_EMAIL={{ .user.SNAPCRAFT_EMAIL }}
export SNAPCRAFT_MACAROON=""
export SNAPCRAFT_UNBOUND_DISCHARGE=""
export VAGRANT_CLOUD_TOKEN=""
export FULLY_AUTOMATED_TASKS=true

138
.config/shell/functions Normal file
View file

@ -0,0 +1,138 @@
# Install WebDriverAgent on iOS device
appiumwebdriver() {
# read -r "Enter the UDID of the device you wish to install WebDriverAgent on: " UDID_INPUT
mkdir -p Resources/WebDriverAgent.bundle
bash ./Scripts/bootstrap.sh -d
cd /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent || return
xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=${UDID_INPUT}" test
}
asdf-update () {
asdf update > /dev/null 2>&1
asdf plugin update --all > /dev/null 2>&1
diff <(cat ~/.tool-versions | awk '{print $1}' | xargs -I {} bash -c 'echo {} $(asdf latest {})') <(cat ~/.tool-versions)
}
# Change directories and view contents at the same time
cl() {
DIR="$*"
# if no DIR given, go home
if [ $# -lt 1 ]; then
DIR=$HOME
fi
builtin cd "${DIR}" &&
# use your preferred ls command
ls -F --color=auto
}
# Safer cp with progress bar and backup to /tmp
cpv() {
rsync -pogbr -hhh --backup-dir="/tmp/rsync-${USERNAME}" -e /dev/null --progress "$@"
}
# Checks status of a website on downforeveryoneorjustme.com
down4me() {
curl -s "http://www.downforeveryoneorjustme.com/$1" | sed '/just you/!d;s/<[^>]*>//g'
}
# Easier version of find command
find() {
if [ $# = 1 ]; then
# shellcheck disable=SC2145
command find . -iname "*$@*"
else
command find "$@"
fi
}
# Opens current repository in browser
gitopen() {
git remote -v | head -n 1 | awk -F "@" '{print $2}' | awk -F " " '{print $1}' | sed 's/:/\//g' | sed 's/.git//g' | awk '{print "http://"$1}' | xargs open
}
# Open Mac OS X desktop on a Linux machine
macosx() {
docker run -it --device /dev/kvm -p 50922:10022 -v /tmp/.X11-unix:/tmp/.X11-unix -e "DISPLAY=${DISPLAY:-:0.0}" sickcodes/docker-osx:big-sur
}
# Generate a random string of X length
randomstring() {
if [ -z "$1" ]; then
head /dev/urandom | tr -dc A-Za-z0-9 | head -c "$1"
else
echo "Pass the number of characters you would like the string to be. Example: randomstring 14"
fi
}
# Reset Docker to factory settings
resetdocker() {
set +e
CONTAINER_COUNT="$(docker ps -a -q | wc -l)"
if [ "$CONTAINER_COUNT" -gt 0 ]; then
docker stop "$(docker ps -a -q)"
docker rm "$(docker ps -a -q)"
fi
VOLUME_COUNT="$(docker volume ls -q | wc -l)"
if [ "$VOLUME_COUNT" -gt 0 ]; then
docker volume rm "$(docker volume ls -q)"
fi
NETWORK_COUNT="$(docker network ls -q | wc -l)"
if [ "$NETWORK_COUNT" -gt 0 ]; then
docker network rm "$(docker network ls -q)"
fi
docker system prune -a --force
}
# ripgrep-all
rgafzf() {
RG_PREFIX="rga --files-with-matches"
local file
file="$(
FZF_DEFAULT_COMMAND="$RG_PREFIX '$1'" \
fzf --sort --preview="[[ ! -z {} ]] && rga --pretty --context 5 {q} {}" \
--phony -q "$1" \
--bind "change:reload:$RG_PREFIX {q}" \
--preview-window="70%:wrap"
)" &&
echo "opening $file" &&
xdg-open "$file"
}
# Easy file sharing from the command line, using transfer.sh
transfer() {
if [ $# -eq 0 ]; then
echo -e "No arguments specified.\nUsage:\n transfer <file|directory>\n ... | transfer <file_name>" >&2
return 1
fi
if tty -s; then
file="$1"
file_name=$(basename "$file")
if [ ! -e "$file" ]; then
echo "$file: No such file or directory" >&2
return 1
fi
if [ -d "$file" ]; then
file_name="$file_name.zip"
(cd "$file" && zip -r -q - .) | curl --progress-bar --upload-file "-" "https://transfer.sh/$file_name" | tee /dev/null,
else
curl --progress-bar --upload-file "-" "https://transfer.sh/$file_name" <"$file" | tee /dev/null
fi
else
file_name=$1
curl --progress-bar --upload-file "-" "https://transfer.sh/$file_name" | tee /dev/null
fi
}
update-all() {
brew update
brew upgrade
brew upgrade --cask --greedy
brew cleanup --prune=1
asdf update || true
asdf plugin-update --all
rustup self update || true
rustup update || true
npm update -g || true
chezmoi upgrade
z4h update
}

25
.config/shell/motd Normal file
View file

@ -0,0 +1,25 @@
### MOTD
# Add file named .hushlogin in the user's home directory to disable the MOTD
if [ "$BASH_SUPPORT" = 'true' ] && [ ! -f ~/.hushlogin ] && [ "$SHLVL" -eq 1 ]; then
if [ -f "$HOME/.local/scripts/motd.bash" ] && { [ -n "$SSH_CONNECTION" ] && [[ $- == *i* ]]; } || command -v qubes-vmexec > /dev/null || command -v qubes-dom0-update > /dev/null || { [ -d /Applications ] && [ -d /System ]; }; then
if { [ -z "$MOTD" ] || [ "$MOTD" -ne 0 ]; } && [[ "$(hostname)" != *'-minimal' ]]; then
. "$HOME/.local/scripts/motd.bash"
# TODO - -- services
if [ -n "$SSH_CONNECTION" ]; then
# SSH
bash_motd --banner --processor --memory --diskspace --docker --updates --letsencrypt --login
elif command -v qubes-vmexec > /dev/null; then
# Qubes AppVM
bash_motd --banner --memory --diskspace --docker --updates
elif command -v qubes-dom0-update > /dev/null; then
# Qubes dom0
bash_motd --banner --updates
elif [ -d /Applications ] && [ -d /System ]; then
# macOS
bash_motd --banner
else
bash_motd --banner --processor --memory --diskspace --docker --updates --letsencrypt --login
fi
fi
fi
fi

149
.config/shell/profile Normal file
View file

@ -0,0 +1,149 @@
# shellcheck disable=SC1090,SC1091
# Aliases / Functions / Exports
export XDG_CONFIG_HOME="$HOME/.config"
if [ -f "$XDG_CONFIG_HOME/shell/exports" ]; then
. "$XDG_CONFIG_HOME/shell/exports"
fi
if [ -f "$XDG_CONFIG_HOME/shell/aliases" ]; then
. "$XDG_CONFIG_HOME/shell/aliases"
fi
if [ -f "$XDG_CONFIG_HOME/shell/functions" ]; then
. "$XDG_CONFIG_HOME/shell/functions"
fi
### Colorize
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias diff='diff --color=auto'
alias ip='ip --color=auto'
alias pacman='pacman --color=auto'
### Aliases (better defaults for simple commands)
alias cp='cp -v'
alias rm='rm -I'
alias mv='mv -iv'
alias ln='ln -sriv'
alias xclip='xclip -selection c'
command -v vim > /dev/null && alias vi='vim'
### TOP - order based on preference of "top" application (last item will always be chosen if installed, e.g. glances)
command -v htop > /dev/null && alias top='htop'
command -v gotop > /dev/null && alias top='gotop -p $([ "$COLOR_SCHEME" = "light" ] && echo "-c default-dark")'
command -v ytop > /dev/null && alias top='ytop -p $([ "$COLOR_SCHEME" = "light" ] && echo "-c default-dark")'
command -v btm > /dev/null && alias top='btm $([ "$COLOR_SCHEME" = "light" ] && echo "--color default-light")'
# themes for light/dark color-schemes inside ~/.config/bashtop; Press ESC to open the menu and change the theme
command -v bashtop > /dev/null && alias top='bashtop'
command -v bpytop > /dev/null && alias top='bpytop'
command -v glances > /dev/null && alias top='glances'
### Bash / ZSH
if [ "$BASH_SUPPORT" = 'true' ]; then
### OS Detection
if [ -f /etc/os-release ]; then
. /etc/os-release
if [ "$ID" = 'alpine' ]; then
OS_ICON=""
elif [ "$ID" = 'arch' ]; then
OS_ICON=""
elif [ "$ID" = 'centos' ]; then
OS_ICON=""
elif [ "$ID" = 'coreos' ]; then
OS_ICON=""
elif [ "$ID" = 'debian' ]; then
OS_ICON=""
elif [ "$ID" = 'deepin' ]; then
OS_ICON=""
elif [ "$ID" = 'elementary' ]; then
OS_ICON=""
elif [ "$ID" = 'endeavour' ]; then
OS_ICON=""
elif [ "$ID" = 'freebsd' ]; then
OS_ICON=""
elif [ "$ID" = 'gentoo' ]; then
OS_ICON=""
elif [ "$ID" = 'kali' ]; then
OS_ICON=""
elif [ "$ID" = 'linuxmint' ]; then
OS_ICON=""
elif [ "$ID" = 'manjaro' ]; then
OS_ICON=""
elif [ "$ID" = 'nixos' ]; then
OS_ICON=""
elif [ "$ID" = 'openbsd' ]; then
OS_ICON=""
elif [ "$ID" = 'opensuse' ]; then
OS_ICON=""
elif [ "$ID" = 'parrot' ]; then
OS_ICON=""
elif [ "$ID" = 'pop_os' ]; then
OS_ICON=""
elif [ "$ID" = 'raspberry_pi' ]; then
OS_ICON=""
elif [ "$ID" = 'redhat' ]; then
OS_ICON=""
elif [ "$ID" = 'fedora' ]; then
OS_ICON=""
elif [ "$ID" = 'ubuntu' ]; then
OS_ICON=""
else
OS_ICON=""
fi
else
if [ -d /Applications ] && [ -d /Library ] && [ -d /System ]; then
# macOS
OS_ICON=""
else
OS_ICON=""
fi
fi
### ASDF
if [ -f "$ASDF_DIR/asdf.sh" ]; then
. "$ASDF_DIR/asdf.sh"
fi
### Directory Colors
if [ -f "$XDG_CONFIG_HOME/shell/lscolors.sh" ]; then
. "$XDG_CONFIG_HOME/shell/lscolors.sh"
fi
### fzf-git
if [ -f "$HOME/.local/scripts/fzf-git.bash" ]; then
. "$HOME/.local/scripts/fzf-git.bash"
fi
### MOTD
if [ -f "$XDG_CONFIG_HOME/shell/motd" ]; then
. "$XDG_CONFIG_HOME/shell/motd"
fi
fi
### Cargo
if [ -f "$CARGO_HOME/env" ]; then
. "$CARGO_HOME/env"
fi
### Docker Functions / Aliases
if [ -f "$HOME/.local/scripts/docker-functions.bash" ]; then
. "$HOME/.local/scripts/docker-functions.bash"
fi
### fzf-tmux
if [ -f "$HOME/.local/scripts/fzf-tmux.bash" ]; then
. "$HOME/.local/scripts/fzf-tmux.bash"
fi
### SDKMan
if command -v brew > /dev/null && command -v sdkman-cli > /dev/null; then
export SDKMAN_DIR="$(brew --prefix sdkman-cli)/libexec"
. "$SDKMAN_DIR/bin/sdkman-init.sh"
elif [ -f "$SDKMAN_DIR/bin/sdkman-init.sh" ]; then
export SDKMAN_DIR="$XDG_DATA_HOME/sdkman"
. "$SDKMAN_DIR/bin/sdkman-init.sh"
fi
### VIM
export GVIMINIT='let $MYGVIMRC="$XDG_CONFIG_HOME/vim/gvimrc" | source $MYGVIMRC'
export VIMINIT='let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | source $MYVIMRC'

38
.config/wget/wgetrc Normal file
View file

@ -0,0 +1,38 @@
# Use the server-provided last modification date, if available
timestamping = on
# Do not go up in the directory structure when downloading recursively
no_parent = on
# Wait 60 seconds before timing out. This applies to all timeouts: DNS, connect and read. (The default read timeout is 15 minutes!)
timeout = 60
# Retry a few times when a download fails, but dont overdo it. (The default is 20!)
tries = 3
# Retry even when the connection was refused
retry_connrefused = on
# Use the last component of a redirection URL for the local file name
trust_server_names = on
# Follow FTP links from HTML documents by default
follow_ftp = on
# Add a `.html` extension to `text/html` or `application/xhtml+xml` files that lack one, or a `.css` extension to `text/css` files that lack one
adjust_extension = on
# Use UTF-8 as the default system encoding
# Disabled as it makes `wget` builds that dont support this feature unusable.
# Does anyone know how to conditionally configure a wget setting?
# http://unix.stackexchange.com/q/34730/6040
#local_encoding = UTF-8
# Ignore `robots.txt` and `<meta name=robots content=nofollow>`
robots = off
# Print the HTTP and FTP server responses
server_response = on
# Disguise as IE 9 on Windows 7
user_agent = Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)

View file

@ -0,0 +1,6 @@
# saner output
-o %(title)s.%(ext)s
# Aira2c
--external-downloader aria2c
--external-downloader-args '-c -j 6 -x 6 -s 6 -k 1M'

View file

View file

@ -0,0 +1,85 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBFdt07cBEADGBsfWMKLODNkW8ro4ltREGK7KVgI1ETvgc1inGa79lW33F5/z
cP8vwVTwn1ntb6hFvQPDkrU2ewy0pYyXahSRPKsGn8ldKzjA5O/iACkpLdEgl8//
3xw5XUKF16KO16w/OdcfR+6bxveMN4tr5yxEFSkpoviLzJdCcOfduaLlKijGsDhW
Ay36UWrbNiV5HsplM3hQy6CTjYe1/1psvf0B1QM7OXJMKgGtY6BSDoZ8etnhVYHy
/yGSDuof2cx9WTX3hnkX9db1YucSwUHq2BVqpjv5osUilEjMNPcMybpxv4UHZ25k
kh73QEqrwMhodFvwBW6M3h5nG7YbgBFPMMftVJExpbvwoKxFVclY0u+oGCxvxE2f
X5vA418ehF8ILN8NJA5DVv38bVN7SG1w7PUcpXuG1GL3SP7gDqdEJ2MOqIqSokAw
uMtDo3pRBkrVjbIxiJ1z37fVcl17ZI6s/Fg3IEd61VAgwObD5mOEmkJt1m8tsqGx
iVdr16yR7LfdBXZplCDBYzRcWlslSbSwG7878bLJoc05eXxgr8jq3nlRYbCjXgHM
FnfDVLbeyyfyGNqA5AMlQB9o5Iv12iHFuN9z15Ie6d2ds59Cw5d5SOyya9vLUIfD
W+V5ypCW/4sf1w8KQhPUu49OLwgcyeXPismEpSj3XIPF0LUFFrfAbPHlMQARAQAB
tDl1bm1hbiAoUXViZXMgT1Mgc2lnbmluZyBrZXkpIDx1bm1hbkB0aGlyZGV5ZXNl
Y3VyaXR5Lm9yZz6JAjcEEwEIACECGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AF
Ald0ZXgACgkQiz8w+cjAwu/cmw/+LLkkSf0QfiSiKhqWQiXFRYngKxAAaiLZV3kc
LCQsZeg7eS8GZYJx19vplBhpGarPGw0REZrvPMfZBcK1YKM7Dt7VfUv49Cd3jPb0
7W6pMfOOcuQO1UV1mqskziWvW1ooikc/HUJA2kIoTzxr0McFySPdoKtH8MsoEecK
fMqYIjNp31w6JEsQRVzNVmaVrEj8+w1e6miVNpKvokMSNF/x44tpt/Y2C4g1Gxw6
lPZYunJsTJK69taJbVDVCRvwwhJwHwbIqJWNIpoVDOpZjOvQlz0GPjTiBrA15AtG
eU6NmMJ5qc9Sw/l3gTfh5SCANo5Q/7s+CX5xFpeGwJx6YDpjZCvR78SGi5cjetmT
iWC1coGxjSSoqJb4T1Kbv/ErJellN1MO6+zmioCgx84qJjU3SuqNKdmc3hWRlbCS
CrwKcVZnjLRmlI7XygndpPB9hM/GB9Wn5+/5j0IFmeCECUtzEmod2l+vTUeutReb
uR+/1FD/p7NL8VfA/tq4d6GTSr6vYSYIL89PpO8Sh5G5PsahjATkv/yUJDmtT+14
nkV+HmQfvT9xrV9tvKbLWcv1RTQf+j3Lk2fXyjxbLsDXIBB2/FfZEFE9E/2uA+Zm
y/o5wkG+xe4Vlx4eRoEM7SLJoXUxkVVAi26sAmYYAh+LkvcAy1IzYaTkS2hU+3Rm
iemoD4e5Ag0EV23TtwEQAMNa9zUDTt9bT2nja+isou+9DJZZQVl46Lx2My780FVo
WWyFjd6vX04TlybLhlD3njg4PQAo7xQ909BRSqKxCkdbwoJfHYNC1FIfOdV+9caw
yaIl5xBc/B7D0+2NdzRc73W0stikNdnkS1lL4rD1TjsUMh/8roiUzNwcU8tIuluw
2U+jiqbPJ2QLL3Sp4uIcsGb4j7Kf9zUtPVw9JuUscBFkRNFr4U8EWjM4zXBm1jFR
CGZ/EI6b2I8W5TjK2RmJXR1gwr8f6gSJqiirjKAqxq4kc7puOFlkRXAknu597aT1
eNBpQPqMX0K9S/vnPSUqjWYLZQ4+YjXYZTpg18tkoxGyDn3jGuFlv+NncL2v3SKM
ejmN4Tyb+184GqcDZ5T91XWXjV2Fz7UgFtoqLPtRG5EQPAMlEottKHNaOgEsdxy8
Cf8G1E58BVpVtPGY1qdYD55AjOaBGrdYDzW2iWWcaRr8nMJp6ur9hzrIubYSwRvJ
KHH5k7/e+MLJooZkJF7IQwvbzQk7Jgp3DcK4ALXHJdprNHl1BOB+L5vzCXAL+544
wwMgptCjEurLC1q4K3Cg3u36EVRTqkmUATdyhl24coHvC8kwHUQMQOUTQEi06TZO
bLeg2QMPkMG5Ub3Bu+7Aly7UQApYK7SLmamzw9foG4hKrQ3N4YG53oUKORgxyt9l
ABEBAAGJAh8EGAEIAAkFAldt07cCGwwACgkQiz8w+cjAwu8FOw/+LHybBicGuQlv
kRIIABa9Yz/GoL3w7GzExzbndWWw9wgY40ZwlfCugODHeRZEvSi/Yq+PV3UTJWJm
vxh3N4YpcQE1W6aBaT3ILT06HNQgufc3CFs9ePQZzRTIo4C13FphV+4AhgTnyAKc
uRNwdb/QGwf1sUELg92PuBEtb9tq1XnRdsnpncHQuj6+zOvNceXPxqHtw4DcNzZ3
Cz2rnsAjKUd4Se/h53MZChwkp14897XIbATbTGuN6i9Dftezw3kuYvpm3h1QnXAN
KHQzr8YW5p2SHTnxHYu8hX+BqKyBoldhVWcCKVrhDQH6SrZi4B22/mzOsQKFfCfp
dJUAhPvFvq0mEajf+Rxo9/wcq3vEGPnnJzV8exERCfjW9cDi/+7BvbnpIdikZJhL
XGq8/NXi8K+2VwLUW5HzuSVXSe73quWV9OXMpNnh0GiGsR5DT8BQgV8LTO59CXfY
4ZYWIdP5ClH1fYehc/I/8ZCM/QV8Gtot/EWxTy3dxCBSP2Z4IdaZqH5aCUip906L
Wtjodp9YCt/f9pyKjuA1hoKaHIaf8L8M2qDFE5OoLDcrAh9m+QrVQRmtFHaMFcej
85SLnQw83PUsMBH0mdDUYiNaRnWiQs1/I1iJKOt6p0/2jNHx7CaxoEoXqznu9o/X
bcr+2Sg6D6+XamPTmG687Ow7101hdp25Ag0EV3BtIwEQAL3DM3RBLdxEe3PK8sK0
PjZPrCeB/aflFoQxAKMOweYcP72ipuCfuKa3Zxxd6o2OfiuO5w9JPn5s92vCbL8f
ZpBJ7SAF5TNOGESBUI18lGVBIb/PCz2kN1qkTPDIKnxoDKW0AEna12LgzhTQBPTh
XX37bx3UlH5uMRZUYF+wl/wfD1UaFaY7EwObNQL9WQzMV7AkhIoA8XKyK2cNsOL5
S87eLpWwffjaE8oZKcYNIPq0x6DuiOuAPLnc7eUDqogjo0suN10uGnvaOvlWIwly
8/8XRwKPHOVlDHU4kEtMnbfbPXNaFrABrF/ApeaOxg1JSSHOPdzqI5ifscAYYXr5
xREn5Hh+Se7o1I8zXyHXPd/RTulFykbdmat9w0kVLgor4ahfQeoCj0PwbANlrk1t
burh2r16CzeR30sNAcuJqKLKwmjfdjPPBwCqLZbIQIDtpJ/4tSx8l1TWJ04JSQeQ
qJZkUpqnOMJup8Baktzbznpy9ac30aHpWL95VXI7hCGa0kbhi7yeDFbLJuMhIli8
z5aDRKbT18M3bgoOMWgkFKxi2JMDRbchdsu5bS4GjUnovkq5HxqFI6SRh1TEflqB
GiGaBPmCT3d9OTZeyK1y/j7N2dh/3d9Z6dmYs+ppG3749kg0rYpdl3kqHUxlNABu
JKcaPQdNJuDnnPMc+6b0Z8pjABEBAAGJBFsEGAEIACYCGwIWIQRLH0AN8lZRtTxB
QbOLPzD5yMDC7wUCYrCMvAUJDxEHGQIpwV0gBBkBCAAGBQJXcG0jAAoJEP3RuCRH
MbNs6CwP/AnUBcsrvYLskStJ7c75vsM1IUQ60gYd8HR2kLAlaG5kkdMVrH7J2lkD
ZYMoT0ZBV2jpMTe6DpSl6+51t0VCrxYjRAt0xCkchNtFrWmbFlbzX8SjdLxuQboH
171vYboVS580mK2SNnExif57mga0sfMc9nPOpzwzqlt2h0q4wbOANPUv7Hz0Vb8I
awWoppR8ztif2zj4NxzFAbw4LloxFlllinbqtTatFn962naz86owCalopxqqJt+f
Gw4aFFwL7Q0vAJoBO94WooEQ4a5YfiICF02RszOm/LkI/uMGlekhRXek97BKWD5f
v7KjCLYexFF2Vnzjr2nzi7gWvO0bVlFeVGY6NfT+2Pv+NFapeDLOJe1488eeXpF5
T0iBERh42f3PwGPMaLCvmgCps6u4h5YBiohpsjuYv5mYok9CwEquOPKG86iBfPtL
kcXf4I3rkjwYteed2WyCTnpQRuHMzeI19WOs/bFuNPCXiRVVAn1KB/mHQKIxZKut
cEZMgAtD//ruhTTvsUBSloDSb/3efm2cZHrix6TjrePbji5nFq7FMClP2Ro1u0wA
ZURkhzDKEkXC94RhUXO0HukUQwFzNRXyVVV8jmTGGiuqO8Q3cijmFO054tDxiLD6
V5BRnxyQOeQdyxNI8rFEIF4HQn/I28HAl/KDXWcRSMUG2jD5jIGNCRCLPzD5yMDC
7x0DD/9Umr0Rc9Un9koCQgmhj97WOjZhuKOVPxyGzwyjMYs0ii3pSNYYxUQ7mO6X
sycDs0YwstUZ0GtanF6ebOHZF1vQwp3RY9zGuBV3gLGo5A6FWcCbWjh6409hKe3J
tSiIEOOeEV/wcc2BiGfj2DWOi/063gzBfrwRmbCao5/Saw+yhfe7BmTneoYjzHbN
Ttd+xhDT0ybTMvvMHkR7Aazy7zfl1OdQhfi+T2NWRZdsKWV12pQo8DTeTIUQUKp6
pmbMazYx5uV6HlCo4Mx+A0z3IBodln/QoE2Glphqn1vGkJWmEA0g2gcMRafzZ5xE
Y5WHiB4fhJ2kM/xjj/XBUpBSX2R13kvc6aYBTXKCny6CUmFyLpgpPh8udQLazbAs
uwTdSNVkqgJsV/Mf9onMvMvAuBZME9EyzTK85O0HUZVj1NYNINsdYiFh1qHrdAN0
RGJkkOKfrYtl/3ER+MI6PeHuaj8akQEmmyvs65tq38VBBnYjIpCbmqVJAJ/fKwuI
aBoCTnTKDuMumLVTxZOlnUXJ/uBvd/SEXd5TuOdDiw/zbtR0XaLLMhmlQwX7XFiW
PRmrTsEr8wluewET8fekxMosM8cMwn43agCc1IjfB6pGP1CyCoN6T3EnNcu8UxoY
CjpmiHZg3mKwE2cDs5WvAt+3Oxww1IiIAKUm2/siNZeshUpBmw==
=qJcP
-----END PGP PUBLIC KEY BLOCK-----

10
.local/Taskfile-local.yml Normal file
View file

@ -0,0 +1,10 @@
---
version: '3'
# This is your local Taskfile.yml file. You can define tasks and scripts while leveraging some of the nifty
# features of https://taskfile.dev. You can safely place your scripts here and they will be combined with
# a veteran stack of Taskfile.yml files. You can access the tasks defined here by running
# `run local:default` for example. You must keep all the tasks in this file without including other files
# because the main Taskfile.yml is a symlinked one. Anyway, try `run local:default`.
tasks:
default: echo "Get started on https://taskfile.dev"

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>name</key>
<string>Betelgeuse</string>
<key>type</key>
<string>Window Settings</string>
<key>BackgroundColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjA4NjI3NDUwOTggMC4wOTgwMzkyMTU3IDAuMTQ1MDk4MDM5MgAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>TextColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjY2NjY2NjY2NjcgMC42ODIzNTI5NDEyIDAuNzIxNTY4NjI3NQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>BoldTextColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc2NDcwNTg4MjQgMC43ODAzOTIxNTY5IDAuODE5NjA3ODQzMQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>CursorColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc2NDcwNTg4MjQgMC43ODAzOTIxNTY5IDAuODE5NjA3ODQzMQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>SelectionColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc4MDM5MjE1NjkgMC4zMDE5NjA3ODQzIDAuNTM3MjU0OTAyMAAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIBlackColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjA4NjI3NDUwOTggMC4wOTgwMzkyMTU3IDAuMTQ1MDk4MDM5MgAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIRedColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjkyOTQxMTc2NDcgMC4xNDUwOTgwMzkyIDAuMzA1ODgyMzUyOQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIGreenColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjQ0MzEzNzI1NDkgMC45Njg2Mjc0NTEwIDAuNjIzNTI5NDExOAAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIYellowColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjk3NjQ3MDU4ODIgMC44NjI3NDUwOTgwIDAuMzYwNzg0MzEzNwAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIBlueColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjQ4NjI3NDUwOTggMC43MTc2NDcwNTg4IDEuMDAwMDAwMDAwMAAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIMagentaColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc4MDM5MjE1NjkgMC4zMDE5NjA3ODQzIDAuNTM3MjU0OTAyMAAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSICyanColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjAwMDAwMDAwMDAgMC43NTY4NjI3NDUxIDAuODk0MTE3NjQ3MQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIWhiteColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjY2NjY2NjY2NjcgMC42ODIzNTI5NDEyIDAuNzIxNTY4NjI3NQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIBrightBlackColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjE4NDMxMzcyNTUgMC4xOTYwNzg0MzE0IDAuMjQzMTM3MjU0OQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIBrightRedColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjg5MDE5NjA3ODQgMC4zMDU4ODIzNTI5IDAuNDM1Mjk0MTE3NgAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIBrightGreenColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjUyNTQ5MDE5NjEgMC45MjE1Njg2Mjc1IDAuNjc0NTA5ODAzOQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIBrightYellowColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjkyNTQ5MDE5NjEgMC44NDMxMzcyNTQ5IDAuNDc0NTA5ODAzOQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIBrightBlueColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjU1Njg2Mjc0NTEgMC43MzMzMzMzMzMzIDAuOTU2ODYyNzQ1MQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIBrightMagentaColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc3NjQ3MDU4ODIgMC40MjM1Mjk0MTE4IDAuNjA3ODQzMTM3MwAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIBrightCyanColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjE5MjE1Njg2MjcgMC43NjQ3MDU4ODI0IDAuODc0NTA5ODAzOQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>ANSIBrightWhiteColor</key>
<data>YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc2NDcwNTg4MjQgMC43ODAzOTIxNTY5IDAuODE5NjA3ODQzMQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA2Q==</data>
<key>Font</key>
<data>YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGkCwwVFlUkbnVsbNQNDg8QERITFFZOU1NpemVYTlNmRmxhZ3NWTlNOYW1lViRjbGFzcyNAJgAAAAAAABAQgAKAA18QGUhhY2tOZXJkRm9udENvbXBsZXRlLUJvbGTSFxgZGlokY2xhc3NuYW1lWCRjbGFzc2VzVk5TRm9udKIZG1hOU09iamVjdAgRGiQpMjdJTFFTWF5nbnd+hY6QkpSwtcDJ0NMAAAAAAAABAQAAAAAAAAAcAAAAAAAAAAAAAAAAAAAA3A==</data>
</dict>
</plist>

25
.local/bin/bwc Normal file
View file

@ -0,0 +1,25 @@
#!/bin/sh
# Exit on error
set -e
# Command to copy to clipboard
COPY="wl-copy"
# Get list of all logins as json
logins="$(bw list items)"
# Grab the name of every login and pip them into fzf
name="$(echo "$logins" | jq -r '.[].name' | fzf)"
# Find the login with the selected name (as a json)
selected="$(echo "$logins" | jq -r ".[] | select(.name == \"$name\")")"
# Print the name of the selected login
echo "Name: $(echo "$selected" | jq -r '.name')"
echo "> Copying Username"
# Copy the username to the clipboard
printf '%s' "$(echo "$selected" | jq -r '.login.username')" | $COPY
echo "Press any key to copy password..."
# Wait for user input before coping the password
read -r
echo "> Copying Password"
# Copy the password to the clipboard
printf '%s' "$(echo "$selected" | jq -r '.login.password')" | $COPY

View file

@ -1,348 +1 @@
#!/usr/bin/env bash
#
# This script will spawn a new Chrome process restricted to a profile that
# is created on demand and (optionally) deleted on exit. If a root profile
# directory is given, it will be used as the template for the newly created
# profile.
#
# NOTES:
#
# Chrome spawning takes place irrespective of any currently running Chrome
# processes. The script will always spawn a new Chrome process.
#
# If a root profile directory is not configured/passed-in as an argument, the
# created profile will be a fresh, first-time profile that does not contain
# any configuration data or extensions that may be present in a different
# profile for the same installed Chrome browser.
#
# To create a root profile, execute `chrome-private.sh --name name --keep',
# and after installing extensions and modifying browser configuration, you
# can copy/rename its directory and set it as ROOT_PROFILE_DIR (or pass it
# as an argument with --root-profile).
#
# This is free and unencumbered software released into the public domain.
# xristos@sdf.org
set -em
#
# Configuration
#
CONFIG=~/.chrome-private.rc
if [ -f "${CONFIG}" ]; then
source "${CONFIG}"
fi
# All of the following user configuration variables can be set in
# ~/.chrome-private.rc
: "${CHROME:=google-chrome}"
: "${TMP:=/tmp}"
# A root chrome profile directory, if it exists it will be used as a template
: "${ROOT_PROFILE_DIR:=}"
# GNU mktemp is required, set this to gmktemp (coreutils) on macOS
: "${MKTEMP:=mktemp}"
: "${PROFILE_MKTEMP:=chrome.priv.prof_XXXXXXXXXX}"
: "${PROXY=socks5://127.0.0.1:5060}"
# Using a ramdisk rather than TMP is a good idea, but doubly so if you're going
# to go heavy on number of disposable profiles. hdiutil can be used to create
# a ramdisk on macOS.
: "${RAMDISK:=}"
# Remote debugging port
: "${DEBUG_PORT:=}"
#
# End of user configuration
#
CHROME_ARGS=(--disable-bundled-ppapi-flash --disable-offline-load-stale-cache
--disk-cache-size=1 --media-cache-size=1 --disk-cache-dir=/dev/null
--no-first-run --no-referrers --save-page-as-mhtml --no-default-browser-check)
CHROME_NO_GPU_ARGS=(--disable-gpu)
CHROME_NO_3D_ARGS=(--disable-3d-apis --disable-webgl)
keep=0
delete=0
incognito=0
use_gpu=0
use_3d=0
use_proxy=0
profile=
profile_name=
chrome_pid=0
color=0
start_color="\e[1;34m"
end_color="\e[0m"
basename="$(basename "${ROOT_PROFILE_DIR}")"
if [ -t 1 ]; then
color=1
fi
#
# Functions
#
function usage {
echo "Usage: $0 [--name name] [--temp-name (${PROFILE_MKTEMP})] [--keep] [--delete] [--gpu] [--3d] [--incognito] [--root-profile dir] [--profile dir] [--port port] [--proxy (${PROXY})] -- chrome-arguments"
echo -e " --name name of created profile directory"
echo -e " this will override --temp-name if given"
echo -e " --temp-name this will be passed to mktemp(1) to generate a"
echo -e " disposable profile directory name"
echo
echo -e " --keep do not delete/rename profile directory on exit"
echo -e " (implied with --profile)"
echo -e " --delete delete rather than rename profile directory"
echo -e " (ignored with --keep / --profile)"
echo
echo -e " --gpu enable gpu acceleration"
echo -e " --3d enable WebGL / 3D APIs"
echo
echo -e " --incognito start Chrome in incognito mode"
echo -e " --root-profile use given directory as root profile directory"
echo -e " --profile dir use given directory as profile directory (needs to exist)"
echo -e " (--root-profile, --name and --temp-name are ignored)"
echo -e " --proxy if given, Chrome will use a proxy (default or specified)"
echo -e " --port use given port as remote debugging port"
echo
}
function msg {
if [ "${color}" -eq 1 ]; then
printf "${start_color}$1${end_color}\n"
else
printf "%s\n" "$1"
fi
}
function err {
echo "Error: $*" >&2
}
function setup {
# Optional, executed first when --profile is not given.
# Currently used to setup the ram disk (if configured).
if [ -d "${RAMDISK}" ]; then
if [ -d "${ROOT_PROFILE_DIR}" ]; then
if [ ! -d "${RAMDISK}/${basename}" ]; then
# Copy the root profile to ramdisk
msg "Copying reference profile from: ${ROOT_PROFILE_DIR} to: ${RAMDISK}/${basename}"
cp -R "${ROOT_PROFILE_DIR}/." "${RAMDISK}/${basename}"
fi
ROOT_PROFILE_DIR="${RAMDISK}/${basename}"
fi
TMP="${RAMDISK}"
fi
}
function cleanup {
if [ -d "${profile}" ]; then
if [ "${keep}" -eq 0 ]; then
if [ "${delete}" -eq 0 ]; then
mv "${profile}" "${profile}.deleted"
msg "Renamed: ${profile}"
else
rm -rf "${profile}"
msg "Deleted: ${profile}"
fi
fi
else
err "Directory ${profile} does not exist"
fi
}
function interrupt {
if [ "${chrome_pid}" -ne 0 ] && ps "${chrome_pid}" &>/dev/null; then
kill "${chrome_pid}"
wait
fi
}
#
# Argument parsing
#
while :; do
case "$1" in
-h|--help)
usage
exit 0
;;
--keep)
keep=1
;;
--delete)
delete=1
;;
--gpu)
use_gpu=1
;;
--3d)
use_3d=1
;;
--incognito)
incognito=1
;;
--name)
if [ "$2" ] && [[ "$2" != --* ]]; then
profile_name="$2"
shift
else
err "--name requires an argument"
exit 1
fi
;;
--temp-name)
if [ "$2" ] && [[ "$2" != --* ]]; then
PROFILE_MKTEMP="$2"
shift
else
err "--temp-name requires an argument"
exit 1
fi
;;
--root-profile)
if [ "$2" ] && [[ "$2" != --* ]]; then
ROOT_PROFILE_DIR="$2"
basename="$(basename "${ROOT_PROFILE_DIR}")"
shift
else
err "--root-profile requires a profile directory"
exit 1
fi
;;
--profile)
if [ "$2" ] && [[ "$2" != --* ]]; then
profile="$2"
shift
else
err "--profile requires a profile directory"
exit 1
fi
;;
--proxy)
use_proxy=1
if [ "$2" ] && [[ "$2" != --* ]]; then
PROXY="$2"
shift
fi
;;
--port)
if [ "$2" ] && [[ "$2" != --* ]]; then
DEBUG_PORT="$2"
shift
fi
;;
--)
shift
break
;;
-?*)
err "Unknown option: $1"
exit 1
;;
*)
break
esac
shift
done
#
# End of argument parsing
#
builtin type -P "${CHROME}" &>/dev/null || { err "${CHROME}" not found; exit 1; }
if [ "${profile}" ]; then
keep=1
if [ -d "${profile}" ]; then
msg "Using existing profile dir: ${profile}"
else
err "Directory ${profile} does not exist"
exit 1
fi
else
setup
if [ "${profile_name}" ]; then
profile="${profile_name}"
else
profile="$("${MKTEMP}" -d -p "${TMP}" "${PROFILE_MKTEMP}")"
fi
if [ -d "${ROOT_PROFILE_DIR}" ]; then
msg "Copying reference profile from: ${ROOT_PROFILE_DIR} to: ${profile}"
cp -R "${ROOT_PROFILE_DIR}/." "${profile}"
else
msg "Using new profile dir: ${profile}"
fi
fi
MY_ARGS=(--user-data-dir="${profile}")
if [ "${use_proxy}" -eq 1 ]; then
msg "Using proxy: ${PROXY}"
MY_ARGS+=(--proxy-server="${PROXY}")
fi
if [ "${incognito}" -eq 1 ]; then
msg "Incognito mode enabled"
MY_ARGS+=(--incognito)
fi
if [ "${use_gpu}" -eq 0 ]; then
CHROME_ARGS=("${CHROME_ARGS[@]}" "${CHROME_NO_GPU_ARGS[@]}")
else
msg "GPU enabled"
fi
if [ "${use_3d}" -eq 0 ]; then
CHROME_ARGS=("${CHROME_ARGS[@]}" "${CHROME_NO_3D_ARGS[@]}")
else
msg "3D APIs enabled"
fi
if [ "${DEBUG_PORT}" ]; then
MY_ARGS+=(--remote-debugging-port="${DEBUG_PORT}")
msg "Remote debugging port: ${DEBUG_PORT}"
fi
#
# Execution
#
trap cleanup EXIT
trap interrupt INT
"${CHROME}" "${CHROME_ARGS[@]}" "${MY_ARGS[@]}" "$@" 2>/dev/null &
#
# Post-execution
#
chrome_pid=$!
msg "Chrome PID: ${chrome_pid}"
wait

View file

View file

@ -1,151 +0,0 @@
#!/usr/bin/env bash
## Author: Tommy Miland (@tmiland) - Copyright (c) 2019
######################################################################
#### Firefox Backup.sh ####
#### Script to backup your firefox profile ####
#### Maintained by @tmiland ####
######################################################################
version='1.0.0'
#------------------------------------------------------------------------------#
#
# MIT License
#
# Copyright (c) 2019 Tommy Miland
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
#------------------------------------------------------------------------------#
#
# Script credits:
# Mozilla Firefox profile (w/ bookmarks, history and addons) backup Bash script
# for Mac OS X - https://gist.github.com/PMK/22a0fde46bf497fd7d732baa07504071
# ghacks user.js - https://github.com/ghacksuserjs/ghacks-user.js
#
readonly CURRDIR=$(pwd)
sfp=$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null)
if [ -z "$sfp" ]; then sfp=${BASH_SOURCE[0]}; fi
readonly SCRIPT_DIR=$(dirname "${sfp}")
# Icons used for printing
ARROW='➜'
DONE='✔'
ERROR='✗'
WARNING='⚠'
# Colors used for printing
RED='\033[0;31m'
BLUE='\033[0;34m'
BBLUE='\033[1;34m'
GREEN='\033[0;32m'
ORANGE='\033[0;33m'
DARKORANGE="\033[38;5;208m"
CYAN='\033[0;36m'
DARKGREY="\033[48;5;236m"
NC='\033[0m' # No Color
# Text formatting used for printing
BOLD="\033[1m"
DIM="\033[2m"
UNDERLINED="\033[4m"
INVERT="\033[7m"
HIDDEN="\033[8m"
DEST=$1
if [ -z "$DEST" ]; then
DEST=${CURRDIR}
fi
if [ ! -d "$DEST" ]; then
mkdir $DEST
fi
readIniFile () { # expects one argument: absolute path of profiles.ini
declare -r inifile="$1"
declare -r tfile=$(mktemp)
if [ $(grep '^\[Profile' "$inifile" | wc -l) == "1" ]; then ### only 1 profile found
grep '^\[Profile' -A 4 "$inifile" | grep -v '^\[Profile' > $tfile
else
grep -E -v '^\[General\]|^StartWithLastProfile=|^IsRelative=' "$inifile"
echo -e "${GREEN}"
read -p 'Select the profile number ( 0 for Profile0, 1 for Profile1, etc ) : ' -r
echo -e "\n${NC}"
if [[ $REPLY =~ ^(0|[1-9][0-9]*)$ ]]; then
grep '^\[Profile'${REPLY} -A 4 "$inifile" | grep -v '^\[Profile'${REPLY} > $tfile
if [[ "$?" != "0" ]]; then
echo -e "${RED}${ERROR}Profile${REPLY} does not exist!${NC}" && exit 1
fi
else
echo -e "${RED}${ERROR} Invalid selection!${NC}" && exit 1
fi
fi
declare -r profpath=$(grep '^Path=' $tfile)
declare -r pathisrel=$(grep '^IsRelative=' $tfile)
rm "$tfile"
# update global variable
if [[ ${pathisrel#*=} == "1" ]]; then
PROFILE_PATH="$(dirname "$inifile")/${profpath#*=}"
PROFILE_ID="${profpath#*=}"
else
PROFILE_PATH="${profpath#*=}"
fi
}
getProfilePath() {
declare -r f1=~/Library/Application\ Support/Firefox/profiles.ini
declare -r f2=~/.mozilla/firefox/profiles.ini
local ini=''
if [[ -f "$f1" ]]; then
ini="$f1"
elif [[ -f "$f2" ]]; then
ini="$f2"
else
echo -e "${RED}${ERROR}Error: Sorry, -l is not supported for your OS${NC}"
exit 1
fi
readIniFile "$ini" # updates PROFILE_PATH or exits on error
}
backupProfile() {
BACKUP_FILE_NAME=${PROFILE_ID}-$(date +"%Y-%m-%d_%H%M").tar.gz
tar -zcf $BACKUP_FILE_NAME $PROFILE_PATH > /dev/null 2>&1
mv $BACKUP_FILE_NAME $DEST
echo -e "${GREEN}${DONE} Done! ${NC}"
echo ""
echo -e "${ORANGE}${ARROW} Firefox profile successfully backed up to $DEST ${NC}"
echo ""
}
getProfilePath # updates PROFILE_PATH or exits on error
backupProfile

12
.local/bin/fonttest Normal file
View file

@ -0,0 +1,12 @@
#!/bin/bash
# FONTTEST SCRIPT
# -----------------
# Print all avaliable variants of chosen terminal font
echo -en "regular "
echo -en "\e[3m italic \e[0m"
echo -en "\e[1m bold \e[0m"
echo -en "\e[3m\e[1m bold-italic \e[0m"
echo -en " \e[4munderline\e[0m "
echo -e " \e[9mstrikethrough\e[0m"

View file

@ -0,0 +1,314 @@
#!/bin/bash
#################################################################
# #
# GNOME Shell Extension Installer v1.2.1 #
# #
# A simple (scriptable) way to install GNOME Shell Extensions! #
# #
# Author: Cyrus Frost #
# License: MIT #
# #
# https://github.com/cyfrost/install-gnome-extensions #
# #
#################################################################
#vars
script_revision="v1.2.1"
args_count="$#"
dependencies=(wget curl jq unzip tput sed egrep sed awk gnome-shell cut basename)
deps_install_apt="sudo apt install -y wget curl jq unzip sed"
deps_install_dnf="sudo dnf install -y wget curl jq unzip sed"
EXTENSIONS_TO_INSTALL=()
OVERWRITE_EXISTING=false
ENABLE_ALL=false
INSTALLED_EXT_COUNT=''
INSTALLED_EXTs=''
# message colors.
info_text_blue=$(tput setaf 7)
normal_text=$(tput sgr0)
error_text=$(tput setaf 1)
status_text_yellow=$(tput setaf 3)
# Bail immediately if running as root.
function CheckIfRunningAsRoot() {
if [ "$(id -u)" = 0 ]; then
printf "
%s Running this script as root is discouraged and won't work since it needs user directories to operate. Retry as normal user.
Note: If you're trying to install extensions for another user on this computer, try 'su <user_account_name>' and proceed.
Abort.
%s" "$error_text" "$normal_text"
exit 1
fi
}
# Bail immediately if running as root.
CheckIfRunningAsRoot
# Trap SIGINT and SIGTERM.
function _term() {
printf "\n\n%s" "$normal_text"
trap - INT TERM # clear the trap
kill -- -$$
}
# Trap SIGINT and SIGTERM for cleanup.
trap _term INT TERM
# This function can check for binaries/commands to be available in Env PATH and report otherwise.
function CheckDependencies() {
# echo -en "\n${info_text_blue}Checking dependencies...${normal_text}";
dependencies=("$@")
for name in "${dependencies[@]}"; do
command -v "$name" >/dev/null 2>&1 || {
echo -en "${error_text}\n[Error] Command not found: \"$name\"${normal_text}"
deps=1
}
done
[[ $deps -ne 1 ]] || {
echo -en "${error_text}\n\nOne or more dependencies is unavailable. Please make sure the above commands are available and re-run this script.\n\n${status_text_yellow}For Ubuntu and similar distros, try: $deps_install_apt\n\nFor Fedora and similar distros, try: $deps_install_dnf\n\n${normal_text}"
exit 1
}
}
# Fail if dependencies unmet.
CheckDependencies "${dependencies[@]}"
function confirm_action() {
while true; do
printf "\n%s" "$normal_text"
read -r -p "$1" -n 1 yn
case $yn in
[Yy]*) return 0 ;;
[Nn]*) return 1 ;;
*) printf "\nPlease answer with 'y' or 'n'." ;;
esac
done
}
# check if current (active) desktop instance is GNOME.
function IsEnvGNOME() {
if [ "$XDG_CURRENT_DESKTOP" = "" ]; then
desktop=$(echo "$XDG_DATA_DIRS" | grep -Po '(xfce|kde|gnome)' | tail -n 1)
#sed 's/.*\(xfce\|kde\|gnome\).*/\1/')
else
desktop=$XDG_CURRENT_DESKTOP
fi
desktop=${desktop,,}
if [[ $desktop == *"gnome"* ]]; then
return 0
else
return 1
fi
}
function enable_extension() {
ext_uuid="$1"
gnome-extensions enable "$ext_uuid" >/dev/null 2>&1
}
function disable_extension() {
ext_uuid="$1"
gnome-extensions disable "$ext_uuid" >/dev/null 2>&1
}
function get_installed_extensions_list() {
user_extensions_path="/home/$USER/.local/share/gnome-shell/extensions"
array=()
while IFS="" read -r line; do array+=("$line"); done < <(find "$user_extensions_path" -maxdepth 1 -mindepth 1 -type d -not -path '*/\.*' -printf "%f\n")
ext_list=$(printf "'%s'," "${array[@]}")
ext_list=${ext_list%,}
INSTALLED_EXT_COUNT="${#array[@]}"
INSTALLED_EXTs=$(printf '%s\n' "${array[@]}")
# echo $ext_list
}
function install_shell_extensions() {
for ext_id in "${EXTENSIONS_TO_INSTALL[@]}"; do
request_url="https://extensions.gnome.org/extension-info/?pk=$ext_id&shell_version=$GNOME_SHELL_VERSION"
http_response="$(curl -s -o /dev/null -I -w "%{http_code}" "$request_url")"
if [ "$http_response" = 404 ]; then
printf "\n%sError: No extension exists matching the ID: %s and GNOME Shell version %s (Skipping this).\n" "$error_text" "$ext_id" "$GNOME_SHELL_VERSION"
continue
fi
printf "%s\n" "$normal_text"
ext_info="$(curl -s "$request_url")"
extension_name="$(echo "$ext_info" | jq -r '.name')"
direct_dload_url="$(echo "$ext_info" | jq -r '.download_url')"
ext_uuid="$(echo "$ext_info" | jq -r '.uuid')"
ext_version="$(echo "$ext_info" | jq -r '.version')"
ext_homepage="$(echo "$ext_info" | jq -r '.link')"
ext_description="$(echo "$ext_info" | jq -r '.description')"
download_url="https://extensions.gnome.org"$direct_dload_url
target_installation_dir="/home/$USER/.local/share/gnome-shell/extensions/$ext_uuid"
printf "%s\nDownloading and installing extension \"%s\"%s" "$status_text_yellow" "$extension_name" "$normal_text"
printf "%s" "$info_text_blue"
printf "\nDescription: %s" "$ext_description"
printf "\nExtension ID: %s" "$ext_id"
printf "\nExtension Version: v%s" "$ext_version"
printf "\nHomepage: https://extensions.gnome.org%s" "$ext_homepage"
printf "\nUUID: \"%s\"" "$ext_uuid"
printf "\nInstalling to: \"%s\"" "$target_installation_dir"
if [ -d "$target_installation_dir" ] && [ "$OVERWRITE_EXISTING" = "false" ]; then
confirm_action "${normal_text}This extension is already installed. Do you want to overwrite it? (y/n): " || continue
fi
printf "\n%sPlease wait...\n" "$info_text_blue"
filename="$(basename "$download_url")"
wget -q "$download_url" \
&& mkdir -p "$target_installation_dir" \
&& unzip -o -q "$filename" -d "$target_installation_dir" \
&& sleep 1 \
&& rm "$filename"
schemas_dir="$target_installation_dir/schemas"
if [ -d "$schemas_dir" ]; then
printf "%sInstall GLib Schemas for dconf storage, this step will require sudo access...\n" "$info_text_blue"
cd "$schemas_dir" || {
echo "$0: Directory do not exist"
exit 1
}
sudo cp ./*.xml "/usr/share/glib-2.0/schemas/"
sudo glib-compile-schemas /usr/share/glib-2.0/schemas/ >/dev/null 2>&1
fi
if [ ! "$ENABLE_ALL" = "false" ]; then
enable_extension "$ext_uuid"
fi
printf "%sDone!\n%s" "$info_text_blue" "$normal_text"
done
printf "\n"
}
# Check if arg is number.
function IsNumber() {
re='^[0-9]+$'
if [[ "$1" =~ $re ]]; then
return 0
fi
return 1
}
function print_usage() {
print_banner
# -u, --update Updates existing extensions to latest available versions.
printf "
Usage: ./install-gnome-extensions.sh [options] <extension_ids> | [links_file]
Options:
-e, --enable Enable extension after installing it.
-o, --overwrite Overwrites existing extensions.
-l. --list Lists the UUIDs of installed extensions.
-f, --file Specify a file containing extension links to install.
-h, --help Display this help message.
Example usages:
---------------
1) ./install-gnome-extensions.sh 6 8 19 --enable
Installs and enables extensions with IDs 6, 8, and 19.
2) ./install-gnome-extensions.sh -e --file links.txt
Installs and enables the extensions from the URLs specified in \"links.txt\" file.
"
}
function print_banner() {
printf "%s
===========================================================
GNOME Shell Extensions Installer %s
A simple (scriptable) way to install GNOME Shell extensions.
https://github.com/cyfrost/install-gnome-extensions
===========================================================\n" "$normal_text" "$script_revision"
}
function trim_file() {
file="$1"
sed -i '/^[[:blank:]]*$/ d' "$file" && awk '{$1=$1};1' "$file" >tmp && mv tmp "$file"
}
function install_exts_from_links_file() {
file="$1"
if [ ! -f "$file" ] || [ ! -s "$file" ]; then
printf "\n%sError: Supplied argument (\"%s\") is either not a valid file or is empty. %s\n\nPlease gather all extension links in a text file (line-by-line) and try again.\n\nSample usage: ./install-gnome-extensions --file links.txt\n\n" "$error_text" "$1" "$normal_text"
exit 1
fi
trim_file "$file"
printf "\nParsing file \"%s\" for extension links...\n" "$file"
while IFS="" read -r p || [ -n "$p" ]; do
url="$(echo "$p" | sed '/^[[:space:]]*$/d')"
ext_id="$(echo "$url" | tr '\n' ' ' | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | awk '{print $1;}')"
IsNumber "$ext_id" && EXTENSIONS_TO_INSTALL+=("$ext_id") || printf "\n%sError: Invalid URL: %s (Skipping this).%s" "$error_text" "$url" "$normal_text"
done <"$file"
printf "\n"
}
function begin_install() {
exts_list="$(printf '%s, ' "${EXTENSIONS_TO_INSTALL[@]}")"
exts_list=${exts_list%, }
print_banner
printf "\n%s[Info] Detected GNOME Shell version: %s\n\nInstalling %s extensions (%s)...\n%s" "$info_text_blue" "$GNOME_SHELL_VERSION" "$extensions_count" "$exts_list" "$normal_text"
install_shell_extensions
printf "\n%sComplete!\n\n" "$normal_text"
IsEnvGNOME || printf "%sPlease login to GNOME desktop to see the installed/enabled extensions.\n\n" "$normal_text"
}
# Obtain GNOME Shell version.
GNOME_SHELL_VERSION="$(gnome-shell --version | cut --delimiter=' ' --fields=3 | cut --delimiter='.' --fields=1,2)"
while test $# -gt 0; do
case "$1" in
-e | --enable)
ENABLE_ALL=true
;;
# -u|--update)
# UPDATE=true
# ;;
-o | --overwrite)
OVERWRITE_EXISTING=true
;;
-h | --help)
print_usage
exit 0
;;
-l | --list)
get_installed_extensions_list
printf "\n============================\nInstalled extensions (UUIDs)\n============================\n\n%s\n\n%s extensions are installed.\n\nDone!\n\n" "$INSTALLED_EXTs" "$INSTALLED_EXT_COUNT"
exit 0
;;
-f | --file)
install_exts_from_links_file "$2"
;;
esac
IsNumber "$1" && EXTENSIONS_TO_INSTALL+=("$1")
shift
done
extensions_count="${#EXTENSIONS_TO_INSTALL[@]}"
if [ "$args_count" -eq 0 ]; then
printf "\n%sInvalid usage.\n%s" "$error_text" "$normal_text"
print_usage
elif [ "$extensions_count" -eq 0 ]; then
printf "\n%sError: Could not find any valid extension IDs or URLs for installation.\n%s\n" "$error_text" "$normal_text"
exit 1
else
begin_install
fi

648
.local/bin/install-software Normal file
View file

@ -0,0 +1,648 @@
#!/usr/bin/env zx
const execSync = require('child_process').execSync
$.log = (entry) => {
if (entry.kind === 'cmd' && entry.cmd.substring(0, 4) === 'logg') {
//execSync(entry.cmd, {stdio: 'inherit', shell: true})
} else {
log(entry)
}
}
let installData
const installOrders = {};
const installOrdersPre = [];
const installOrdersPost = [];
const osType = await OSType();
let osID = osType
if(osType === 'linux') {
osID = await realeaseID()
}
// Download the installation map
async function downloadInstallData() {
const response = await fetch(
"https://gitlab.com/megabyte-labs/misc/dotfiles/-/raw/master/dotfiles/.local/share/chezmoi/software.yml"
);
if (response.ok) {
const text = await response.text()
return YAML.parse(text)
} else {
await $`logg error 'Failed to download the installation map'`
}
}
// Creates the installOrders object which maps package managers to arrays of packages to install
async function generateInstallOrders() {
const packagesToInstall = process.argv.slice(3);
const installerPreference = await OSTypeInstallerKey()
await $`logg info 'Installer preference category detected as ${installerPreference}'`
const preferenceOrder = installData.installerPreference[installerPreference];
await $`logg info 'Preference order acquired:'`
console.log(preferenceOrder)
const softwarePackages = installData.softwarePackages;
for (let pkg of packagesToInstall) {
let packageKey;
if (softwarePackages[pkg + ":" + osID]) {
packageKey = pkg + ":" + osID;
} else if (softwarePackages[pkg + ":" + osType]) {
packageKey = pkg + ":" + osType;
} else if (softwarePackages[pkg]) {
packageKey = pkg
} else {
await $`logg warn 'The package \`${pkg}\` was not found in the installation map'`
continue;
}
for (let preference of preferenceOrder) {
if (softwarePackages[packageKey][preference + ":" + osID]) {
await updateInstallMaps(
preference,
softwarePackages[packageKey],
preference + ":" + osID,
pkg,
packageKey
);
break
} else if (softwarePackages[packageKey][preference + ":" + osType]) {
await updateInstallMaps(
preference,
softwarePackages[packageKey],
preference + ":" + osType,
pkg,
packageKey
);
break
} else if (softwarePackages[packageKey][preference]) {
await updateInstallMaps(preference, softwarePackages[packageKey], preference, pkg, packageKey);
break
}
}
}
return installOrders;
}
// Update install, pre-hook, and post-hook objects
async function updateInstallMaps(preference, packages, scopedPreference, pkg, packageKey) {
const preHook = getHook(packages, "pre", scopedPreference, preference);
if (preHook) {
installOrdersPre.concat(typeof preHook === "string" ? [preHook] : preHook);
}
const postHook = getHook(packages, "post", scopedPreference, preference);
if (postHook) {
installOrdersPost.concat(
typeof postHook === "string" ? [postHook] : postHook
);
}
if (!installOrders[preference]) {
installOrders[preference] = [];
}
await $`logg info 'Found a match for the package \`${pkg}\` (${packageKey} via ${scopedPreference})'`
const newPackages = packages[scopedPreference];
installOrders[preference] = installOrders[preference].concat(
typeof newPackages === "string" ? [newPackages] : newPackages
);
}
// Get pre / post install hooks
function getHook(packages, hook, scopedPreference, preference) {
const hookLabel = "_" + hook + ":";
if (packages[hookLabel + scopedPreference]) {
return packages[hookLabel + scopedPreference];
} else if (packages[hookLabel + preference]) {
return packages[hookLabel + preference];
} else if (packages[hookLabel + osID]) {
return packages;
} else if (packages[hookLabel + osType]) {
return packages[hookLabel + osType];
} else if (packages["_" + hook]) {
return packages["_" + hook];
}
}
// Acquire OS type installer key (for the installerPreference data key)
async function OSTypeInstallerKey() {
const apt = which.sync('apt-get', { nothrow: true })
const dnf = which.sync('dnf', { nothrow: true })
const freebsd = which.sync('pkg', { nothrow: true })
const pacman = which.sync('pacman', { nothrow: true })
const yum = which.sync('yum', { nothrow: true })
const zypper = which.sync('zypper', { nothrow: true })
if (apt) {
return 'apt'
} else if (dnf || yum) {
return 'dnf'
} else if(pacman) {
return 'pacman'
} else if(zypper) {
return 'zypper'
} else if (freebsd) {
return 'freebsd'
} else {
const macOS = await $`test -d /Applications && test -d Library`
if (macOS.exitCode === 0) {
return 'darwin'
} else {
return 'windows'
}
}
}
// Acquire OS type
async function OSType() {
try {
await $`test -d /Applications && test -d /Library`
return 'darwin'
} catch(e) {
try {
await $`test -f /etc/os-release`
return 'linux'
} catch (e) {
return 'windows'
}
}
}
// Acquire release ID (for Linux)
async function releaseID() {
const ID = await $`
if [ -f /etc/os-release ]; then
. /etc/os-release
echo -n $ID
fi
`;
return ID.stdout;
}
// Post-install hook
async function afterInstall(packageManager) {
if (packageManager === 'appimage') {
} else if (packageManager === 'ansible') {
await $`logg info 'Ensuring temporary passwordless sudo privileges used by Ansible are removed'`
await $`sudo sed -i '/# TEMPORARY FOR ANSIBLE INSTALL/d' /etc/sudoers`
} else if (packageManager === 'apk') {
} else if (packageManager === 'apt') {
} else if (packageManager === 'basher') {
} else if (packageManager === 'binary') {
} else if (packageManager === 'brew' || packageManager === 'cask') {
} else if (packageManager === 'cargo') {
} else if (packageManager === 'choco') {
} else if (packageManager === 'crew') {
} else if (packageManager === 'dnf') {
} else if (packageManager === 'flatpak') {
} else if (packageManager === 'gem') {
} else if (packageManager === 'go') {
} else if (packageManager === 'nix') {
} else if (packageManager === 'npm') {
} else if (packageManager === 'pacman') {
} else if (packageManager === 'pipx') {
} else if (packageManager === 'pkg') {
} else if (packageManager === 'port') {
} else if (packageManager === 'scoop') {
} else if (packageManager === 'crew') {
} else if (packageManager === 'dnf') {
} else if (packageManager === 'flatpak') {
} else if (packageManager === 'snap') {
} else if (packageManager === 'whalebrew') {
} else if (packageManager === 'winget') {
} else if (packageManager === 'yay') {
} else if (packageManager === 'zypper') {
}
}
// Pre-install hook
async function beforeInstall(packageManager) {
if (packageManager === 'appimage') {
} else if (packageManager === 'ansible') {
await $`logg info 'Temporarily enabling passwordless sudo for Ansible role installations'`
await $`sudo echo "$(whoami) ALL=(ALL:ALL) NOPASSWD: ALL # TEMPORARY FOR ANSIBLE INSTALL" > /etc/sudoers`
} else if (packageManager === 'apk') {
} else if (packageManager === 'apt') {
await $`sudo apt-get update`
} else if (packageManager === 'basher') {
} else if (packageManager === 'binary') {
} else if (packageManager === 'brew' || packageManager === 'cask') {
} else if (packageManager === 'cargo') {
} else if (packageManager === 'choco') {
} else if (packageManager === 'crew') {
} else if (packageManager === 'dnf') {
} else if (packageManager === 'flatpak') {
} else if (packageManager === 'gem') {
} else if (packageManager === 'go') {
} else if (packageManager === 'nix') {
} else if (packageManager === 'npm') {
} else if (packageManager === 'pacman') {
await $`sudo pacman -Syu`
} else if (packageManager === 'pipx') {
} else if (packageManager === 'pkg') {
} else if (packageManager === 'port') {
} else if (packageManager === 'scoop') {
} else if (packageManager === 'crew') {
} else if (packageManager === 'dnf') {
} else if (packageManager === 'flatpak') {
} else if (packageManager === 'snap') {
} else if (packageManager === 'whalebrew') {
} else if (packageManager === 'winget') {
} else if (packageManager === 'yay') {
} else if (packageManager === 'zypper') {
}
}
async function ensureInstalled(bin, callback) {
const installed = which.sync(bin, { nothrow: true })
if (installed) {
await $`logg info '\`${bin}\` is available'`
} else {
await $`logg warn '\`${bin}\` is not installed!'`
if (callback) {
await $`${callback}`
} else {
await $`logg error 'There does not appear to be an installation method available for \`${bin}\`'`
}
}
}
// Ensure the package manager is available
let packageManagerInstalled = {};
async function ensurePackageManager(packageManager) {
await $`logg info 'Ensuring \`${packageManager}\` is set up'`
if (packageManagerInstalled[packageManager]) {
return;
} else {
packageManagerInstalled[packageManager] = true;
}
if (packageManager === "ansible") {
await ensurePackageManager("pipx");
}
if (
packageManager === "gem" ||
packageManager === "go" ||
packageManager === "npm" ||
packageManager === "pipx" ||
packageManager === "whalebrew"
) {
await ensurePackageManager("brew");
}
if (packageManager === 'appimage') {
} else if (packageManager === 'ansible') {
$`
if [ ! -f "$HOME/.cache/megabytelabs/ansible-installed" ] || ! command -v ansible > /dev/null; then
pipx install ansible
pipx inject ansible PyObjC PyObjC-core docker lxml netaddr pexpect python-vagrant pywinrm requests-credssp watchdog
touch "$HOME/.cache/megabytelabs/ansible-installed"
else
logg info '\`ansible\` and its supporting packages appear to be installed'
fi
`
} else if (packageManager === 'apk') {
await ensureInstalled('apk', false)
} else if (packageManager === 'apt') {
await ensureInstalled('apt', false)
} else if (packageManager === 'basher') {
await ensureInstalled('basher', `
# TODO
echo "Bash script that installs basher here"
`)
} else if (packageManager === 'binary') {
} else if (packageManager === 'bpkg') {
await ensureInstalled('bpkg', `
# TODO
echo "Bash script that installs bpkg here"
`)
} else if (packageManager === 'brew' || packageManager === 'cask') {
await ensureInstalled('brew', `
if command -v sudo > /dev/null && sudo -n true; then
echo | bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
else
logg info 'Homebrew is not installed. Password may be required.'
bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" || BREW_EXIT_CODE="$?"
if [ -n "$BREW_EXIT_CODE" ]; then
if command -v brew > /dev/null; then
logg warn 'Homebrew was installed but part of the installation failed. Attempting to fix..'
BREW_DIRS="share/man share/doc share/zsh/site-functions etc/bash_completion.d"
for BREW_DIR in $BREW_DIRS; do
if [ -d "$(brew --prefix)/$BREW_DIR" ]; then
sudo chown -R "$(whoami)" "$(brew --prefix)/$BREW_DIR"
fi
done
brew update --force --quiet
fi
fi
fi
`)
} else if (packageManager === 'cargo') {
await ensureInstalled('cargo', `
# TODO Bash script that installs cargo
`)
} else if (packageManager === 'choco') {
await ensureInstalled('choco', `
powershell "Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))"
`)
} else if (packageManager === 'crew') {
await ensureInstalled('crew', `
# TODO Bash script that installs crew here
# Source: https://github.com/chromebrew/chromebrew
curl -Ls git.io/vddgY | bash
`)
} else if (packageManager === 'dnf') {
const dnf = which.sync('dnf', { nothrow: true })
const yum = which.sync('yum', { nothrow: true })
if (dnf) {
await $`logg info '\`dnf\` is available'`
} else if (yum) {
await $`logg info '\`yum\` is available'`
} else {
await $`logg error 'Both \`dnf\` and \`yum\` are not available'`
}
} else if (packageManager === 'flatpak') {
const flatpak = which.sync('flatpak', { nothrow: true })
if (flatpak) {
await $`logg info '\`flatpak\` is available'`
} else {
const apk = which.sync('apk', { nothrow: true })
const apt = which.sync('apt', { nothrow: true })
const dnf = which.sync('dnf', { nothrow: true })
const yum = which.sync('yum', { nothrow: true })
const pacman = which.sync('pacman', { nothrow: true })
const zypper = which.sync('zypper', { nothrow: true })
if (apk) {
$`sudo apk add flatpak`
} else if(apt) {
$`
sudo apt install -y flatpak
if [ -f /usr/bin/gnome-shell ]; then
sudo apt install -y gnome-software-plugin-flatpak
fi
if [ -f /usr/bin/plasmashell ]; then
sudo apt install -y plasmashell
fi
`
} else if(dnf) {
await $`sudo dnf install -y flatpak`
} else if(yum) {
await $`sudo yum install -y flatpak`
} else if (pacman) {
await $`sudo pacman -Sy flatpak`
} else if (zypper) {
await $`sudo zypper install -y flatpak`
}
const flatpakPost = which.sync('flatpak', { nothrow: true })
if (flatpakPost) {
await $`flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo`
} else {
await $`logg error '\`flatpak\` failed to install!'`
}
await $`logg info '\`flatpak\` was installed. It may require a reboot to function correctly.'`
}
} else if (packageManager === 'gem') {
await ensureInstalled('gem', `brew install ruby`)
} else if (packageManager === 'go') {
await ensureInstalled('gem', `brew install go`)
} else if (packageManager === 'nix') {
await ensureInstalled('nix', `
if [ -d /Applications ] && [ -d /Library ]; then
sh <(curl -L https://nixos.org/nix/install)
else
sh <(curl -L https://nixos.org/nix/install) --daemon
fi
`)
} else if (packageManager === 'npm') {
const npm = which('npm', { nothrow: true })
const node = which('node', { nothrow: true })
const volta = which('volta', { nothrow: true })
if (npm && node && volta) {
await $`logg info '\`npm\`, \`node\`, and \`volta\` are available'`
} else {
if (!volta) {
await $`brew install volta`
}
await $`
if [ -z "$VOLTA_HOME" ]; then
volta setup
fi
export PATH="$VOLTA_HOME/bin:$PATH"
volta install node
`
}
} else if (packageManager === 'pacman') {
await ensureInstalled('pacman', false)
} else if (packageManager === 'pipx') {
await ensureInstalled('pipx', `brew install pipx && pipx ensurepath`)
} else if (packageManager === 'pkg') {
await ensureInstalled('pkg', false)
} else if (packageManager === 'port') {
await ensureInstalled('port', `
echo "TODO - script that installs port on macOS here"
`)
} else if (packageManager === 'scoop') {
await ensureInstalled('scoop', `
powershell 'Set-ExecutionPolicy RemoteSigned -Scope CurrentUser'
powershell 'irm get.scoop.sh | iex
`)
} else if (packageManager === 'snap') {
const apk = which.sync('apk', { nothrow: true })
const apt = which.sync('apt-get', { nothrow: true })
const dnf = which.sync('dnf', { nothrow: true })
const yum = which.sync('yum', { nothrow: true })
const pacman = which.sync('pacman', { nothrow: true })
const zypper = which.sync('zypper', { nothrow: true })
if (apt) {
await $`
if [ -f /etc/apt/preferences.d/nosnap.pref ]; then
sudo mv /etc/apt/preferences.d/nosnap.pref /etc/apt/nosnap.pref.bak
fi
sudo apt install -y snapd
`
// TODO Following may be required on Kali -> https://snapcraft.io/docs/installing-snap-on-kali
// systemctl enable --now snapd apparmor
} else if (dnf) {
await $`
sudo dnf install -y snapd
if [ ! -d /snap ]; then
sudo ln -s /var/lib/snapd/snap /snap
fi
`
} else if (yum) {
await $`
sudo yum install -y snapd
sudo systemctl enable --now snapd.socket
if [ ! -d /snap ]; then
sudo ln -s /var/lib/snapd/snap /snap
fi
`
} else if (pacman) {
await $`
if [ -f /etc/arch-release ]; then
sudo git clone https://aur.archlinux.org/snapd.git /usr/local/src/snapd
cd /usr/local/src/snapd
sudo makepkg -si
else
sudo pacman -S snapd
sudo systemctl enable --now snapd.socket
if [ ! -d /snap ]; then
sudo ln -s /var/lib/snapd/snap /snap
fi
fi
`
} else if (zypper) {
// TODO See https://snapcraft.io/docs/installing-snap-on-opensuse
await $`
echo "TODO - Bash script that installs snap w/ zypper"
`
}
const snap = which.sync('snap', { nothrow: true })
if (snap) {
$`sudo snap install core`
}
} else if (packageManager === 'whalebrew') {
await ensureInstalled('whalebrew', `brew install whalebrew`)
} else if (packageManager === 'winget') {
await ensureInstalled('winget', `
echo "TODO - Script that installs winget here"
`)
} else if (packageManager === 'yay') {
const yay = which.sync('yay', { nothrow: true })
await $`sudo pacman -S --needed base-devel git`
await $`
if [ -d /usr/local/src ]; then
git clone https://aur.archlinux.org/yay.git /usr/local/src/yay
cd /usr/local/src/yay
makepkg -si
fi
`
} else if (packageManager === 'zypper') {
await ensureInstalled('zypper', false)
}
}
// Installs a list of packages via the specified package manager
async function installPackageList(packageManager, packages) {
try {
if (packageManager === 'appimage') {
} else if (packageManager === 'ansible') {
for (const role of packages) {
await $`ansible localhost -m include_role -a name=${role}`
}
} else if (packageManager === 'apk') {
await $`sudo apk add ${packages}`
} else if (packageManager === 'apt') {
await $`sudo apt-get install -y ${packages}`
} else if (packageManager === 'basher') {
} else if (packageManager === 'binary') {
} else if (packageManager === 'brew') {
await $`brew install ${packages}`
} else if (packageManager === 'cask') {
await $`brew install --cask ${packages}`
} else if (packageManager === 'cargo') {
for (const cargoPkg of packages) {
await $`cargo install ${cargoPkg}`
}
} else if (packageManager === 'choco') {
await $`choco install -y ${packages}`
} else if (packageManager === 'crew') {
} else if (packageManager === 'dnf') {
const dnf = which.sync('dnf', { nothrow: true })
const yum = which.sync('yum', { nothrow: true })
if (dnf) {
await $`dnf install -y ${packages}`
} else if (yum) {
await $`yum install -y ${packages}`
}
} else if (packageManager === 'flatpak') {
for (const flatPkg of packages) {
await $`sudo flatpak install flathub ${flatPkg}`
}
} else if (packageManager === 'gem') {
for (const gem of packages) {
await $`gem install ${gem}`
}
} else if (packageManager === 'go') {
for (const goPkg of packages) {
await $`go install ${goPkg}`
}
} else if (packageManager === 'nix') {
} else if (packageManager === 'npm') {
for (const npmPkg of packages) {
await $`volta install ${npmPkg}`
}
} else if (packageManager === 'pacman') {
await $`sudo pacman -Sy --noconfirm --needed ${packages}`
} else if (packageManager === 'pipx') {
for (const pipxPkg of packages) {
await $`pipx install ${pipxPkg}`
}
} else if (packageManager === 'pkg') {
} else if (packageManager === 'port') {
for (const portPkg of packages) {
await $`sudo port install ${portPkg}`
}
} else if (packageManager === 'scoop') {
for (const scoopPkg of packages) {
await $`scoop install ${scoopPkg}`
}
} else if (packageManager === 'snap') {
for (const snapPkg of packages) {
await $`sudo snap install -y ${snapPkg}`
}
} else if (packageManager === 'whalebrew') {
for (const whalePkg of packages) {
await $`whalebrew install ${snapPkg}`
}
} else if (packageManager === 'winget') {
} else if (packageManager === 'yay') {
for (const yayPkg of packages) {
await $`yay -Sy --noconfirm --needed ${yayPkg}`
}
} else if (packageManager === 'zypper') {
await $`sudo zypper install -y ${zypPkg}`
}
} catch (e) {
await $`logg error 'Failed to install via \`${packageManager}\`'`
await $`logg info 'Proceeding with the installation..'`
}
}
// main process
async function main() {
await $`logg info 'Fetching the latest version of the installation map'`
installData = await downloadInstallData();
await $`logg info 'Calculating the install orders'`
await generateInstallOrders();
await $`logg info 'Ensuring any package managers that will be used are installed / configured'`
const packageManagers = Object.keys(installOrders);
for (const packageManager of packageManagers) {
await ensurePackageManager(packageManager);
}
await $`logg info 'The install orders were generated:'`
console.log(installOrders)
await $`logg info 'Running package manager pre-installation steps'`
for (const packageManager of packageManagers) {
await beforeInstall(packageManager);
}
await $`logg info 'Running package-specific pre-installation steps'`
for (const script of installOrdersPre) {
await $`${script}`;
}
await $`logg info 'Installing the packages'`
for (const packageManager of packageManagers) {
const asyncOrders = [];
asyncOrders.push(
Promise.resolve(
installPackageList(packageManager, installOrders[packageManager])
)
);
await Promise.all(asyncOrders);
}
await $`logg info 'Running package-specific post-installation steps'`
for (const script of installOrdersPost) {
await $`${script}`;
}
await $`logg info 'Running package manager post-installation steps'`
for (const packageManager of packageManagers) {
await afterInstall(packageManager);
}
await $`logg success 'Done!'`
}
// Start the main process
await main();

View file

@ -10,6 +10,9 @@
# Themer.dev: https://themer.dev/?calculateIntermediaryShades.dark=true&colors.dark.shade0=%23161925&colors.dark.shade7=%23C3C7D1&colors.dark.accent0=%23ED254E&colors.dark.accent3=%2371F79F&colors.dark.accent2=%23F9DC5C&colors.dark.accent4=%2300C1E4&colors.dark.accent5=%237CB7FF&colors.dark.accent7=%23C74D89&colors.dark.accent6=%23C3C7D1&colors.dark.accent1=%23DCDFE4&colors.light.accent0=%23FF4972&colors.light.accent3=%2395FFC3&colors.light.accent2=%23FFFF80&colors.light.accent5=%23A0DBFF&colors.light.accent7=%23EB71AD&colors.light.accent6=%234C5058&colors.light.shade7=%234C5058&colors.light.shade0=%23FFFFFF&colors.light.accent4=%2324E5FF&colors.light.accent1=%23DCDFE4&activeColorSet=dark
# Required for styled logging
{{- includeTemplate "universal/logg-compat" }}
export COLOR_01="#282C34" # Black
export COLOR_02="#ED254E" # Red
export COLOR_03="#71F79F" # Green
@ -34,7 +37,9 @@ export CURSOR_COLOR="$FOREGROUND_COLOR" # Cursor color
export PROFILE_NAME="Betelgeuse"
if [ ! -e gconftool-2 ] && [ -f /etc/debian_version ]; then
logg 'Running `sudo apt-get update`'
sudo apt-get update
logg 'Running `sudo apt-get install -y gconf2`'
sudo apt-get install -y gconf2
fi

3
.local/bin/load-secrets Normal file
View file

@ -0,0 +1,3 @@
#!/usr/bin/env bash
logg

View file

@ -122,7 +122,7 @@ logger() {
if [ "$1" == 'error' ]; then
"$GUM_PATH" style --border="thick" "$("$GUM_PATH" style --foreground="#ff0000" "✖") $("$GUM_PATH" style --bold --background="#ff0000" --foreground="#ffffff" " ERROR ") $("$GUM_PATH" style --bold "$(format "$2")")"
elif [ "$1" == 'info' ]; then
"$GUM_PATH" style " $("$GUM_PATH" style --foreground="#00ffff" "○") $2"
"$GUM_PATH" style " $("$GUM_PATH" style --foreground="#00ffff" "○") $("$GUM_PATH" style --faint "$(formatFaint "$2")")"
elif [ "$1" == 'md' ]; then
# @description Ensure glow is installed
if [ "${container:=}" != 'docker' ]; then
@ -148,26 +148,44 @@ logger() {
elif [ "$1" == 'prompt' ]; then
"$GUM_PATH" style " $("$GUM_PATH" style --foreground="#00008b" "▶") $("$GUM_PATH" style --bold "$(format "$2")")"
elif [ "$1" == 'star' ]; then
"$GUM_PATH" style " $("$GUM_PATH" style --foreground="#d1d100" "◆") $("$GUM_PATH" style --bold --underline "$(format "$2")")"
"$GUM_PATH" style " $("$GUM_PATH" style --foreground="#d1d100" "◆") $("$GUM_PATH" style --bold "$(format "$2")")"
elif [ "$1" == 'start' ]; then
"$GUM_PATH" style " $("$GUM_PATH" style --foreground="#00ff00" "▶") $("$GUM_PATH" style --bold "$(format "$2")")"
elif [ "$1" == 'success' ]; then
"$GUM_PATH" style "$("$GUM_PATH" style --foreground="#00ff00" "✔") $("$GUM_PATH" style --bold "$(format "$2")")"
elif [ "$1" == 'warn' ]; then
"$GUM_PATH" style " $("$GUM_PATH" style --foreground="#d1d100" "◆") $("$GUM_PATH" style --bold --background="#ffff00" --foreground="#000000" " WARNING ") $("$GUM_PATH" style --bold --italic "$(format "$2")")"
"$GUM_PATH" style " $("$GUM_PATH" style --foreground="#d1d100" "◆") $("$GUM_PATH" style --bold --background="#ffff00" --foreground="#000000" " WARNING ") $("$GUM_PATH" style --bold "$(format "$2")")"
else
echo "WARNING: Unknown log type"
echo "$2"
"$GUM_PATH" style " $("$GUM_PATH" style --foreground="#00ff00" "▶") $("$GUM_PATH" style --bold "$(format "$2")")"
fi
}
format() {
# shellcheck disable=SC2001,SC2016
ANSI_STR="$(echo "$1" | sed 's/^\([^`]*\)`\([^`]*\)`/\1\\u001b[47;1;30m \2 \\e[0;39m/')"
if [[ $ANSI_STR == *'`'*'`'* ]]; then
ANSI_STR="$(format "$ANSI_STR")"
ANSI_STR_FORMATTED="$(echo "$1" | sed 's/^\([^`]*\)`\([^`]*\)`.*/\1\\u001b[47;30m \2 \\e[49;m/')"
ANSI_STR="$(echo "$1" | sed 's/^\([^`]*\)`\([^`]*\)`\(.*\)$/\3/')"
if [ "$ANSI_STR_FORMATTED" != "$ANSI_STR" ]; then
if [[ $ANSI_STR == *'`'*'`'* ]]; then
ANSI_STR_FORMATTED="$ANSI_STR_FORMATTED$(format "$("$GUM_PATH" style --bold "$ANSI_STR")")"
else
ANSI_STR_FORMATTED="$("$GUM_PATH" style --bold "$ANSI_STR")"
fi
fi
echo -e "$ANSI_STR"
echo -e "$ANSI_STR_FORMATTED"
}
formatFaint() {
# shellcheck disable=SC2001,SC2016
ANSI_STR_FORMATTED="$(echo "$1" | sed 's/^\([^`]*\)`\([^`]*\)`.*/\1\\u001b[47;30m \2 \\e[49;m/')"
ANSI_STR="$(echo "$1" | sed 's/^\([^`]*\)`\([^`]*\)`\(.*\)$/\3/')"
if [ "$ANSI_STR_FORMATTED" != "$ANSI_STR" ]; then
if [[ $ANSI_STR == *'`'*'`'* ]]; then
ANSI_STR_FORMATTED="$ANSI_STR_FORMATTED$(formatFaint "$("$GUM_PATH" style --faint "$ANSI_STR")")"
else
ANSI_STR_FORMATTED="$ANSI_STR_FORMATTED$("$GUM_PATH" style --faint "$ANSI_STR")"
fi
fi
echo -e "$ANSI_STR_FORMATTED"
}
# @description Display prompt that allows you to choose between options
@ -389,5 +407,7 @@ elif [ -n "$1" ]; then
# Public functions that can run with only one argument passed to .config/log (i.e. `.config/log password`)
if [ "$1" == 'write' ] || [ "$1" == 'password' ] || [ "$1" == 'confirm' ] || [ "$1" == 'input' ]; then
"$1"
else
info "$1"
fi
fi

View file

@ -1,183 +1,30 @@
#!/usr/bin/env bash
set -eo pipefail
### Qubes dom0 specific code at top
# The VM name that will manage the Ansible provisioning (for Qubes dom0)
ANSIBLE_PROVISION_VM="provision"
# Ensure sys-whonix is configured (for Qubes dom0)
CONFIG_WIZARD_COUNT=0
ENABLE_OBFSC='false'
function configureWizard() {
if xwininfo -root -tree | grep "Anon Connection Wizard"; then
WINDOW_ID="$(xwininfo -root -tree | grep "Anon Connection Wizard" | sed 's/^ *\([^ ]*\) .*/\1/')"
xdotool windowactivate "$WINDOW_ID" && sleep 1 && xdotool key 'Enter' && sleep 1 && xdotool key 'Tab Tab Enter' && sleep 24 && xdotool windowactivate "$WINDOW_ID" && sleep 1 && xdotool key 'Enter' && sleep 300
qvm-shutdown --wait sys-whonix
sleep 3
qvm-start sys-whonix
if xwininfo -root -tree | grep "systemcheck | Whonix" > /dev/null; then
WINDOW_ID_SYSCHECK="$(xwininfo -root -tree | grep "systemcheck | Whonix" | sed 's/^ *\([^ ]*\) .*/\1/')"
if xdotool windowactivate "$WINDOW_ID_SYS_CHECK"; then
sleep 1
xdotool key 'Enter'
fi
fi
# Install Homebrew
if ! type brew &> /dev/null; then
if type sudo &> /dev/null && sudo -n true; then
echo | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
else
sleep 3
CONFIG_WIZARD_COUNT=$((CONFIG_WIZARD_COUNT + 1))
if [[ "$CONFIG_WIZARD_COUNT" == '4' ]]; then
echo "The sys-whonix anon-connection-wizard utility did not open."
else
echo "Checking for anon-connection-wizard again.."
configureWizard
fi
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
}
### Update via system package manager and install Homebrew dependencies
if command -v qubesctl > /dev/null; then
# Qubes dom0
### Ensure dom0 is updated
if [ ! -f /root/dom0-updated ]; then
sudo qubesctl --show-output state.sls update.qubes-dom0
sudo qubes-dom0-update --clean -y
touch /root/dom0-updated
fi
### Ensure sys-whonix is running
if ! qvm-check --running sys-whonix; then
qvm-start sys-whonix --skip-if-running
configureWizard > /dev/null
fi
### Ensure TemplateVMs are updated
if [ ! -f /root/templatevms-updated ]; then
# timeout of 10 minutes is added here because the whonix-gw VM does not like to get updated
# with this method. Anyone know how to fix this?
sudo timeout 600 qubesctl --show-output --skip-dom0 --templates state.sls update.qubes-vm &> /dev/null || EXIT_CODE=$?
while read RESTART_VM; do
qvm-shutdown --wait "$RESTART_VM"
done< <(qvm-ls --all --no-spinner --fields=name,state | grep Running | grep -v sys-net | grep -v sys-firewall | grep -v sys-whonix | grep -v dom0 | awk '{print $1}')
sudo touch /root/templatevms-updated
fi
### Ensure provisioning VM can run commands on any VM
echo "/bin/bash" | sudo tee /etc/qubes-rpc/qubes.VMShell
sudo chmod 755 /etc/qubes-rpc/qubes.VMShell
echo "$ANSIBLE_PROVISION_VM"' dom0 allow' | sudo tee /etc/qubes-rpc/policy/qubes.VMShell
echo "$ANSIBLE_PROVISION_VM"' $anyvm allow' | sudo tee -a /etc/qubes-rpc/policy/qubes.VMShell
sudo chown "$(whoami):$(whoami)" /etc/qubes-rpc/policy/qubes.VMShell
sudo chmod 644 /etc/qubes-rpc/policy/qubes.VMShell
### Create provisioning VM and initialize the provisioning process from there
qvm-create --label red --template debian-11 "$ANSIBLE_PROVISION_VM" &> /dev/null || EXIT_CODE=$?
qvm-volume extend "$ANSIBLE_PROVISION_VM:private" "40G"
if [ -f ~/.vaultpass ]; then
qvm-run "$ANSIBLE_PROVISION_VM" 'rm -f ~/QubesIncoming/dom0/.vaultpass'
qvm-copy-to-vm "$ANSIBLE_PROVISION_VM" ~/.vaultpass
qvm-run "$ANSIBLE_PROVISION_VM" 'cp ~/QubesIncoming/dom0/.vaultpass ~/.vaultpass'
fi
qvm-run --pass-io "$ANSIBLE_PROVISION_VM" 'curl -sSL https://install.doctor/start > ~/start.sh && bash ~/start.sh'
exit 0
elif command -v apt-get > /dev/null; then
# Debian / Ubuntu
sudo apt-get update
sudo apt-get install -y curl git
elif command -v dnf > /dev/null; then
# Fedora
sudo dnf install -y curl git
elif command -v yum > /dev/null; then
# CentOS
sudo yum install -y curl git
elif command -v pacman > /dev/null; then
# Archlinux
sudo pacman update
sudo pacman -Sy curl git
elif command -v zypper > /dev/null; then
# OpenSUSE
sudo zypper install -y curl git nodejs
elif command -v apk > /dev/null; then
# Alpine
apk add curl git
elif [ -d /Applications ] && [ -d /Library ]; then
# macOS
sudo xcode-select -p >/dev/null 2>&1 || xcode-select --install
elif command -v nix-env > /dev/null; then
# NixOS
elif [[ "$OSTYPE" == 'freebsd'* ]]; then
# FreeBSD
elif command -v pkg > /dev/null; then
# Termux
elif command -v xbps-install > /dev/null; then
# Void
elif [[ "$OSTYPE" == 'cygwin' ]] || [[ "$OSTYPE" == 'msys' ]] || [[ "$OSTYPE" == 'win32' ]]; then
# Windows
choco install -y curl git node
fi
### Install Homebrew
ensurePackageManagerHomebrew() {
if ! command -v brew > /dev/null; then
if command -v sudo > /dev/null && sudo -n true; then
echo | bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
else
logg info 'Homebrew is not installed. Password may be required.'
bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" || BREW_EXIT_CODE="$?"
if [ -n "$BREW_EXIT_CODE" ]; then
if command -v brew > /dev/null; then
logg warn 'Homebrew was installed but part of the installation failed. Attempting to fix..'
BREW_DIRS="share/man share/doc share/zsh/site-functions etc/bash_completion.d"
for BREW_DIR in $BREW_DIRS; do
if [ -d "$(brew --prefix)/$BREW_DIR" ]; then
sudo chown -R "$(whoami)" "$(brew --prefix)/$BREW_DIR"
fi
done
brew update --force --quiet
fi
fi
fi
fi
}
ensurePackageManagerHomebrew
# Install Homebrew bundle and go-task
brew install go-task/tap/go-task
brew install jq
brew install yq
### Install installer dependencies via Homebrew
if command -v brew > /dev/null; then
brew install chezmoi go-task/tap/go-task jq node yq zx
fi
### Ensure source files are present
if [ -d /usr/local/src/hiawatha ] && [ ! -w /usr/local/src/hiawatha ]; then
sudo chown -Rf "$USER":"$(id -g -n)" /usr/local/src/hiawatha
fi
if [ -d /usr/local/src/hiawatha/.git ]; then
git config pull.rebase false
git pull origin master
# Ensure dotfiles are present
if [ ! -f "$HOME/.local/bin/install-dotfiles" ]; then
bash <(curl -sSL https://gitlab.com/megabyte-labs/misc/dotfiles/-/raw/master/dotfiles/.local/bin/install-dotfiles)
else
rm -rf /usr/local/src/hiawatha
sudo git clone https://gitlab.com/megabyte-labs/dotfiles.git /usr/local/src/hiawatha
chown -Rf "$USER":"$(id -g -n)" /usr/local/src/hiawatha
chmod +x "$HOME/.local/bin/install-dotfiles"
install-dotfiles
fi
### Copy folders
find /usr/local/src/hiawatha -maxdepth 1 -mindepth 1 -type d | while read FOLDER; do
BASENAME="$(basename "$FOLDER")"
if [ ! -d "$HOME/$BASENAME" ]; then
mkdir -p "$HOME/$BASENAME"
fi
cp -rf "$FOLDER/"* "$HOME/$BASENAME"
done
### Copy files
find /usr/local/src/hiawatha -maxdepth 1 -mindepth 1 -type f | while read FILE; do
BASENAME="$(basename "$FILE")"
cp "$FILE" "$HOME/$BASENAME"
chmod 600 "$HOME/$BASENAME"
done
### Ensure ~/.local/bin files are executable
find "$HOME/.local/bin" -maxdepth 1 -mindepth 1 -type f | while read BINFILE; do
chmod +x "$BINFILE"
done
# Use run alias to invoke the `$HOME/.local/Taskfile.yml`
if [ -z "$1" ]; then
run localhost:provision
else
run "localhost:provision:$1"
fi

View file

@ -1,3 +1,3 @@
#!/usr/bin/env bash
task --taskfile $HOME/.local/common/shared/Taskfile.yml $@
task --taskfile $HOME/.local/src/shared-common/Taskfile.yml $@

2
.local/bin/slack Normal file
View file

@ -0,0 +1,2 @@
#!/bin/bash
exec firejail /usr/bin/slack --enable-features=UseOzonePlatform,WebRTCPipeWireCapturer --ozone-platform=wayland &> /dev/null &

669
.local/scripts/motd.bash Normal file
View file

@ -0,0 +1,669 @@
#!/usr/bin/env bash
# shellcheck disable=SC1090,SC1091
BAR_ELEMENT="-"
BAR_HEALTHY_COLOR="32"
BAR_WARNING_THRESHOLD=70
BAR_WARNING_COLOR="33"
BAR_CRITICAL_THRESHOLD=90
BAR_CRITICAL_COLOR="31"
BANNER_KERNEL_ICON=""
BANNER_KERNEL_COLOR="33"
BANNER_UPTIME_ICON=""
BANNER_UPTIME_COLOR="94"
BANNER_DEBIAN_ICON=""
BANNER_DEBIAN_COLOR="95"
BANNER_FEDORA_ICON=""
BANNER_FEDORA_COLOR="34"
BANNER_FONTPATH=""
BANNER_TEXT="$(hostname -s)"
PROCESSOR_LOADAVG_ICON="ﲯ"
PROCESSOR_LOADAVG_HEALTHY_COLOR="32"
PROCESSOR_LOADAVG_WARNING_THRESHOLD=2
PROCESSOR_LOADAVG_WARNING_COLOR="33"
PROCESSOR_LOADAVG_CRITICAL_THRESHOLD=4
PROCESSOR_LOADAVG_CRITICAL_COLOR="31"
PROCESSOR_MODEL_ICON=""
MEMORY_ICON=""
SWAP_ICON=""
DISKSPACE_ICON=""
SERVICES_UP_ICON=""
SERVICES_UP_COLOR="32"
SERVICES_DOWN_ICON=""
SERVICES_DOWN_COLOR="31"
SERVICES_FILE=".bashrc_motd_services.txt"
# TODO - Fill this in if Podman is ever used
PODMAN_VERSION_ICON="#"
PODMAN_IMAGES_ICON="#"
PODMAN_RUNNING_ICON="#"
PODMAN_RUNNING_COLOR="32"
PODMAN_OTHER_ICON="#"
PODMAN_OTHER_COLOR="90"
DOCKER_VERSION_ICON=""
DOCKER_IMAGES_ICON=""
DOCKER_RUNNING_ICON=""
DOCKER_RUNNING_COLOR="32"
DOCKER_OTHER_ICON=""
DOCKER_OTHER_COLOR="90"
UPDATES_ZERO_ICON=""
UPDATES_ZERO_COLOR="32"
UPDATES_AVAILIABLE_ICON="ﮮ"
UPDATES_AVAILIABLE_COLOR="33"
UPDATES_SECURITY_ICON="撚"
UPDATES_SECURITY_COLOR="31"
LETSENCRYPT_VALID_ICON="ﲘ"
LETSENCRYPT_VALID_COLOR="32"
LETSENCRYPT_WARNING_ICON="ﲙ"
LETSENCRYPT_WARNING_COLOR="33"
LETSENCRYPT_INVALID_ICON=""
LETSENCRYPT_INVALID_COLOR="31"
LETSENCRYPT_CERTPATH="/etc/letsencrypt/live"
LOGIN_LOGIN_ICON="﫻"
LOGIN_LOGOUT_ICON="﫼"
LOGIN_IP_ICON="ﯱ"
INCLUDE_FILE="ownscript.sh"
generate_unit_byte() {
# 1 - unit in M
if [ "$1" -ge 1024 ]; then
unit_symbol="G"
unit_value=$(echo "$1/1024" | bc -l | LANG=C xargs printf "%.1f\n")
else
unit_symbol="M"
unit_value=$1
fi
echo "$unit_value$unit_symbol"
}
generate_space() {
# 1 - already used
# 2 - total
space_fill=$(($2 - ${#1}))
space_chars=""
while [ $space_fill -ge 0 ]; do
space_chars="$space_chars "
space_fill=$((space_fill - 1))
done
echo "$space_chars"
}
generate_bar() {
# 1 - icon
# 2 - total
# 3 - used_1
# 4 - [ used_2 ]
bar_percent=$(($3 * 100 / $2))
bar_separator=$(($3 * 100 * 10 / $2 / 25))
if [ $bar_percent -ge "$BAR_WARNING_THRESHOLD" ]; then
bar_color=$BAR_WARNING_COLOR
elif [ $bar_percent -ge "$BAR_CRITICAL_THRESHOLD" ]; then
bar_color=$BAR_CRITICAL_COLOR
else
bar_color=$BAR_HEALTHY_COLOR
fi
printf " %s \\033[%dm" "$1" "$bar_color"
if [ -z "$4" ]; then
bar_piece=0
while [ $bar_piece -le 40 ]; do
if [ "$bar_piece" -ne "$bar_separator" ]; then
printf "%s" "$BAR_ELEMENT"
else
printf "%s\\033[1;30m" "$BAR_ELEMENT"
fi
bar_piece=$((bar_piece + 1))
done
else
bar_cached_val=$(($3 + $4))
bar_cached_separator=$((bar_cached_val * 100 * 10 / $2 / 25))
bar_piece=0
while [ $bar_piece -le 40 ]; do
if [ $bar_piece -eq $bar_separator ]; then
printf "%s\\033[1;36m" "$BAR_ELEMENT"
elif [ $bar_piece -eq $bar_cached_separator ]; then
printf "%s\\033[1;30m" "$BAR_ELEMENT"
else
printf "%s" "$BAR_ELEMENT"
fi
bar_piece=$((bar_piece + 1))
done
fi
printf "\\033[0m\\n"
}
generate_bar_memory() {
# 1 - icon
# 2 - total memory in M
# 3 - used memory in M
# 4 - cached memory in M
bar_memory_used=$(generate_unit_byte "$3")
bar_memory_cached=$(generate_unit_byte "$4")
bar_memory_available=$(generate_unit_byte $(($2 - $3)))
printf " %s used / %s cached / %s available\\n" "$bar_memory_used" "$bar_memory_cached" "$bar_memory_available"
generate_bar "$1" "$2" "$3" "$4"
}
generate_bar_swap() {
# 1 - icon
# 2 - total swap in M
# 3 - used swap in M
bar_swap_used=$(generate_unit_byte "$3")
bar_swap_available=$(($2 - $3))
bar_swap_available=$(generate_unit_byte "$bar_swap_available")
printf " %s used / %s available\\n" "$bar_swap_used" "$bar_swap_available"
generate_bar "$1" "$2" "$3"
}
generate_bar_disk() {
# 1 - icon
# 2 - total size in M
# 3 - used space in M
# 4 - mount path
bar_disk_mount="$4$(generate_space "$4" 10)"
bar_disk_used="$(generate_unit_byte "$3")"
bar_disk_used="$(generate_space "$bar_disk_used" 5)$bar_disk_used used"
bar_disk_available="$(($2 - $3))"
bar_disk_available="$(generate_unit_byte "$bar_disk_available") available"
printf " %s%s / %s\\n" "$bar_disk_mount" "$bar_disk_used" "$bar_disk_available"
generate_bar "$1" "$2" "$3"
}
print_banner() {
if command -v lolcat >/dev/null && command -v figlet >/dev/null; then
if [[ "${#HOSTNAME}" -lt 14 ]]; then
figlet "$(hostname)" | lolcat -f
else
printf "\\n"
printf " \\033[1;37mHostname:\\033[0m %s\\n" "$(hostname)"
fi
elif command -v figlet >/dev/null; then
printf "\\n%s\\n" "$(figlet -t -f "$BANNER_FONTPATH" " $BANNER_TEXT")"
else
printf "\\n"
printf " \\033[1;37mHostname:\\033[0m %s\\n" "$(hostname)"
fi
if [ -f /etc/os-release ]; then
. /etc/os-release
if [ "$ID" = "debian" ]; then
banner_distro_icon="$BANNER_DEBIAN_ICON"
banner_distro_color="$BANNER_DEBIAN_COLOR"
banner_distro_name="Debian"
banner_distro_version="$(cat /etc/debian_version)"
elif [ "$ID" = "fedora" ]; then
banner_distro_icon="$BANNER_FEDORA_ICON"
banner_distro_color="$BANNER_FEDORA_COLOR"
banner_distro_name="Fedora"
banner_distro_version="$VERSION_ID"
else
banner_distro_icon="$OS_ICON"
banner_distro_color="0"
if [ -n "$NAME" ]; then
banner_distro_name="$NAME"
elif [ -n "$PRETTY_NAME" ]; then
banner_distro_name="$PRETTY_NAME"
else
banner_distro_name="Linux"
fi
if [ -n "$VERSION" ]; then
banner_distro_version="$VERSION"
elif [ -n "$VERSION_ID" ]; then
banner_distro_version="$VERSION_ID"
elif [ -n "$BUILD_ID" ]; then
banner_distro_version="$BUILD_ID"
else
banner_distro_version="Version Unknown"
fi
fi
banner_distro_space="$(generate_space "$banner_distro_name" 13)"
if [ "$(hostname)" = 'dom0' ]; then
# Qubes dom0
banner_distro_space="$(generate_space "$NAME" 13)"
printf " \\033[%sm%s %s\\033[0m%s%s\\n" "$banner_distro_color" "" "$NAME" "$banner_distro_space" "$VERSION"
else
printf " \\033[%sm%s %s\\033[0m%s%s\\n" "$banner_distro_color" "$banner_distro_icon" "$banner_distro_name" "$banner_distro_space" "$banner_distro_version"
fi
printf " \\033[%sm%s Linux\\033[0m %s\\n" "$BANNER_KERNEL_COLOR" "$BANNER_KERNEL_ICON" "$(cut -d ' ' -f 3 </proc/version)"
printf " \\033[%sm%s Uptime\\033[0m %s\\n" "$BANNER_UPTIME_COLOR" "$BANNER_UPTIME_ICON" "$(uptime -p | cut -d ' ' -f 2-)"
else
if [ -d '/Applications' ] && [ -d '/System' ]; then
printf " \\033[%sm%s OS \\033[0m %s\\n" "$UPDATES_ZERO_COLOR" "" "macOS $(sw_vers -productVersion) / Build $(sw_vers -buildVersion)"
printf " \\033[%sm%s UUID \\033[0m %s\\n" "$PODMAN_RUNNING_COLOR" "" "$(ioreg -d2 -c IOPlatformExpertDevice | awk -F\" '/IOPlatformUUID/{print $(NF-1)}')"
printf " \\033[%sm%s LAN IP \\033[0m %s\\n" "$BANNER_KERNEL_COLOR" "ﯱ" "$(ifconfig en0 2>/dev/null | grep 'inet ' | cut -d ' ' -f 2)"
IP_ADDR_PUB="$(timeout 1 sh -c 'curl -sSL ifconfig.me')"
if [ -n "$IP_ADDR_PUB" ]; then
printf " \\033[%sm%s Public IP\\033[0m %s\\n" "$UPDATES_SECURITY_COLOR" "" "$IP_ADDR_PUB"
fi
fi
fi
}
print_processor() {
printf "\\n"
printf " \\033[1;37mProcessor:\\033[0m\\n"
processor_loadavg="$(cut -d " " -f 1,2,3 </proc/loadavg)"
if [ "$(echo "$processor_loadavg" | cut -d "." -f 1)" -ge "$PROCESSOR_LOADAVG_CRITICAL_THRESHOLD" ]; then
processor_loadavg_color="$PROCESSOR_LOADAVG_CRITICAL_COLOR"
elif [ "$(echo "$processor_loadavg" | cut -d "." -f 1)" -ge "$PROCESSOR_LOADAVG_WARNING_THRESHOLD" ]; then
processor_loadavg_color="$PROCESSOR_LOADAVG_WARNING_COLOR"
else
processor_loadavg_color="$PROCESSOR_LOADAVG_HEALTHY_COLOR"
fi
processor_info=$(cat /proc/cpuinfo)
processor_arch=$(uname -m)
if [ "$processor_arch" = "x86_64" ]; then
processor_model="$(echo "$processor_info" | grep "model name" | sort -u | cut -d ':' -f 2)"
processor_count=$(echo "$processor_info" | grep "physical id" | sort -u | wc -l)
processor_cores=$(echo "$processor_info" | grep "cpu cores" | sort -u | cut -d ':' -f 2)
processor_threads=$(($(echo "$processor_info" | grep "siblings" | tail -n 1 | cut -d ':' -f 2)))
if [ ! "$processor_cores" -eq $processor_threads ]; then
processor_threads=", $processor_threads Threads"
else
processor_threads=""
fi
elif [ "$processor_arch" = "mips64" ]; then
processor_model="$(echo "$processor_info" | grep "cpu model" | sort -u | cut -d ':' -f 2)"
processor_count=$(echo "$processor_info" | grep "package" | sort -u | wc -l)
processor_cores=$(echo "$processor_info" | grep -c processor)
processor_threads=""
else
processor_model="?"
processor_count=0
processor_cores=0
processor_threads=0
fi
processor_model="${processor_model//\(R\)/}"
processor_model="${processor_model//\(tm\)/}"
processor_model="${processor_model// @/,}"
processor_model="${processor_model// CPU/}"
processor_model="${processor_model// / }"
# shellcheck disable=SC2001
processor_model="$(echo "$processor_model" | sed "s/^ //g")"
processor_cores=$((processor_cores * processor_count))
if [ "$processor_count" -gt 1 ]; then
processor_count="$processor_count""x "
else
processor_count=""
fi
printf " %s \\033[%dm%s\\033[0m\\n" "$PROCESSOR_LOADAVG_ICON" "$processor_loadavg_color" "$processor_loadavg"
printf " %s %s%s = %s Cores%s\\n" "$PROCESSOR_MODEL_ICON" "$processor_count" "$processor_model" "$processor_cores" "$processor_threads"
}
print_memory() {
printf "\\n"
printf " \\033[1;37mMemory:\\033[0m\\n"
memory_usage=$(LANG=C free --mega | grep "Mem:")
memory_total=$(echo "$memory_usage" | awk '{ print $2 }')
memory_used=$(echo "$memory_usage" | awk '{ print $3 }')
memory_cached=$(echo "$memory_usage" | awk '{ print $6 }')
generate_bar_memory "$MEMORY_ICON" "$memory_total" "$memory_used" "$memory_cached"
}
print_swap() {
swap_usage=$(LANG=C free --mega | grep "Swap:")
swap_total=$(echo "$swap_usage" | awk '{ print $2 }')
swap_used=$(echo "$swap_usage" | awk '{ print $3 }')
if [ "$swap_total" -ne 0 ]; then
printf "\\n"
printf " \\033[1;37mSwap:\\033[0m\\n"
generate_bar_swap "$SWAP_ICON" "$swap_total" "$swap_used"
fi
}
print_diskspace() {
if command -v jq >/dev/null; then
printf "\\n"
printf " \\033[1;37mDiskspace:\\033[0m\\n"
diskspace_devices=$(lsblk -Jlo NAME,MOUNTPOINT | jq -c '.blockdevices | sort_by(.mountpoint) | .[] | select( .mountpoint != null and .mountpoint != "[SWAP]" )')
diskspace_partitions=$(df -B M 2> /dev/null | sed -e "s/M//g")
diskspace_index=0
echo "$diskspace_devices" | while read -r line; do
diskspace_disk_name="$(echo "$line" | jq -r '.name')"
diskspace_disk_mount="$(echo "$line" | jq -r '.mountpoint')"
diskspace_disk_size="$(echo "$diskspace_partitions" | grep "$diskspace_disk_name " | awk '{ print $2 }')"
diskspace_disk_used="$(echo "$diskspace_partitions" | grep "$diskspace_disk_name " | awk '{ print $3 }')"
if [[ "$diskspace_disk_mount" != '/var/lib/snapd/snap'* ]] && [[ "$diskspace_disk_mount" != '/snap/'* ]]; then
if [ -z "$diskspace_disk_size" ]; then
diskspace_disk_size="$(echo "$diskspace_partitions" | grep "$diskspace_disk_mount" | awk '{ print $2 }')"
fi
if [ -z "$diskspace_disk_used" ]; then
diskspace_disk_used="$(echo "$diskspace_partitions" | grep "$diskspace_disk_mount" | awk '{ print $3 }')"
fi
if [ "$diskspace_index" -ne 0 ]; then
printf "\\n"
fi
diskspace_index=$((diskspace_index + 1))
generate_bar_disk "$DISKSPACE_ICON" "$diskspace_disk_size" "$diskspace_disk_used" "$diskspace_disk_mount"
fi
done
fi
}
print_services() {
if [ -f $SERVICES_FILE ] && [ "$(wc -l <$SERVICES_FILE)" != 0 ]; then
printf "\\n"
printf " \\033[1;37mServices:\\033[0m \\033[1;37mVersion:\\033[0m\\n"
while read -r line; do
service_description=$(echo "$line" | cut -d ';' -f 1)
service_name=$(echo "$line" | cut -d ';' -f 2)
service_package=$(echo "$line" | cut -d ';' -f 3)
if [ -n "$service_description" ] && [ -n "$service_name" ]; then
if systemctl is-active --quiet "$service_name".service; then
service_icon="$SERVICES_UP_ICON"
service_color="$SERVICES_UP_COLOR"
else
service_icon="$SERVICES_DOWN_ICON"
service_color="$SERVICES_DOWN_COLOR"
fi
service_space=$(generate_space "$service_description" 34)
if [ -n "$service_package" ]; then
if [ -f /usr/bin/apt ]; then
package_version=$(dpkg -s "$service_package" | grep '^Version:' | cut -d ' ' -f 2 | cut -d ':' -f 2 | cut -d '-' -f 1)
elif [ -f /usr/bin/rpm ]; then
package_version=$(rpm -q --queryformat '%{VERSION}' "$service_package")
else
package_version="?"
fi
else
package_version="--"
fi
fi
printf " \\033[%sm%s\\033[0m %s%s%s\\n" "$service_color" "$service_icon" "$service_description" "$service_space" "$package_version"
done <"$SERVICES_FILE" | grep -v '#'
fi
}
print_podman() {
if command -v jq >/dev/null; then
printf "\\n"
printf " \\033[1;37mPodman:\\033[0m\\n"
podman_version="$(sudo podman version --format json | jq -r '.Client.Version')"
podman_space="$(generate_space "$podman_version" 23)"
podman_images="$(sudo podman images --format json | jq '. | length')"
printf " %s Version %s%s%s %s Images\\n\\n" "$PODMAN_VERSION_ICON" "$podman_version" "$podman_space" "$PODMAN_IMAGES_ICON" "$podman_images"
podman_list=$(sudo podman pod ls --sort name --format json)
podman_pods=$(echo "$podman_list" | jq -r '.[] .Name')
echo "$podman_pods" | while read -r pod; do
if [ "$(echo "$podman_list" | jq -r ".[] | select(.Name == \"$pod\") | .Status")" = "Running" ]; then
pod_space=$(generate_space "$pod" 34)
pod_container_running="$(echo "$podman_list" | jq -r ".[] | select(.Name == \"$pod\") | .Containers[] | select(.Status == \"running\") | .Status" | wc -l)"
if [ "$pod_container_running" -ne 0 ]; then
pod_container_running=$(printf "\\033[%um%u Running\\033[0m" "$PODMAN_RUNNING_COLOR" "$pod_container_running")
fi
pod_container_other="$(echo "$podman_list" | jq -r ".[] | select(.Name == \"$pod\") | .Containers[] | select(.Status != \"running\") | .Status" | wc -l)"
if [ "$pod_container_other" -ne 0 ]; then
pod_container_other=$(printf ", \\033[%um%u Other\\033[0m" "$PODMAN_OTHER_COLOR" "$pod_container_other")
else
pod_container_other=""
fi
pod_status="$pod_container_running$pod_container_other"
printf " \\033[%um%s\\033[0m %s%s%s\\n" "$PODMAN_RUNNING_COLOR" "$PODMAN_RUNNING_ICON" "$pod" "$pod_space" "$pod_status"
else
printf " \\033[%um%s\\033[0m \\033[%um%s\\033[0m\\n" "$PODMAN_OTHER_COLOR" "$PODMAN_OTHER_ICON" "$PODMAN_OTHER_COLOR" "$pod"
fi
done
fi
}
print_docker() {
if command -v jq >/dev/null && [ "$(systemctl is-active docker.service)" = "active" ]; then
printf "\\n"
printf " \\033[1;37mDocker:\\033[0m\\n"
docker_info=$(sudo curl -sf --unix-socket /var/run/docker.sock http:/v1.40/info)
docker_version=$(echo "$docker_info" | jq -r '.ServerVersion')
docker_space=$(generate_space "$docker_version" 23)
docker_images=$(echo "$docker_info" | jq -r '.Images')
printf " %s Version %s%s%s %s Images\\n" "$DOCKER_VERSION_ICON" "$docker_version" "$docker_space" "$DOCKER_IMAGES_ICON" "$docker_images"
docker_list_curl="$(sudo curl -sf --unix-socket /var/run/docker.sock "http://v1.40/containers/json?all=true")"
docker_list_curl_length="$(echo "$docker_list_curl" | jq -c '. | length')"
docker_list="$(echo "$docker_list_curl" | jq -c ' .[]')"
if [ "$docker_list_curl_length" != '0' ]; then
echo "$docker_list" | while read -r line; do
container_name="$(echo "$line" | jq -r '.Names[]' | sed 's/\///')"
container_status="$(echo "$line" | jq -r '.Status' | sed 's/.*/\l&/')"
container_space=$(generate_space "$container_name" 34)
if [ "$(echo "$line" | jq -r '.State')" = "running" ]; then
printf " \\033[%um%s\\033[0m %s%s%s\\n" "$DOCKER_RUNNING_COLOR" "$DOCKER_RUNNING_ICON" "$container_name" "$container_space" "$container_status"
else
printf " \\033[%um%s\\033[0m \\033[%um%s\\033[0m%s\\033[%um%s\\033[0m\\n" "$DOCKER_OTHER_COLOR" "$DOCKER_OTHER_ICON" "$DOCKER_OTHER_COLOR" "$container_name" "$container_space" "$DOCKER_OTHER_COLOR" "$container_status"
fi
done
fi
fi
}
print_updates() {
printf "\\n"
printf " \\033[1;37mHealth:\\033[0m\\n"
if [ -f /usr/bin/apt ]; then
updates_count_regular=$(apt-get -qq -y --ignore-hold --allow-change-held-packages --allow-unauthenticated -s dist-upgrade | grep ^Inst | grep -c -v Security)
updates_count_security=$(apt-get -qq -y --ignore-hold --allow-change-held-packages --allow-unauthenticated -s dist-upgrade | grep ^Inst | grep -c Security)
if [ "$updates_count_regular" -ne 0 ]; then
if [ -n "$updates_count_security" ] && [ "$updates_count_security" -ne 0 ]; then
updates_icon=$UPDATES_SECURITY_ICON
updates_color=$UPDATES_SECURITY_COLOR
updates_message="$updates_count_regular packages can be updated, $updates_count_security are security updates."
else
updates_icon=$UPDATES_AVAILIABLE_ICON
updates_color=$UPDATES_AVAILIABLE_COLOR
updates_message="$updates_count_regular packages can be updated."
fi
else
updates_icon=$UPDATES_ZERO_ICON
updates_color=$UPDATES_ZERO_COLOR
updates_message="The system apt packages are up-to-date!"
fi
printf " \\033[%sm%s \\033[0m %s\\n" "$updates_color" "$updates_icon" "$updates_message"
elif [ -f /usr/bin/dnfTODO ]; then
# TODO - Find way of quickly acquiring details
mkdir -p "$HOME/.local/labs" > /dev/null
(command dnf list updates | grep updates | wc -l > "$HOME/.local/labs/dnf-updates-reg" &)
(command dnf updateinfo list --security --available | grep '/Sec. ' | wc -l > "$HOME/.local/labs/dnf-updates-sec" &)
updates_count_security="0"
updates_count_reg="0"
if [ -f "$HOME/.local/labs/dnf-updates-sec" ]; then
updates_count_security="$(cat "$HOME/.local/labs/dnf-updates-sec")"
fi
if [ -f "$HOME/.local/labs/dnf-updates-reg" ]; then
updates_count_reg="$(cat "$HOME/.local/labs/dnf-updates-reg")"
fi
if [ -n "$updates_count_regular" ] && [ "$updates_count_regular" -ne 0 ]; then
if [ -n "$updates_count_security" ] && [ "$updates_count_security" -ne 0 ]; then
updates_icon=$UPDATES_SECURITY_ICON
updates_color=$UPDATES_SECURITY_COLOR
updates_message="$(generate_space "$updates_count_regular" 5) packages can be updated, $updates_count_security are security updates."
else
updates_icon=$UPDATES_AVAILIABLE_ICON
updates_color=$UPDATES_AVAILIABLE_COLOR
updates_message="$(generate_space "$bar_disk_used" 5) packages can be updated."
fi
else
updates_icon=$UPDATES_ZERO_ICON
updates_color=$UPDATES_ZERO_COLOR
updates_message="The system dnf packages are up-to-date!"
fi
printf " \\033[%sm%s \\033[0m %s\\n" "$updates_color" "$updates_icon" "$updates_message"
fi
if command -v systemctl > /dev/null; then
running_services_count="$(systemctl --type=service --plain | grep 'active running' | wc -l)"
failed_services_count="$(systemctl --type=service --failed | grep 'failed failed' | wc -l)"
if [ "$failed_services_count" -eq 0 ]; then
printf " \\033[%sm%s \\033[0m All enabled services are running!\\n" "32" ""
elif [ "$failed_services_count" -eq 1 ]; then
printf " \\033[%sm%s \\033[0m %s services are are currently running\\n" "32" "" "$running_services_count"
printf " \\033[%sm%s \\033[0m 1 service failed to start (%s)\\n" "31" "" "$(systemctl --type=service --failed | grep 'failed failed' | sed 's/..\([^ ]*\).service.*/\1/')"
elif [ "$failed_services_count" -gt 1 ]; then
printf " \\033[%sm%s \\033[0m %s services are are currently running\\n" "32" "" "$running_services_count"
printf " \\033[%sm%s \\033[0m %s services failed to start (see \`systemctl --type=service\`)\\n" "31" "" "$failed_services_count"
fi
fi
}
print_letsencrypt() {
if [ -d $LETSENCRYPT_CERTPATH ] && [ "$(ls -a $LETSENCRYPT_CERTPATH)" ]; then
printf "\\n"
printf " \\033[1;37mSSL / lets encrypt:\\033[0m\\n"
cert_list=$(sudo find $LETSENCRYPT_CERTPATH -name cert.pem)
for cert_file in $cert_list; do
sudo openssl x509 -checkend $((25 * 86400)) -noout -in "$cert_file" >>/dev/null
result=$?
cert_name=$(echo "$cert_file" | rev | cut -d '/' -f 2 | rev)
if [ "$result" -eq 0 ]; then
printf " \\033[%sm%s\\033[0m %s\\n" "$LETSENCRYPT_VALID_COLOR" "$LETSENCRYPT_VALID_ICON" "$cert_name"
else
sudo openssl x509 -checkend $((0 * 86400)) -noout -in "$cert_file" >>/dev/null
result=$?
if [ "$result" -eq 0 ]; then
printf " \\033[%sm%s\\033[0m %s\\n" "$LETSENCRYPT_WARNING_COLOR" "$LETSENCRYPT_WARNING_ICON" "$cert_name"
else
printf " \\033[%sm%s\\033[0m %s\\n" "$LETSENCRYPT_INVALID_COLOR" "$LETSENCRYPT_INVALID_ICON" "$cert_name"
fi
fi
done
fi
}
print_login() {
login_last="$(last -n 2 -a -d --time-format iso "$(whoami)" | head -n 2 | tail -n 1)"
if [ "$(echo "$login_last" | awk '{ print $1 }')" = "$(whoami)" ]; then
login_ip="$(echo "$login_last" | awk '{ print $7 }')"
login_login="$(date -d "$(echo "$login_last" | awk '{ print $3 }' | cut -d '+' -f 1 | sed "s/T/ /")" "+%a, %d.%m.%y %H:%M")"
login_space=$(generate_space "$login_login" 25)
if [ "$(echo "$login_last" | awk '{ print $4 }')" = "still" ]; then
login_logout="still connected"
else
login_logout="$(date -d "$(echo "$login_last" | awk '{ print $5 }' | cut -d '+' -f 1 | sed "s/T/ /")" "+%a, %d.%m.%y %H:%M")"
fi
printf "\\n"
printf " \\033[1;37mLast login for %s:\\033[0m\\n" "$(echo "$login_last" | awk '{ print $1 }')"
printf " %s %s%s%s %s\\n" "$LOGIN_LOGIN_ICON" "$login_login" "$login_space" "$LOGIN_LOGOUT_ICON" "$login_logout"
printf " %s %s\\n" "$LOGIN_IP_ICON" "$login_ip"
fi
}
print_include() {
. $INCLUDE_FILE
}
bash_motd() {
for module in "$@"; do
if [ "$module" = "--banner" ]; then
print_banner
elif [ "$module" = "--processor" ]; then
print_processor
elif [ "$module" = "--memory" ]; then
print_memory
elif [ "$module" = "--swap" ]; then
print_swap
elif [ "$module" = "--diskspace" ]; then
print_diskspace
elif [ "$module" = "--services" ]; then
print_services
elif [ "$module" = "--podman" ]; then
print_podman
elif [ "$module" = "--docker" ]; then
print_docker
elif [ "$module" = "--updates" ]; then
print_updates
elif [ "$module" = "--letsencrypt" ]; then
print_letsencrypt
elif [ "$module" = "--login" ]; then
print_login
elif [ "$module" = "--include" ]; then
print_include
fi
done
printf "\\n"
}

1641
.local/scripts/p10k.zsh Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,9 @@
#!/bin/sh
### git-stats hook (begin) ###
# Copy last commit hash to clipboard on commit
commit_hash=$(git rev-parse HEAD)
repo_url=$(git config --get remote.origin.url)
commit_date=$(git log -1 --format=%cd)
commit_data="\"{ \"date\": \"$commit_date\", \"url\": \"$repo_url\", \"hash\": \"$commit_hash\" }\""
git-stats --record "${commit_data}"
### git-stats hook (end) ###

View file

@ -7,4 +7,3 @@ poetry system
python system
ruby 3.1.1
rust system

View file

@ -1,8 +1,8 @@
if &background == 'dark'
let s:guishade0 = "#161925"
let s:guishade1 = "#2f323e"
let s:guishade2 = "#474b56"
@ -35,13 +35,13 @@
let s:ctermaccent5 = 117
let s:ctermaccent6 = 188
let s:ctermaccent7 = 175
endif
endif
if &background == 'light'
let s:guishade0 = "#ffffff"
let s:guishade1 = "#e5e6e7"
let s:guishade2 = "#cccdcf"
@ -74,9 +74,9 @@
let s:ctermaccent5 = 153
let s:ctermaccent6 = 239
let s:ctermaccent7 = 211
endif
highlight clear
syntax reset
@ -255,4 +255,4 @@
""""""""""""
unlet s:guishade0 s:guishade1 s:guishade2 s:guishade3 s:guishade4 s:guishade5 s:guishade6 s:guishade7 s:guiaccent0 s:guiaccent1 s:guiaccent2 s:guiaccent3 s:guiaccent4 s:guiaccent5 s:guiaccent6 s:guiaccent7
unlet s:ctermshade0 s:ctermshade1 s:ctermshade2 s:ctermshade3 s:ctermshade4 s:ctermshade5 s:ctermshade6 s:ctermshade7 s:ctermaccent0 s:ctermaccent1 s:ctermaccent2 s:ctermaccent3 s:ctermaccent4 s:ctermaccent5 s:ctermaccent6 s:ctermaccent7
unlet s:ctermshade0 s:ctermshade1 s:ctermshade2 s:ctermshade3 s:ctermshade4 s:ctermshade5 s:ctermshade6 s:ctermshade7 s:ctermaccent0 s:ctermaccent1 s:ctermaccent2 s:ctermaccent3 s:ctermaccent4 s:ctermaccent5 s:ctermaccent6 s:ctermaccent7

54
.vim/vimrc Normal file
View file

@ -0,0 +1,54 @@
silent! call plug#begin()
Plug '~/.vim/plugged/typescript-vim'
Plug '~/.vim/plugged/vim-airline'
Plug '~/.vim/plugged/lightline.vim'
Plug '~/.vim/plugged/vim-javascript'
Plug '~/.vim/plugged/vim-jsx'
Plug '~/.vim/plugged/vim-markdown'
Plug '~/.vim/plugged/dockerfile.vim'
Plug '~/.vim/plugged/php.vim'
Plug '~/.vim/plugged/python-syntax'
Plug '~/.vim/plugged/nerdtree'
Plug '~/.vim/plugged/vim-five'
Plug '~/.vim/plugged/vim-prettier'
Plug '~/.vim/plugged/vim-sensible'
Plug '~/.vim/plugged/editorconfig-vim'
Plug '~/.vim/plugged/vimgutter'
Plug '~/.vim/plugged/vim-surround'
Plug '~/.vim/plugged/vim-carbon-now-sh'
Plug '~/.vim/plugged/vim-multiple-cursors'
Plug '~/.vim/plugged/ale'
Plug '~/.vim/plugged/fzf'
Plug '~/.vim/plugged/fzf.vim'
if executable('node')
Plug '~/.vim/plugged/coc.nvim'
endif
Plug '~/.vim/plugged/syntastic'
Plug '~/.vim/plugged/vim-devicons'
Plug '~/.vim/plugged/zoxide.vim'
Plug '~/.vim/plugged/vim-go'
Plug '~/.vim/plugged/ansible-vim', {'do': './UltiSnips/generate.sh'}
call plug#end()
syntax enable
set background=dark
colorscheme Betelgeuse
" set g:lightline = { 'colorscheme': 'Betelgeuse' }
" Settings for plugin https://github.com/neoclide/coc.nvim.git
autocmd FileType json syntax match Comment +\/\/.\+$+
" Settings for plugin https://github.com/vim-syntastic/syntastic.git
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
" Settings for plugin https://github.com/ryanoasis/vim-devicons.git
set encoding=UTF-8
" Automatically apply with Chezmoi anytime a source file is modified
autocmd BufWritePost ~/.local/share/chezmoi/* ! chezmoi apply --source-path "%"

View file

@ -0,0 +1 @@
load(io.popen('oh-my-posh init cmd'):read("*a"))()

View file

@ -0,0 +1,36 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"crypto-js": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
"integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
},
"tabby-docker": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/tabby-docker/-/tabby-docker-0.2.0.tgz",
"integrity": "sha512-kEDZI33Xt7NnncPDhhbqREP809YevCnoVRYhzACvAkteODWorABCoKEuOrfi2I3DDwCHcMk0+fM0nCWy5C/JVg=="
},
"tabby-save-output": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/tabby-save-output/-/tabby-save-output-3.1.0.tgz",
"integrity": "sha512-4mGxpYSaeBzU8TkOrZudPmT3/YkT9fGXCesBp2XO9iql+2EELzkPLJUntlGYSBH0RQVRDYnl+IF8F65WPaaSxQ=="
},
"tabby-search-in-browser": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/tabby-search-in-browser/-/tabby-search-in-browser-0.0.1.tgz",
"integrity": "sha512-jb5UINTXBN6UR0xi+LWs7KdnE5qRV++ogy9lmkIJ9dDbBbVe7d6HKxneZcQVjQLjG+UYJNl/nElh8DPzFPMTSg=="
},
"tabby-workspace-manager": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/tabby-workspace-manager/-/tabby-workspace-manager-0.0.4.tgz",
"integrity": "sha512-O3etFcZxw68ZieS1q8VM01IW0M+rMyyBJpghYhz7WtNyckxfO/ir4AuXfb/kFz9ozOmI33/ff3UMY8yJjIJ6qw=="
},
"terminus-elastic-quick-cmds": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/terminus-elastic-quick-cmds/-/terminus-elastic-quick-cmds-1.1.1.tgz",
"integrity": "sha512-PDWQ5MKs8UuPE1O/Nk63RSz661big/uuWWaRIZFSYfdqvrUWK186xNcUFioBWOnyNVvdLI4H+mxektmW2TnHrA=="
}
}
}

View file

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>DVTConsoleDebuggerInputTextColor</key>
<string>0.764706 0.780392 0.819608 1</string>
<key>DVTConsoleDebuggerOutputTextColor</key>
<string>0.572549 0.584314 0.627451 1</string>
<key>DVTConsoleDebuggerPromptTextColor</key>
<string>0.862745 0.87451 0.894118 1</string>
<key>DVTConsoleExectuableInputTextColor</key>
<string>0.572549 0.584314 0.627451 1</string>
<key>DVTConsoleExectuableOutputTextColor</key>
<string>0.764706 0.780392 0.819608 1</string>
<key>DVTConsoleTextBackgroundColor</key>
<string>0.086275 0.098039 0.145098 1</string>
<key>DVTConsoleTextInsertionPointColor</key>
<string>0.764706 0.780392 0.819608 1</string>
<key>DVTConsoleTextSelectionColor</key>
<string>0.184314 0.196078 0.243137 1</string>
<key>DVTDebuggerInstructionPointerColor</key>
<string>0.443137 0.968627 0.623529 1</string>
<key>DVTSourceTextBackground</key>
<string>0.086275 0.098039 0.145098 1</string>
<key>DVTSourceTextBlockDimBackgroundColor</key>
<string>0.47451 0.486275 0.529412 1</string>
<key>DVTSourceTextInsertionPointColor</key>
<string>0.764706 0.780392 0.819608 1</string>
<key>DVTSourceTextInvisiblesColor</key>
<string>0.184314 0.196078 0.243137 1</string>
<key>DVTSourceTextSelectionColor</key>
<string>0.184314 0.196078 0.243137 1</string>
<key>DVTSourceTextSyntaxColors</key>
<dict>
<key>xcode.syntax.attribute</key>
<string>0.443137 0.968627 0.623529 1</string>
<key>xcode.syntax.character</key>
<string>0 0.756863 0.894118 1</string>
<key>xcode.syntax.comment</key>
<string>0.278431 0.294118 0.337255 1</string>
<key>xcode.syntax.comment.doc</key>
<string>0.376471 0.392157 0.435294 1</string>
<key>xcode.syntax.comment.doc.keyword</key>
<string>0.47451 0.486275 0.529412 1</string>
<key>xcode.syntax.identifier.class</key>
<string>0.976471 0.862745 0.360784 1</string>
<key>xcode.syntax.identifier.class.system</key>
<string>0.976471 0.862745 0.360784 1</string>
<key>xcode.syntax.identifier.constant</key>
<string>0.443137 0.968627 0.623529 1</string>
<key>xcode.syntax.identifier.constant.system</key>
<string>0.443137 0.968627 0.623529 1</string>
<key>xcode.syntax.identifier.function</key>
<string>0 0.756863 0.894118 1</string>
<key>xcode.syntax.identifier.function.system</key>
<string>0 0.756863 0.894118 1</string>
<key>xcode.syntax.identifier.macro</key>
<string>0.780392 0.301961 0.537255 1</string>
<key>xcode.syntax.identifier.macro.system</key>
<string>0.780392 0.301961 0.537255 1</string>
<key>xcode.syntax.identifier.type</key>
<string>0.929412 0.145098 0.305882 1</string>
<key>xcode.syntax.identifier.type.system</key>
<string>0.862745 0.87451 0.894118 1</string>
<key>xcode.syntax.identifier.variable</key>
<string>0.764706 0.780392 0.819608 1</string>
<key>xcode.syntax.identifier.variable.system</key>
<string>0.764706 0.780392 0.819608 1</string>
<key>xcode.syntax.keyword</key>
<string>0.486275 0.717647 1 1</string>
<key>xcode.syntax.number</key>
<string>0.443137 0.968627 0.623529 1</string>
<key>xcode.syntax.plain</key>
<string>0.666667 0.682353 0.721569 1</string>
<key>xcode.syntax.preprocessor</key>
<string>0.764706 0.780392 0.819608 1</string>
<key>xcode.syntax.string</key>
<string>0.443137 0.968627 0.623529 1</string>
<key>xcode.syntax.url</key>
<string>0.486275 0.717647 1 1</string>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>DVTConsoleDebuggerInputTextColor</key>
<string>0.298039 0.313725 0.345098 1</string>
<key>DVTConsoleDebuggerOutputTextColor</key>
<string>0.498039 0.509804 0.533333 1</string>
<key>DVTConsoleDebuggerPromptTextColor</key>
<string>0.862745 0.87451 0.894118 1</string>
<key>DVTConsoleExectuableInputTextColor</key>
<string>0.498039 0.509804 0.533333 1</string>
<key>DVTConsoleExectuableOutputTextColor</key>
<string>0.298039 0.313725 0.345098 1</string>
<key>DVTConsoleTextBackgroundColor</key>
<string>1 1 1 1</string>
<key>DVTConsoleTextInsertionPointColor</key>
<string>0.298039 0.313725 0.345098 1</string>
<key>DVTConsoleTextSelectionColor</key>
<string>0.898039 0.901961 0.905882 1</string>
<key>DVTDebuggerInstructionPointerColor</key>
<string>0.584314 1 0.764706 1</string>
<key>DVTSourceTextBackground</key>
<string>1 1 1 1</string>
<key>DVTSourceTextBlockDimBackgroundColor</key>
<string>0.6 0.607843 0.627451 1</string>
<key>DVTSourceTextInsertionPointColor</key>
<string>0.298039 0.313725 0.345098 1</string>
<key>DVTSourceTextInvisiblesColor</key>
<string>0.898039 0.901961 0.905882 1</string>
<key>DVTSourceTextSelectionColor</key>
<string>0.898039 0.901961 0.905882 1</string>
<key>DVTSourceTextSyntaxColors</key>
<dict>
<key>xcode.syntax.attribute</key>
<string>0.584314 1 0.764706 1</string>
<key>xcode.syntax.character</key>
<string>0.141176 0.898039 1 1</string>
<key>xcode.syntax.comment</key>
<string>0.8 0.803922 0.811765 1</string>
<key>xcode.syntax.comment.doc</key>
<string>0.698039 0.705882 0.717647 1</string>
<key>xcode.syntax.comment.doc.keyword</key>
<string>0.6 0.607843 0.627451 1</string>
<key>xcode.syntax.identifier.class</key>
<string>1 1 0.501961 1</string>
<key>xcode.syntax.identifier.class.system</key>
<string>1 1 0.501961 1</string>
<key>xcode.syntax.identifier.constant</key>
<string>0.584314 1 0.764706 1</string>
<key>xcode.syntax.identifier.constant.system</key>
<string>0.584314 1 0.764706 1</string>
<key>xcode.syntax.identifier.function</key>
<string>0.141176 0.898039 1 1</string>
<key>xcode.syntax.identifier.function.system</key>
<string>0.141176 0.898039 1 1</string>
<key>xcode.syntax.identifier.macro</key>
<string>0.921569 0.443137 0.678431 1</string>
<key>xcode.syntax.identifier.macro.system</key>
<string>0.921569 0.443137 0.678431 1</string>
<key>xcode.syntax.identifier.type</key>
<string>1 0.286275 0.447059 1</string>
<key>xcode.syntax.identifier.type.system</key>
<string>0.862745 0.87451 0.894118 1</string>
<key>xcode.syntax.identifier.variable</key>
<string>0.298039 0.313725 0.345098 1</string>
<key>xcode.syntax.identifier.variable.system</key>
<string>0.298039 0.313725 0.345098 1</string>
<key>xcode.syntax.keyword</key>
<string>0.627451 0.858824 1 1</string>
<key>xcode.syntax.number</key>
<string>0.584314 1 0.764706 1</string>
<key>xcode.syntax.plain</key>
<string>0.4 0.411765 0.439216 1</string>
<key>xcode.syntax.preprocessor</key>
<string>0.298039 0.313725 0.345098 1</string>
<key>xcode.syntax.string</key>
<string>0.584314 1 0.764706 1</string>
<key>xcode.syntax.url</key>
<string>0.627451 0.858824 1 1</string>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,328 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Default Window Settings</key>
<string>Betelgeuse</string>
<key>DefaultProfilesVersion</key>
<integer>1</integer>
<key>HasMigratedDefaults</key>
<true/>
<key>NSColorPanelMode</key>
<string>1</string>
<key>NSColorPickerPreferredRGBEntryMode</key>
<integer>2</integer>
<key>NSColorPickerSlidersDefaults</key>
<string>1</string>
<key>NSFontPanelAttributes</key>
<string>1, 0</string>
<key>NSNavLastRootDirectory</key>
<string>/Users</string>
<key>NSNavPanelExpandedSizeForSaveMode</key>
<string>{712, 448}</string>
<key>NSSplitView Subview Frames NSColorPanelSplitView</key>
<array>
<string>0.000000, 0.000000, 257.000000, 271.000000, NO, NO</string>
<string>0.000000, 272.000000, 257.000000, 43.000000, NO, NO</string>
</array>
<key>NSToolbar Configuration com.apple.NSColorPanel</key>
<dict>
<key>TB Is Shown</key>
<integer>1</integer>
</dict>
<key>NSWindow Frame NSColorPanel</key>
<string>1295 353 257 291 0 0 1680 1025 </string>
<key>NSWindow Frame NSFontPanel</key>
<string>573 187 445 79 0 0 1680 1025 </string>
<key>NSWindow Frame NSNavPanelAutosaveName</key>
<string>-14 33 328 167 0 0 1680 1025 </string>
<key>NSWindow Frame TTAppPreferences</key>
<string>663 257 667 554 0 0 1680 1025 </string>
<key>NSWindow Frame TTWindow</key>
<string>580 240 710 455 0 0 1680 1025 </string>
<key>NSWindow Frame TTWindow Basic</key>
<string>552 468 585 371 0 0 1680 1025 </string>
<key>NSWindow Frame TTWindow Betelgeuse</key>
<string>267 404 893 525 0 0 1680 1025 </string>
<key>NSWindow Frame TTWindow Cipherpunk</key>
<string>51 119 570 365 0 0 1280 777 </string>
<key>NSWindow Frame TTWindow Homebrew</key>
<string>124 412 570 365 0 0 1280 777 </string>
<key>NSWindow Frame TTWindow Nord_Custom</key>
<string>210 278 570 412 0 0 1280 777 </string>
<key>NSWindow Frame TTWindow Ocean</key>
<string>187 343 570 365 0 0 1280 777 </string>
<key>NSWindow Frame TTWindow Silver Aerogel</key>
<string>20 292 570 365 0 0 1280 777 </string>
<key>NSWindow Frame TTWindow SolarizedDark_custom</key>
<string>124 365 570 412 0 0 1280 777 </string>
<key>NSWindow Frame TTWindow Solarized_Dark_Custom</key>
<string>693 199 725 455 0 0 1680 1025 </string>
<key>NSWindow Frame TTWindow themer-dark</key>
<string>246 284 505 371 0 0 1680 1025 </string>
<key>ProfileCurrentVersion</key>
<real>2.0699999999999998</real>
<key>SecureKeyboardEntry</key>
<false/>
<key>Startup Window Settings</key>
<string>Betelgeuse</string>
<key>TTAppPreferences Selected Tab</key>
<integer>1</integer>
<key>Window Settings</key>
<dict>
<key>Betelgeuse</key>
<dict>
<key>ANSIBlackColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjA4NjI3NDUwOTggMC4w
OTgwMzkyMTU3IDAuMTQ1MDk4MDM5MgAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIBlueColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjQ4NjI3NDUwOTggMC43
MTc2NDcwNTg4IDEuMDAwMDAwMDAwMAAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIBrightBlackColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjE4NDMxMzcyNTUgMC4x
OTYwNzg0MzE0IDAuMjQzMTM3MjU0OQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIBrightBlueColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjU1Njg2Mjc0NTEgMC43
MzMzMzMzMzMzIDAuOTU2ODYyNzQ1MQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIBrightCyanColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjE5MjE1Njg2MjcgMC43
NjQ3MDU4ODI0IDAuODc0NTA5ODAzOQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIBrightGreenColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjUyNTQ5MDE5NjEgMC45
MjE1Njg2Mjc1IDAuNjc0NTA5ODAzOQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIBrightMagentaColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc3NjQ3MDU4ODIgMC40
MjM1Mjk0MTE4IDAuNjA3ODQzMTM3MwAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIBrightRedColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjg5MDE5NjA3ODQgMC4z
MDU4ODIzNTI5IDAuNDM1Mjk0MTE3NgAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIBrightWhiteColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc2NDcwNTg4MjQgMC43
ODAzOTIxNTY5IDAuODE5NjA3ODQzMQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIBrightYellowColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjkyNTQ5MDE5NjEgMC44
NDMxMzcyNTQ5IDAuNDc0NTA5ODAzOQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSICyanColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjAwMDAwMDAwMDAgMC43
NTY4NjI3NDUxIDAuODk0MTE3NjQ3MQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIGreenColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjQ0MzEzNzI1NDkgMC45
Njg2Mjc0NTEwIDAuNjIzNTI5NDExOAAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIMagentaColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc4MDM5MjE1NjkgMC4z
MDE5NjA3ODQzIDAuNTM3MjU0OTAyMAAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIRedColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjkyOTQxMTc2NDcgMC4x
NDUwOTgwMzkyIDAuMzA1ODgyMzUyOQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIWhiteColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjY2NjY2NjY2NjcgMC42
ODIzNTI5NDEyIDAuNzIxNTY4NjI3NQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>ANSIYellowColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjk3NjQ3MDU4ODIgMC44
NjI3NDUwOTgwIDAuMzYwNzg0MzEzNwAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>BackgroundColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjA4NjI3NDUwOTggMC4w
OTgwMzkyMTU3IDAuMTQ1MDk4MDM5MgAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>BoldTextColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc2NDcwNTg4MjQgMC43
ODAzOTIxNTY5IDAuODE5NjA3ODQzMQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>CursorColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc2NDcwNTg4MjQgMC43
ODAzOTIxNTY5IDAuODE5NjA3ODQzMQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>Font</key>
<data>
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0
b3BYJG9iamVjdHMSAAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRy
b290gAGkCwwVFlUkbnVsbNQNDg8QERITFFZOU1NpemVYTlNmRmxh
Z3NWTlNOYW1lViRjbGFzcyNAJgAAAAAAABAQgAKAA18QGUhhY2tO
ZXJkRm9udENvbXBsZXRlLUJvbGTSFxgZGlokY2xhc3NuYW1lWCRj
bGFzc2VzVk5TRm9udKIZG1hOU09iamVjdAgRGiQpMjdJTFFTWF5n
bnd+hY6QkpSwtcDJ0NMAAAAAAAABAQAAAAAAAAAcAAAAAAAAAAAA
AAAAAAAA3A==
</data>
<key>SelectionColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjc4MDM5MjE1NjkgMC4z
MDE5NjA3ODQzIDAuNTM3MjU0OTAyMAAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>TextColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFy
Y2hpdmVyVCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdC
XE5TQ29sb3JTcGFjZVYkY2xhc3NPECcwLjY2NjY2NjY2NjcgMC42
ODIzNTI5NDEyIDAuNzIxNTY4NjI3NQAQAYAC0hAREhNaJGNsYXNz
bmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNL
ZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCV
oKmxtL3P0tcAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAA
2Q==
</data>
<key>columnCount</key>
<integer>35</integer>
<key>name</key>
<string>Betelgeuse</string>
<key>rowCount</key>
<integer>124</integer>
<key>type</key>
<string>Window Settings</string>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,30 @@
<?xml version="1.0"?>
<!--
** DO NOT EDIT THIS FILE.
** If you make changes to this file while any VirtualBox related application
** is running, your changes will be overwritten later, without taking effect.
** Use VBoxManage or the VirtualBox Manager GUI to make changes.
-->
<VirtualBox xmlns="http://www.virtualbox.org/" version="1.12-linux">
<Global>
<ExtraData>
<ExtraDataItem name="GUI/Details/Elements" value="general,system,preview,display,storage,audio,network,usb,sharedFolders,description"/>
<ExtraDataItem name="GUI/GroupDefinitions/" value="n=GLOBAL"/>
<ExtraDataItem name="GUI/LastItemSelected" value="n=GLOBAL"/>
<ExtraDataItem name="GUI/LastWindowPosition" value="341,164,683,404"/>
<ExtraDataItem name="GUI/SplitterSizes" value="226,456"/>
<ExtraDataItem name="GUI/Toolbar" value="false"/>
<ExtraDataItem name="GUI/Tools/LastItemsSelected" value="Welcome,Details"/>
<ExtraDataItem name="GUI/UpdateCheckCount" value="2"/>
<ExtraDataItem name="GUI/UpdateDate" value="1 d, 2021-12-15, stable, 6.1.30"/>
</ExtraData>
<MachineRegistry/>
<NetserviceRegistry>
<DHCPServers>
<DHCPServer networkName="HostInterfaceNetworking-vboxnet0" IPAddress="192.168.56.100" networkMask="255.255.255.0" lowerIP="192.168.56.101" upperIP="192.168.56.254" enabled="1"/>
</DHCPServers>
</NetserviceRegistry>
<SystemProperties defaultMachineFolder="/home/{{ .user.username }}/.local/virtualbox" defaultHardDiskFormat="VDI" VRDEAuthLibrary="VBoxAuth" webServiceAuthLibrary="VBoxAuth" LogHistoryCount="3" proxyMode="0" exclusiveHwVirt="true"/>
<USBDeviceFilters/>
</Global>
</VirtualBox>

13
README.md Normal file
View file

@ -0,0 +1,13 @@
# Hiawatha
This is a decked out dotfiles repository that leverages a handful of technologies including Chezmoi and Ansible.
To use these dotfiles and provision your computer with prompts (which can be made headless with environment variables):
```
bash <(curl -sSL https://install.doctor/start)
```
All the source files are located in ~/.local/share/chezmoi/home for the dotfiles and ~/.local/share/chezmoi/system for the system files. The roles / playbooks from [Gas Station](https://gitlab.com/megabyte-labs/gas-station) are occasionally used to fill in gaps. The software installation (which happens when you run Chezmoi or the link above) determines which package manager to use to install the software using [this software map](https://gitlab.com/megabyte-labs/misc/dotfiles/-/blob/master/.local/share/chezmoi/software.yml).
Many of the dotfiles (and system files) are templated. Those ones you will have to look at ~/.local/share/chezmoi to take a peek at. The static files are at the root of this repository for easy viewing.

13
sync.sh Normal file
View file

@ -0,0 +1,13 @@
#!/usr/bin/env bash
### Copy static files to base directory for easy viewing - source should still be modified in ~/.local/share/chezmoi/home (or ~/.local/share/chezmoi/system for system files)
find ./.local/share/chezmoi/home -type f | while read FILE; do
BASENAME="$(basename "$FILE")"
DIRNAME="$(dirname "$FILE")"
if [[ "$FILE" != *'.tmpl' ]] && [[ "$BASENAME" != '.chezmoi'* ]] && [[ "$BASENAME" != 'symlink_'* ]] && [[ "$FILE" != *'gitkeep' ]] && [[ "$FILE" != *'.chezmoitemplates'* ]] && [ "$BASENAME" != 'chezmoi.txt.age' ] && [ "$FILE" != *'TODO' ]; then
TARGET_DIR="$(echo "$DIRNAME" | sed 's/private_//g' | sed 's/dot_/\./g' | sed 's/executable_//' | sed 's/readonly_//g' | sed 's/\/.local\/share\/chezmoi\/home//')"
mkdir -p "$TARGET_DIR"
TARGET="$(echo "$FILE" | sed 's/private_//g' | sed 's/dot_/\./g' | sed 's/executable_//' | sed 's/readonly_//g' | sed 's/\/.local\/share\/chezmoi\/home//' )"
cp "$FILE" "$TARGET"
fi
done