diff options
180 files changed, 14049 insertions, 37 deletions
@@ -0,0 +1,55 @@ +# shellcheck shell=bash +# +#██████╗ █████╗ ███████╗██╗ ██╗██████╗ ██████╗ +#██╔══██╗██╔══██╗██╔════╝██║ ██║██╔══██╗██╔════╝ +#██████╔╝███████║███████╗███████║██████╔╝██║ +#██╔══██╗██╔══██║╚════██║██╔══██║██╔══██╗██║ +#██████╔╝██║ ██║███████║██║ ██║██║ ██║╚██████╗ +#╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ +# +# ~/.bashrc +# + +if [[ $- != *i* ]]; then + . ~/.profile + return +fi + +# Get the current active terminal +term="$(cat /proc/"$PPID"/comm)" + +# Set a default prompt +p='\[\033[01;37m\]┌─[\[\033[01;32m\]srdusr\[\033[01;37m\]]-[\[\033[01;36m\]archlinux\[\033[01;37m\]]-[\[\033[01;33m\]\W\]\[\033[00;37m\]\[\033 +\[\033[01;37m\]└─[\[\033[05;33m\]$\[\033[00;37m\]\[\033[01;37m\]]\[\033[00;37m\] ' + +# Set transparency and prompt while using st +if [[ $term = "st" ]]; then + transset-df "0.65" --id "$WINDOWID" >/dev/null + + # [Your_Name]-----| |=======|------[Your_Distro] + # [Color]--------| | [Color]------| | + # [Style]------------| | | [Style]---------| | | + # V V V V V V + p='\[\033[01;37m\]┌─[\[\033[01;32m\]srdusr\[\033[01;37m\]]-[\[\033[01;36m\]archlinux\[\033[01;37m\]]-[\[\033[01;33m\]\W\[\033[00;37m\]\[\033[01;37m\]] +\[\033[01;37m\]└─[\[\033[05;33m\]$\[\033[00;37m\]\[\033[01;37m\]]\[\033[00;37m\] ' +# A A A +# [Style]----| | |-------- [Your_Choice] +# [Color]------------| + +fi + +# If not running interactively, dont do anything +[[ $- != *i* ]] && return + +# My alias commands +alias ls='ls --color=auto -1' +alias shred='shred -uzvn3' +alias wallset='feh --bg-fill' + +PS1=$p + +# pfetch + +#export NVM_DIR="$HOME/.local/share/nvm" +#[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm +#[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion diff --git a/.config/Code/User/keybindings.json b/.config/Code/User/keybindings.json new file mode 100644 index 0000000..9d04af3 --- /dev/null +++ b/.config/Code/User/keybindings.json @@ -0,0 +1,274 @@ +[ + { + "key": "ctrl+shift+r", + "command": "workbench.action.reloadWindow", + "when": "editorTextFocus" + }, + { + "key": "ctrl+i", + "command": "workbench.action.terminal.sendSequence", + "when": "resourceExtname == .py", + "args": { + "text": "python \"${file}\" < ./i\n" + } + }, + { + "key": "f5", + "command": "python.execInTerminal", + "when": "resourceExtname == .py", + }, + { + "key": "f5", + "command": "workbench.action.terminal.sendSequence", + "when": "resourceExtname == .dart", + "args": { + "text": "dart \"${file}\"\n" + } + }, + { + "key": "f5", + "command": "workbench.action.terminal.sendSequence", + "when": "resourceExtname == .js", + "args": { + "text": "node \"${file}\"\n" + } + }, + { + "key": "f5", + "command": "workbench.action.terminal.sendSequence", + "when": "resourceExtname == .java", + "args": { + "text": "java \"${file}\"\n" + } + }, + { + "key": "f5", + "command": "workbench.action.terminal.sendSequence", + "when": "resourceExtname == .sh", + "args": { + "text": "\"${file}\"\n" + } + }, + { + "key": "f5", + "command": "workbench.action.terminal.sendSequence", + "when": "resourceExtname == .cpp", + "args": { + "text": "g++ -g \"${file}\" -o \"${fileDirname}/${fileBasenameNoExtension}\" && \"${fileDirname}/${fileBasenameNoExtension}\"\n" + } + }, + { + "key": "f5", + "command": "workbench.action.terminal.sendSequence", + "when": "resourceExtname == .c", + "args": { + "text": "gcc -g \"${file}\" -o \"${fileDirname}/${fileBasenameNoExtension}\" && \"${fileDirname}/${fileBasenameNoExtension}\"\n" + } + }, + { + "key": "f5", + "command": "workbench.action.terminal.sendSequence", + "when": "resourceExtname == .asm", + "args": { + "text": "nasm -f elf64 \"${file}\" && ld -o \"${fileDirname}/${fileBasenameNoExtension}\" \"${fileDirname}/${fileBasenameNoExtension}.o\" && \"${fileDirname}/${fileBasenameNoExtension}\"\n" + } + }, + { + "key": "ctrl+i", + "command": "workbench.action.terminal.sendSequence", + "when": "resourceExtname == .cpp", + "args": { + "text": "g++ -g \"${file}\" -o \"${fileDirname}/${fileBasenameNoExtension}\" && \"${fileDirname}/${fileBasenameNoExtension}\" < ./i\n" + } + }, + { + "key": "ctrl+g", + "command": "workbench.action.terminal.sendSequence", + "when": "resourceExtname == .cpp", + "args": { + "text": "g++ -g \"${file}\" -o \"${fileDirname}/${fileBasenameNoExtension}\" -lgraph -lGL -lGLU -lglut && \"${fileDirname}/${fileBasenameNoExtension}\" 2>/dev/null\n" + } + }, + // { + // "key": "f5", + // "command": "workbench.action.tasks.runTask", + // "when": "resourceExtname == .cpp", + // "args": "Build and Run C++" + // }, + { + "key": "shift+f5", + "command": "workbench.action.terminal.sendSequence", + "when": "resourceExtname == .cpp", + "args": { + "text": "g++ -g \"${fileDirname}/*.cpp\" -o \"${fileDirname}/${fileBasenameNoExtension}\" && \"${fileDirname}/${fileBasenameNoExtension}\"\n" + } + }, + // { + // "key": "shift+f5", + // "command": "workbench.action.tasks.runTask", + // "when": "resourceExtname == .cpp", + // "args": "Build and Run C++ (Multiple cpp files)" + // }, + { + "key": "f4", + "command": "workbench.action.debug.continue", + "when": "inDebugMode" + }, + { + "key": "f4", + "command": "workbench.action.debug.start", + "when": "!inDebugMode" + }, + { + "key": "f4", + "command": "workbench.action.debug.start", + "when": "debuggersAvailable && !inDebugMode" + }, + { + "key": "f5", + "command": "-workbench.action.debug.continue", + "when": "inDebugMode" + }, + { + "key": "f5", + "command": "-workbench.action.debug.start", + "when": "!inDebugMode" + }, + { + "key": "f5", + "command": "-workbench.action.debug.start", + "when": "debuggersAvailable && !inDebugMode" + }, + { + "key": "shift+f4", + "command": "workbench.action.debug.stop", + "when": "inDebugMode" + }, + { + "key": "shift+f5", + "command": "-workbench.action.debug.stop", + "when": "inDebugMode" + }, + { + "key": "ctrl+v", + "command": "workbench.action.terminal.paste", + "when": "terminalFocus && terminalProcessSupported" + }, + { + "key": "ctrl+shift+v", + "command": "-workbench.action.terminal.paste", + "when": "terminalFocus && terminalProcessSupported" + }, + { + "key": "ctrl+alt+up", + "command": "editor.action.copyLinesUpAction", + "when": "editorTextFocus && !editorReadonly" + }, + { + "key": "ctrl+alt+down", + "command": "editor.action.copyLinesDownAction", + "when": "editorTextFocus && !editorReadonly" + }, + { + "key": "ctrl+shift+alt+up", + "command": "-editor.action.copyLinesUpAction", + "when": "editorTextFocus && !editorReadonly" + }, + { + "key": "ctrl+shift+alt+down", + "command": "-editor.action.copyLinesDownAction", + "when": "editorTextFocus && !editorReadonly" + }, + { + "key": "ctrl+,", + "command": "-workbench.action.openSettings" + }, + { + "key": "ctrl+,", + "command": "workbench.action.openSettingsJson" + }, + { + "key": "ctrl+i", + "command": "-editor.action.triggerSuggest", + "when": "editorHasCompletionItemProvider && textInputFocus && !editorReadonly" + }, + { + "key": "ctrl+c", + "command": "workbench.action.terminal.copySelection", + "when": "terminalFocus && terminalProcessSupported && terminalTextSelected && terminalTextSelected" + }, + { + "key": "ctrl+shift+c", + "command": "-workbench.action.terminal.copySelection", + "when": "terminalFocus && terminalProcessSupported && terminalTextSelected && terminalTextSelected" + }, + { + "key": "ctrl+k", + "command": "workbench.action.terminal.kill", + "when": "terminalIsOpen && terminalFocus" + }, + { + "key": "delete", + "command": "-workbench.action.terminal.killInstance", + "when": "terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus" + }, + { + "key": "ctrl+shift+i", + "command": "-editor.action.formatDocument.none", + "when": "editorTextFocus && !editorHasDocumentFormattingProvider && !editorReadonly" + }, + { + "key": "ctrl+shift+i", + "command": "-notebook.formatCell", + "when": "editorHasDocumentFormattingProvider && editorTextFocus && inCompositeEditor && notebookEditable && !editorReadonly && activeEditor == 'workbench.editor.notebook'" + }, + { + "key": "ctrl+shift+i", + "command": "editor.action.formatDocument", + "when": "editorTextFocus" + }, + { + "key": "ctrl+shift+i", + "command": "-editor.action.formatDocument", + "when": "editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly && !inCompositeEditor" + }, + { + "key": "ctrl+shift+i", + "command": "workbench.action.toggleDevTools", + "when": "!editorTextFocus" + }, + { + "key": "ctrl+shift+i", + "command": "-workbench.action.toggleDevTools", + "when": "isDevelopment" + }, + { + "key": "ctrl+t", + "command": "-workbench.action.showAllSymbols" + }, + { + "key": "ctrl+t", + "command": "workbench.action.files.newUntitledFile" + }, + { + "key": "ctrl+n", + "command": "-workbench.action.files.newUntitledFile" + }, + { + "key": "ctrl+shift+m", + "command": "github.cweijan.mysql.focus" + }, + { + "key": "ctrl+shift+m", + "command": "-workbench.actions.view.problems", + "when": "workbench.panel.markers.view.active" + }, + { + "key": "ctrl+shift+0", + "command": "workbench.action.zoomReset" + }, + { + "key": "ctrl+numpad0", + "command": "-workbench.action.zoomReset" + } +] diff --git a/.config/Code/User/settings.json b/.config/Code/User/settings.json new file mode 100644 index 0000000..d7bae40 --- /dev/null +++ b/.config/Code/User/settings.json @@ -0,0 +1,733 @@ +{ + "workbench.colorCustomizations": { + "[Chromodynamics]": { + "terminal.background": "#060606", + "terminal.foreground": "#e0e0e0", + "terminal.selectionBackground": "#555555", + "titleBar.activeBackground": "#020202", + "titleBar.activeForeground": "#e0e0e0", + "titleBar.inactiveBackground": "#020202", + "titleBar.inactiveForeground": "#e0e0e0", + "tab.inactiveBackground": "#0b0b0b", + "editor.background": "#060606", + "editor.findMatchBorder": "#0c0c0d", + "editor.findMatchHighlightBorder": "#0c0c0d", + "editor.lineHighlightBackground": "#060606", + "editor.selectionBackground": "#222222", + "editor.selectionHighlightBackground": "#e4dddd", + "editor.selectionHighlightBorder": "#0c0c0d", + "editorGroupHeader.tabsBackground": "#0b0b0b", + "editorGutter.background": "#000000", + "sideBar.background": "#060606", + "sideBarSectionHeader.background": "#0b0b0b", + "statusBar.background": "#060606" + }, + "[Sweet Dracula]": { + "editorGroupHeader.tabsBackground": "#161925", + } + }, + "editor.tokenColorCustomizations": { + "[Chromodynamics]": { + "textMateRules": [ + { + "scope": [ + "constant.language.python", + "variable.parameter.function.language.special.self.python" + ], + "settings": { + "foreground": "#66D9EF" + } + }, + { + "scope": [ + "entity.name.function.operator", + "keyword.operator" + ], + "settings": { + "foreground": "#E8364F", + "fontStyle": "" + } + }, + { + "scope": [ + "punctuation.definition.template-expression.begin.js", + "punctuation.definition.template-expression.end.js" + ], + "settings": { + "foreground": "#da70d6", + "fontStyle": "italic" + } + }, + { + "scope": [ + "variable.other.readwrite.js" + ], + "settings": { + "foreground": "#c6c6c6", + "fontStyle": "" + } + } + ] + }, + "textMateRules": [ + { + "scope": [ + "entity.name.type.class", + "storage.type.class", + "storage.modifier", + "storage.type", + "constant", + "comment", + "keyword", + "invalid" + ], + "settings": { + "fontStyle": "italic" + } + } + ] + }, + // Window Settings + "window.commandCenter": false, + "window.menuBarVisibility": "toggle", + "window.newWindowDimensions": "maximized", + "window.restoreWindows": "all", + "window.title": "${activeEditorShort}${separator}${rootName}", + "window.titleBarStyle": "native", + "window.titleSeparator": " ・ ・", + "workbench.editor.enablePreviewFromQuickOpen": false, + "workbench.editor.highlightModifiedTabs": true, + "workbench.editor.restoreViewState": false, + "workbench.editor.sharedViewState": false, + "workbench.editor.showTabs": true, + "workbench.editor.tabCloseButton": "right", + "workbench.editor.tabSizing": "shrink", + "workbench.editor.untitled.hint": "hidden", + "workbench.iconTheme": "sweet-vscode-icons", + "workbench.layoutControl.type": "menu", + "workbench.list.smoothScrolling": true, + "workbench.panel.defaultLocation": "right", + "workbench.startupEditor": "none", + "workbench.statusBar.visible": true, + "workbench.editorAssociations": { + "*.ipynb": "jupyter-notebook" + }, + "workbench.reduceMotion": "off", + // Editor Settings + "editor.acceptSuggestionOnEnter": "smart", + "editor.autoClosingBrackets": "always", + "editor.bracketPairColorization.enabled": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + }, + "editor.colorDecorators": false, + "editor.cursorBlinking": "phase", + "editor.cursorSmoothCaretAnimation": "on", + "editor.cursorStyle": "line-thin", + "editor.detectIndentation": false, + "editor.emptySelectionClipboard": false, + "editor.fontFamily": "'Operator Mono SSm Lig Book', 'FiraCode Nerd Font', 'Hack Nerd Font Mono', 'codicon'", + "editor.fontVariations": true, + "editor.fontLigatures": "'ss01', 'ss02', 'ss03', 'ss04', 'ss05', 'ss06', 'zero', 'onum'", + "editor.fontSize": 12, + "editor.fontWeight": "normal", + "editor.formatOnSave": true, + "editor.formatOnType": true, + "editor.glyphMargin": true, + "editor.guides.bracketPairs": "active", + "editor.guides.bracketPairsHorizontal": "active", + "editor.guides.highlightActiveBracketPair": true, + "editor.hover.above": false, + "editor.inlayHints.enabled": "on", + "editor.inlineSuggest.enabled": true, + "editor.insertSpaces": true, + "editor.linkedEditing": true, + "editor.matchBrackets": "never", + "editor.maxTokenizationLineLength": 99999999, + "editor.minimap.enabled": false, + "editor.mouseWheelScrollSensitivity": 1.5, + "editor.occurrencesHighlight": false, + "editor.renderControlCharacters": true, + "editor.renderFinalNewline": "on", + "editor.renderLineHighlight": "gutter", + "editor.renderWhitespace": "none", + "editor.scrollbar.horizontal": "auto", + "editor.scrollbar.vertical": "auto", + "editor.selectionHighlight": true, + "editor.smoothScrolling": true, + "editor.stickyScroll.enabled": true, + "editor.stickyScroll.maxLineCount": 5, + "editor.stickyTabStops": false, + "editor.suggestSelection": "first", + "editor.suggest.insertMode": "replace", + "editor.suggest.preview": true, + "editor.suggest.snippetsPreventQuickSuggestions": false, + "editor.tabCompletion": "on", + "editor.tabSize": 4, + "editor.wordBasedSuggestions": true, + "editor.wordBasedSuggestionsMode": "matchingDocuments", + "editor.wordWrap": "on", + "editor.quickSuggestions": { + "other": "on", + "comments": "on", + "strings": "on", + }, + // Emmet Settings + "emmet.excludeLanguages": [], + "emmet.includeLanguages": { + "javascript": "javascriptreact", + "markdown": "html", + "vue-html": "html" + }, + // Explorer Settings + "explorer.compactFolders": false, + "explorer.confirmDelete": false, + "explorer.confirmDragAndDrop": false, + // Customize UI + // "customizeUI.activityBar": "bottom", + // "customizeUI.activityBarHideSettings": true, + // "customizeUI.listRowHeight": 20, + // "customizeUI.font.monospace": "CaskaydiaCove Nerd Font", + // "customizeUI.font.regular": "CaskaydiaCove Nerd Font", + // "customizeUI.fontSizeMap": { + // "13px": "12px", + // "monospace": "12px", + // "tab-title": "12px", + // "window-title": "12.5px" + // }, + // "customizeUI.titleBar": "inline", + // "customizeUI.stylesheet": { + // ":root,::after,::before": "--tab-height: 25px;--tab-radius: 8px;--ui-radius: 6px;--base-color: #bd93f9;--gradient-one: #c50ed2;--gradient-two: #8500f7;--side-pane-color: var(--vscode-editor-background);--focus-border: #3f4f81;--sash-size: 2px !important;--sash-hover-size: 2px !important;", + // ".editor-container": "-webkit-font-smoothing: antialiased;", + // ".monaco-workbench .part.editor > .content > .watermark": "display: none !important;", + // ".monaco-workbench .part.titlebar .window-controls-container .layout-dropdown-container": "margin-left: auto !important;", + // ".monaco-workbench .part.titlebar > .window-controls-container": "width: unset !important;", + // ".monaco-workbench .part.titlebar > .window-controls-container > .window-icon": "width: 30px !important;", + // ".monaco-workbench .part.titlebar > .titlebar-container .window-appicon > .home-bar-icon-badge, .monaco-workbench .part.titlebar > .titlebar-container > .window-appicon:not(.codicon)": "background-image: url(./vsc/vsc.svg) !important;", + // ".monaco-workbench .part.editor > .content .editor-group-container.empty .editor-group-letterpress": "background-image: url(./vsc/vsc-back.svg) !important;", + // ".monaco-workbench .part.editor.has-watermark > .content.empty .editor-group-container > .editor-group-letterpress": "background-position-y: 50% !important;", + // ".monaco-sash.hover:before, .monaco-sash.active:before": "background: linear-gradient(to bottom, var(--gradient-one), var(--gradient-two)) !important;", + // ".monaco-editor .squiggly-error": "background: none !important;border-bottom: 0.5px solid var(--vscode-editorError-foreground) !important;", + // ".monaco-editor .squiggly-warning": "background: none !important;border-bottom: 0.5px solid var(--vscode-editorWarning-foreground) !important;", + // ".monaco-editor .squiggly-info": "background: none !important;border-bottom: 0.5px solid var(--vscode-editorInfo-foreground) !important;", + // ".monaco-editor .squiggly-hint": "background: none !important;border-bottom: 0.5px solid var(--vscode-editorHint-foreground) !important;", + // "body.activity-bar-at-bottom .monaco-workbench .activitybar .active-item-indicator": "display: block !important;", + // ".monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.checked .active-item-indicator:before": "border: 0 !important;width: 100% !important;height: 3px !important;position: absolute !important;bottom: 0 !important;left: 0 !important;top: unset !important;background-image: linear-gradient(to top, var(--gradient-one), var(--gradient-two)) !important;border-radius: 100vmax !important;", + // ".monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab > .tab-border-bottom-container, .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab > .tab-border-top-container": "background-image: linear-gradient(to left, var(--gradient-one), var(--gradient-two)) !important;height: 3px !important;", + // ".monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .badge .badge-content": "background-image: linear-gradient(90deg, var(--gradient-one), var(--gradient-two)) !important;", + // ".monaco-workbench .part.editor > .content .editor-group-container.active > .title .tabs-container > .tab.dirty > .tab-actions .action-label:not(:hover):before, .monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.dirty > .tab-actions .action-label:not(:hover):before": "content: '' !important;", + // ".codicon-git-branch:before": "background: linear-gradient(to bottom, var(--gradient-one), var(--gradient-two)) !important;-webkit-background-clip: text !important;background-clip: text !important;color: rgba(255, 255, 255, 0.4) !important;", + // ".monaco-editor, .split-view-view .monaco-editor-background": "background: url(./vsc/pek.png) bottom right / 10% auto no-repeat scroll;", + // ".monaco-scrollable-element > .scrollbar > .slider": "border-radius: 7px !important;", + // ".monaco-scrollable-element > .scrollbar > .slider.active": "background: linear-gradient(to top, var(--gradient-one), var(--gradient-two)) !important;", + // "canvas.decorationsOverviewRuler, .monaco-scrollable-element > .scrollbar.vertical, .monaco-scrollable-element > .scrollbar.vertical > .slider": "width: 7px !important;", + // ".monaco-scrollable-element > .scrollbar.horizontal, .monaco-scrollable-element > .scrollbar.horizontal > .slider": "height: 7px !important;", + // ".monaco-scrollable-element > .scrollbar.horizontal > .slider": "width: 135px !important;", + // ".monaco-editor .monaco-hover, .monaco-editor .suggest-widget, .monaco-editor .suggest-details": "border-radius: var(--ui-radius) !important;overflow: hidden !important;box-shadow: rgb(0 0 0 / 36%) 0px 2px calc(var(--ui-radius) + 2px) !important;", + // ".pane .pane-body, .pane .pane-body .monaco-list, .pane .pane-body .monaco-list .monaco-scrollable-element, .pane .pane-body .monaco-list .monaco-scrollable-element .monaco-list-rows, .pane .pane-body .monaco-list .monaco-scrollable-element .monaco-list-rows .monaco-list-row": "overflow: visible !important;", + // ".open-editors .monaco-list .monaco-list-row": "padding-left: 0px !important;", + // ".monaco-list-row:hover, .monaco-list-row.selected, .monaco-list-row.focused": "border-radius: 0 var(--ui-radius) var(--ui-radius) 0 !important;", + // ".monaco-workbench .monaco-list:not(.element-focused):focus:before, .monaco-select-box, .monaco-select-box-dropdown-container, .monaco-select-box-dropdown-container .monaco-list-row:hover, .monaco-select-box-dropdown-container .monaco-list-row.selected, .monaco-select-box-dropdown-container .monaco-list-row.focused": "border-radius: var(--ui-radius) !important;", + // ".monaco-list-row.selected::before, .monaco-list-row.selected::after": "--ui-radius: 6px;content: '' !important;display: block !important;position: absolute !important;width: var(--ui-radius) !important;height: var(--ui-radius) !important;left: 0 !important;pointer-events: none !important;", + // ".monaco-list-row.selected::before": "top: calc(0px - var(--ui-radius)) !important;background: radial-gradient(circle at 100% 0%, transparent 70.71%, var(--side-pane-color) 29.289%) no-repeat;background-position: 100% 0%;", + // ".monaco-list-row.selected::after": "bottom: calc(0px - var(--ui-radius)) !important;background: radial-gradient(circle at 100% 100%, transparent 70.71%, var(--side-pane-color) 29.289%) no-repeat;background-position: 100% 100%;", + // ".monaco-button.monaco-text-button": "border-radius: var(--ui-radius) !important;", + // ".monaco-editor .cursors-layer.cursor-smooth-caret-animation > .cursor": "transition: all 100ms ease-out;", + // ".tab:first-child": "margin-left: var(--tab-radius) !important;", + // ".tab:last-child": "margin-right: var(--tab-radius) !important;", + // ".tab.active": "border-radius: var(--tab-radius) var(--tab-radius) 0 0 !important;", + // ".tab.dirty-border-top > .tab-border-top-container": "border-radius: var(--tab-radius) var(--tab-radius) 0 0 !important;", + // ".tab.active::before, .tab.active::after": "content: '' !important;display: block !important;box-sizing: border-box !important;position: absolute !important;z-index: 1;width: var(--tab-radius) !important;height: var(--tab-radius) !important;bottom: 0px !important;pointer-events: none !important;", + // ".tab.active::before": "left: calc(0px - var(--tab-radius)) !important;border-bottom-right-radius: var(--tab-radius) !important;box-shadow: 3px 3px 0 3px var(--vscode-editor-background) !important;", + // ".tab.active::after": "right: 0 !important;transform: translateX(var(--tab-radius)) !important;border-bottom-left-radius: var(--tab-radius) !important;box-shadow: -3px 3px 0 3px var(--vscode-editor-background) !important;", + // ".monaco-workbench .part.sidebar>.title>.title-label h2": "font-weight: bold !important;", + // "body.activity-bar-at-bottom div.monaco-grid-view > div > div > div.monaco-scrollable-element > div.split-view-container > div.split-view-view.visible > div > div > div.monaco-scrollable-element > div.split-view-container > div:nth-child(1) > div > div > div.monaco-scrollable-element > div.split-view-container > div:nth-child(2)": "height: auto !important;", + // "body.activity-bar-at-bottom .monaco-workbench .part.activitybar": "border: none !important; padding: 0px 6px 6px 6px !important;margin-top: -8px !important; background-color: var(--vscode-editor-background) !important; position: relative !important; z-index: 10 !important;", + // "body.activity-bar-at-bottom .monaco-workbench .activitybar.bordered:before": "display: none !important;", + // "body.activity-bar-at-bottom .monaco-workbench .activitybar > .content": "justify-content: center !important; border-radius: 6px; width: unset !important; border: 1px solid #3f4f818c !important;", + // "body.activity-bar-at-bottom .monaco-workbench .activitybar>.content>.composite-bar": "margin-bottom: unset !important;", + // "body.activity-bar-at-bottom .monaco-action-bar .action-item.icon > .action-label": "color: var(--vscode-editor-foreground) !important;opacity: 0.4;", + // "body.activity-bar-at-bottom .monaco-action-bar .action-item.icon.checked > .action-label": "opacity: 1 !important;", + // ".monaco-workbench .part.editor .tabs-and-actions-container .window-controls-container": "display: flex;flex-grow: 0;flex-shrink: 0;text-align: center; -webkit-app-region: no-drag; height: 100%;", + // ".monaco-workbench .part.editor .tabs-and-actions-container .window-controls-container .window-icon": "width: 30px !important;height: 30px !important; display: flex; align-items: center; justify-content: center;", + // ".monaco-workbench .part.editor .tabs-and-actions-container .window-controls-container .window-icon.window-close:hover": "background-color: #FF5555", + // }, + // Terminal Settings + "terminal.integrated.altClickMovesCursor": true, + "terminal.integrated.cursorBlinking": true, + "terminal.integrated.customGlyphs": true, + "terminal.integrated.cursorStyle": "line", + "terminal.integrated.enableMultiLinePasteWarning": false, + "terminal.integrated.fontFamily": "'CaskaydiaCove Nerd Font', 'FiraCode Nerd Font', 'Hack Nerd Font Mono'", + "terminal.integrated.fontSize": 13, + "terminal.integrated.gpuAcceleration": "auto", + "terminal.integrated.scrollback": 200000, + "terminal.integrated.smoothScrolling": true, + "terminal.integrated.tabs.enabled": false, + "terminal.integrated.tabs.enableAnimation": true, + "terminal.integrated.profiles.linux": { + "zsh": { + "path": "/usr/bin/zsh" + } + }, + "terminal.integrated.shellIntegration.enabled": false, + "terminal.integrated.shellIntegration.decorationsEnabled": "never", + // Language Settings + "[python]": { + "editor.semanticHighlighting.enabled": false + }, + "python.analysis.completeFunctionParens": true, + "python.formatting.provider": "black", + "python.formatting.blackArgs": [ + "--line-length", + "120" + ], + "python.languageServer": "Pylance", + "python.linting.ignorePatterns": [ + ".vscode/*.py", + "**/site-packages/**/*.py", + ".git" + ], + "python.linting.enabled": true, + "python.linting.pylintEnabled": true, + "python.linting.pylintArgs": [ + "--rcfile", + "${env:HOME}/.pylintrc" + // "--load-plugins=pylint_django" + ], + "[cpp]": { + "editor.semanticHighlighting.enabled": false, + }, + "C_Cpp.default.includePath": [ + "${workspaceFolder}/**", + "/usr/include", + "/usr/local/include", + "/usr/include/c++/11.1.0" + ], + "C_Cpp.default.defines": [ + "${default}" + ], + "C_Cpp.default.compilerPath": "/usr/bin/g++", + "C_Cpp.default.cppStandard": "c++20", + "C_Cpp.default.cStandard": "c17", + "C_Cpp.default.intelliSenseMode": "gcc-x64", + "C_Cpp.default.compilerArgs": [ + "-g" + ], + "launch": { + "version": "0.2.0", + "configurations": [ + { + "name": "(gdb) Launch", + "type": "cppdbg", + "request": "launch", + "program": "${fileDirname}/${fileBasenameNoExtension}", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "/usr/bin/gdb", + "preLaunchTask": "Build", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] + }, + "tasks": { + "version": "2.0.0", + "tasks": [ + { + "label": "Build", + "type": "shell", + "command": "g++ -g \"${file}\" -o \"${fileDirname}/${fileBasenameNoExtension}\"", + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "label": "Build (Multiple cpp files)", + "type": "shell", + "command": "g++ -g \"${fileDirname}/*.cpp\" -o \"${fileDirname}/${fileBasenameNoExtension}\"", + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + } + } + ] + }, + "C_Cpp.autocompleteAddParentheses": true, + "C_Cpp.codeFolding": "enabled", + "C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: Google, IndentWidth: 2, ColumnLimit: 0}", + "C_Cpp.inlayHints.autoDeclarationTypes.enabled": true, + "C_Cpp.inlayHints.autoDeclarationTypes.showOnLeft": true, + "C_Cpp.inlayHints.parameterNames.enabled": true, + "C_Cpp.inlayHints.parameterNames.hideLeadingUnderscores": true, + "C_Cpp.inlayHints.parameterNames.suppressWhenArgumentContainsName": true, + "C_Cpp.inlayHints.referenceOperator.enabled": true, + "C_Cpp.inlayHints.referenceOperator.showSpace": false, + "css.format.enable": true, + "css.format.newlineBetweenRules": true, + "css.format.newlineBetweenSelectors": true, + "css.format.spaceAroundSelectorSeparator": true, + "[css]": { + "editor.tabSize": 2 + }, + "java.jdt.ls.java.home": "/usr/lib/jvm/java-11-openjdk-amd64", + "java.configuration.runtimes": [ + { + "name": "JavaSE-11", + "path": "/usr/lib/jvm/java-11-openjdk-amd64" + } + ], + "java.server.launchMode": "LightWeight", + "[html]": { + "editor.tabSize": 2 + }, + "html.autoClosingTags": true, + "html.completion.attributeDefaultValue": "singlequotes", + "[dart]": { + "editor.suggestSelection": "first", + "editor.tabCompletion": "onlySnippets", + "editor.wordBasedSuggestions": false + }, + "[javascript]": { + "editor.tabSize": 2 + }, + "javascript.autoClosingTags": true, + "javascript.suggest.autoImports": true, + "javascript.suggest.completeFunctionCalls": true, + "javascript.suggest.enabled": true, + "javascript.updateImportsOnFileMove.enabled": "always", + "javascript.validate.enable": false, + "[json]": { + "editor.tabSize": 2 + }, + "json.maxItemsComputed": 100000, + "[markdown]": { + "editor.quickSuggestions": { + "other": "on", + "comments": "on", + "strings": "on", + } + }, + "[scss]": { + "editor.tabSize": 2 + }, + "[typescript]": { + "editor.tabSize": 2 + }, + "typescript.autoClosingTags": true, + "typescript.suggest.autoImports": true, + "typescript.updateImportsOnFileMove.enabled": "always", + "typescript.validate.enable": false, + "[typescriptreact]": { + "editor.tabSize": 2, + "editor.formatOnSave": false, + }, + "js/ts.implicitProjectConfig.checkJs": true, + //Latex + "[latex]": { + "editor.formatOnSave": false + }, + // Empty-Indent Extension + "emptyIndent.highlightColor": "rgba(246,36,89,0.6)", + "emptyIndent.highlightIndent": false, + "emptyIndent.removeIndent": true, + // Github Co-pilot + "github.copilot.inlineSuggest.enable": true, + "github.copilot.enable": { + "*": true, + "yaml": false, + "plaintext": true, + "markdown": false + }, + // Gitlens + "gitlens.currentLine.enabled": true, + "gitlens.hovers.currentLine.over": "line", + "gitlens.codeLens.enabled": false, + "gitlens.statusBar.enabled": true, + // General Setting\ + "color-highlight.markRuler": false, + "color-highlight.markerType": "background", + "debug.onTaskErrors": "showErrors", + "debug.openDebug": "openOnDebugBreak", + "eslint.enable": true, + "extensions.ignoreRecommendations": true, + "files.autoSave": "onWindowChange", + "files.insertFinalNewline": true, + "files.restoreUndoStack": true, + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true, + "git.autofetch": true, + "grammarly.files.include": [ + "**/*.md", + "**/*.txt", + "**/*.tex", + ], + "latex-workshop.latex.autoBuild.cleanAndRetry.enabled": true, + "latex-workshop.latex.autoBuild.run": "never", + "latex-workshop.latex.clean.fileTypes": [ + "*/*.aux", + "*/*.synctex.gz" + ], + "latex-workshop.latex.outDir": "/tmp/Review-Paper/", + "latex-workshop.latex.recipe.default": "latexmk (lualatex)", + "latex-workshop.latex.recipes": [ + { + "name": "latexmk 🔃", + "tools": [ + "latexmk" + ] + }, + { + "name": "latexmk (latexmkrc)", + "tools": [ + "latexmk_rconly" + ] + }, + { + "name": "latexmk (lualatex)", + "tools": [ + "lualatexmk" + ] + }, + { + "name": "latexmk (xelatex)", + "tools": [ + "xelatexmk" + ] + }, + { + "name": "pdflatex ➞ bibtex ➞ pdflatex × 2", + "tools": [ + "pdflatex", + "bibtex", + "pdflatex", + "pdflatex" + ] + }, + { + "name": "Compile Rnw files", + "tools": [ + "rnw2tex", + "latexmk" + ] + }, + { + "name": "Compile Jnw files", + "tools": [ + "jnw2tex", + "latexmk" + ] + }, + { + "name": "tectonic", + "tools": [ + "tectonic" + ] + } + ], + "latex-workshop.latex.tools": [ + { + "name": "latexmk", + "command": "latexmk", + "args": [ + "-synctex=1", + "-interaction=nonstopmode", + "-file-line-error", + "-pdf", + "-outdir=%OUTDIR%", + "%DOC%" + ], + "env": {} + }, + { + "name": "lualatexmk", + "command": "latexmk", + "args": [ + "-synctex=1", + "-interaction=nonstopmode", + "-file-line-error", + "-lualatex", + "-outdir=%OUTDIR%", + "%DOC%" + ], + "env": {} + }, + { + "name": "xelatexmk", + "command": "latexmk", + "args": [ + "-synctex=1", + "-interaction=nonstopmode", + "-file-line-error", + "-xelatex", + "-outdir=%OUTDIR%", + "%DOC%" + ], + "env": {} + }, + { + "name": "latexmk_rconly", + "command": "latexmk", + "args": [ + "%DOC%" + ], + "env": {} + }, + { + "name": "pdflatex", + "command": "pdflatex", + "args": [ + "-synctex=1", + "-interaction=nonstopmode", + "-file-line-error", + "-output-directory=%OUTDIR%", + "%DOC%" + ], + "env": {} + }, + { + "name": "bibtex", + "command": "bibtex", + "args": [ + "%DOCFILE%" + ], + "env": {} + }, + { + "name": "rnw2tex", + "command": "Rscript", + "args": [ + "-e", + "knitr::opts_knit$set(concordance = TRUE); knitr::knit('%DOCFILE_EXT%')" + ], + "env": {} + }, + { + "name": "jnw2tex", + "command": "julia", + "args": [ + "-e", + "using Weave; weave(\"%DOC_EXT%\", doctype=\"tex\")" + ], + "env": {} + }, + { + "name": "jnw2texmintex", + "command": "julia", + "args": [ + "-e", + "using Weave; weave(\"%DOC_EXT%\", doctype=\"texminted\")" + ], + "env": {} + }, + { + "name": "tectonic", + "command": "tectonic", + "args": [ + "--synctex", + "--keep-logs", + "%DOC%.tex" + ], + "env": {} + } + ], + "liveServer.settings.donotShowInfoMsg": true, + "liveServer.settings.donotVerifyTags": true, + "liveServer.settings.file": "404.html", + // "liveServer.settings.https": { + // "enable": true, + // "cert": "/home/proxzima/.ssh/cert/cert.pem", + // "key": "/home/proxzima/.ssh/cert/key.pem", + // "passphrase": "1234" + // }, + "liveServer.settings.useLocalIp": true, + "markdown.preview.markEditorSelection": true, + "markdown.preview.scrollEditorWithPreview": false, + "markdown.preview.scrollPreviewWithEditor": false, + "svgPreview.autoOpen": true, + "svgPreview.scaleToFit": true, + "svgPreview.style": { + "html": { + "background-position": "0 0, 13px 13px", + "background-size": "26px 26px", + "background": "rgba(255, 255, 255, 1)", + // "background-image": "linear-gradient(45deg, #141414 25%, transparent 25%, transparent 75%, #141414 75%, #141414), linear-gradient(45deg, #141414 25%, transparent 25%, transparent 75%, #141414 75%, #141414)" + } + }, + "print.folder.exclude": [ + "{bin,obj,out}", + "node_module", + "**/*.{bin,exe,dll,hex,pdb,pdf,pfx,png,jpg,gif,bmp,suo,pptx,ppt,jar,woff2,woff,ttf,eot,odt,otf,class}" + ], + "print.lineNumbers": "on", + "print.printAndClose": false, + "print.colourScheme": "XCode", + "print.alternateBrowser": true, + "print.browserPath": "/usr/bin/google-chrome", + "spellright.documentTypes": [ + "markdown", + "latex", + "plaintext" + ], + "spellright.language": [ + "en_GB" + ], + "spellright.notificationClass": "information", + "spellright.suggestionsInHints": false, + "spellright.useDocumentSymbolsInCode": true, + "telemetry.telemetryLevel": "off", + "search.exclude": { + "**/bower_components": true, + "**/*.code-search": true, + "**/node_modules": true, + "**/env": true, + "**/venv": true + }, + "files.associations": { + "*.xml": "html", + "*.svg": "html", + "*.json": "jsonc" + }, + "files.exclude": { + "**/.DS_Store": true, + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.classpath": true, + "**/.project": true, + "**/.settings": true, + "**/.factorypath": true + }, + "files.watcherExclude": { + "**/.DS_Store/**": true, + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/.svn/**": true, + "**/.hg/**": true, + "**/CVS/**": true, + "**/node_modules/**": true, + "**/env/**": true, + "**/venv/**": true, + "env-*": true + }, + "workbench.colorTheme": "Sweet Dracula", + "security.workspace.trust.untrustedFiles": "open", + "workbench.activityBar.visible": false +} diff --git a/.config/Code/User/snippets/snippet.code-snippets b/.config/Code/User/snippets/snippet.code-snippets new file mode 100644 index 0000000..16bdfed --- /dev/null +++ b/.config/Code/User/snippets/snippet.code-snippets @@ -0,0 +1,126 @@ +{ + // Place your global snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and + // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope + // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is + // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: + // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. + // Placeholders with the same ids are connected. + // Example: + "if name is main": { + "scope": "python", + "prefix": "ifn", + "body": [ + "if __name__ == '__main__':", + "\t$0" + ], + "description": "" + }, + "for in": { + "scope": "python", + "prefix": "fori", + "body": [ + "for ${1:item} in ${2:items}:", + "\t$0" + ], + "description": "" + }, + "for in range": { + "scope": "python", + "prefix": "forr", + "body": [ + "for ${1:i} in range($2):", + "\t$0" + ], + "description": "" + }, + "lambda": { + "scope": "python", + "prefix": "lamb", + "body": [ + "lambda ${1:arg} : $0", + ], + "description": "" + }, + "map input": { + "scope": "python", + "prefix": "mapi", + "body": [ + "map(${1:func}, input($2).split())" + ], + "description": "" + }, + "html boiler plate": { + "scope": "html", + "prefix": "html", + "body": [ + "<!DOCTYPE html>", + "<html lang=\"en\">", + "", + "<head>", + " <meta charset=\"utf-8\">", + " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">", + "", + " <title>${1:Basic HTML5}</title>", + " <meta name=\"author\" content=\"${2:Trevor Gray}\">", + " <meta name=\"description\" content=\"${3:HTML5 Template}\">", + "", + " <meta property=\"og:title\" content=\"${4:HTML5 Template}\">", + " <meta property=\"og:type\" content=\"website\">", + " <meta property=\"og:url\" content=\"https://$5\">", + " <meta property=\"og:description\" content=\"${6:HTML5 Template}\">", + " <meta property=\"og:image\" content=\"${7:./assets/preview.png}\">", + "", + " <link rel=\"icon\" href=\"${8:./assets/favicon.ico}\">", + " <link rel=\"icon\" href=\"${9:./assets/favicon.svg}\" type=\"image/svg+xml\">", + " <link rel=\"apple-touch-icon\" href=\"${10:./assets/apple-touch-icon.png}\">", + "", + " <link rel=\"stylesheet\" href=\"${11:./css/style.css}\">", + "", + "</head>", + "", + "<body>", + " ${0:<!-- your content here... -->}", + " <script src=\"${12:./js/main.js}\" defer></script>", + "</body>", + "", + "</html>", + ], + "description": "" + }, + "css boiler plate": { + "scope": "css", + "prefix": "css", + "body": [ + "html {", + " font-family: sans-serif;", + " font-size: 100%;", + " box-sizing: border-box;", + "}", + "", + "*, ::before, ::after {", + " box-sizing: inherit;", + "}", + "", + "html, body {", + " margin: 0;", + " padding: 0;", + " width: 100vw;", + " min-height: 100%;", + " text-rendering: optimizeLegibility;", + "}", + "" + ] + }, + "consoleLog": { + "scope": "javascript", + "prefix": "clg", + "body": "console.log(${1:object});", + "description": "Displays a message in the console" + }, + "consoleLogObject": { + "scope": "javascript", + "prefix": "clo", + "body": "console.log('${1:object} :>> ', ${1:object});", + "description": "Displays an object in the console with its name" + } +} diff --git a/.config/Code/User/spellright.dict b/.config/Code/User/spellright.dict new file mode 100644 index 0000000..94f1e64 --- /dev/null +++ b/.config/Code/User/spellright.dict @@ -0,0 +1,14 @@ +srdusr +gui +url +yara +backend +txt +Regex +github +args +grep +res +yar +shipit +json diff --git a/.config/Code/User/vsc.css b/.config/Code/User/vsc.css new file mode 100644 index 0000000..8316df0 --- /dev/null +++ b/.config/Code/User/vsc.css @@ -0,0 +1,408 @@ +/* *:not(.monaco-editor .margin):not(.monaco-editor .lines-content.monaco-editor-background):not(.monaco-editor .cursors-layer.cursor-smooth-caret-animation > .cursor):not(.monaco-scrollable-element > .scrollbar.vertical > .slider):not(.monaco-scrollable-element > .scrollbar.horizontal > .slider):not(.pane .pane-body .monaco-list .monaco-scrollable-element .monaco-list-rows) { + transition-duration: 100ms !important; +} */ + +:root, +::after, +::before { + --tab-height: 25px; + --tab-radius: 8px; + --ui-radius: 6px; + --base-color: #bd93f9; + --gradient-one: #cba6f7; + --gradient-two: #89b4fa; + --side-pane-color: var(--vscode-editor-background); + --focus-border: #3f4f81; + --sash-size: 2px !important; + --sash-hover-size: 2px !important; +} + +body > .monaco-workbench > .monaco-grid-view > .monaco-grid-branch-node > .monaco-split-view2 > .monaco-scrollable-element > .split-view-container { + background: var(--vscode-editor-background) !important; +} + +.editor-container { + -webkit-font-smoothing: antialiased; +} + +.monaco-workbench .part.titlebar .window-controls-container .window-icon, +.monaco-workbench .part.editor > .content > .watermark { + display: none !important; +} + +.monaco-workbench .part.editor .tabs-and-actions-container .window-controls-container { + display: flex; + flex-grow: 0; + flex-shrink: 0; + text-align: center; + -webkit-app-region: no-drag; + height: 100%; +} + +.monaco-workbench .part.editor .tabs-and-actions-container .window-controls-container .window-icon { + width: 30px !important; + height: 30px !important; + display: flex; + align-items: center; + justify-content: center; +} + +.monaco-workbench .part.editor .tabs-and-actions-container .window-controls-container .window-icon.window-close:hover { + background: #FF5555 !important; +} + +.monaco-workbench .part.titlebar .window-controls-container .layout-dropdown-container { + margin-left: auto !important; +} + +.monaco-workbench .part.titlebar > .window-controls-container { + width: unset !important; +} + +.monaco-workbench .part.titlebar > .window-controls-container > .window-icon { + width: 30px !important; +} + +.monaco-workbench.linux .part.titlebar > .window-title { + font-size: 12.5px !important; +} + +.monaco-workbench .part.titlebar > .titlebar-container .window-appicon > .home-bar-icon-badge, +.monaco-workbench .part.titlebar > .titlebar-container > .window-appicon:not(.codicon) { + background-image: url(./vsc/vsc.svg) !important; +} + +.monaco-workbench .part.editor > .content .editor-group-container.empty .editor-group-letterpress { + background-image: url(./vsc/vsc-back.svg) !important; +} + +.monaco-workbench .part.editor.has-watermark > .content.empty .editor-group-container > .editor-group-letterpress { + background-position-y: 50% !important; +} + +.mac, +.windows, +.linux { + /* font-family: 'CaskaydiaCove Nerd Font' !important; + --monaco-monospace-font: 'CaskaydiaCove Nerd Font' !important; */ + /* font-family: 'Delugia' !important; + --monaco-monospace-font: 'Delugia Mono' !important; */ +} + + +.monaco-workbench .part.sidebar > .title > .title-label h2 { + font-weight: bold !important; +} + +.monaco-sash.hover:before, +.monaco-sash.active:before { + background: linear-gradient(to bottom, var(--gradient-one), var(--gradient-two)) !important; +} + +/* Squiggly lines to straight lines */ + +.monaco-editor .squiggly-error { + background: none !important; + border-bottom: 0.5px solid var(--vscode-editorError-foreground) !important; +} + +.monaco-editor .squiggly-warning { + background: none !important; + border-bottom: 0.5px solid var(--vscode-editorWarning-foreground) !important; +} + +.monaco-editor .squiggly-info { + background: none !important; + border-bottom: 0.5px solid var(--vscode-editorInfo-foreground) !important; +} + +.monaco-editor .squiggly-hint { + background: none !important; + border-bottom: 0.5px solid var(--vscode-editorHint-foreground) !important; +} + +/* */ + +/* Gradient Tab border */ +body.activity-bar-at-bottom .monaco-workbench .activitybar .active-item-indicator { + display: block !important; +} + +.monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .action-item.checked .active-item-indicator:before { + border: 0 !important; + width: 3px !important; + height: 100% !important; + position: absolute !important; + top: 0 !important; + left: 0 !important; + background-image: linear-gradient(to top, var(--gradient-one), var(--gradient-two)) !important; + border-radius: 100vmax !important; +} + +.monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab > .tab-border-bottom-container, +.monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab > .tab-border-top-container { + background-image: linear-gradient(to left, var(--gradient-one), var(--gradient-two)) !important; + height: 3px !important; + display: none !important; +} + +.monaco-workbench .activitybar > .content :not(.monaco-menu) > .monaco-action-bar .badge .badge-content { + background-image: linear-gradient(90deg, var(--gradient-one), var(--gradient-two)) !important; +} + +/* */ + +/* Hides dirty tab white dot indicator */ + +.monaco-workbench .part.editor > .content .editor-group-container.active > .title .tabs-container > .tab.dirty > .tab-actions .action-label:not(:hover):before, +.monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.dirty > .tab-actions .action-label:not(:hover):before { + content: '' !important; +} + +/* */ + +/* Git icon background */ + +.codicon-git-branch:before { + background: linear-gradient(to bottom, var(--gradient-one), var(--gradient-two)) !important; + -webkit-background-clip: text !important; + background-clip: text !important; + color: rgba(255, 255, 255, 0.4) !important; +} + +/* */ + +/* Editor Background */ + +.monaco-editor, +.split-view-view .lines-content.monaco-editor-background { + background: url(./vsc/pek.png) bottom right / 10% auto no-repeat scroll; + /*background: linear-gradient(rgba(0,0,0,.65), rgba(0,0,0,.65)), url(./vsc/bg.jpg) center center / auto 100vh no-repeat scroll;*/ +} + +/* */ + +/* Scrollbar */ +.monaco-scrollable-element > .scrollbar > .slider { + border-radius: 7px !important; +} + +.monaco-scrollable-element > .scrollbar > .slider.active { + background: linear-gradient(to top, var(--gradient-one), var(--gradient-two)) !important; +} + +canvas.decorationsOverviewRuler, +.monaco-scrollable-element > .scrollbar.vertical, +.monaco-scrollable-element > .scrollbar.vertical > .slider { + width: 7px !important; +} + +.monaco-scrollable-element > .scrollbar.vertical > .slider { + transition: all 100ms ease-out; +} + +.monaco-scrollable-element > .scrollbar.horizontal, +.monaco-scrollable-element > .scrollbar.horizontal > .slider { + height: 7px !important; +} + +.monaco-scrollable-element > .scrollbar.horizontal > .slider { + transition: all 100ms ease-out; +} + +.monaco-scrollable-element > .scrollbar.horizontal > .slider { + width: 135px !important; +} + +/* */ + +/* Rounded UI */ + +/* Suggestions */ +.monaco-editor .monaco-hover, +.monaco-editor .suggest-widget, +.monaco-editor .suggest-details { + border-radius: var(--ui-radius) !important; + overflow: hidden !important; + box-shadow: rgb(0 0 0 / 36%) 0px 2px calc(var(--ui-radius) + 2px) !important; +} + +/* Left pane selected file */ +.pane .pane-body, +.pane .pane-body .monaco-list, +.pane .pane-body .monaco-list .monaco-scrollable-element, +.pane .pane-body .monaco-list .monaco-scrollable-element .monaco-list-rows, +.pane .pane-body .monaco-list .monaco-scrollable-element .monaco-list-rows .monaco-list-row { + overflow: visible !important; +} + +.open-editors .monaco-list .monaco-list-row { + padding-left: 0px !important; +} + +.monaco-list-row:hover, +.monaco-list-row.selected, +.monaco-list-row.focused { + border-radius: 0 var(--ui-radius) var(--ui-radius) 0 !important; +} + +.monaco-workbench .monaco-list:not(.element-focused):focus:before, +.monaco-select-box, +.monaco-select-box-dropdown-container, +.monaco-select-box-dropdown-container .monaco-list-row:hover, +.monaco-select-box-dropdown-container .monaco-list-row.selected, +.monaco-select-box-dropdown-container .monaco-list-row.focused { + border-radius: var(--ui-radius) !important; +} + +.monaco-list-row.selected::before, +.monaco-list-row.selected::after { + content: '' !important; + display: block !important; + position: absolute !important; + width: var(--ui-radius) !important; + height: var(--ui-radius) !important; + left: 0 !important; + pointer-events: none !important; +} + +.monaco-list-row.selected::before { + top: calc(0px - var(--ui-radius)) !important; + background: radial-gradient(circle at 100% 0%, transparent 70.71%, var(--side-pane-color) 29.289%) no-repeat; + background-position: 100% 0%; +} + +.monaco-list-row.selected::after { + bottom: calc(0px - var(--ui-radius)) !important; + background: radial-gradient(circle at 100% 100%, transparent 70.71%, var(--side-pane-color) 29.289%) no-repeat; + background-position: 100% 100%; +} + +.monaco-button.monaco-text-button { + border-radius: var(--ui-radius) !important; +} + +/* */ + +/* Smooth cursor */ + +.monaco-editor .cursors-layer.cursor-smooth-caret-animation > .cursor { + transition: all 100ms ease-out; +} + +/* */ + +/* Active tab (Without border) */ + +..tab:first-child { + margin-left: var(--tab-radius) !important; + /* margin-left: calc(var(--tab-radius) - 2px) !important; */ +} + +..tab:last-child { + margin-right: var(--tab-radius) !important; + /* margin-right: calc(var(--tab-radius) - 2px) !important; */ +} + +..tab.active { + /* border: 2px solid var(--base-color) !important; */ + /* background-color: transparent !important; */ + /* rgb(20, 24, 34) */ + border-radius: var(--tab-radius) var(--tab-radius) 0 0 !important; + /* border-bottom: 2px solid #0c0e14 !important; */ + /* z-index: 1 !important; */ +} + +.tab.dirty-border-top > .tab-border-top-container { + border-radius: var(--tab-radius) var(--tab-radius) 0 0 !important; +} + +/* Border bottom radius*/ +..tab.active::before, +..tab.active::after { + content: '' !important; + display: block !important; + box-sizing: border-box !important; + position: absolute !important; + z-index: 1; + width: var(--tab-radius) !important; + height: var(--tab-radius) !important; + bottom: 0px !important; + /* bottom: -2px !important; */ + pointer-events: none !important; + /* border-bottom: 2px solid var(--base-color) !important; */ +} + +...tab.active::before { + left: calc(0px - var(--tab-radius)) !important; + /* transform: translateX(calc(0px - var(--tab-radius))) !important; */ + /* border-right: 2px solid var(--base-color) !important; */ + border-bottom-right-radius: var(--tab-radius) !important; + /* box-shadow: 3px 3px 0 3px var(--tab-color) !important; */ + box-shadow: 3px 3px 0 3px var(--vscode-editor-background) !important; + /* background: radial-gradient(circle at 0% 0%, transparent 70.71%, var(--tab-color) 29.289%) no-repeat; + background-position: 0% 0%; */ +} + +..tab.active::after { + right: 0 !important; + transform: translateX(var(--tab-radius)) !important; + /* border-left: 2px solid var(--base-color) !important; */ + border-bottom-left-radius: var(--tab-radius) !important; + /* box-shadow: -3px 3px 0 3px var(--tab-color) !important; */ + box-shadow: -3px 3px 0 3px var(--vscode-editor-background) !important; + /* background: radial-gradient(circle at 100% 0%, transparent 70.71%, var(--tab-color) 29.289%) no-repeat; + background-position: 100% 0%; */ +} + +/* .tabs-container:before { + content: '' !important; + top: 0 !important; + left: 0 !important; + right: 0 !important; + bottom: 0 !important; + background: linear-gradient(90deg, rgb(12, 14, 20), rgb(189, 172, 255), rgb(189, 147, 249), rgb(189, 147, 249), rgb(189, 147, 249), rgb(189, 172, 249), rgb(12, 14, 20)) !important; + clip: rect(33px, 2600px, 33px, 0px) !important; + position: absolute !important; +} + +.tabs-container:after { + content: '' !important; + top: 0 !important; + left: 0 !important; + right: 0 !important; + bottom: 0 !important; + background: linear-gradient(90deg, rgb(12, 14, 20), rgb(189, 172, 255), rgb(189, 147, 249), rgb(189, 147, 249), rgb(189, 147, 249), rgb(189, 172, 249), rgb(12, 14, 20)) !important; + clip: rect(33px, 2600px, 35px, 0px) !important; + position: absolute !important; +} + +.tab-label > .monaco-icon-label-container::after { + background: transparent !important; +} */ + +/* */ + +.tab{ + border-radius: 12px !important; + margin: 5px !important; + height: 40px !important; + border:2px solid #313244 !important; + background-color: #161925 !important; +} +.tab.active { + border: 2px solid var(--gradient-one) !important; + color: var(--gradient-one) !important; + font-weight: bold !important; +} +.tab.dirty { + border: 2px solid var(--gradient-two) !important; + +} +.tabs-container{ + height: auto !important; + padding: 5px !important; +} +.editor-actions { + height: inherit !important; +} diff --git a/.config/Code/User/vsc.js b/.config/Code/User/vsc.js new file mode 100644 index 0000000..a14bf5a --- /dev/null +++ b/.config/Code/User/vsc.js @@ -0,0 +1,100 @@ +function getOffset(el) { + const rect = el.getBoundingClientRect(); + return { + left: rect.left + window.scrollX, + top: rect.top + window.scrollY, + }; +} + +const prevOffset = {}; + +const displayEffect = (event) => { + if (prevOffset.top === undefined) { + let initialOffset = getOffset(document.getElementsByClassName("cursor")[0]); + prevOffset.top = initialOffset.top; + prevOffset.left = initialOffset.left; + } + + const existingRect = document.getElementById("myRect"); + if (existingRect !== null) { + existingRect.remove(); + } + + setTimeout(function () { + const currOffset = getOffset(document.getElementsByClassName("cursor")[0]); + const top = prevOffset.top; + const left = prevOffset.left; + const rect = document.createElement("div"); + + // console.log("prev: ", top, left); + // console.log("curr: ", currOffset.top, currOffset.left); + + rect.id = "myRect"; + rect.style.cssText = ` + position:absolute; + top:${top}px; + left:${left}px; + width:9px; + height:20px; + z-index:10; + background-color:red; + opacity: 0.5; + `; + rect.animate( + [ + // keyframes + { transform: "scale(1) skew(10deg)" }, + { transform: "scale(0) skew(10deg)" }, + ], + { + // timing options + duration: 500, + easing: "ease-in-out", + direction: "alternate", + iterations: Infinity, + } + ); + + document.body.appendChild(rect); + prevOffset.top = currOffset.top; + prevOffset.left = currOffset.left; + }, 24); +}; + +// NOTE: First enable editor.cursorSmoothCaretAnimation. +// NOTE: Uncomment this to get a cursor trail effect. +// document.addEventListener("keydown", displayEffect); + +const windowControls = document.createElement('div'); +windowControls.className = 'window-controls-container'; +const minimize = document.createElement('div'); +minimize.classList.add('window-icon', 'window-minimize', 'codicon', 'codicon-chrome-minimize'); +const restore = document.createElement('div'); +restore.classList.add('window-icon', 'window-max-restore', 'codicon', 'codicon-chrome-restore'); +const close = document.createElement('div'); +close.classList.add('window-icon', 'window-close', 'codicon', 'codicon-chrome-close'); +windowControls.appendChild(minimize); +windowControls.appendChild(restore); +windowControls.appendChild(close); +// const html = '<div class="window-controls-container"><div class="window-icon window-minimize codicon codicon-chrome-minimize"></div><div class="window-icon window-max-restore codicon codicon-chrome-restore"></div><div class="window-icon window-close codicon codicon-chrome-close"></div></div>'; +// template.innerHTML = html; +// const windowControls = template.content.firstChild; + +var observer = new MutationObserver(function (mutations, me) { + console.warn('Observing if window controls present'); + // const windowControls = document.querySelector(".window-controls-container"); + const tabContainer = document.querySelector(".tabs-and-actions-container"); + + if (windowControls && tabContainer) { + tabContainer.appendChild(windowControls); + console.warn('Observing completed'); + me.disconnect(); + return; + } +}); + + +// observer.observe(document, { +// childList: true, +// subtree: true +// }); diff --git a/.config/X11/.Xresources b/.config/X11/.Xresources new file mode 100644 index 0000000..be509d1 --- /dev/null +++ b/.config/X11/.Xresources @@ -0,0 +1,307 @@ +st.alpha: 255 +!! Transparency (0-1): +*.alpha: 0.2 + +urxvt*shading: 10 +urxvt*tintColor: #000000 +urxvt*blurRadius: 5 +urxvt*transparent: true +urxvt*depth: 32 +urxvt*background: rgba:0000/0000/1111/dddd +!urxvt*background: rgba:0000/0000/0200/c800 +!URxvt*scrollstyle: plain +URxvt.scrollBar: False +!URxvt.font: xft:DejaVu Sans Mono:pixelsize=11:antialias=true +URxvt.font: xft:monospace:Bold:pixelsize=12:antialias=true +!URxvt*transparent: true +!URxvt*shading: 5 +! change to whateva background +URxvt.keysym.C-7: command:\033]11;#ff0000\007 +!URxvt*reverseVideo: True + +URxvt*saveLines : 10000 + +!URxvt.keysym.Control-Up: \033[1;5A +!URxvt.keysym.Control-Down: \033[1;5B +!URxvt.keysym.Control-Left: \033[1;5D +!URxvt.keysym.Control-Right: \033[1;5C + +URxvt.keysym.Control-1: command:\007\033]711;xft:monospace:Bold:pixelsize=12:antialias=true\007 +URxvt.keysym.Control-2: command:\007\033]711;xft:monospace:Bold:pixelsize=18:antialias=true\007 +URxvt.keysym.Control-3: command:\007\033]711;xft:monospace:Bold:pixelsize=28:antialias=true\007 +!URxvt.keysym.Control-1: command:\033]710;xft:Terminus:pixelsize=10:antialias=false\007\033]711;xft:Terminus:Bold:pixelsize=10:antialias=false\007 +!URxvt.keysym.Control-2: command:\033]710;xft:Terminus:pixelsize=14:antialias=false\007\033]711;xft:Terminus:Bold:pixelsize=14:antialias=false\007 +!URxvt.keysym.Control-3: command:\033]710;xft:Terminus:pixelsize=18:antialias=false\007\033]711;xft:Terminus:Bold:pixelsize=18:antialias=false\007 +!URxvt.keysym.Control-4: command:\033]710;xft:Terminus:Bold:pixelsize=20:antialias=false\007\033]711;xft:Terminus:Bold:pixelsize=20:antialias=false\007 +!URxvt.keysym.Control-5: command:\033]710;xft:Terminus:Bold:pixelsize=28:antialias=false\007\033]711;xft:Terminus:Bold:pixelsize=28:antialias=false\007 + + + + + + + +!URxvt.perl-ext-common: selection-to-clipboard +!URxvt.keysym.Shift-Control-V: eval:paste_clipboard +!URxvt.keysym.Shift-Control-C: eval:selection_to_clipboard + + +URxvt.iso14755: false +URxvt.iso14755_52: false + + +!URxvt.scrollBar: true +!URxvt.scrollBar_right: true +!URxvt.scrollBar_floating: true +!URxvt.searchable-scrollback: false +URxvt.url-select.underline: true +URxvt.url-select.autocopy: true +URxvt.cutchars: `""()''*<>[]{|} +URxvt.cursorBlink: True +URxvt.cursorColor: green +URxvt.colorBD: yellow +URxvt.colorUL: green +!URxvt.blurRadius: 5 + + +!! Copy Paste & Other Extensions +!URxvt.perl-ext-common: default,clipboard,url-select,keyboard-select +!URxvt.copyCommand: xclip -i -selection clipboard +!URxvt.pasteCommand: xclip -o -selection clipboard +!URxvt.keysym.M-c: perl:clipboard:copy +!URxvt.keysym.M-v: perl:clipboard:paste +!URxvt.keysym.M-C-v: perl:clipboard:paste_escaped +!URxvt.keysym.M-Escape: perl:keyboard-select:activate +!URxvt.keysym.M-s: perl:keyboard-select:search +!URxvt.keysym.M-u: perl:url-select:select_next +!URxvt.urlLauncher: firefox +!URxvt.underlineURLs: true +!URxvt.urlButton: 1 + + + + +URxvt.keysym.Control-v: eval:paste_clipboard +URxvt.keysym.Control-c: eval:selection_to_clipboard +URxvt.keysym.Control-Meta-c: builtin-string: +URxvt.keysym.Control-Meta-v: builtin-string: + + +URxvt.keysym.Control-k: command:\033]720;1\007 +URxvt.keysym.Control-j: command:\033]721;1\007 + + +URxvt.keysym.Meta-Page_Up: perl:pageup +URxvt.keysym.Meta-Page_Down: perl:pagedown +URxvt.perl-lib: /usr/local/lib/urxvt/perl +URxvt.perl-ext: custom.pl + + +!URxvt*loginShell: true +!URxvt*termName: screen-256color + +!URxvt*perl-ext-common: +!URxvt*perl-ext: + + +!URxvt.keysym.Control-B: eval:scroll_up_pages 1 +!URxvt.keysym.Control-F: eval:scroll_down_pages 1 + + +URxvt.perl-ext-common: default,matcher,clipboard,tabbed +URxvt.clipboard.autocopy: true +URxvt.keysym.M-c: perl:clipboard:copy +URxvt.keysym.M-v: perl:clipboard:paste + +!URxvt.url-launcher: /usr/bin/xdg-open +!URxvt.matcher.button: 1 +!URxvt.keysym.C-Delete: perl:matcher:last +!URxvt.keysym.M-Delete: perl:matcher:list +!URxvt.matcher.rend.0: Uline Bold fg5 + +!URxvt.perl-ext-common: ...,tabbed,... + + +!Key Description +!Shift+Down New tab +!Shift+Left Go to left tab +!Shift+Right Go to right tab +!Ctrl+Left Move tab to the left +!Ctrl+Right Move tab to the right +!Ctrl+d Close tab + + +!URxvt.keysym.Control-k: \033[1;5A +!URxvt.keysym.Control-j: \033[1;5B +!URxvt.keysym.Control-l: \033[1;5C +!URxvt.keysym.Control-h: \033[1;5D + +!^[[5~ + + +rofi.kb-row-up: Up,Control+k,Shift+Tab,Shift+ISO_Left_Tab +rofi.kb-row-down: Down,Control+j +rofi.kb-accept-entry: Control+m,Return,KP_Enter +rofi.terminal: st +rofi.kb-remove-to-eol: Control+Shift+e +rofi.kb-mode-next: Shift+Right,Control+Tab,Control+l +rofi.kb-mode-previous: Shift+Left,Control+Shift+Tab,Control+h +rofi.kb-remove-char-back: BackSpace + + + + +!! Set a default font and font size as below: +!*.font: monospace:size=10 +rofi.font: Noto Sans 11 + +/* name dark light */ +/* black 0 8 */ +/* red 1 9 */ +/* green 2 10 */ +/* yellow 3 11 */ +/* blue 4 12 */ +/* purple 5 13 */ +/* cyan 6 14 */ +/* white 7 15 */ + +/* !! gruvbox: */ +/* *.color0: #1d2021 */ +/* *.color1: #cc241d */ +/* *.color2: #98971a */ +/* *.color3: #d79921 */ +/* *.color4: #458588 */ +/* *.color5: #b16286 */ +/* *.color6: #689d6a */ +/* *.color7: #a89984 */ +/* *.color8: #928374 */ +/* *.color9: #fb4934 */ +/* *.color10: #b8bb26 */ +/* *.color11: #fabd2f */ +/* *.color12: #83a598 */ +/* *.color13: #d3869b */ +/* *.color14: #8ec07c */ +/* *.color15: #ebdbb2 */ +/* *.color256: #1d2021 */ +/* *.color257: #ebdbb2 */ + +* !! gruvbox light: */ +* *.color0: #fbf1c7 */ +* *.color1: #cc241d */ +* *.color2: #98971a */ +* *.color3: #d79921 */ +* *.color4: #458588 */ +* *.color5: #b16286 */ +* *.color6: #689d6a */ +* *.color7: #7c6f64 */ +* *.color8: #928374 */ +* *.color9: #9d0006 */ +* *.color10: #79740e */ +* *.color11: #b57614 */ +* *.color12: #076678 */ +* *.color13: #8f3f71 */ +* *.color14: #427b58 */ +* *.color15: #3c3836 */ +* *.background: #fbf1c7 */ +* *.foreground: #282828 */ +* st.alpha: 0.2 */ + +/* !! brogrammer: */ +/* *.foreground: #d6dbe5 */ +/* *.background: #131313 */ +/* *.color0: #1f1f1f */ +/* *.color8: #d6dbe5 */ +/* *.color1: #f81118 */ +/* *.color9: #de352e */ +/* *.color2: #2dc55e */ +/* *.color10: #1dd361 */ +/* *.color3: #ecba0f */ +/* *.color11: #f3bd09 */ +/* *.color4: #2a84d2 */ +/* *.color12: #1081d6 */ +/* *.color5: #4e5ab7 */ +/* *.color13: #5350b9 */ +/* *.color6: #1081d6 */ +/* *.color14: #0f7ddb */ +/* *.color7: #d6dbe5 */ +/* *.color15: #ffffff */ +/* *.colorBD: #d6dbe5 */ + +/* ! base16 */ +/* *.color0: #181818 */ +/* *.color1: #ab4642 */ +/* *.color2: #a1b56c */ +/* *.color3: #f7ca88 */ +/* *.color4: #7cafc2 */ +/* *.color5: #ba8baf */ +/* *.color6: #86c1b9 */ +/* *.color7: #d8d8d8 */ +/* *.color8: #585858 */ +/* *.color9: #ab4642 */ +/* *.color10: #a1b56c */ +/* *.color11: #f7ca88 */ +/* *.color12: #7cafc2 */ +/* *.color13: #ba8baf */ +/* *.color14: #86c1b9 */ +/* *.color15: #f8f8f8 */ + +/* !! solarized */ +/* *.color0: #073642 */ +/* *.color1: #dc322f */ +/* *.color2: #859900 */ +/* *.color3: #b58900 */ +/* *.color4: #268bd2 */ +/* *.color5: #d33682 */ +/* *.color6: #2aa198 */ +/* *.color7: #eee8d5 */ +/* *.color9: #cb4b16 */ +/* *.color8: #fdf6e3 */ +/* *.color10: #586e75 */ +/* *.color11: #657b83 */ +/* *.color12: #839496 */ +/* *.color13: #6c71c4 */ +/* *.color14: #93a1a1 */ +/* *.color15: #fdf6e3 */ + +/* !! xterm */ +/* *.color0: #000000 */ +/* *.color1: #cd0000 */ +/* *.color2: #00cd00 */ +/* *.color3: #cdcd00 */ +/* *.color4: #0000cd */ +/* *.color5: #cd00cd */ +/* *.color6: #00cdcd */ +/* *.color7: #e5e5e5 */ +/* *.color8: #4d4d4d */ +/* *.color9: #ff0000 */ +/* *.color10: #00ff00 */ +/* *.color11: #ffff00 */ +/* *.color12: #0000ff */ +/* *.color13: #ff00ff */ +/* *.color14: #00ffff */ +/* *.color15: #aabac8 */ +/* *.background: #000000 */ + +/* ! Dracula Xresources palette */ +/* *.foreground: #F8F8F2 */ +/* *.background: #282A36 */ +/* *.color0: #000000 */ +/* *.color8: #4D4D4D */ +/* *.color1: #FF5555 */ +/* *.color9: #FF6E67 */ +/* *.color2: #50FA7B */ +/* *.color10: #5AF78E */ +/* *.color3: #F1FA8C */ +/* *.color11: #F4F99D */ +/* *.color4: #BD93F9 */ +/* *.color12: #CAA9FA */ +/* *.color5: #FF79C6 */ +/* *.color13: #FF92D0 */ +/* *.color6: #8BE9FD */ +/* *.color14: #9AEDFE */ +/* *.color7: #BFBFBF */ +/* *.color15: #E6E6E6 */ + +/* *.background: .color0 */ +/* *.color256: 0#1d2021 */ +/* *.color257: 15#ebdbb2 */ diff --git a/.config/X11/.xbindkeysrc b/.config/X11/.xbindkeysrc new file mode 100644 index 0000000..481943d --- /dev/null +++ b/.config/X11/.xbindkeysrc @@ -0,0 +1,31 @@ +# # Up +# "xdotool mousemove_relative --sync -- 0 -24" +# alt + w +# +# # Left +# "xdotool mousemove_relative --sync -- -24 0" +# alt + a +# +# # Down +# "xdotool mousemove_relative --sync -- 0 24" +# alt + s +# +# # Right +# "xdotool mousemove_relative --sync -- 24 0" +# alt + d +# +# # left + up +# "xdotool mousemove_relative --sync -- -24 -24" +# Shift+alt + q +# +# # right + up +# "xdotool mousemove_relative --sync -- 24 -24" +# Shift+alt + e +# +# # right + down +# "xdotool mousemove_relative --sync -- 24 24" +# Shift+alt + d +# +# # left + down +# "xdotool mousemove_relative --sync -- -24 24" +# Shift+alt + a diff --git a/.config/X11/.xinitrc b/.config/X11/.xinitrc new file mode 100755 index 0000000..1bb2ba9 --- /dev/null +++ b/.config/X11/.xinitrc @@ -0,0 +1,32 @@ +#!/bin/sh +# +#░█▀▀░▀█▀░█▀█░█▀▄░▀█▀░█░█ +#░▀▀█░░█░░█▀█░█▀▄░░█░░▄▀▄ +#░▀▀▀░░▀░░▀░▀░▀░▀░░▀░░▀░▀ +# + +# xinitrc.d +if [ -d /etc/X11/xinit/xinitrc.d ]; then + for f in /etc/X11/xinit/xinitrc.d/*; do + [ -x "$f" ] && . "$f" + done + unset f +fi + +# xinitrc runs automatically when you run startx. + +# There are some small but important commands that need to be run when we start +# the graphical environment. There is a link to this file in ~/.xprofile +# because that file is run automatically if someone uses a display manager +# (login screen) and so they are needed there. To prevent doubling up commands, +# I source them here with the line below. + +# Profile +[[ -f /etc/profile ]] && source /etc/profile + +if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/X11/.xprofile" ]; then + . "${XDG_CONFIG_HOME:-$HOME/.config}/X11/.xprofile" +else + . "$HOME/.xprofile" +fi + diff --git a/.config/X11/.xprofile b/.config/X11/.xprofile new file mode 100644 index 0000000..939b7e1 --- /dev/null +++ b/.config/X11/.xprofile @@ -0,0 +1,23 @@ +#!/bin/sh + +# Xresources +[[ -f ~/.config/X11/.Xresources ]] && xrdb -merge ~/.config/X11/.Xresources + +# Xbindkeys +xbindkeys -f "$XDG_CONFIG_HOME"/X11/xbindkeysrc + +# XKB +setxkbmap -print | xkbcomp -I$HOME/.config/xkb - $DISPLAY + + +#export XAUTHORITY="$XDG_RUNTIME_DIR/.Xauthority" # This line will break some DMs. +export USERXSESSION="$XDG_CACHE_HOME/X11/xsession" +export USERXSESSIONRC="$XDG_CACHE_HOME/X11/xsessionrc" +export ALTUSERXSESSION="$XDG_CACHE_HOME/X11/Xsession" +export ERRFILE="$XDG_CACHE_HOME/X11/xsession-errors" + + +if [[ "$(tty)" = "/dev/tty1" ]]; then + pgrep bspwm || startx "$XDG_CONFIG_HOME/X11/.xinitrc" +# pgrep startxfce4 || startx "$XDG_CONFIG_HOME/X11/.xinitrc" +fi diff --git a/.config/alacritty/alacritty.yml b/.config/alacritty/alacritty.yml new file mode 100644 index 0000000..756fb45 --- /dev/null +++ b/.config/alacritty/alacritty.yml @@ -0,0 +1,106 @@ +# ~/.config/alacritty/alacritty.yml + + +live_config_reload: true + +window: + opacity: 0.6 + dynamic_title: true + dimensions: + columns: 2 + lines: 0 + + + # startup_mode: Maximized + # position: + # x: 0 + # y: 0 + + padding: + x: 9 + y: 9 + + dynamic_padding: false + decorations: none + +scrolling: + history: 50000 + multiplier: 3 + + + +font: + normal: + family: JetBrains Mono Medium + #family: Fira Mono Regular + #family: UbuntuMono Nerd Font Regular + #family: monospace + size: 8.5 + offset: + x: 0 + y: 0 + glyph_offset: + x: 0 + y: 0 + builtin_box_drawing: true + #size: 8.5 + + # Glyph offset determines the locations of the glyphs within their cells with + # the default being at the bottom. Increase the x offset to move the glyph to + # the right, increase the y offset to move the glyph upward. + +key_bindings: +- { key: V, mods: Control, action: Paste } +- { key: C, mods: Control, action: Copy } +- { key: C, mods: Control|Shift, chars: "\x03" } +- { key: N, mods: Control|Shift, action: SpawnNewInstance } +- { key: O, mods: Control|Shift, command: { program: "opacity-change.sh", args: ["-"] } } +- { key: P, mods: Control|Shift, command: { program: "opacity-change.sh", args: ["+"] } } +save_to_clipboard: true + +colors: + primary: + background: '#000000' + foreground: '#FFFACD' + normal: + black: '#313539' + red: '#b02626' + green: '#40a62f' + yellow: '#f2e635' + blue: '#314ad0' + magenta: '#b30ad0' + cyan: '#32d0fc' + white: '#acadb1' + bright: + black: '#676f78' + red: '#b55454' + green: '#78a670' + yellow: '#faf380' + blue: '#707fd0' + magenta: '#c583d0' + cyan: '#8adaf1' + white: '#e0e3e7' + + +#colors: +# primary: +# background: '#0F111A' +# foreground: '#8F93A2' +# normal: +# black: '#0F111A' +# red: '#FF5370' +# green: '#99C794' +# yellow: '#C4E88D' +# blue: '#82AAFF' +# magenta: '#C792EA' +# cyan: '#89DDFF' +# white: '#464B5D' +# bright: +# black: '#0F111A' +# red: '#FF5370' +# green: '#99C794' +# yellow: '#C4E88D' +# blue: '#82AAFF' +# magenta: '#C792EA' + # cyan: '#89DDFF' + # white: '#8F93A2' diff --git a/.config/betterlockscreen/betterlockscreenrc b/.config/betterlockscreen/betterlockscreenrc new file mode 100644 index 0000000..4cdfbe8 --- /dev/null +++ b/.config/betterlockscreen/betterlockscreenrc @@ -0,0 +1,37 @@ +# ~/.config/betterlockscreenrc + +# default options +display_on=0 +span_image=false +lock_timeout=300 +fx_list=(dim blur dimblur pixel dimpixel color) +dim_level=40 +blur_level=1 +pixel_scale=10,1000 +solid_color=333333 +wallpaper_cmd="feh --bg-fill" +quiet=false +# i3lockcolor_bin="i3lock-color" # Manually set command for i3lock-color + +# default theme +loginbox=00000066 +loginshadow=00000000 +locktext="Type password to unlock..." +font="sans-serif" +ringcolor=ffffffff +insidecolor=00000000 +separatorcolor=00000000 +ringvercolor=ffffffff +insidevercolor=00000000 +ringwrongcolor=ffffffff +insidewrongcolor=d23c3dff +timecolor=ffffffff +time_format="%H:%M:%S" +greetercolor=ffffffff +layoutcolor=ffffffff +keyhlcolor=d23c3dff +bshlcolor=d23c3dff +verifcolor=ffffffff +wrongcolor=d23c3dff +modifcolor=d23c3dff +bgcolor=000000ff diff --git a/.config/bspwm/bspcmd b/.config/bspwm/bspcmd new file mode 100755 index 0000000..94bed26 --- /dev/null +++ b/.config/bspwm/bspcmd @@ -0,0 +1,37 @@ +#!/bin/bash + +CMD=${1:-help}; shift + +help() { + echo "Available commands:" + echo " * unhide - select and unhide window" +} + +unhide() { + action=${1:-list} + case $action in + "list") + selection=`for id in $(bspc query -N -n .hidden); do + title=$(xtitle $id) + [[ -z "$title" ]] && title="<unnamed>" + echo $id $title + done | rofi -dmenu -i -p "Hidden windows" | cut -f1 -d' '` + + [[ -z "$selection" ]] && exit 1 + + bspc node $selection -g hidden=off + ;; + esac +} + +case $CMD in + "help") + help + ;; + "unhide") + unhide $1 + ;; + *) + help + ;; +esac diff --git a/.config/bspwm/bspwmrc b/.config/bspwm/bspwmrc new file mode 100755 index 0000000..af6fc1a --- /dev/null +++ b/.config/bspwm/bspwmrc @@ -0,0 +1,95 @@ +#! /bin/sh + +#░█▀▄░█▀▀░█▀█░█░█░█▄█ +#░█▀▄░▀▀█░█▀▀░█▄█░█░█ +#░▀▀░░▀▀▀░▀░░░▀░▀░▀░▀ + +bspc monitor LVDS-1 -d 1 2 3 4 5 +bspc monitor HDMI-1 -d 6 7 8 9 0 + +###---Global Settings---### +bspc config automatic_scheme alternate +bspc config initial_polarity second_child +bspc config pointer_action1 move +bspc config pointer_action2 resize_side +bspc config pointer_action2 resize_corner +bspc config focus_follows_pointer false +bspc config remove_disabled_monitors true +bspc config remove_unplugged_monitors true +bspc config merge_overlapping_monitors true +bspc config border_width 2 +bspc config window_gap 10 +bspc config split_ratio 0.52 +bspc config borderless_monocle true +bspc config gapless_monocle true +bspc config swallow_first_click false +bspc config pointer_modifier mod1 +#bspc config pointer_action1 resize_side +#bspc config pointer_action1 resize_corner +#bspc config pointer_action3 move +bspc config normal_border_color "#282828" +bspc config active_border_color "#ebdbb2" +bspc config focused_border_color "#77dd77" +bspc config presel_feedback_color "#BF616A" +#bspc config normal_border_color "#282828" +#bspc config active_border_color "#ebdbb2" +#bspc config focused_border_color "#fe8019" + +# remove all rules first +bspc rule -r *:* + +bspc rule -a Plank layer=above border=off + +###---Autostart---#### +pgrep -x sxhkd >/dev/null || sxhkd & +picom -b --experimental-backends & +if [[ $(xrandr -q | grep 'HDMI-1 connected') ]]; then + xrandr --output LVDS-1 --primary --mode 1366x768 --rotate normal --output HDMI-1 --mode 1920x1080 --rotate normal --right-of LVDS-1 +fi +xfce4-panel --disable-wm-check & +"$HOME"/.config/polybar/launch.sh & +dunst & # notification daemon +unclutter & # Remove mouse when idle +nitrogen --force-setter=xinerama --restore & +#bspc rule -a \* rectangle=680x700+340+40 +bspc rule -a '*:*:Picture-in-Picture' state=floating sticky=on layer=above +bspc rule -a '*:*:Picture in picture' state=floating sticky=on layer=above +bspc rule -a firefox:Toolkit focus=on state=floating sticky=on layer=above rectangle=522x320+830+280 +#320x190+1030+480 +#522x316-10+280 +bspc rule -a "https://www.youtube.com - Enhancer for YouTube™ — Mozilla Firefox" state=floating sticky=on layer=above +bspc rule -a Wezterm state=floating +bspc rule -a Zathura state=tiled + +#eww daemon & + +# SCRATCHPAD +bspc rule -a scratchpad sticky=on state=floating + +# Heads Up Display (scratchpad) +bspc rule -a Heads-Up-Display sticky=on state=floating rectangle=360x160+990+40 + +[ "$1" = 0 ] && { + nm-applet & + plank & +} + +pkill xfce4-power-manager +sleep 1 && nice -n 1 xfce4-power-manager & +pkill volumeicon +sleep 2 && nice -n 2 volumeicon & +pkill mictray +sleep 2 && nice -n 2 mictray & +pkill parcellite +sleep 2 && nice -n 2 parcellite & + +bspc subscribe node_state | while read -r _ _ _ _ state flag; do + if [[ "$state" != fullscreen ]]; then continue; fi + if [[ "$flag" == on ]]; then + xdo lower -N Plank + else + xdo raise -N Plank + fi +done & + +bspc config external_rules_command ~/.config/bspwm/scripts/external_rules.sh diff --git a/.config/bspwm/menu.sh b/.config/bspwm/menu.sh new file mode 100755 index 0000000..f678ae1 --- /dev/null +++ b/.config/bspwm/menu.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# Custom Rofi Script + +BORDER="#1F1F1F" +SEPARATOR="#1F1F1F" +FOREGROUND="#A9ABB0" +BACKGROUND="#1F1F1F" +BACKGROUND_ALT="#252525" +HIGHLIGHT_BACKGROUND="#1A237E" +HIGHLIGHT_FOREGROUND="#FFFFFF" + +BLACK="#000000" +WHITE="#ffffff" +RED="#e53935" +GREEN="#43a047" +YELLOW="#fdd835" +BLUE="#1e88e5" +MAGENTA="#00897b" +CYAN="#00acc1" +PINK="#d81b60" +PURPLE="#8e24aa" +INDIGO="#3949ab" +TEAL="#00897b" +LIME="#c0ca33" +AMBER="#ffb300" +ORANGE="#fb8c00" +BROWN="#6d4c41" +GREY="#757575" +BLUE_GREY="#546e7a" +DEEP_PURPLE="#5e35b1" +DEEP_ORANGE="#f4511e" +LIGHT_BLUE="#039be5" +LIGHT_GREEN="#7cb342" + +# Launch Rofi +rofi -no-lazy-grab -show drun \ +-display-drun "Applications " -drun-display-format "{name}" \ +-hide-scrollbar true \ +-bw 0 \ +-lines 10 \ +-line-padding 10 \ +-padding 20 \ +-width 30 \ +-xoffset 27 -yoffset 60 \ +-location 1 \ +-columns 2 \ +-show-icons -icon-theme "Papirus" \ +-font "Fantasque Sans Mono 10" \ +-color-enabled true \ +-color-window "$BACKGROUND,$BORDER,$SEPARATOR" \ +-color-normal "$BACKGROUND_ALT,$FOREGROUND,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" \ +-color-active "$BACKGROUND,$MAGENTA,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" \ +-color-urgent "$BACKGROUND,$YELLOW,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" + +# More Options +# -fullscreen \ + +# Theming help +# color window = background, border, separator +# color normal = background, foreground, background-alt, highlight-background, highlight-foreground +# color active = background, foreground, background-alt, highlight-background, highlight-foreground +# color urgent = background, foreground, background-alt, highlight-background, highlight-foreground + diff --git a/.config/bspwm/noswallow b/.config/bspwm/noswallow new file mode 100644 index 0000000..139597f --- /dev/null +++ b/.config/bspwm/noswallow @@ -0,0 +1,2 @@ + + diff --git a/.config/bspwm/scripts/external_rules.sh b/.config/bspwm/scripts/external_rules.sh new file mode 100755 index 0000000..74fdaa0 --- /dev/null +++ b/.config/bspwm/scripts/external_rules.sh @@ -0,0 +1,39 @@ +#!/bin/env bash + +#instance=$3 +#[!-z"$3"] && xdo raise -a polybar-bottom_LVDS-1 +#[!-z"$3"] && xdo below -a polybar-bottom_LVDS-1 -t $(xdo id -N Bspwm -n root) + + +#bspc subscribe node_state | while read -r _ _ _ _ state flag; do +# if [[ "$state" != fullscreen ]]; then continue; fi +# if [[ "$flag" == on ]]; then +# xdo lower -N Plank +# else +# xdo raise -N Plank +# fi +#done & +# +#eval $4 +#bspc query -N -d ${desktop:-focused} -n .fullscreen >/dev/null && +# echo layer=above + + +#bspc subscribe node_state | while read -r _ _ _ _ state flag; do +# if [[ "$state" != fullscreen ]]; then continue; fi +# if [[ "$flag" == on ]]; then +# xdo lower -a polybar-bottom_LVDS-1 +# else +# xdo raise -a polybar-bottom_LVDS-1 +# fi +#done & + +# Allow any type of window to ignore fullscreen windows (allow fullscreen to +# stay) +wid="$1" +class="$2" +instance="$3" +eval "$4" + +[[ "$state" = floating ]] \ + && echo 'layer=above' diff --git a/.config/bspwm/swallow b/.config/bspwm/swallow new file mode 100644 index 0000000..21b7f00 --- /dev/null +++ b/.config/bspwm/swallow @@ -0,0 +1,3 @@ +sxiv +Sxiv +zathura diff --git a/.config/bspwm/sysmenu.sh b/.config/bspwm/sysmenu.sh new file mode 100755 index 0000000..1bdc35e --- /dev/null +++ b/.config/bspwm/sysmenu.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +# Custom Rofi Script + +BORDER="#1F1F1F" +SEPARATOR="#1F1F1F" +FOREGROUND="#A9ABB0" +BACKGROUND="#1F1F1F" +BACKGROUND_ALT="#252525" +HIGHLIGHT_BACKGROUND="#1A237E" +HIGHLIGHT_FOREGROUND="#FFFFFF" + +BLACK="#000000" +WHITE="#ffffff" +RED="#e53935" +GREEN="#43a047" +YELLOW="#fdd835" +BLUE="#1e88e5" +MAGENTA="#00897b" +CYAN="#00acc1" +PINK="#d81b60" +PURPLE="#8e24aa" +INDIGO="#3949ab" +TEAL="#00897b" +LIME="#c0ca33" +AMBER="#ffb300" +ORANGE="#fb8c00" +BROWN="#6d4c41" +GREY="#757575" +BLUE_GREY="#546e7a" +DEEP_PURPLE="#5e35b1" +DEEP_ORANGE="#f4511e" +LIGHT_BLUE="#039be5" +LIGHT_GREEN="#7cb342" + +# Launch Rofi +MENU="$(rofi -no-lazy-grab -sep "|" -dmenu -i -p 'System :' \ +-hide-scrollbar true \ +-bw 0 \ +-lines 4 \ +-line-padding 10 \ +-padding 20 \ +-width 15 \ +-xoffset -27 -yoffset 60 \ +-location 3 \ +-columns 1 \ +-show-icons -icon-theme "Papirus" \ +-font "Fantasque Sans Mono 10" \ +-color-enabled true \ +-color-window "$BACKGROUND,$BORDER,$SEPARATOR" \ +-color-normal "$BACKGROUND_ALT,$FOREGROUND,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" \ +-color-active "$BACKGROUND,$MAGENTA,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" \ +-color-urgent "$BACKGROUND,$YELLOW,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" \ +<<< " Lock| Logout| Reboot| Shutdown")" +case "$MENU" in + *Lock) i3lock -c 282a36 -n ;; + *Logout) openbox --exit;; + *Reboot) sudo reboot ;; + *Shutdown) sudo shutdown -r now +esac + +# More Options +# -fullscreen \ + +# Theming help +# color window = background, border, separator +# color normal = background, foreground, background-alt, highlight-background, highlight-foreground +# color active = background, foreground, background-alt, highlight-background, highlight-foreground +# color urgent = background, foreground, background-alt, highlight-background, highlight-foreground + diff --git a/.config/bspwm/terminals b/.config/bspwm/terminals new file mode 100644 index 0000000..414337e --- /dev/null +++ b/.config/bspwm/terminals @@ -0,0 +1 @@ +Alacritty diff --git a/.config/dunst/dunstrc b/.config/dunst/dunstrc new file mode 100644 index 0000000..b9cf04f --- /dev/null +++ b/.config/dunst/dunstrc @@ -0,0 +1,500 @@ +# See dunst(5) for all configuration options + +[global] + ### Display ### + + # Which monitor should the notifications be displayed on. + monitor = 0 + + # Display notification on focused monitor. Possible modes are: + # mouse: follow mouse pointer + # keyboard: follow window with keyboard focus + # none: don't follow anything + # + # "keyboard" needs a window manager that exports the + # _NET_ACTIVE_WINDOW property. + # This should be the case for almost all modern window managers. + # + # If this option is set to mouse or keyboard, the monitor option + # will be ignored. + follow = mouse + + # The geometry of the window: + #[{width}]x{height}[+/-{x}+/-{y}] + # The geometry of the message window. + # The height is measured in number of notifications everything else + # in pixels. If the width is omitted but the height is given + # ("-geometry x2"), the message window expands over the whole screen + # (dmenu-like). If width is 0, the window expands to the longest + # message displayed. A positive x is measured from the left, a + # negative from the right side of the screen. Y is measured from + # the top and down respectively. + # The width can be negative. In this case the actual width is the + # screen width minus the width defined in within the geometry option. + geometry = "300x5-7+30" + + # Scale factor. It is auto-detected if value is 0. + scale = 0 + + # Turn on the progess bar. It appears when a progress hint is passed with + # for example dunstify -h int:value:12 + progress_bar = true + + # Set the progress bar height. This includes the frame, so make sure + # it's at least twice as big as the frame width. + progress_bar_height = 10 + + # Set the frame width of the progress bar + progress_bar_frame_width = 1 + + # Set the minimum width for the progress bar + progress_bar_min_width = 150 + + # Set the maximum width for the progress bar + progress_bar_max_width = 300 + + + # Show how many messages are currently hidden (because of geometry). + indicate_hidden = yes + + # Shrink window if it's smaller than the width. Will be ignored if + # width is 0. + shrink = no + + # The transparency of the window. Range: [0; 100]. + # This option will only work if a compositing window manager is + # present (e.g. xcompmgr, compiz, etc.). (X11 only) + transparency = 0 + + # The height of the entire notification. If the height is smaller + # than the font height and padding combined, it will be raised + # to the font height and padding. + notification_height = 45 + + # Draw a line of "separator_height" pixel height between two + # notifications. + # Set to 0 to disable. + separator_height = 2 + + # Padding between text and separator. + padding = 8 + + # Horizontal padding. + horizontal_padding = 15 + + # Padding between text and icon. + text_icon_padding = 12 + + # Defines width in pixels of frame around the notification window. + # Set to 0 to disable. + frame_width = 3 + + # Defines color of the frame around the notification window. + frame_color = "#f0f2f5" + #frame_color = "#2E3440" + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = frame + + # Sort messages by urgency. + sort = yes + + # Don't remove messages, if the user is idle (no mouse or keyboard input) + # for longer than idle_threshold seconds. + # Set to 0 to disable. + # A client can set the 'transient' hint to bypass this. See the rules + # section for how to disable this if necessary + # idle_threshold = 120 + + ### Text ### + + font = UbuntuMono Nerd Font 9 + + # The spacing between lines. If the height is smaller than the + # font height, it will get raised to the font height. + line_height = 0 + + # Possible values are: + # full: Allow a small subset of html markup in notifications: + # <b>bold</b> + # <i>italic</i> + # <s>strikethrough</s> + # <u>underline</u> + # + # For a complete reference see + # <https://developer.gnome.org/pango/stable/pango-Markup.html>. + # + # strip: This setting is provided for compatibility with some broken + # clients that send markup even though it's not enabled on the + # server. Dunst will try to strip the markup but the parsing is + # simplistic so using this option outside of matching rules for + # specific applications *IS GREATLY DISCOURAGED*. + # + # no: Disable markup parsing, incoming notifications will be treated as + # plain text. Dunst will not advertise that it has the body-markup + # capability if this is set as a global setting. + # + # It's important to note that markup inside the format option will be parsed + # regardless of what this is set to. + markup = strip + show_indicators = false + + + # The format of the message. Possible variables are: + # %a appname + # %s summary + # %b body + # %i iconname (including its path) + # %I iconname (without its path) + # %p progress value if set ([ 0%] to [100%]) or nothing + # %n progress value if set without any extra characters + # %% Literal % + # Markup is allowed + format = "<b>%s</b>\n%b" + + # Alignment of message text. + # Possible values are "left", "center" and "right". + alignment = left + + # Vertical alignment of message text and icon. + # Possible values are "top", "center" and "bottom". + vertical_alignment = top + + # Show age of message if message is older than show_age_threshold + # seconds. + # Set to -1 to disable. + show_age_threshold = 60 + + # Split notifications into multiple lines if they don't fit into + # geometry. + word_wrap = yes + + # When word_wrap is set to no, specify where to make an ellipsis in long lines. + # Possible values are "start", "middle" and "end". + ellipsize = middle + + # Ignore newlines '\n' in notifications. + ignore_newline = no + + # Stack together notifications with the same content + stack_duplicates = true + + # Hide the count of stacked notifications with the same content + hide_duplicate_count = false + + # Display indicators for URLs (U) and actions (A). + show_indicators = false + + ### Icons ### + + # Align icons left/right/off + icon_position = left + + # Scale small icons up to this size, set to 0 to disable. Helpful + # for e.g. small files or high-dpi screens. In case of conflict, + # max_icon_size takes precedence over this. + min_icon_size = 0 + + # Scale larger icons down to this size, set to 0 to disable + max_icon_size = 32 + + # Paths to default icons. + icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/ + + ### History ### + + # Should a notification popped up from history be sticky or timeout + # as if it would normally do. + sticky_history = yes + + # Maximum amount of notifications kept in history + history_length = 20 + + ### Misc/Advanced ### + + # dmenu path. + dmenu = /usr/bin/dmenu -p dunst: + + # Browser for opening urls in context menu. + browser = /usr/bin/brave -new-tab + + # Always run rule-defined scripts, even if the notification is suppressed + always_run_script = true + + # Define the title of the windows spawned by dunst + title = Dunst + + # Define the class of the windows spawned by dunst + class = Dunst + + # Print a notification on startup. + # This is mainly for error detection, since dbus (re-)starts dunst + # automatically after a crash. + startup_notification = false + + # Manage dunst's desire for talking + # Can be one of the following values: + # crit: Critical features. Dunst aborts + # warn: Only non-fatal warnings + # mesg: Important Messages + # info: all unimportant stuff + # debug: all less than unimportant stuff + verbosity = mesg + + # Define the corner radius of the notification window + # in pixel size. If the radius is 0, you have no rounded + # corners. + # The radius will be automatically lowered if it exceeds half of the + # notification height to avoid clipping text and/or icons. + corner_radius = 0 + + # Ignore the dbus closeNotification message. + # Useful to enforce the timeout set by dunst configuration. Without this + # parameter, an application may close the notification sent before the + # user defined timeout. + ignore_dbusclose = false + + ### Wayland ### + # These settings are Wayland-specific. They have no effect when using X11 + + # Uncomment this if you want to let notications appear under fullscreen + # applications (default: overlay) + # layer = top + + # Set this to true to use X11 output on Wayland. + force_xwayland = false + + ### Legacy + + # Use the Xinerama extension instead of RandR for multi-monitor support. + # This setting is provided for compatibility with older nVidia drivers that + # do not support RandR and using it on systems that support RandR is highly + # discouraged. + # + # By enabling this setting dunst will not be able to detect when a monitor + # is connected or disconnected which might break follow mode if the screen + # layout changes. + force_xinerama = false + + ### mouse + + # Defines list of actions for each mouse event + # Possible values are: + # * none: Don't do anything. + # * do_action: Invoke the action determined by the action_name rule. If there is no + # such action, open the context menu. + # * open_url: If the notification has exactly one url, open it. If there are multiple + # ones, open the context menu. + # * close_current: Close current notification. + # * close_all: Close all notifications. + # * context: Open context menu for the notification. + # * context_all: Open context menu for all notifications. + # These values can be strung together for each mouse event, and + # will be executed in sequence. + mouse_left_click = close_current + mouse_middle_click = close_all + mouse_right_click = do_action + +# Experimental features that may or may not work correctly. Do not expect them +# to have a consistent behaviour across releases. +[experimental] + # Calculate the dpi to use on a per-monitor basis. + # If this setting is enabled the Xft.dpi value will be ignored and instead + # dunst will attempt to calculate an appropriate dpi value for each monitor + # using the resolution and physical size. This might be useful in setups + # where there are multiple screens with very different dpi values. + per_monitor_dpi = false + + +[urgency_low] + # IMPORTANT: colors have to be defined in quotation marks. + # Otherwise the "#" and following would be interpreted as a comment. + background = "#00101212" + #background = "#fafafa" + foreground = "#CECCC9" + #foreground = "#2e2e2e" + timeout = 5 + # Icon for notifications with low urgency, uncomment to enable + #icon = /path/to/icon + +[urgency_normal] + background = "#00101212" + #background = "#fafafa" + foreground = "#CECCC9" + #foreground = "#2e2e2e" + timeout = 10 + # Icon for notifications with normal urgency, uncomment to enable + #icon = /path/to/icon + +[urgency_critical] + background = "#00101212" + background = "#fafafa" + foreground = "#CECCC9" + #foreground = "#2e2e2e" + frame_color = #a1dde7 + timeout = 30 + # Icon for notifications with critical urgency, uncomment to enable + #icon = /path/to/icon + +# Every section that isn't one of the above is interpreted as a rules to +# override settings for certain messages. +# +# Messages can be matched by +# appname (discouraged, see desktop_entry) +# body +# category +# desktop_entry +# icon +# match_transient +# msg_urgency +# stack_tag +# summary +# +# and you can override the +# background +# foreground +# format +# frame_color +# fullscreen +# new_icon +# set_stack_tag +# set_transient +# timeout +# urgency +# action_name +# +# Shell-like globbing will get expanded. +# +# Instead of the appname filter, it's recommended to use the desktop_entry filter. +# GLib based applications export their desktop-entry name. In comparison to the appname, +# the desktop-entry won't get localized. +# +# SCRIPTING +# You can specify a script that gets run when the rule matches by +# setting the "script" option. +# The script will be called as follows: +# script appname summary body icon urgency +# where urgency can be "LOW", "NORMAL" or "CRITICAL". +# +# NOTE: if you don't want a notification to be displayed, set the format +# to "". +# NOTE: It might be helpful to run dunst -print in a terminal in order +# to find fitting options for rules. + +# Disable the transient hint so that idle_threshold cannot be bypassed from the +# client +#[transient_disable] +# match_transient = yes +# set_transient = no +# +# Make the handling of transient notifications more strict by making them not +# be placed in history. +#[transient_history_ignore] +# match_transient = yes +# history_ignore = yes + +# fullscreen values +# show: show the notifications, regardless if there is a fullscreen window opened +# delay: displays the new notification, if there is no fullscreen window active +# If the notification is already drawn, it won't get undrawn. +# pushback: same as delay, but when switching into fullscreen, the notification will get +# withdrawn from screen again and will get delayed like a new notification +#[fullscreen_delay_everything] +# fullscreen = delay +#[fullscreen_show_critical] +# msg_urgency = critical +# fullscreen = show + +#[espeak] +# summary = "*" +# script = dunst_espeak.sh + +#[script-test] +# summary = "*script*" +# script = dunst_test.sh + +#[ignore] +# # This notification will not be displayed +# summary = "foobar" +# format = "" + +#[history-ignore] +# # This notification will not be saved in history +# summary = "foobar" +# history_ignore = yes + +#[skip-display] +# # This notification will not be displayed, but will be included in the history +# summary = "foobar" +# skip_display = yes + +#[signed_on] +# appname = Pidgin +# summary = "*signed on*" +# urgency = low +# +#[signed_off] +# appname = Pidgin +# summary = *signed off* +# urgency = low +# +#[says] +# appname = Pidgin +# summary = *says* +# urgency = critical +# +#[twitter] +# appname = Pidgin +# summary = *twitter.com* +# urgency = normal +[spotify] + appname = Spotify + Summary = *Song* + urgency = critical + background = "#00101212" + #background = "#fafafa" + foreground = "#CECCC9" + #foreground = "#2e2e2e" + +[Telegram] + appname = Telegram + summary = *New msg* + urgency = critical + background = "#00101212" + #background = "#fafafa" + foreground = "#CECCC9" + #foreground = "#2e2e2e" + +[Discord] + appname = Discord + Summary = *Ping* + urgency = critical + background = "#00101212" + #background = "#fafafa" + foreground = "#CECCC9" + #foreground = "#2e2e2e" + + + +[Brave] + appname = Brave + Summary = *Notification* + urgency = critical + background = "#00101212" + #background = "#fafafa" + foreground = "#CECCC9" + #foreground = "#2e2e2e" + + +# +#[stack-volumes] +# appname = "some_volume_notifiers" +# set_stack_tag = "volume" + +# +# vim: ft=cfg diff --git a/.config/eww/bar/main.yuck b/.config/eww/bar/main.yuck new file mode 100644 index 0000000..a379ace --- /dev/null +++ b/.config/eww/bar/main.yuck @@ -0,0 +1,193 @@ +(defwindow bar + :monitor 0 + :geometry (geometry :x -28 :y 0 :anchor "center right") +(bar)) + +(defwidget bar [] + (box + :class "bar" + :orientation "v" + :space-evenly false + (bar-group + (bar-item-center-window) + (bar-item-resize-ratio) + (bar-item-resize) + (bar-item-toggle-floaty) + (bar-item-close-window) + ) + (bar-group + (bar-item-balance) + (bar-item-rotate) + (bar-item-focus-parent) + ) + (bar-group + (bar-item-toggle-borders) + (bar-item-toggle-hidden) + (bar-item-toggle-monocle) + ) + (bar-group + (bar-item-empty-desktop) + (bar-item-cycle-desktops) + ) + (bar-group + ;(bar-item-clipboard) + (bar-item-screenshot) + (bar-item-power) + ) + ) +) + +(defwidget bar-group [] + (box + :class "bar-group" + :orientation "v" + (children) + ) +) + +(defwidget bar-item [icon ?color ?lclick ?rclick] + (box + :class "bar-item" + (eventbox + :onscroll "resize-window {}" + (button + :onclick lclick + :onrightclick rclick + ;:timeout 200 + (icon :name icon :color color) + ) + ) + ) +) + +(defwidget bar-item-balance [] + (bar-item + :icon "columns" + :color "yellow" + :lclick "bspc node @/ -B" + ) +) + +(defwidget bar-item-center-window [] + (bar-item + :icon "minimize" + :color "yellow" + :lclick "center-window" + ) +) + +(defwidget bar-item-clipboard [] + (bar-item + :icon "clipboard" + :color "yellow" + ) +) + +(defwidget bar-item-close-window [] + (bar-item + :icon "x-circle" + :color "red" + :lclick "close-window" + ) +) + +(defwidget bar-item-cycle-desktops [] + (bar-item + :icon "skip-forward" + :color "blue" + :lclick "show-desktop next" + :rclick "show-desktop prev" + ) +) + +(defwidget bar-item-empty-desktop [] + (bar-item + :icon "plus-circle" + :color "green" + :lclick "show-desktop empty" + ) +) + +(defwidget bar-item-focus-parent [] + (bar-item + :icon "arrow-up-circle" + :color "blue" + :lclick "bspc node -f @parent" + ) +) + +(defwidget bar-item-power [] + (bar-item + :icon "power" + :color "red" + :lclick "shut-down" + ) +) + +(defwidget bar-item-resize [] + (bar-item + :icon "maximize-2" + :color "blue" + :lclick "bspc node -z top_left -16 -9 \ + && bspc node -z bottom_right 16 9" + :rclick "bspc node -z top_left 16 9 \ + && bspc node -z bottom_right -16 -9" + ) +) + +(defwidget bar-item-resize-ratio [] + (bar-item + :icon "youtube" + :color "green" + :lclick "resize-ratio 16 9" + ) +) + +(defwidget bar-item-rotate [] + (bar-item + :icon "rotate-cw" + :color "green" + :lclick "bspc node -R 90" + ) +) + +(defwidget bar-item-screenshot [] + (bar-item + :icon "camera" + :color "purple" + :lclick "notify hello" + :rclick "scrot -s -l mode=edge,width=7,color=\"#FFFFFF\",opacity=20 -e 'mv $f ~/unsorted/screenshots'" + ) +) + +(defwidget bar-item-toggle-borders [] + (bar-item + :icon "maximize" + :icon {disableBorders ? "square" : "maximize"} + :color "purple" + :lclick "toggle-borders" + ) +) + +(defwidget bar-item-toggle-floaty [] + (bar-item + :icon {focusIsFloaty ? "corner-left-down" : "corner-right-up"} + :color "purple" + :lclick "toggle-floaty" + ) +) + +(defwidget bar-item-toggle-hidden [] + (bar-item + :icon "eye" + :color "red" + :lclick "toggle-hidden" + ) +) +(defwidget bar-item-toggle-monocle [] + (bar-item + :icon {monocleMode ? "zoom-out" : "zoom-in"} + :color "yellow" + :lclick "toggle-monocle" + ) +) diff --git a/.config/eww/bar/style.scss b/.config/eww/bar/style.scss new file mode 100644 index 0000000..121cd12 --- /dev/null +++ b/.config/eww/bar/style.scss @@ -0,0 +1,16 @@ +.bar { + background-color: $borderColor; + // border: $borderSize solid $borderColor; + padding: $borderSize 0 0 0; +} + +.bar-group { + background-color: $bgColor; + border-radius: $borderRadius; + margin: 0 $borderSize $borderSize $borderSize; + padding: 7; +} + +.bar-item { + padding: 7; +} diff --git a/.config/eww/dock/main.yuck b/.config/eww/dock/main.yuck new file mode 100644 index 0000000..a3ec73f --- /dev/null +++ b/.config/eww/dock/main.yuck @@ -0,0 +1,94 @@ +(defwindow dock + :monitor 0 + :geometry (geometry :x 0 :y -28 :anchor "bottom center") + (dock)) + +(defwidget dock [] + (box + :class "dock" + :space-evenly false + (dock-group + (dock-item + :icon "firefox" + :lclick "quick-app -c firefox -i Navigator&" + :rclick "firefox&" + ) + (dock-item + :icon "nautilus" + :lclick "quick-app -c Thunar -f thunar ~/unsorted" + ) + (dock-item + :icon "terminal" + :lclick "quick-app -c kitty -i quick -f kitty --name quick" + :rclick "cd ~ && kitty&" + ) + ) + (dock-group + (dock-item + :icon "email" + ) + (dock-item + :icon "telegram" + :lclick "quick-app -c TelegramDesktop -f telegram-desktop" + ) + (dock-item + :icon "weechat" + ) + (dock-item + :icon "discord-development" + :lclick "quick-app -c discord -f" + ) + ) + (dock-group + (dock-item + :icon "preferences-desktop-color" + ;:icon "openrgb" + ;:icon "gcolor3" + :lclick "quick-app -c Gcolor3 -f gcolor3" + ) + (dock-item + :icon "gnome-calculator" + :lclick "quick-app -c gnome-calculator -f" + ) + (dock-item + :icon "easyeffects" + :lclick "quick-app -c easyeffects -f" + ) + (dock-item + :icon "obs" + :lclick "quick-app -c obs -f" + ) + (dock-item + :icon "deepin-music-player" + ) + ) + (dock-group + (dock-item :icon "youtube" :lclick "quick-app -c mpv&") + (dock-item + :icon "steam" + :lclick "quick-app -c Steam steam&" + ) + (dock-item :icon "blender" :lclick "quick-app -c Blender blender&") + (dock-item :icon "godot" :lclick "quick-app -c Godot -f godot&") + (dock-item :icon "inkscape" :lclick "quick-app -c Inkscape inkscape&") + ) + ) +) + +(defwidget dock-group [] + (box + :class "dock-group" + (children) + ) +) + +(defwidget dock-item [icon ?lclick ?rclick] + (box + :class "dock-item" + (button + :onclick lclick + :onrightclick rclick + (image :path "${appIcons}${icon}.svg") + ) + ) +) diff --git a/.config/eww/dock/style.scss b/.config/eww/dock/style.scss new file mode 100644 index 0000000..4cc4515 --- /dev/null +++ b/.config/eww/dock/style.scss @@ -0,0 +1,16 @@ +.dock { + background-color: $borderColor; + // border: $borderSize solid $borderColor; + padding: 0 0 0 $borderSize; +} + +.dock-group { + background-color: $bgColor; + border-radius: $borderRadius; + margin: $borderSize $borderSize $borderSize 0; + padding: 5; +} + +.dock-item { + padding: 5; +} diff --git a/.config/eww/eww.scss b/.config/eww/eww.scss new file mode 100644 index 0000000..3c46de1 --- /dev/null +++ b/.config/eww/eww.scss @@ -0,0 +1,21 @@ +$borderColor: #24283b; +$borderRadius: 5px; +$borderSize: 5px; +$bgColor: #1a1b26; +$fgColor: #c0caf5; + +* { + all: unset; + color: $fgColor; +} + +// .window { +// background-color: $bgColor; +// border: $borderSize solid $borderColor; +// color: $fgColor; +// } + +@import "bar/style.scss"; +@import "dock/style.scss"; +@import "panel/style.scss"; +@import "status/style.scss"; diff --git a/.config/eww/eww.yuck b/.config/eww/eww.yuck new file mode 100644 index 0000000..fbd1bc3 --- /dev/null +++ b/.config/eww/eww.yuck @@ -0,0 +1,26 @@ +(defvar appIcons "/usr/share/icons/Papirus-Dark/48x48/apps/") +(defvar barIcons "/home/sxrdusr/.local/share/icons/feather-icons/") + +(defvar disableBorders false) +(defvar externalMonitor false) +(defvar focusIsFloaty false) +(defvar monocleMode false) +(defvar ultrawide true) +(defvar brightness 10) +(defvar nightlight 0) +(defvar volume 10) + +(defpoll date :interval "1m" "date '+%B %d'") +(defpoll time :interval "2s" "date '+%H:%M'") + +(defwidget icon [name ?color ?size] + (image + :image-width {size?:20} + :path "${barIcons}/${color?:'white'}/${name}.svg" + ) +) + +(include "bar/main.yuck") +(include "dock/main.yuck") +(include "panel/main.yuck") +(include "status/main.yuck") diff --git a/.config/eww/panel/drives.yuck b/.config/eww/panel/drives.yuck new file mode 100644 index 0000000..122f0d8 --- /dev/null +++ b/.config/eww/panel/drives.yuck @@ -0,0 +1,77 @@ +(defwidget dock-drives [] + (box + :orientation "v" + (disk + :label "System" + :mount "/" + :space "100" + ) + (disk + :label "SSD 1" + :mount "/mnt/ssd250" + :space "250" + ) + (disk + :label "SSD 2" + :mount "/mnt/games" + :space "250" + ) + (disk + :label "HDD" + :mount "/mnt/hdd500" + :space "500" + ) + (disk + :label "RAID" + :mount "/mnt/raid" + :space "3000" + ) + ) +) + +(defwidget disk [label mount space] + (eventbox + :class "disk-wrapper" + (button + :onclick "quick file ${mount}" + (box + :class "disk" + :space-evenly false + (box + :class "disk-icon" + :width 30 + (image :path "/home/edwin/workspace/icons/hard-drive.svg") + ) + (box + :class "disk-usage" + :orientation "v" + :spacing 3 + :space-evenly false + (box + :class "disk-usage-text" + :width 140 + (box + :halign "start" + :valign "start" + label + ) + (box + :halign "end" + :valign "end" + :hexpand true + :vexpand true + "${round(EWW_DISK[mount].free/1000000000, 0)} GB" + ) + ) + (scale + :class "disk-usage-bar" + :marks "false" + :max 100 + :min 0 + :value {EWW_DISK[mount].used_perc} + ) + ) + ) + ) + ) +) diff --git a/.config/eww/panel/main.yuck b/.config/eww/panel/main.yuck new file mode 100644 index 0000000..ac8b559 --- /dev/null +++ b/.config/eww/panel/main.yuck @@ -0,0 +1,142 @@ +(defwindow panel + :monitor 0 + :geometry (geometry :x 28 :y 0 :anchor "center left") + (panel)) + +(defwidget panel [] + (box + :class "panel" + :orientation "v" + :space-evenly false + (panel-audio) + (panel-video) + ) +) + +; Panel Items + +(defwidget panel-buttons [] + (box + :class "panel-buttons" + :space-evenly false + (children) + ) +) + +(defwidget panel-checkbox [?change text ?value] + (button + :onclick change + (box + :class "panel-checkbox" + :space-evenly false + (icon :name {value ? "check-square" : "square"}) + text + ) + ) +) + +(defwidget panel-slider [icon ?setter ?value] + (eventbox + ;:onscroll setter + (box + :space-evenly false + (icon :name icon) + (scale + :class "panel-slider" + :min 0 + :max 11 + :onchange setter + :value value + ) + ) + ) +) + +; Panel Sections + +(defwidget panel-section [color icon title] + (box + :class "panel-section" + :orientation "v" + :space-evenly false + (box + :class "panel-header" + :spacing 10 + :space-evenly false + (icon :name icon :color color) + title + ) + (box + :orientation "v" + :space-evenly false + :spacing 14 + (children) + ) + ) +) + +(defwidget panel-audio [] + (panel-section + :color "green" + :icon "sliders" + :title "Audio" + + ; audio device + (panel-buttons + (button :onclick "set-output -a pci-0000_00_1b" "Bar") + (button :onclick "set-output -a stereo-game" "Headset") + (button :onclick "set-output -a HD3" "Speakers") + ) + + ; volume slider + (panel-slider + :icon "volume-2" + :setter "set-volume {}" + :value volume + ) + ) +) + +(defwidget panel-video [] + (panel-section + :color "red" + :icon "monitor" + :title "Video" + + ; wallpaper setter + (eventbox + :ondropped "set-wallpaper {}" + (button + :onclick "quick-app -c Thunar -f \ + && thunar /home/edwin/.local/share/backgrounds" + (image + :class "panel-wallpaper" + :path "/home/edwin/.config/wallpaper" + :image-height 108 + :image-width 256 + ) + ) + ) + + ; brightness slider + (panel-slider + :icon "sun" + :setter "set-brightness {}" + :value brightness + ) + + ; external monitor + (panel-checkbox + :change "set-output -e ${!externalMonitor}" + :text "External Monitor" + :value externalMonitor + ) + + ; ultrawide resolution + (panel-checkbox + :change "set-output -u ${!ultrawide}" + :text "Ultrawide Resolution" + :value ultrawide + ) + ) +) diff --git a/.config/eww/panel/style.scss b/.config/eww/panel/style.scss new file mode 100644 index 0000000..0f39959 --- /dev/null +++ b/.config/eww/panel/style.scss @@ -0,0 +1,69 @@ +.panel { + background-color: $borderColor; + padding: $borderSize; + + .button { + background-color: $borderColor; + border-radius: $borderRadius; + margin-left: 10; + padding: 8; + + &:first-child { + margin-left: 0; + } + } +} + +.panel-buttons { + button { + background-color: $borderColor; + border-radius: $borderRadius; + margin-left: 14; + padding: 7 9; + + &:first-child { + margin-left: 0; + } + } +} + +.panel-checkbox { + image { + margin-right: 10; + } +} + +.panel-header { + margin-bottom: 14; +} + +.panel-section { + background-color: $bgColor; + border-radius: $borderRadius; + margin-top: $borderSize; + padding: 14; + + &:first-child { + margin-top: 0; + } +} + +.panel-slider { + margin-left: 10; + + trough { + background-color: $borderColor; + border-radius: 5; + min-height: 10px; + min-width: 232px; + + highlight { + border-radius: 5; + background-color: #414868; + } + } +} + +.panel-wallpaper { + border: 3px solid $borderColor; +} diff --git a/.config/eww/status/main.yuck b/.config/eww/status/main.yuck new file mode 100644 index 0000000..c6ebd3e --- /dev/null +++ b/.config/eww/status/main.yuck @@ -0,0 +1,44 @@ +; windows +(defwindow status + :monitor 0 + :geometry (geometry :x 0 :y 28 :anchor "top center") + (status)) + +(defwidget status [] + (box + :class "status" + :space-evenly false + :spacing 5 + (status-item :color "green" :icon "clock" :text time) + (status-item :color "yellow" :icon "calendar" :text date) + (status-item + :color "red" + :icon "thermometer" + :text "${EWW_TEMPS["CPU"]}°" + ) + (status-item + :color "blue" + :icon "cpu" + :text "${round(EWW_CPU["avg"],0)}%" + ) + (status-item + :color "purple" + :icon "database" + :text "${round(EWW_RAM["used_mem_perc"],0)}%" + ) + ) +) + +(defwidget status-item [icon ?color text] + (box + :class "status-item" + :space-evenly false + :spacing 7 + (icon :color color :name icon) + text + ) +) + +(defwidget status-seperator [] + (box :class "status-seperator") +) diff --git a/.config/eww/status/style.scss b/.config/eww/status/style.scss new file mode 100644 index 0000000..a31257e --- /dev/null +++ b/.config/eww/status/style.scss @@ -0,0 +1,14 @@ +.status { + background-color: $borderColor; + border: $borderSize solid $borderColor; +} + +.status-item { + background-color: $bgColor; + border-radius: $borderRadius; + font-family: "Inter"; + font-size: 13; + font-weight: 700; + min-width: 60px; + padding: 7; +} diff --git a/.config/hypr/autostart b/.config/hypr/autostart new file mode 100644 index 0000000..c7a5932 --- /dev/null +++ b/.config/hypr/autostart @@ -0,0 +1,54 @@ +#!/usr/bin/bash + +# Policy Authentication Agent +/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 & + +eval $(/usr/bin/gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh) +export $(gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh) + +# https://wiki.hyprland.org/FAQ/#some-of-my-apps-take-a-really-long-time-to-open +# https://gist.github.com/PowerBall253/2dea6ddf6974ba4e5d26c3139ffb7580 +systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP & +dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP --all & + +export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/gcr/ssh + +# variables +scripts=~/.scripts + +# gsettings +gsettings set org.gnome.desktop.interface gtk-theme 'Tokyonight-Dark-BL-LB' +gsettings set org.gnome.desktop.interface font-name 'CaskaydiaCove Nerd Font 9' +gsettings set org.gnome.desktop.interface icon-theme 'Tokyonight-Moon' +gsettings set org.gnome.desktop.interface cursor-theme 'Sweet-cursors' + +# For nemo +gsettings set org.cinnamon.desktop.default-applications.terminal exec kitty + +# notification daemon +swaync & + +# waybar +$scripts/launch_waybar & +# $scripts/dynamic & + +# wallpaper +$scripts/wall ~/.config/hypr/wallpapers/1.jpg & + +# effects +# $scripts/tools/rgb & + +# Applets +blueman-applet & +nm-applet --indicator & + +# music daemon +mpd & + +# other +hyprctl setcursor Sweet-cursors 24 +wl-paste --watch cliphist store & +notify-send -a aurora "hello $(whoami)" & + +sleep 2 +mpd-mpris & diff --git a/.config/hypr/hyprland.conf b/.config/hypr/hyprland.conf new file mode 100644 index 0000000..0749272 --- /dev/null +++ b/.config/hypr/hyprland.conf @@ -0,0 +1,303 @@ +monitor=, 1920x1080@60, auto, 1 + +exec-once=$HOME/.config/hypr/autostart + +$term = kitty +$browser = firefox +$gmail = firefox --new-instance -P app "https://mail.google.com/" --class appProfile +$editor = code +$explorer = nemo +$music = g4music +$notepad = code --profile notepad --unity-launch ~/Templates +$launcher = wofi --show drun -n +$launcher_alt = wofi --show run -n +#$discord = discord + + +general { + gaps_in = 5 + gaps_out = 10 + border_size = 2 + col.active_border = rgba(cba6f7ff) rgba(89b4faff) rgba(94e2d5ff) 10deg + col.inactive_border = 0xff313244 + # whether to apply the sensitivity to raw input (e.g. used by games where you aim using your mouse) + apply_sens_to_raw = 0 +} + + +input { + # kb_file = + kb_layout = us + # kb_variant = + # kb_model = + # kb_options = ctrl:swapcaps + # kb_rules = + sensitivity = 0.75 # for mouse cursor + + follow_mouse = 1 + + scroll_method = 2fg + + touchpad { + natural_scroll = false + disable_while_typing = true + tap-to-click = true + } +} + + +decoration { + rounding = 16 + multisample_edges = true + + active_opacity = 0.95 + inactive_opacity = 0.9 + fullscreen_opacity = 0.95 + + dim_inactive = false + dim_strength = 0.05 + + blur = true + blur_size = 5 + blur_passes = 4 + blur_new_optimizations = true + blur_xray = true + blur_ignore_opacity = true + + drop_shadow = true + shadow_ignore_window = true + shadow_range = 20 + shadow_render_power = 3 + col.shadow = 0x55161925 + col.shadow_inactive = 0x22161925 + # Your blur "amount" is blur_size * blur_passes, but high blur_size (over around 5-ish) will produce artifacts. + # if you want heavy blur, you need to up the blur_passes. + # the more passes, the more you can up the blur_size without noticing artifacts. + + # Blurring layerSurfaces + # blurls = gtk-layer-shell + # blurls = waybar + # blurls = lockscreen + blurls = rofi + blurls = wofi +} + + +animations { + enabled = true + # bezier = overshot, 0.05, 0.9, 0.1, 1.1 + bezier = overshot, 0.13, 0.99, 0.29, 1.1 + animation = windows, 1, 4, overshot, slide + animation = border, 1, 10, default + animation = fade, 1, 10, default + animation = workspaces, 1, 6, overshot, slidevert +} + + +dwindle { + pseudotile = true # enable pseudotiling on dwindle + force_split = 0 + col.group_border = 0xff89dceb + col.group_border_active = 0xfff9e2af + preserve_split = true +} + + +master { + +} + + +gestures { + workspace_swipe = true + workspace_swipe_invert = false + workspace_swipe_fingers = 3 +} + + +misc { + disable_hyprland_logo = true + + focus_on_activate = true + + enable_swallow = true + swallow_regex = ^(kitty)$ +} + + +binds { + allow_workspace_cycles = true +} + + +custom { + rules { + # for windows named/classed as abc and xyz + # windowrule = move 69 420, abc + # windowrule = pseudo, abc + # windowrule = monitor 0, xyz + # windowrule = tile, xy + + windowrule = float, title:^(fly_is_kitty)$ + windowrule = size 800 500, title:^(fly_is_kitty)$ + windowrule = move center, title:^(fly_is_kitty)$ + windowrule = animation slide, title:^(fly_is_kitty)$ + + windowrule = float, title:^(all_is_kitty)$ + + windowrule = float, title:^(clock_is_kitty)$ + windowrule = size 325 180, title:^(clock_is_kitty)$ + + windowrule = float, title:^(donut_is_kitty)$ + windowrule = size 660 486, title:^(donut_is_kitty)$ + + windowrule = animation popin, title:^(donut_is_kitty)$ + + windowrule = float,^(rlr)$ + windowrule = float,^(pavucontrol)$ + windowrule = float,^(blueman-manager)$ + windowrule = float,^(nm-connection-editor)$ + windowrule = float,^(mediainfo-gui)$ + windowrule = tile,^(neovide)$ + windowrulev2 = float, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$ + windowrulev2 = float, class:^(nemo)$, title:^(.*Properties)$ + windowrulev2 = float, class:^(Nemo-preview-start)$ + + windowrule = float,^(com.github.neithern.g4music)$ + windowrule = size 670 635,^(com.github.neithern.g4music)$ + windowrule = move center,^(com.github.neithern.g4music)$ + + windowrulev2 = animation slide, class:^(wofi)$ + windowrulev2 = move 100%-433 53, class:^(wofi)$, title:^(clippick)$ + + windowrulev2 = animation popin, class:^(wlogout)$, title:^(wlogout)$ + windowrulev2 = float, class:^(wlogout)$, title:^(wlogout)$ + } + + binds { + # Mouse binds + bindm = SUPER, mouse:272, movewindow + bindm = SUPER, mouse:273, resizewindow + + bind = SUPER, mouse_down, workspace, e-1 + bind = SUPER, mouse_up, workspace, e+1 + + # Kitty binds + bind = ALT, RETURN, exec, kitty --start-as=fullscreen --title all_is_kitty + bind = SUPER, RETURN, exec, kitty --title fly_is_kitty --single-instance + bind = SUPER, t, exec, $term + + # Screenshot binds + bind = , Print, exec,~/.scripts/screenshot_full + bind = ALT, Print, exec,~/.scripts/screenshot + + # Application binds + bind = SUPER, Q, killactive, + bind = SUPER, F, exec, $explorer + bind = SUPER, B, exec, $browser + bind = SUPER, E, exec, $gmail + bind = SUPER, G, exec, $notepad + + # Wofi and notification binds + bind = SUPER, V, exec, pkill wofi || cliphist list | wofi --dmenu -p clippick -l top_right -x -15 -y 10 -n | cliphist decode | wl-copy + bind = SUPER, N, exec, swaync-client -t -sw + bindr = SUPER, SUPER_L, exec, pkill wofi || $launcher + bind = SUPER, space, exec, pkill wofi || $launcher_alt + + # Other dispatchers + bind = ALT, Tab, cyclenext + bind = SUPER, M, fullscreen, + bind = SUPER, C, exec, hyprctl dispatch centerwindow none + bind = SUPER_SHIFT, M, fakefullscreen, + bind = SUPER, P, pseudo, + bind = SUPER, S, togglefloating, + bind = SUPER_SHIFT, G, togglegroup, + bind = SUPER, tab, changegroupactive, + + # Reload waybar + bind = SUPER_SHIFT, R, exec,~/.scripts/launch_waybar + + # Logout screen, lock, exit + bind = SUPER, escape, exec,~/.config/wlogout/launch.sh + bind = SUPER, L, exec,~/.scripts/lock + bind = SUPER_SHIFT, escape, exit + + + # Move window with SUPER + Shift + arrow keys + # [↑] + # [←] [↓] [→] + bind = SUPER_SHIFT, left, movewindow, l + bind = SUPER_SHIFT, right, movewindow, r + bind = SUPER_SHIFT, up, movewindow, u + bind = SUPER_SHIFT, down, movewindow, d + + # Move window focus with SUPER + arrow keys + # [↑] + # [←] [↓] [→] + bind = SUPER, left, movefocus, l + bind = SUPER, right, movefocus, r + bind = SUPER, up, movefocus, u + bind = SUPER, down, movefocus, d + + # Move To a workspaces + bind = SUPER, 1, workspace, 1 + bind = SUPER, 2, workspace, 2 + bind = SUPER, 3, workspace, 3 + bind = SUPER, 4, workspace, 4 + bind = SUPER, 5, workspace, 5 + bind = SUPER, 6, workspace, 6 + bind = SUPER, 7, workspace, 7 + bind = SUPER, 8, workspace, 8 + bind = SUPER, 9, workspace, 9 + + # Move windows between workspaces + bind = SUPER_SHIFT, 1, movetoworkspace, 1 + bind = SUPER_SHIFT, 2, movetoworkspace, 2 + bind = SUPER_SHIFT, 3, movetoworkspace, 3 + bind = SUPER_SHIFT, 4, movetoworkspace, 4 + bind = SUPER_SHIFT, 5, movetoworkspace, 5 + bind = SUPER_SHIFT, 6, movetoworkspace, 6 + bind = SUPER_SHIFT, 7, movetoworkspace, 7 + bind = SUPER_SHIFT, 8, movetoworkspace, 8 + bind = SUPER_SHIFT, 9, movetoworkspace, 9 + + # Ricing :p + bind = CTRL, 1, exec, kitty --title fly_is_kitty sh -c 'cava' + bind = CTRL, 2, exec, kitty --title donut_is_kitty sh -c '~/.local/bin/donut' + bind = CTRL, 3, exec, kitty --title clock_is_kitty sh -c 'tty-clock -C5 -c' + + # Use this to get thw XF86 bind (FN + Fx combination) for your keyboard + # xev | grep -A2 --line-buffered '^KeyRelease' | sed -n '/keycode /s/^.*keycode \([0-9]*\).* (.*, \(.*\)).*$/\1 \2/p' + + # Volume Control + binde = , XF86AudioRaiseVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ +1% + binde = , XF86AudioLowerVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ -1% + bind = , XF86AudioMute, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle + bind = , XF86AudioMicMute, exec, pactl set-source-mute @DEFAULT_SOURCE@ toggle + + # Media Control + bind = , XF86AudioMedia, exec, playerctl play-pause + bind = , XF86AudioPlay, exec, playerctl play-pause + bind = , XF86AudioStop, exec, playerctl stop + bind = , XF86AudioPrev, exec, playerctl previous + bind = , XF86AudioNext, exec, playerctl next + + # Brightness Control + binde = , XF86MonBrightnessUp, exec, light -A 1 + binde = , XF86MonBrightnessDown, exec, light -U 1 + + # Screensaver key + bind = , XF86ScreenSaver, exec,~/.scripts/lock + + # Others + bind = , XF86Mail, exec,$gmail + bind = , XF86HomePage, exec, $explorer ~/ + bind = , XF86Calculator, exec, qalculate-gtk + bind = , XF86Search, exec, wofi + + # trigger when the switch is turning on + # bindl = , switch:on:Lid Switch, exec, hyprctl keyword monitor ", 1920x1080@60, auto, 1" + # trigger when the switch is turning off + bindl = , switch:off:Lid Switch, exec, playerctl --all-players stop; ~/.scripts/lock; systemctl suspend + } +} diff --git a/.config/inputrc b/.config/inputrc new file mode 100644 index 0000000..8d3920c --- /dev/null +++ b/.config/inputrc @@ -0,0 +1,43 @@ +$include /etc/inputrc + +set editing-mode vi +set keymap vi-insert +"\f": clear-screen +set show-mode-in-prompt on +set vi-cmd-mode-string "\1\e[2 q\2" +set vi-ins-mode-string "\1\e[6 q\2" + +# Reduce the delay between pressing escape and the cursor change +set keyseq-timeout 0 + +#set -o vi +#lset keymap vi +#$if mode=vi + # set show-mode-in-prompt on + # set vi-ins-mode-string \1\e[6 q\2 + # set vi-cmd-mode-string \1\e[2 q\2 + +# set keymap vi-command + # these are for vi-command mode +# Control-l: clear-screen +# Control-a: beginning-of-line + +# set keymap vi-insert +# # these are for vi-insert mode +# Control-l: clear-screen +# Control-a: beginning-of-line +# # exit insert mode using <jj> +# "jj" # remap escape +#$endif + +set bell-style none +#$if mode=vi +# set keymap vi-command +# "gg": beginning-of-history +# "G": end-of-history +# set keymap vi-insert #notice how the "jj" movement is +# "jj": vi-movement-mode #after 'set keymap vi-insert'? + # "\C-w": backward-kill-word +# "\C-p": history-search-backward +#$endif + diff --git a/.config/kitty/kitty.conf b/.config/kitty/kitty.conf new file mode 100644 index 0000000..cbf9f70 --- /dev/null +++ b/.config/kitty/kitty.conf @@ -0,0 +1,827 @@ + +# vim:fileencoding=utf-8:ft=conf:foldmethod=marker + +#: Fonts {{{ + +#: kitty has very powerful font management. You can configure +#: individual font faces and even specify special fonts for particular +#: characters. + +font_family JetBrains Mono Medium +bold_font auto +italic_font auto +bold_italic_font auto + +#: You can specify different fonts for the bold/italic/bold-italic +#: variants. By default they are derived automatically, by the OSes +#: font system. Setting them manually is useful for font families that +#: have many weight variants like Book, Medium, Thick, etc. For +#: example: + +#: font_family Operator Mono Book +#: bold_font Operator Mono Medium +#: italic_font Operator Mono Book Italic +#: bold_italic_font Operator Mono Medium Italic + +font_size 9.0 + +#: Font size (in pts) + +# adjust_line_height 0 +# adjust_column_width 0 + +#: Change the size of each character cell kitty renders. You can use +#: either numbers, which are interpreted as pixels or percentages +#: (number followed by %), which are interpreted as percentages of the +#: unmodified values. You can use negative pixels or percentages less +#: than 100% to reduce sizes (but this might cause rendering +#: artifacts). + +# symbol_map U+E0A0-U+E0A2,U+E0B0-U+E0B3 PowerlineSymbols + +#: Map the specified unicode codepoints to a particular font. Useful +#: if you need special rendering for some symbols, such as for +#: Powerline. Avoids the need for patched fonts. Each unicode code +#: point is specified in the form U+<code point in hexadecimal>. You +#: can specify multiple code points, separated by commas and ranges +#: separated by hyphens. symbol_map itself can be specified multiple +#: times. Syntax is:: + +#: symbol_map codepoints Font Family Name + +# box_drawing_scale 0.001, 1, 1.5, 2 + +#: Change the sizes of the lines used for the box drawing unicode +#: characters These values are in pts. They will be scaled by the +#: monitor DPI to arrive at a pixel value. There must be four values +#: corresponding to thin, normal, thick, and very thick lines. + +#: }}} + +#: Cursor customization {{{ + +# cursor magenta +cursor white + +#: Default cursor color + +# cursor_shape block + +#: The cursor shape can be one of (block, beam, underline) + +cursor_blink_interval 0.5 +cursor_stop_blinking_after 15.0 + +#: The interval (in seconds) at which to blink the cursor. Set to zero +#: to disable blinking. Note that numbers smaller than repaint_delay +#: will be limited to repaint_delay. Stop blinking cursor after the +#: specified number of seconds of keyboard inactivity. Set to zero to +#: never stop blinking. + +#: }}} + +#: Scrollback {{{ + +scrollback_lines 20000 + +#: Number of lines of history to keep in memory for scrolling back. +#: Memory is allocated on demand. + +# scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER + +#: Program with which to view scrollback in a new window. The +#: scrollback buffer is passed as STDIN to this program. If you change +#: it, make sure the program you use can handle ANSI escape sequences +#: for colors and text formatting. INPUT_LINE_NUMBER in the command +#: line above will be replaced by an integer representing which line +#: should be at the top of the screen. + +wheel_scroll_multiplier 5 + +#: Modify the amount scrolled by the mouse wheel or touchpad. Use +#: negative numbers to change scroll direction. + +#: }}} + +#: Mouse {{{ + +url_color #0087BD +url_style curly + +#: The color and style for highlighting URLs on mouse-over. url_style +#: can be one of: none, single, double, curly + +open_url_modifiers kitty_mod + +#: The modifier keys to press when clicking with the mouse on URLs to +#: open the URL + +open_url_with default + +#: The program with which to open URLs that are clicked on. The +#: special value default means to use the operating system's default +#: URL handler. + +copy_on_select yes + +#: Copy to clipboard on select. With this enabled, simply selecting +#: text with the mouse will cause the text to be copied to clipboard. +#: Useful on platforms such as macOS/Wayland that do not have the +#: concept of primary selectons. Note that this is a security risk, +#: as all programs, including websites open in your browser can read +#: the contents of the clipboard. + +# rectangle_select_modifiers ctrl+alt + +#: The modifiers to use rectangular selection (i.e. to select text in +#: a rectangular block with the mouse) + +# select_by_word_characters :@-./_~?&=%+# + +#: Characters considered part of a word when double clicking. In +#: addition to these characters any character that is marked as an +#: alpha-numeric character in the unicode database will be matched. + +click_interval 0.5 + +#: The interval between successive clicks to detect double/triple +#: clicks (in seconds) + +# mouse_hide_wait 3.0 + +#: Hide mouse cursor after the specified number of seconds of the +#: mouse not being used. Set to zero to disable mouse cursor hiding. + +# focus_follows_mouse no + +#: Set the active window to the window under the mouse when moving the +#: mouse around + +#: }}} + +#: Performance tuning {{{ + +repaint_delay 10 + +#: Delay (in milliseconds) between screen updates. Decreasing it, +#: increases frames-per-second (FPS) at the cost of more CPU usage. +#: The default value yields ~100 FPS which is more than sufficient for +#: most uses. Note that to actually achieve 100 FPS you have to either +#: set sync_to_monitor to no or use a monitor with a high refresh +#: rate. + +# input_delay 3 + +#: Delay (in milliseconds) before input from the program running in +#: the terminal is processed. Note that decreasing it will increase +#: responsiveness, but also increase CPU usage and might cause flicker +#: in full screen programs that redraw the entire screen on each loop, +#: because kitty is so fast that partial screen updates will be drawn. + +# sync_to_monitor yes + +#: Sync screen updates to the refresh rate of the monitor. This +#: prevents tearing (https://en.wikipedia.org/wiki/Screen_tearing) +#: when scrolling. However, it limits the rendering speed to the +#: refresh rate of your monitor. With a very high speed mouse/high +#: keyboard repeat rate, you may notice some slight input latency. If +#: so, set this to no. + +#: }}} + +#: Terminal bell {{{ + +enable_audio_bell no + +#: Enable/disable the audio bell. Useful in environments that require +#: silence. + +# visual_bell_duration 0.5 + +#: Visual bell duration. Flash the screen when a bell occurs for the +#: specified number of seconds. Set to zero to disable. + +window_alert_on_bell yes + +#: Request window attention on bell. Makes the dock icon bounce on +#: macOS or the taskbar flash on linux. + +bell_on_tab yes + +#: Show a bell symbol on the tab if a bell occurs in one of the +#: windows in the tab and the window is not the currently focused +#: window + +#: }}} + +#: Window layout {{{ + +# remember_window_size yes +# initial_window_width 640 +# initial_window_height 400 + +#: If enabled, the window size will be remembered so that new +#: instances of kitty will have the same size as the previous +#: instance. If disabled, the window will initially have size +#: configured by initial_window_width/height, in pixels. You can use a +#: suffix of "c" on the width/height values to have them interpreted +#: as number of cells instead of pixels. + +enabled_layouts * + +#: The enabled window layouts. A comma separated list of layout names. +#: The special value * means all layouts. The first listed layout will +#: be used as the startup layout. For a list of available layouts, see +#: the layouts. + +# window_resize_step_cells 2 +# window_resize_step_lines 2 + +#: The step size (in units of cell width/cell height) to use when +#: resizing windows. The cells value is used for horizontal resizing +#: and the lines value for vertical resizing. + +window_border_width 1 + +#: The width (in pts) of window borders. Will be rounded to the +#: nearest number of pixels based on screen resolution. Note that +#: borders are displayed only when more than one window is visible. +#: They are meant to separate multiple windows. + +window_margin_width 0 + +#: The window margin (in pts) (blank area outside the border) + +# single_window_margin_width -1000.0 + +#: The window margin (in pts) to use when only a single window is +#: visible. Negative values will cause the value of +#: window_margin_width to be used instead. + +window_padding_width 2 + +#: The window padding (in pts) (blank area between the text and the +#: window border) + +active_border_color #282c34 + +#: The color for the border of the active window + +inactive_border_color #22262d + +#: The color for the border of inactive windows + +# bell_border_color #ff5a00 + +#: The color for the border of inactive windows in which a bell has +#: occurred + +inactive_text_alpha .6 + +#: Fade the text in inactive windows by the specified amount (a number +#: between zero and one, with zero being fully faded). + +#: }}} + +#: Tab bar {{{ + +# tab_bar_edge bottom + +#: Which edge to show the tab bar on, top or bottom + +tab_bar_margin_width 4 + +#: The margin to the left and right of the tab bar (in pts) + +tab_bar_style fade + +#: The tab bar style, can be one of: fade or separator. In the fade +#: style, each tab's edges fade into the background color, in the +#: separator style, tabs are separated by a configurable separator. + +# tab_fade 0.25 0.5 0.75 1 +tab_fade 1 1 1 + +#: Control how each tab fades into the background when using fade for +#: the tab_bar_style. Each number is an alpha (between zero and one) +#: that controls how much the corresponding cell fades into the +#: background, with zero being no fade and one being full fade. You +#: can change the number of cells used by adding/removing entries to +#: this list. + +# tab_separator " " + +#: The separator between tabs in the tab bar when using separator as +#: the tab_bar_style. + +active_tab_foreground #282c34 +active_tab_background #abb2bf +active_tab_font_style bold +inactive_tab_foreground #5c6370 +inactive_tab_background #22262d +inactive_tab_font_style normal + +#: Tab bar colors and styles + +#: }}} + +#: Color scheme {{{ + +foreground #d8dee9 +#background #1d1f21 +background #000000 + +#: The foreground and background colors + +background_opacity 0.7 +dynamic_background_opacity yes +# Increase background opacity ctrl+shift+a>m + +# Decrease background opacity ctrl+shift+a>l + +# Full background opacity ctrl+shift+a>1 + +# Reset background opacity ctrl+shift+a>d + +#: The opacity of the background. A number between 0 and 1, where 1 is +#: opaque and 0 is fully transparent. This will only work if +#: supported by the OS (for instance, when using a compositor under +#: X11). Note that it only sets the default background color's +#: opacity. This is so that things like the status bar in vim, +#: powerline prompts, etc. still look good. But it means that if you +#: use a color theme with a background color in your editor, it will +#: not be rendered as transparent. Instead you should change the +#: default background color in your kitty config and not use a +#: background color in the editor color scheme. Or use the escape +#: codes to set the terminals default colors in a shell script to +#: launch your editor. Be aware that using a value less than 1.0 is a +#: (possibly significant) performance hit. If you want to dynamically +#: change transparency of windows set dynamic_background_opacity to +#: yes (this is off by default as it has a performance cost) + +dim_opacity 1.0 + +#: How much to dim text that has the DIM/FAINT attribute set. One +#: means no dimming and zero means fully dimmed (i.e. invisible). + +selection_foreground #000000 +selection_background #FFFACD + +#: The foreground and background for text selected with the mouse + + +#: The 16 terminal colors. There are 8 basic colors, each color has a +#: dull and bright version. You can also set the remaining colors from +#: the 256 color table as color16 to color255. + +#: black +color0 #313539 +color8 #676f78 + +#: red +color1 #b02626 +color9 #b55454 + +#: green +color2 #40a62f +color10 #78a670 + +#: yellow +color3 #f2e635 +color11 #faf380 + +#: blue +color4 #314ad0 +color12 #707fd0 + +#: magenta +color5 #b30ad0 +color13 #c583d0 + +#: cyan +color6 #32d0fc +color14 #8adaf1 + +#: white +color7 #acadb1 +color15 #e0e3e7 + + +#: }}} + +#: Advanced {{{ + +# shell zsh + +#: The shell program to execute. The default value of . means to use +#: whatever shell is set as the default shell for the current user. +#: Note that on macOS if you change this, you might need to add +#: --login to ensure that the shell starts in interactive mode and +#: reads its startup rc files. + +editor . + +#: The console editor to use when editing the kitty config file or +#: similar tasks. A value of . means to use the environment variable +#: EDITOR. Note that this environment variable has to be set not just +#: in your shell startup scripts but system-wide, otherwise kitty will +#: not see it. + +# Confirm when closing where 0 disables it; -1 enables it +confirm_os_window_close 0 + +# close_on_child_death nvim + +#: Close the window when the child process (shell) exits. If no (the +#: default), the terminal will remain open when the child exits as +#: long as there are still processes outputting to the terminal (for +#: example disowned or backgrounded processes). If yes, the window +#: will close as soon as the child process exits. Note that setting it +#: to yes means that any background processes still using the terminal +#: can fail silently because their stdout/stderr/stdin no longer work. + +# allow_remote_control no + +#: Allow other programs to control kitty. If you turn this on other +#: programs can control all aspects of kitty, including sending text +#: to kitty windows, opening new windows, closing windows, reading the +#: content of windows, etc. Note that this even works over ssh +#: connections. + +# startup_session none + +#: Path to a session file to use for all kitty instances. Can be +#: overridden by using the kitty --session command line option for +#: individual instances. See sessions in the kitty documentation for +#: details. Note that relative paths are interpreted with respect to +#: the kitty config directory. Environment variables in the path are +#: expanded. + +# clipboard_control write-clipboard write-primary +clipboard_control write-primary write-clipboard no-append + +#: Allow programs running in kitty to read and write from the +#: clipboard. You can control exactly which actions are allowed. The +#: set of possible actions is: write-clipboard read-clipboard write- +#: primary read-primary The default is to allow writing to the +#: clipboard and primary selection. Note that enabling the read +#: functionality is a security risk as it means that any program, even +#: one running on a remote server via SSH can read your clipboard. + +#term xterm-kitty + +#: The value of the TERM environment variable to set. Changing this +#: can break many terminal programs, only change it if you know what +#: you are doing, not because you read some advice on Stack Overflow +#: to change it. + +#: }}} + +#: OS specific tweaks {{{ + +# macos_titlebar_color #22262d + +#: Change the color of the kitty window's titlebar on macOS. A value +#: of system means to use the default system color, a value of +#: background means to use the background color of the currently +#: active window and finally you can use an arbitrary color, such as +#: #12af59 or red. WARNING: This option works by using a hack, as +#: there is no proper Cocoa API for it. It sets the background color +#: of the entire window and makes the titlebar transparent. As such it +#: is incompatible with background_opacity. If you want to use both, +#: you are probably better off just hiding the titlebar with +#: macos_hide_titlebar. + +# macos_hide_titlebar no + +#: Hide the kitty window's title bar on macOS. + +hide_window_decorations yes + +#: Hide the window decorations (title bar and window borders) on X11 +#: and Wayland. Whether this works and exactly what effect it has +#: depends on the window manager, as it is the job of the window +#: manager/compositor to draw window decorations. + +# macos_option_as_alt yes + +#: Use the option key as an alt key. With this set to no, kitty will +#: use the macOS native Option+Key = unicode character behavior. This +#: will break any Alt+key keyboard shortcuts in your terminal +#: programs, but you can use the macOS unicode input technique. + +# macos_hide_from_tasks no + +#: Hide the kitty window from running tasks (Option+Tab) on macOS. + +# macos_quit_when_last_window_closed no + +#: Have kitty quit when all the top-level windows are closed. By +#: default, kitty will stay running, even with no open windows, as is +#: the expected behavior on macOS. + +linux_display_server x11 + +#: Choose between Wayland and X11 backends. By default, an appropriate +#: backend based on the system state is chosen automatically. Set it +#: to x11 or wayland to force the choice. + +#: }}} + +#: Keyboard shortcuts {{{ + +#: For a list of key names, see: GLFW keys +#: <http://www.glfw.org/docs/latest/group__keys.html>. The name to use +#: is the part after the GLFW_KEY_ prefix. For a list of modifier +#: names, see: GLFW mods +#: <http://www.glfw.org/docs/latest/group__mods.html> + +#: On Linux you can also use XKB key names to bind keys that are not +#: supported by GLFW. See XKB keys +#: <https://github.com/xkbcommon/libxkbcommon/blob/master/xkbcommon/xkbcommon- +#: keysyms.h> for a list of key names. The name to use is the part +#: after the XKB_KEY_ prefix. Note that you should only use an XKB key +#: name for keys that are not present in the list of GLFW keys. + +#: You can use the special action no_op to unmap a keyboard shortcut +#: that is assigned in the default configuration. + +#: You can combine multiple actions to be triggered by a single +#: shortcut, using the syntax below:: + +#: map key combine <separator> action1 <separator> action2 <separator> action3 ... + +#: For example:: + +#: map kitty_mod+e combine : new_window : next_layout + +#: this will create a new window and switch to the next available +#: layout + +#: You can use multi-key shortcuts using the syntax shown below:: + +#: map key1>key2>key3 action + +#: For example:: + +#: map ctrl+f>2 set_font_size 20 + +# kitty_mod ctrl+shift + +#: The value of kitty_mod is used as the modifier for all default +#: shortcuts, you can change it in your kitty.conf to change the +#: modifiers for all the default shortcuts. + +# clear_all_shortcuts no + +#: You can have kitty remove all shortcut definition seen up to this +#: point. Useful, for instance, to remove the default shortcuts. + +#: Clipboard {{{ + +# map cmd+c copy_to_clipboard +#map kitty_mod+c copy_to_clipboard +# map cmd+v paste_from_clipboard +#map kitty_mod+v paste_from_clipboard +#map kitty_mod+s paste_from_selection +map shift+insert paste_from_selection +# map kitty_mod+o pass_selection_to_program +map ctrl+c copy_to_clipboard +map ctrl+v paste_from_clipboard + +#: You can also pass the contents of the current selection to any +#: program using pass_selection_to_program. By default, the system's +#: open program is used, but you can specify your own, for example:: + +#: map kitty_mod+o pass_selection_to_program firefox + +#: You can pass the current selection to a terminal program running in +#: a new kitty window, by using the @selection placeholder:: + +#: map kitty_mod+y new_window less @selection + +#: }}} + +#: Scrolling {{{ + +#map kitty_mod+up scroll_line_up +#map ctrl+k scroll_line_up +#map kitty_mod+k scroll_line_up +#map kitty_mod+down scroll_line_down +#map ctrl+j scroll_line_down +#map kitty_mod+j scroll_line_down +map kitty_mod+page_up scroll_page_up +map kitty_mod+page_down scroll_page_down +map kitty_mod+b scroll_page_up +map kitty_mod+f scroll_page_down +# map kitty_mod+home scroll_home +# map kitty_mod+end scroll_end +# map kitty_mod+h show_scrollback + +#: You can send the contents of the current screen + history buffer as +#: stdin to an arbitrary program using the placeholders @text (which +#: is the plain text) and @ansi (which includes text styling escape +#: codes). For only the current screen, use @screen or @ansi_screen. +#: For example, the following command opens the scrollback buffer in +#: less in a new window:: + +#: map kitty_mod+y new_window @ansi less +G -R + +#: }}} + +#: Window management {{{ + +# map kitty_mod+enter new_window +map kitty_mod+enter no_op +map kitty_mod+enter new_window_with_cwd + +#: You can open a new window running an arbitrary program, for +#: example:: + +#: map kitty_mod+y new_window mutt + +#: You can open a new window with the current working directory set to +#: the working directory of the current window using:: + +#: map ctrl+alt+enter new_window_with_cwd + +# map cmd+n new_os_window +# map kitty_mod+n new_os_window +# map kitty_mod+w close_window +# map kitty_mod+] next_window +# map kitty_mod+[ previous_window +map kitty_mod+j previous_window +map kitty_mod+k next_window +map kitty_mod+up move_window_forward +map kitty_mod+down move_window_backward +# map kitty_mod+f move_window_forward +# map kitty_mod+b move_window_backward +# map kitty_mod+` move_window_to_top +# map kitty_mod+r start_resizing_window +# map kitty_mod+1 first_window +# map kitty_mod+2 second_window +# map kitty_mod+3 third_window +# map kitty_mod+4 fourth_window +# map kitty_mod+5 fifth_window +# map kitty_mod+6 sixth_window +# map kitty_mod+7 seventh_window +# map kitty_mod+8 eighth_window +# map kitty_mod+9 ninth_window +# map kitty_mod+0 tenth_window +#: }}} + +#: Tab management {{{ + +# map kitty_mod+right next_tab +# map kitty_mod+left previous_tab +map kitty_mod+] no_op +map kitty_mod+] next_tab +map kitty_mod+[ no_op +map kitty_mod+[ previous_tab +# map kitty_mod+t new_tab +# map kitty_mod+q close_tab +# map kitty_mod+. move_tab_forward +# map kitty_mod+, move_tab_backward +map kitty_mod+right no_op +map kitty_mod+right move_tab_forward +map kitty_mod+left no_op +map kitty_mod+left move_tab_backward +# map kitty_mod+alt+t set_tab_title +map kitty_mod+t no_op +map kitty_mod+t new_tab_with_cwd + +#: You can also create shortcuts to go to specific tabs, with 1 being +#: the first tab:: + +#: map ctrl+alt+1 goto_tab 1 +#: map ctrl+alt+2 goto_tab 2 + +#: Just as with new_window above, you can also pass the name of +#: arbitrary commands to run when using new_tab and use +#: new_tab_with_cwd. +#: }}} + +#: Layout management {{{ + +# map kitty_mod+l next_layout + +#: You can also create shortcuts to switch to specific layouts:: + +map kitty_mod+0 no_op +map kitty_mod+0 goto_layout stack +map kitty_mod+9 no_op +map kitty_mod+9 goto_layout tall +map kitty_mod+8 no_op +map kitty_mod+8 goto_layout fat +#: map ctrl+alt+t goto_layout tall +#: map ctrl+alt+s goto_layout stack +#: }}} + +#: Font sizes {{{ + +#: You can change the font size for all top-level kitty windows at a +#: time or only the current one. + +map kitty_mod+equal change_font_size all +2.0 +map kitty_mod+minus change_font_size all -2.0 +map kitty_mod+backspace change_font_size all 0 + +#: To setup shortcuts for specific font sizes:: + +#: map kitty_mod+f6 change_font_size all 10.0 + +#: To setup shortcuts to change only the current window's font size:: + +#: map kitty_mod+f6 change_font_size current 10.0 +#: }}} + +#: Select and act on visible text {{{ + +#: Use the hints kitten to select text and either pass it to an +#: external program or insert it into the terminal or copy it to the +#: clipboard. + +# map kitty_mod+e kitten hints + +#: Open a currently visible URL using the keyboard. The program used +#: to open the URL is specified in open_url_with. + +# map kitty_mod+p>f kitten hints --type path --program - + +#: Select a path/filename and insert it into the terminal. Useful, for +#: instance to run git commands on a filename output from a previous +#: git command. + +# map kitty_mod+p>shift+f kitten hints --type path + +#: Select a path/filename and open it with the default open program. + +# map kitty_mod+p>l kitten hints --type line --program - + +#: Select a line of text and insert it into the terminal. Use for the +#: output of things like: ls -1 + +# map kitty_mod+p>w kitten hints --type word --program - + +#: Select words and insert into terminal. + +# map kitty_mod+p>h kitten hints --type hash --program - + +#: Select something that looks like a hash and insert it into the +#: terminal. Useful with git, which uses sha1 hashes to identify +#: commits + + +#: The hints kitten has many more modes of operation that you can map +#: to different shortcuts. For a full description see kittens/hints. +#: }}} + +#: Miscellaneous {{{ + + +# map kitty_mod+f11 toggle_fullscreen +# map kitty_mod+u input_unicode_character +# map kitty_mod+f2 edit_config_file +# map kitty_mod+escape kitty_shell window + +#: Open the kitty shell in a new window/tab/overlay/os_window to +#: control kitty using commands. + +# map kitty_mod+a>m set_background_opacity +0.1 +# map kitty_mod+a>l set_background_opacity -0.1 +# map kitty_mod+a>1 set_background_opacity 1 +# map kitty_mod+a>d set_background_opacity default +# +# map kitty_mod+a>m set_background_opacity +0.1 +# map kitty_mod+a>l set_background_opacity -0.1 +map kitty_mod+, set_background_opacity 1 +map kitty_mod+. set_background_opacity default + +#: You can tell kitty to send arbitrary (UTF-8) encoded text to the +#: client program when pressing specified shortcut keys. For example:: + +#: map ctrl+alt+a send_text all Special text + +#: This will send "Special text" when you press the ctrl+alt+a key +#: combination. The text to be sent is a python string literal so you +#: can use escapes like \x1b to send control codes or \u21fb to send +#: unicode characters (or you can just input the unicode characters +#: directly as UTF-8 text). The first argument to send_text is the +#: keyboard modes in which to activate the shortcut. The possible +#: values are normal or application or kitty or a comma separated +#: combination of them. The special keyword all means all modes. The +#: modes normal and application refer to the DECCKM cursor key mode +#: for terminals, and kitty refers to the special kitty extended +#: keyboard protocol. + +#: Another example, that outputs a word and then moves the cursor to +#: the start of the line (same as pressing the Home key):: + +#: map ctrl+alt+a send_text normal Word\x1b[H +#: map ctrl+alt+a send_text application Word\x1bOH + +#: }}} + +map ctrl+space send_text all \x10 + +# }}} diff --git a/.config/mimeapps.list b/.config/mimeapps.list new file mode 100644 index 0000000..7f8b90b --- /dev/null +++ b/.config/mimeapps.list @@ -0,0 +1,11 @@ +[Default Applications] +application/pdf=zathura.desktop; +image/png=vimiv.desktop +image/jpeg=vimiv.desktop; +video/mp4=vlc.desktop; + +[Added Associations] +image/png=vimiv.desktop; + +[Removed Associations] + diff --git a/.config/nvim/.gitignore b/.config/nvim/.gitignore new file mode 100644 index 0000000..f6f2fa2 --- /dev/null +++ b/.config/nvim/.gitignore @@ -0,0 +1,4 @@ +plugin/packer_compiled.lua +startup.log +tmp +*.log diff --git a/.config/nvim/README.md b/.config/nvim/README.md new file mode 100644 index 0000000..2849262 --- /dev/null +++ b/.config/nvim/README.md @@ -0,0 +1,33 @@ +## Neovim + +#### Dependencies + +nvm +nvm install --lts + +#### TODOS: + +- [ ] Markdown filetype plugin or autocommand to add two spaces each line +- [ ] Markdown filetype plugin or autocommand to make backtick auto-correct properly +- [x] Indent by filetype/fix global indent (2) +- [x] Check history or telescope history of last files edited or opened. +- [ ] - Windows native support configuration +- [ ] - Python debugger +- [ ] README file heirachcy +- [ ] Markdown snippet for code blocks with list, ie.- ``and -` ` +- [ ] Snippet for filler text with variations, ie. common sentences: The quick brown fox... and more and placeholder words +- [ ] Configure snippets.lua +- [ ] Documentation shortcuts for different languages quote in quote "locally" (preffered) or opening web browser +- [ ] Dictionary, an actual dictionary +- [ ] Null-ls/lsp keymap to check current buffer servers must check both same time + > NOTE: Different servers must be configured only to one or another, research null-ls being archived +- [ ] Don't highlight whitespaces in lazygit (maybe exclusively markdown) +- [ ] Configure prettier/prettierd servers to join a lot of different files (null-ls) +- [ ] Nvim-tree preview window similar to telescope +- [x] Nvim-tree behaviour when delete current buffer + > NOTE: One idea is to create an autocmd to make a blank window (hidden) as a secondary window but when creating a opening a new file it does not ask which split to open in +- [ ] Nvim-tree conditionally when open going in the opposite direction will go back to nvim-tree ie. going right then goes to nvim-tree but is conditionally because of tmux etc... +- [x] Substitute keybinding +- [ ] Snippet/filetype plugin for markdown tick boxes +- [ ] Delete lua/user/func.lua +- [ ] Clean entire config by prioritizing single quotation marks over double diff --git a/after/ftplugin/markdown.lua b/.config/nvim/after/ftplugin/markdown.lua index 718a871..718a871 100644 --- a/after/ftplugin/markdown.lua +++ b/.config/nvim/after/ftplugin/markdown.lua diff --git a/autoload/utils.vim b/.config/nvim/autoload/utils.vim index 23a9178..23a9178 100644 --- a/autoload/utils.vim +++ b/.config/nvim/autoload/utils.vim diff --git a/init.lua b/.config/nvim/init.lua index 42c7a64..42c7a64 100644 --- a/init.lua +++ b/.config/nvim/init.lua diff --git a/lua/plugins/autopairs.lua b/.config/nvim/lua/plugins/autopairs.lua index 90c6d35..90c6d35 100644 --- a/lua/plugins/autopairs.lua +++ b/.config/nvim/lua/plugins/autopairs.lua diff --git a/lua/plugins/cmp-gh-source.lua b/.config/nvim/lua/plugins/cmp-gh-source.lua index 4990c35..4990c35 100644 --- a/lua/plugins/cmp-gh-source.lua +++ b/.config/nvim/lua/plugins/cmp-gh-source.lua diff --git a/lua/plugins/cmp.lua b/.config/nvim/lua/plugins/cmp.lua index edf57de..edf57de 100644 --- a/lua/plugins/cmp.lua +++ b/.config/nvim/lua/plugins/cmp.lua diff --git a/lua/plugins/colorscheme.lua b/.config/nvim/lua/plugins/colorscheme.lua index be78ac8..be78ac8 100644 --- a/lua/plugins/colorscheme.lua +++ b/.config/nvim/lua/plugins/colorscheme.lua diff --git a/lua/plugins/dap.lua b/.config/nvim/lua/plugins/dap.lua index 3189f4f..3189f4f 100644 --- a/lua/plugins/dap.lua +++ b/.config/nvim/lua/plugins/dap.lua diff --git a/lua/plugins/dashboard.lua b/.config/nvim/lua/plugins/dashboard.lua index e25d536..e25d536 100644 --- a/lua/plugins/dashboard.lua +++ b/.config/nvim/lua/plugins/dashboard.lua diff --git a/lua/plugins/fidget.lua b/.config/nvim/lua/plugins/fidget.lua index d401c5f..d401c5f 100644 --- a/lua/plugins/fidget.lua +++ b/.config/nvim/lua/plugins/fidget.lua diff --git a/lua/plugins/fzf.lua b/.config/nvim/lua/plugins/fzf.lua index 5675e9f..5675e9f 100644 --- a/lua/plugins/fzf.lua +++ b/.config/nvim/lua/plugins/fzf.lua diff --git a/lua/plugins/gitsigns.lua b/.config/nvim/lua/plugins/gitsigns.lua index 8fbdae1..8fbdae1 100644 --- a/lua/plugins/gitsigns.lua +++ b/.config/nvim/lua/plugins/gitsigns.lua diff --git a/lua/plugins/goto-preview.lua b/.config/nvim/lua/plugins/goto-preview.lua index d4d2c67..d4d2c67 100644 --- a/lua/plugins/goto-preview.lua +++ b/.config/nvim/lua/plugins/goto-preview.lua diff --git a/lua/plugins/hardtime.lua b/.config/nvim/lua/plugins/hardtime.lua index 153411d..153411d 100644 --- a/lua/plugins/hardtime.lua +++ b/.config/nvim/lua/plugins/hardtime.lua diff --git a/lua/plugins/harpoon.lua b/.config/nvim/lua/plugins/harpoon.lua index 784ee0b..784ee0b 100644 --- a/lua/plugins/harpoon.lua +++ b/.config/nvim/lua/plugins/harpoon.lua diff --git a/lua/plugins/heirline.lua b/.config/nvim/lua/plugins/heirline.lua index c41aff3..c41aff3 100644 --- a/lua/plugins/heirline.lua +++ b/.config/nvim/lua/plugins/heirline.lua diff --git a/lua/plugins/leetcode.lua b/.config/nvim/lua/plugins/leetcode.lua index 50369e1..50369e1 100644 --- a/lua/plugins/leetcode.lua +++ b/.config/nvim/lua/plugins/leetcode.lua diff --git a/lua/plugins/loclist.lua b/.config/nvim/lua/plugins/loclist.lua index 9b72a94..9b72a94 100644 --- a/lua/plugins/loclist.lua +++ b/.config/nvim/lua/plugins/loclist.lua diff --git a/lua/plugins/lsp.lua b/.config/nvim/lua/plugins/lsp.lua index b081cb4..b081cb4 100644 --- a/lua/plugins/lsp.lua +++ b/.config/nvim/lua/plugins/lsp.lua diff --git a/lua/plugins/modify-blend.lua b/.config/nvim/lua/plugins/modify-blend.lua index 1b2c6d5..1b2c6d5 100644 --- a/lua/plugins/modify-blend.lua +++ b/.config/nvim/lua/plugins/modify-blend.lua diff --git a/lua/plugins/navic.lua b/.config/nvim/lua/plugins/navic.lua index a95485d..a95485d 100644 --- a/lua/plugins/navic.lua +++ b/.config/nvim/lua/plugins/navic.lua diff --git a/lua/plugins/neodev.lua b/.config/nvim/lua/plugins/neodev.lua index f820422..f820422 100644 --- a/lua/plugins/neodev.lua +++ b/.config/nvim/lua/plugins/neodev.lua diff --git a/lua/plugins/neoscroll.lua b/.config/nvim/lua/plugins/neoscroll.lua index d122584..d122584 100644 --- a/lua/plugins/neoscroll.lua +++ b/.config/nvim/lua/plugins/neoscroll.lua diff --git a/lua/plugins/neotest.lua b/.config/nvim/lua/plugins/neotest.lua index aa73899..aa73899 100644 --- a/lua/plugins/neotest.lua +++ b/.config/nvim/lua/plugins/neotest.lua diff --git a/lua/plugins/notify.lua b/.config/nvim/lua/plugins/notify.lua index dcb496a..dcb496a 100644 --- a/lua/plugins/notify.lua +++ b/.config/nvim/lua/plugins/notify.lua diff --git a/lua/plugins/nvim-tree.lua b/.config/nvim/lua/plugins/nvim-tree.lua index f82a327..f82a327 100644 --- a/lua/plugins/nvim-tree.lua +++ b/.config/nvim/lua/plugins/nvim-tree.lua diff --git a/lua/plugins/overseer.lua b/.config/nvim/lua/plugins/overseer.lua index 6319d36..6319d36 100644 --- a/lua/plugins/overseer.lua +++ b/.config/nvim/lua/plugins/overseer.lua diff --git a/lua/plugins/quickfix.lua b/.config/nvim/lua/plugins/quickfix.lua index 4a76da0..4a76da0 100644 --- a/lua/plugins/quickfix.lua +++ b/.config/nvim/lua/plugins/quickfix.lua diff --git a/lua/plugins/session.lua b/.config/nvim/lua/plugins/session.lua index 0c84625..0c84625 100644 --- a/lua/plugins/session.lua +++ b/.config/nvim/lua/plugins/session.lua diff --git a/lua/plugins/snippets.lua b/.config/nvim/lua/plugins/snippets.lua index 7df6b2f..7df6b2f 100644 --- a/lua/plugins/snippets.lua +++ b/.config/nvim/lua/plugins/snippets.lua diff --git a/lua/plugins/sniprun.lua b/.config/nvim/lua/plugins/sniprun.lua index 418e8cc..418e8cc 100644 --- a/lua/plugins/sniprun.lua +++ b/.config/nvim/lua/plugins/sniprun.lua diff --git a/lua/plugins/statuscol.lua b/.config/nvim/lua/plugins/statuscol.lua index 24a2308..24a2308 100644 --- a/lua/plugins/statuscol.lua +++ b/.config/nvim/lua/plugins/statuscol.lua diff --git a/lua/plugins/telescope.lua b/.config/nvim/lua/plugins/telescope.lua index fb1b3ee..fb1b3ee 100644 --- a/lua/plugins/telescope.lua +++ b/.config/nvim/lua/plugins/telescope.lua diff --git a/lua/plugins/toggleterm.lua b/.config/nvim/lua/plugins/toggleterm.lua index e67bdec..e67bdec 100644 --- a/lua/plugins/toggleterm.lua +++ b/.config/nvim/lua/plugins/toggleterm.lua diff --git a/lua/plugins/treesitter.lua b/.config/nvim/lua/plugins/treesitter.lua index 7f481d3..7f481d3 100644 --- a/lua/plugins/treesitter.lua +++ b/.config/nvim/lua/plugins/treesitter.lua diff --git a/lua/plugins/trouble.lua b/.config/nvim/lua/plugins/trouble.lua index 7d74730..7d74730 100644 --- a/lua/plugins/trouble.lua +++ b/.config/nvim/lua/plugins/trouble.lua diff --git a/lua/plugins/web-devicons.lua b/.config/nvim/lua/plugins/web-devicons.lua index 06f2d1c..06f2d1c 100644 --- a/lua/plugins/web-devicons.lua +++ b/.config/nvim/lua/plugins/web-devicons.lua diff --git a/lua/plugins/which-key.lua b/.config/nvim/lua/plugins/which-key.lua index 10c0c41..10c0c41 100644 --- a/lua/plugins/which-key.lua +++ b/.config/nvim/lua/plugins/which-key.lua diff --git a/lua/plugins/zen-mode.lua b/.config/nvim/lua/plugins/zen-mode.lua index 7e52854..7e52854 100644 --- a/lua/plugins/zen-mode.lua +++ b/.config/nvim/lua/plugins/zen-mode.lua diff --git a/lua/user/keys.lua b/.config/nvim/lua/user/keys.lua index a6be1e5..a6be1e5 100644 --- a/lua/user/keys.lua +++ b/.config/nvim/lua/user/keys.lua diff --git a/lua/user/mods.lua b/.config/nvim/lua/user/mods.lua index 49027da..49027da 100644 --- a/lua/user/mods.lua +++ b/.config/nvim/lua/user/mods.lua diff --git a/lua/user/opts.lua b/.config/nvim/lua/user/opts.lua index cc8debc..cc8debc 100644 --- a/lua/user/opts.lua +++ b/.config/nvim/lua/user/opts.lua diff --git a/lua/user/pack.lua b/.config/nvim/lua/user/pack.lua index 1a37d28..1a37d28 100644 --- a/lua/user/pack.lua +++ b/.config/nvim/lua/user/pack.lua diff --git a/lua/user/view.lua b/.config/nvim/lua/user/view.lua index 837fce4..837fce4 100644 --- a/lua/user/view.lua +++ b/.config/nvim/lua/user/view.lua diff --git a/snippets/boilerplate.lua b/.config/nvim/snippets/boilerplate.lua index 04e973a..04e973a 100644 --- a/snippets/boilerplate.lua +++ b/.config/nvim/snippets/boilerplate.lua diff --git a/snippets/lua.lua b/.config/nvim/snippets/lua.lua index eb46b67..eb46b67 100644 --- a/snippets/lua.lua +++ b/.config/nvim/snippets/lua.lua diff --git a/snippets/markdown.lua b/.config/nvim/snippets/markdown.lua index d0d1487..d0d1487 100644 --- a/snippets/markdown.lua +++ b/.config/nvim/snippets/markdown.lua diff --git a/.config/picom/picom.conf b/.config/picom/picom.conf new file mode 100644 index 0000000..1e071ed --- /dev/null +++ b/.config/picom/picom.conf @@ -0,0 +1,488 @@ +################################# +# Animations # +################################# +# requires https://github.com/jonaburg/picom +# (These are also the default values) +transition-length = 300 +transition-pow-x = 0.1 +transition-pow-y = 0.1 +transition-pow-w = 0.1 +transition-pow-h = 0.1 +size-transition = true + + +################################# +# Corners # +################################# +# requires: https://github.com/sdhand/compton or https://github.com/jonaburg/picom +corner-radius = 10.0; +rounded-corners-exclude = [ +#"window_type = 'normal'", +# "class_g = 'Bspwm' && class_i = 'presel_feedback'", +# "class_g = 'URxvt'", +# "class_g = 'alacritty'", +# "class_g = 'Org.gnome.Nautilus'", +# "class_g = 'Nemo'", + "class_g = 'firefox'", +# "class_g = 'Rofi'", +# "class_g = 'Spotify'", +# "class_g = 'discord'", +# "class_g = 'Code'", +# "class_g = 'TelegramDesktop'", +# "class_g = 'YouTube Music'", + "class_g = 'Polybar'" +# "class_g = 'qutebrowser'", +# "class_g = 'Zathura'", +# "class_g = 'Pavucontrol'" + +]; +round-borders = 1; +#round-borders-exclude = [ +# "class_g = 'TelegramDesktop'", +#]; + + + +################################# +# Shadows # +################################# + + +# Enabled client-side shadows on windows. Note desktop windows +# (windows with '_NET_WM_WINDOW_TYPE_DESKTOP') never get shadow, +# unless explicitly requested using the wintypes option. +# +# shadow = false +shadow = true; + +# The blur radius for shadows, in pixels. (defaults to 12) +# shadow-radius = 12 +shadow-radius = 20; + +# The opacity of shadows. (0.0 - 1.0, defaults to 0.75) +# shadow-opacity = .75 + +# The left offset for shadows, in pixels. (defaults to -15) +# shadow-offset-x = -15 +shadow-offset-x = -5; + +# The top offset for shadows, in pixels. (defaults to -15) +# shadow-offset-y = -15 +shadow-offset-y = -5; + +# Avoid drawing shadows on dock/panel windows. This option is deprecated, +# you should use the *wintypes* option in your config file instead. +# +# no-dock-shadow = false + +# Don't draw shadows on drag-and-drop windows. This option is deprecated, +# you should use the *wintypes* option in your config file instead. +# +# no-dnd-shadow = false + +# Red color value of shadow (0.0 - 1.0, defaults to 0). +# shadow-red = 0 + +# Green color value of shadow (0.0 - 1.0, defaults to 0). +# shadow-green = 0 + +# Blue color value of shadow (0.0 - 1.0, defaults to 0). +# shadow-blue = 0 + +# Do not paint shadows on shaped windows. Note shaped windows +# here means windows setting its shape through X Shape extension. +# Those using ARGB background is beyond our control. +# Deprecated, use +# shadow-exclude = 'bounding_shaped' +# or +# shadow-exclude = 'bounding_shaped && !rounded_corners' +# instead. +# +# shadow-ignore-shaped = '' + +# Specify a list of conditions of windows that should have no shadow. +# +# examples: +# shadow-exclude = "n:e:Notification"; +# +# shadow-exclude = [] +shadow-exclude = [ + "name = 'Notification'", + "class_g = 'Conky'", + "class_g ?= 'Notify-osd'", + "class_g = 'Cairo-clock'", + "class_g = 'Polybar'", + # "class_g = 'Rofi'" + "_GTK_FRAME_EXTENTS@:c" + ]; + +# Specify a X geometry that describes the region in which shadow should not +# be painted in, such as a dock window region. Use +# shadow-exclude-reg = "x10+0+0" +# for example, if the 10 pixels on the bottom of the screen should not have shadows painted on. +# +# shadow-exclude-reg = "" + +# Crop shadow of a window fully on a particular Xinerama screen to the screen. +# xinerama-shadow-crop = false + + +################################# +# Fading # +################################# + + +# Fade windows in/out when opening/closing and when opacity changes, +# unless no-fading-openclose is used. +# fading = false +fading = true + +# Opacity change between steps while fading in. (0.01 - 1.0, defaults to 0.028) +# fade-in-step = 0.028 +fade-in-step = 0.08; + +# Opacity change between steps while fading out. (0.01 - 1.0, defaults to 0.03) +# fade-out-step = 0.03 +fade-out-step = 0.08; + +# The time between steps in fade step, in milliseconds. (> 0, defaults to 10) +# fade-delta = 10 + +# Specify a list of conditions of windows that should not be faded. +# fade-exclude = [] + +# Do not fade on window open/close. +# no-fading-openclose = false + +# Do not fade destroyed ARGB windows with WM frame. Workaround of bugs in Openbox, Fluxbox, etc. +# no-fading-destroyed-argb = false + + +################################# +# Transparency / Opacity # +################################# + +# Opacity of inactive windows. (0.1 - 1.0, defaults to 1.0) +# inactive-opacity = 1 +inactive-opacity = 1; + +# Opacity of window titlebars and borders. (0.1 - 1.0, disabled by default) +# frame-opacity = 1.0 +frame-opacity = 1; + +# Default opacity for dropdown menus and popup menus. (0.0 - 1.0, defaults to 1.0) +# menu-opacity = 1.0 + +# Let inactive opacity set by -i override the '_NET_WM_OPACITY' values of windows. +# inactive-opacity-override = true +inactive-opacity-override = false; + +# Default opacity for active windows. (0.0 - 1.0, defaults to 1.0) +active-opacity = 1.0; + +# Dim inactive windows. (0.0 - 1.0, defaults to 0.0) +inactive-dim = 0.2 + +# Specify a list of conditions of windows that should always be considered focused. +# focus-exclude = [] +focus-exclude = ["class_g = 'Plank'", "class_g = 'st'", "class_g = 'kitty'", "class_g = 'wezterm'", "class_g = 'Alacritty'", "class_g = 'firefox'"]; + +# Use fixed inactive dim value, instead of adjusting according to window opacity. +# inactive-dim-fixed = 1.0 + +# Specify a list of opacity rules, in the format `PERCENT:PATTERN`, +# like `50:name *= "Firefox"`. picom-trans is recommended over this. +# Note we don't make any guarantee about possible conflicts with other +# programs that set '_NET_WM_WINDOW_OPACITY' on frame or client windows. +# example: +# opacity-rule = [ "80:class_g = 'URxvt'" ]; +opacity-rule = ["80:class_g = 'betterlockscreen'", "80:class_g = 'URxvt'", "100:class_g = 'firefox'", "100:class_g = 'Zathura'", "80:class_g = 'Spotify'", "80:class_g *?= 'Rofi'", "100:class_g = 'kitty' && focused", "100:class_g = 'kitty' && !focused", "100:class_g = 'Alacritty' && focused", "100:class_g = 'Alacritty' && !focused", "100:class_g = 'wezterm' && focused", "100:class_g = 'wezterm' && !focused"]; +# +#opacity-rule = ["85:class_g ?= 'Alacritty' && focused"]; + +#blur-background-exclude = ["class_g = 'scratchpad'"]; + +################################# +# Background-Blurring # +################################# + + +# Parameters for background blurring, see the *BLUR* section for more information. +blur-method = "dual_kawase"; +#blur-method = "gaussian"; +blur-strength = 6; +# blur-size = 12 +# +# blur-deviation = false + +# Blur background of semi-transparent / ARGB windows. +# Bad in performance, with driver-dependent behavior. +# The name of the switch may change without prior notifications. +# +blur-background = false; + +# Blur background of windows when the window frame is not opaque. +# Implies: +# blur-background +# Bad in performance, with driver-dependent behavior. The name may change. +# +# blur-background-frame = false + + +# Use fixed blur strength rather than adjusting according to window opacity. +#blur-background-fixed = false + + +# Specify the blur convolution kernel, with the following format: +# example: +# blur-kern = "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"; +# +# blur-kern = '' +#blur-kern = "3x3box"; +blur-kern = "7x7box"; + +# Exclude conditions for background blur. +# blur-background-exclude = [] +blur-background-exclude = [ + "window_type = 'dock'", + "window_type = 'desktop'", + "_GTK_FRAME_EXTENTS@:c", + "class_g = 'kitty'", + "class_g = 'Alacritty'", + "class_g = 'wezterm'", +# "class_g = 'Polybar'", + "class_g = 'URxvt'", + "class_g = 'scratchpad'", + "class_g = 'Heads-Up-Display'", + "class_g = 'Firefox'", + "class_g = 'firefox'", + "class_g = 'discord'", + "class_g = 'Rofi'", + "class_g = 'Zathura'" +]; + +################################# +# General Settings # +################################# + +# Daemonize process. Fork to background after initialization. Causes issues with certain (badly-written) drivers. +# daemon = false + +# Specify the backend to use: `xrender`, `glx`, or `xr_glx_hybrid`. +# `xrender` is the default one. +# +experimental-backends = true; +#backend = 'glx' +backend = "glx"; +#backend = "xrender"; + +# Enable/disable VSync. +# vsync = false +vsync = true + +# Enable remote control via D-Bus. See the *D-BUS API* section below for more details. +# dbus = false + +# Try to detect WM windows (a non-override-redirect window with no +# child that has 'WM_STATE') and mark them as active. +# +# mark-wmwin-focused = false +mark-wmwin-focused = true; + +# Mark override-redirect windows that doesn't have a child window with 'WM_STATE' focused. +mark-ovredir-focused = false; +#mark-ovredir-focused = true; + +# Try to detect windows with rounded corners and don't consider them +# shaped windows. The accuracy is not very high, unfortunately. +# +# detect-rounded-corners = false +detect-rounded-corners = true; + +# Detect '_NET_WM_OPACITY' on client windows, useful for window managers +# not passing '_NET_WM_OPACITY' of client windows to frame windows. +# +# detect-client-opacity = false +detect-client-opacity = true; + +# Specify refresh rate of the screen. If not specified or 0, picom will +# try detecting this with X RandR extension. +# +# refresh-rate = 60 +refresh-rate = 0 + +# Limit picom to repaint at most once every 1 / 'refresh_rate' second to +# boost performance. This should not be used with +# vsync drm/opengl/opengl-oml +# as they essentially does sw-opti's job already, +# unless you wish to specify a lower refresh rate than the actual value. +# +# sw-opti = + +# Use EWMH '_NET_ACTIVE_WINDOW' to determine currently focused window, +# rather than listening to 'FocusIn'/'FocusOut' event. Might have more accuracy, +# provided that the WM supports it. +# +# use-ewmh-active-win = false + +# Unredirect all windows if a full-screen opaque window is detected, +# to maximize performance for full-screen windows. Known to cause flickering +# when redirecting/unredirecting windows. +# +# unredir-if-possible = false + +# Delay before unredirecting the window, in milliseconds. Defaults to 0. +# unredir-if-possible-delay = 0 + +# Conditions of windows that shouldn't be considered full-screen for unredirecting screen. +# unredir-if-possible-exclude = [] + +# Use 'WM_TRANSIENT_FOR' to group windows, and consider windows +# in the same group focused at the same time. +# +# detect-transient = false +detect-transient = true + +# Use 'WM_CLIENT_LEADER' to group windows, and consider windows in the same +# group focused at the same time. 'WM_TRANSIENT_FOR' has higher priority if +# detect-transient is enabled, too. +# +# detect-client-leader = false +detect-client-leader = true + +# Resize damaged region by a specific number of pixels. +# A positive value enlarges it while a negative one shrinks it. +# If the value is positive, those additional pixels will not be actually painted +# to screen, only used in blur calculation, and such. (Due to technical limitations, +# with use-damage, those pixels will still be incorrectly painted to screen.) +# Primarily used to fix the line corruption issues of blur, +# in which case you should use the blur radius value here +# (e.g. with a 3x3 kernel, you should use `--resize-damage 1`, +# with a 5x5 one you use `--resize-damage 2`, and so on). +# May or may not work with *--glx-no-stencil*. Shrinking doesn't function correctly. +# +# resize-damage = 1 + +# Specify a list of conditions of windows that should be painted with inverted color. +# Resource-hogging, and is not well tested. +# +# invert-color-include = [] + +# GLX backend: Avoid using stencil buffer, useful if you don't have a stencil buffer. +# Might cause incorrect opacity when rendering transparent content (but never +# practically happened) and may not work with blur-background. +# My tests show a 15% performance boost. Recommended. +# +# glx-no-stencil = false + +# GLX backend: Avoid rebinding pixmap on window damage. +# Probably could improve performance on rapid window content changes, +# but is known to break things on some drivers (LLVMpipe, xf86-video-intel, etc.). +# Recommended if it works. +# +# glx-no-rebind-pixmap = false + +# Disable the use of damage information. +# This cause the whole screen to be redrawn everytime, instead of the part of the screen +# has actually changed. Potentially degrades the performance, but might fix some artifacts. +# The opposing option is use-damage +# +# no-use-damage = false +use-damage = true + +# Use X Sync fence to sync clients' draw calls, to make sure all draw +# calls are finished before picom starts drawing. Needed on nvidia-drivers +# with GLX backend for some users. +# +# xrender-sync-fence = false + +# GLX backend: Use specified GLSL fragment shader for rendering window contents. +# See `compton-default-fshader-win.glsl` and `compton-fake-transparency-fshader-win.glsl` +# in the source tree for examples. +# +# glx-fshader-win = '' + +# Force all windows to be painted with blending. Useful if you +# have a glx-fshader-win that could turn opaque pixels transparent. +# +# force-win-blend = false + +# Do not use EWMH to detect fullscreen windows. +# Reverts to checking if a window is fullscreen based only on its size and coordinates. +# +# no-ewmh-fullscreen = false + +# Dimming bright windows so their brightness doesn't exceed this set value. +# Brightness of a window is estimated by averaging all pixels in the window, +# so this could comes with a performance hit. +# Setting this to 1.0 disables this behaviour. Requires --use-damage to be disabled. (default: 1.0) +# +# max-brightness = 1.0 + +# Make transparent windows clip other windows like non-transparent windows do, +# instead of blending on top of them. +# +# transparent-clipping = false + +# Set the log level. Possible values are: +# "trace", "debug", "info", "warn", "error" +# in increasing level of importance. Case doesn't matter. +# If using the "TRACE" log level, it's better to log into a file +# using *--log-file*, since it can generate a huge stream of logs. +# +# log-level = "debug" +log-level = "warn"; + +# Set the log file. +# If *--log-file* is never specified, logs will be written to stderr. +# Otherwise, logs will to written to the given file, though some of the early +# logs might still be written to the stderr. +# When setting this option from the config file, it is recommended to use an absolute path. +# +# log-file = '/path/to/your/log/file' + +# Show all X errors (for debugging) +# show-all-xerrors = false + +# Write process ID to a file. +# write-pid-path = '/path/to/your/log/file' + +# Window type settings +# +# 'WINDOW_TYPE' is one of the 15 window types defined in EWMH standard: +# "unknown", "desktop", "dock", "toolbar", "menu", "utility", +# "splash", "dialog", "normal", "dropdown_menu", "popup_menu", +# "tooltip", "notification", "combo", and "dnd". +# +# Following per window-type options are available: :: +# +# fade, shadow::: +# Controls window-type-specific shadow and fade settings. +# +# opacity::: +# Controls default opacity of the window type. +# +# focus::: +# Controls whether the window of this type is to be always considered focused. +# (By default, all window types except "normal" and "dialog" has this on.) +# +# full-shadow::: +# Controls whether shadow is drawn under the parts of the window that you +# normally won't be able to see. Useful when the window has parts of it +# transparent, and you want shadows in those areas. +# +# redir-ignore::: +# Controls whether this type of windows should cause screen to become +# redirected again after been unredirected. If you have unredir-if-possible +# set, and doesn't want certain window to cause unnecessary screen redirection, +# you can set this to `true`. +# +wintypes: +{ + tooltip = { fade = true; shadow = true; opacity = 0.75; focus = true; full-shadow = false; }; + dock = { shadow = false; } + dnd = { shadow = false; } + popup_menu = { opacity = 0.8; } + dropdown_menu = { opacity = 0.8; } +}; + diff --git a/.config/polybar/config b/.config/polybar/config new file mode 100644 index 0000000..5991386 --- /dev/null +++ b/.config/polybar/config @@ -0,0 +1,816 @@ +;========================================================== +; +; +; ██████╗ ██████╗ ██╗ ██╗ ██╗██████╗ █████╗ ██████╗ +; ██╔══██╗██╔═══██╗██║ ╚██╗ ██╔╝██╔══██╗██╔══██╗██╔══██╗ +; ██████╔╝██║ ██║██║ ╚████╔╝ ██████╔╝███████║██████╔╝ +; ██╔═══╝ ██║ ██║██║ ╚██╔╝ ██╔══██╗██╔══██║██╔══██╗ +; ██║ ╚██████╔╝███████╗██║ ██████╔╝██║ ██║██║ ██║ +; ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ +; +; +; To learn more about how to configure Polybar +; go to https://github.com/polybar/polybar +; +; The README contains a lot of information +; +;========================================================== + +[colors] +background = #aa000000 +;background = #aa101212 +;background = #00000000 +background-alt = #aaCECCC9 +;foreground = #aaCECCC9 +foreground = #fafafa +foreground-alt = #aaCECCC9 +primary = #aaCECCC9 +secondary = #aaCECCC9 +alert = #aaCECCC9 +non = #aaCECCC9 +;background = #aa000000 +blue = #61afef +dark_blue = #42A5F5 +nord = #81a1c1 +light_blue = #ADD8E6 +;green = #a0c980 +purple = #c882e7 +orange = #E57C46 +;orange = #d08770 +gray = #676E95 +red = #EC7875 +pink = #EC407A +yellow = #FDD835 +;yellow = #ECBE7B +amber = #FBC02D +indigo = #6C77BB +green = #61C766 +lime = #B9C244 +cyber = #53E2AE + +[bar/top] +;width = 100% +width = 99.15% +height = 24 +offset-x = 0.5% +offset-y = 0.5% +radius = 10.0 +;radius = 0 +fixed-center = true +bottom = false +enable-ipc = true +tray-position = right +tray-padding = 4 +tray-background = ${colors.background} +;tray-offest-x = -15 +;tray-offset-x = 400 +;tray-offset-x = -95 +;tray-offset-x = -208 +;tray-offset-x = -178 +;tray-offset-x = -183 +tray-offset-x = -188 +;tray-offset-x = -210 +tray-offset-y = -0.9 +tray-detached = true + +background = ${colors.background} +foreground = ${colors.foreground} + +line-size = 0 +line-color = ${colors.background-alt} + +;border-top-size = 1 +;border-bottom-size = 1 +;border-right-size = 1 +;border-left-size = 1 +;border-color = ${colors.foreground} +;border-size = 2 +;border-color = ${colors.background} + +padding-left = 0 +padding-right = 0 + +module-margin-left = 0 +module-margin-right = 0 +; Font for date +font-0 = "SF Pro Mono:style=Display Bold:size=10;2" +; Font for crypto, dunst +font-1 = "Material Design Icons:style=Bold:size=11.5;2" +; Font for menu +font-2 = "Material Design Icons:style=Bold:size=13.5;2" +; Font for controlCenter +font-3 = "SF Pro:style=Medium:size=10.5;2" +; Font for search +font-4 = "SF Pro:style=Medium:size=9.5;2" +; Font for bspwm/workspaces +font-5 = "UbuntuMono Nerd font:size=11;2" + +modules-left = sep menu sep close sep minimize sep maximize sep +modules-center = bspwm +modules-right = spotify spotify-prev spotify-play-pause spotify-next long-sep dunst search control date sep + +;modules-left = sep menu +;modules-center = date +;modules-right = bspwm whitespace crypto dunst search control space + +;modules-right = crypto dunst search date sep powermenu sep +;modules-right = crypto toggle_spotify volume backlight battery network notification powermenu + +wm-restack = bspwm +;wm-restack = bspwm + +override-redirect = true + +;; scroll-up = bspwm-desknext +;; scroll-down = bspwm-deskprev + +;scroll-up = i3wm-wsnext +;scroll-down = i3wm-wsprev + +cursor-click = pointer +cursor-scroll = ns-resize + +[module/menu] +type = custom/text +content = +content-font = 3 +content-padding = 1 +content-foreground = ${colors.foreground} +click-left = ~/.config/polybar/scripts/menu.sh +click-right = ~/.config/polybar/scripts/menu_full.sh + +[module/bspwm] +type = internal/bspwm +format = <label-state> +;format = <label-state> <label-mode> +format-padding = 0 +;format-padding-right = 2 +format-foreground = ${colors.foreground} +index-sort = true +enable-click = true +reverse-scroll = true +#reverse-scroll = false + +label-focused = +label-focused-padding = 2 + +label-occupied = +label-occupied-padding = 2 + +label-empty = +label-empty-padding = 2 + + +[module/sepp] +type = custom/text +content = " " + + +[module/close] +type = custom/text +content-foreground = ${colors.red} +content-padding = 1 +content = +click-left = "xdotool getwindowfocus windowkill" + +[module/minimize] +type = custom/text +content-foreground = ${colors.yellow} +content-padding = 1 +content = +click-left = bspc node -g hidden +click-right = ${HOME}/.config/bspwm/bspcmd unhide + +;label = +[module/maximize] +type = custom/text +content-foreground = ${colors.green} +content-padding = 1 +content = +;click-left = bspc node -t {fullscreen} +click-left = bspc node -t ~floating +click-right = bspc desktop -l next +#bspc node -t \~{fullscreen}; + +[module/blur-toggle] +type = custom/ipc +hook-0 = echo +hook-1 = echo +click-left = ~/.scripts/blurtoggle.sh +initial = 1 +format-foreground = ${colors.foreground} + + +[module/battery] +type = internal/battery +full-t = 99 +time-format = %H:%M +battery = BAT1 +adapter = ACAD +format-padding = 1 +format-charging = <animation-charging> <label-charging> +format-charging-background = +label-charging = %percentage%% +format-discharging = <ramp-capacity> <label-discharging> +format-discharging-background = +label-discharging = %percentage%% +format-full = <label-full> +format-full-prefix = " " +format-full-prefix-foreground = ${colors.green} +;format-foreground = ${colors.green} +ramp-capacity-0 = +ramp-capacity-1 = +ramp-capacity-2 = +ramp-capacity-3 = +ramp-capacity-4 = +ramp-capacity-5 = +ramp-capacity-6 = +ramp-capacity-7 = +ramp-capacity-8 = +ramp-capacity-9 = + +ramp-capacity-0-foreground = ${colors.red} +ramp-capacity-1-foreground = ${colors.red} +ramp-capacity-foreground = ${colors.green} +;ramp-capacity-foreground = ${colors.foreground} +bar-capacity-width = 10 + +animation-charging-0 = +animation-charging-1 = +animation-charging-2 = +animation-charging-3 = +animation-charging-4 = +animation-charging-5 = +animation-charging-6 = +animation-charging-foreground = ${colors.green} + +animation-charging-framerate = 750 + +[module/xbacklight] +type = internal/xbacklight +enable-scroll = true + +[module/backlight] +inherit = module/xbacklight +type = internal/backlight +card = intel_backlight +format-backlight = <ramp-backlight> <label> +format-padding = 1 +format-prefix = " " +format-prefix-foreground = ${colors.indigo} +label = %percentage%% +label-foreground = ${colors.foreground} + +[module/bluetooth] +type = custom/script +exec = ~/.config/polybar/scripts/bluetooth.sh +tail = true +click-left = exec blueberry & +click-right = exec $HOME/.config/polybar/scripts/toggle_bluetooth.sh + +[module/network] +type = custom/script +exec = ~/.config/polybar/scripts/check-network.sh +format-background = +format-foreground = ${colors.light_blue} +click-left = networkmanager_dmenu & +click-right = nm-applet +tail = true +format-padding = 1 + + +;[module/date] +;type = internal/date +;interval = 30 +;label = %time% +;label-padding = 2 +;label-background = +;time = %H:%M +;time-alt = %Y-%m-%d + +[module/date] +type = internal/date +interval = 1 +label = %date%, %time% +label-padding = 2.5 +label-background = +date = %a %d %b +time = %H:%M + +;[module/powermenu] +;type = custom/text +;content = +;;content = 襤 +;content-foreground = ${colors.red} +;content-padding = 1 +;label-margin = 3 +;click-left = ~/.config/polybar/scripts/sysmenu.sh +;click-right = ~/.config/polybar/scripts/sysmenu.sh + +[module/control] +type = custom/text +content = +;content = 襤 +content-foreground = ${colors.foreground} +content-padding = 1 +label-margin = 10 +click-left = ~/.config/polybar/scripts/sysmenu.sh +click-right = ~/.config/polybar/scripts/sysmenu.sh + + +;[module/title] +;type = internal/xwindow +;; Available tags: +;; <label> (default) +;format = <label> +;format-background = ${colors.background} +;format-foreground = ${colors.foreground} +;format-padding = 1 +;label-maxlen = 10 +;label-empty = " " + + +;[module/bspwm] +;type = internal/bspwm +;format = <label-state> +;;format = <label-state> <label-mode> +;format-padding = 1 +;format-foreground = ${colors.foreground} +;index-sort = true +;enable-click = true +;reverse-scroll = true +;#reverse-scroll = false +; +;label-focused = +;label-focused-padding = 2 +; +;label-occupied = +;label-occupied-padding = 2 +; +;label-empty = +;label-empty-padding = 2 +; +;label-monocle = " " +;label-tiled = " " +;label-fullscreen = " " +;label-floating = " " +;label-pseudotiled = " " +;label-locked = " " +;;label-sticky = " " +;label-private = " " + +; Separator in between workspaces +;label-separator = | +;label-separator-padding = 10 +;label-separator-foreground = #ffb52a +[module/search] +type = custom/text +content = "" +; hack nerd +content-padding = 1 +content-font = 5 +;content-padding-right = 5 +content-foreground = ${colors.foreground} +click-left = rofi -show drun +;click-left = ~/.config/polybar/scripts/menu.sh + + + +[module/crypto] +type = custom/script +exec = echo +format = <label> +format-padding = 1 +label-padding = +content-background = +format-foreground = ${colors.foreground} +interval = 60 +click-left = cryptonotify +click-right = $TERMINAL -e cointop & + +[module/now-playing] +type = custom/script +tail = true +;format-prefix = "" +format = <label> +exec = ~/.config/polybar/scripts/now-playing.sh +click-right = "kill -USR1 $(pgrep --oldest --parent %pid%)" + + +[module/sep] +type = custom/text +content = " " + +[module/long-sep] +type = custom/text +content = " " + +[module/space] +type = custom/text +content = " " + +[module/whitespace] +type = custom/text +content = " " + +[module/xwindow] +type = internal/xwindow +label = %title:0:60:...% +format-foreground = ${colors.foreground} +format-padding = 6 + +[module/arch] +typ = custom/text +content = " " +format-foreground = ${colors.foreground} +format-padding = 4 + + + +[module/workspaces] +type = internal/xworkspaces +pin-workspaces = true +enable-click = true +enable-scroll = true +format-padding = 1 + +icon-default = + +format = <label-state> +format-background = ${colors.bg1} +label-active = " " +label-occupied = " " +label-urgent = " " +label-empty = " " + +label-empty-padding = 1 +label-active-padding = 1 +label-urgent-padding = 1 +label-occupied-padding = 1 + +label-empty-foreground = ${colors.foreground} +label-active-foreground = ${colors.acolor} +label-urgent-foreground = ${colors.curgent} +label-occupied-foreground = ${colors.foreground} + +[module/spotify] +type = custom/script +tail = true +interval = 1 +; prefix symbol is shown before the text +format-prefix = "" +format = <label> +exec = ~/.config/polybar/scripts/scroll_spotify_status.sh + +[module/spotify-prev] +type = custom/script +tail = true +interval = 1 +exec = echo " " +format = <label> +click-left = playerctl previous -p spotify + +[module/spotify-play-pause] +type = custom/ipc +tail = true +interval = 1 +hook-0 = echo "" +hook-1 = echo "" +initial = 1 +click-left = playerctl play-pause -p spotify + +[module/spotify-next] +type = custom/script +#type = custom/ipc +tail = true +interval = 1 +exec = echo " " +format = <label> +click-left = playerctl next -p spotify + +[module/toggle_spotify] +type = custom/text +content = " " +content-padding = 1 +content-foreground = ${colors.pink} +click-left = spotify +click-right = spotify + +[module/cmus] +type = custom/script + +exec = ~/.config/polybar/scripts/cmus.sh +exec-if = pgrep -x cmus +interval = 1 + +click-left = cmus-remote --next +click-right = cmus-remote --prev +click-middle = cmus-remote --pause +scroll-up = cmus-remote --volume +5% +scroll-down = cmus-remote --volume -5% + +label-font = 1 +format = <label> +format-underline = ${colors.foreground-alt} +label = %output% +label-maxlen = 50 + +[module/notification] +type = custom/text +content = +content-padding = 0 +content-foreground = ${colors.foreground-alt} +click-left = sh rofi_notif_center.sh +click-right = sh rofi_notif_center.sh + +[module/dunst] +type = custom/text +content-foreground = ${colors.foreground} +content-padding = 1 +content = +click-left = "dunstctl history-pop" + +[module/popup-calendar] +type = custom/script +exec = ~/.config/polybar/scripts/popup-calendar.sh +interval = 5 +click-left = ~/.config/polybar/scripts/popup-calendar.sh --popup & + +;[module/dunst] +;type = custom/ipc +;initial = 1 +;format-foreground = ${colors.foreground} +;hook-0 = echo "%{A1:notify-send dunstctl && polybar-msg hook dunst 2:}%{A}" & +;hook-1 = echo "%{A1:notify-send dunstctl && polybar-msg hook dunst 1:}%{A}" & + +[module/eww] +type = custom/text +content = +content-padding = 0 +content-foreground = #d8dee9 +click-left = sh toggle_eww.sh +click-right = sh toggle_eww.sh + +[module/pulseaudio] +type = internal/pulseaudio +ramp-volume-foreground = #8959a8 +format-volume-padding = 0 +format-volume-margin = 0 +format-volume = <ramp-volume> +use-ui-max = true +interval = 5 + +ramp-volume-0 = " " +ramp-volume-1 = " " +ramp-volume-2 = " " + + +label-muted = +label-muted-background = #3e999f +format-muted-foreground = #3e999f +format-muted-overline = #3e999f +format-muted-margin = 2 +format-muted-padding = 2 + +[module/volume] +type = internal/pulseaudio +format-volume = <ramp-volume> <label-volume> +format-volume-font = 10 +format-volume-padding = 0 +;ramp-volume-foreground = ${colors.foreground} +label-volume = %percentage%% +label-volume-padding = 0 +;label-muted-foreground = ${colors.foreground} +;format-volume-foreground = ${colors.purple} +format-muted-foreground = ${colors.red} +format-muted-underline = ${colors.red} +ramp-volume-foreground = ${colors.purple} +label-muted = "婢 " +ramp-volume-0 = "" +ramp-volume-1 = "" +ramp-volume-2 = "" +ramp-volume-3 = "" +ramp-volume-4 = "" +ramp-volume-5 = "" +ramp-volume-6 = "" + + +[module/xkeyboard] +type = internal/xkeyboard +blacklist-0 = num lock + +format-prefix = +format-foreground = ${colors.foreground-alt} +label-layout = " %layout%" + +label-indicator-foreground = ${colors.alert} +label-indicator-padding = 2 + +[module/filesystem] +type = internal/fs +interval = 25 + +mount-0 = / + +format-mounted = <label-mounted> +format-mounted-foreground = #b48ead +format-mounted-prefix = " " +label-mounted = " %free%" + +format-unmounted = <label-unmounted> +format-unmounted-prefix = +label-unmounted = %mountpoint%: not mounted + +[module/updates] +type = custom/script +exec = xbps-updates +format = <label> +interval = 4600 +label = %output% +label-padding = 2 +label-foreground = #81A1C1 + + +[module/cpu] +type = internal/cpu +interval = 2 +format-prefix = " " +format-prefix-foreground = #b48ead +label = %percentage:2%% + + +[module/memory] +type = internal/memory +interval = 2 +format-prefix = " " +format-prefix-foreground = #5e81ac +label = %percentage_used%% + +[module/globalmenu] +type = custom/script +exec = ~/.config/polybar/globalmenu.sh +format = <label> +label = %output% +;type = custom/ipc +;hook-0 = xfce4-panel | sed -e 's/^"//' -e 's/"$//' +;;exec = awk /usr/bin/xfce4-panel +;initial = 1 +;format-underline = ${colors.cyber} +;format-padding = 1 + +[module/global] +type = custom/script +exec = ~/.config/polybar/globaldmenu +label = %output% + +[settings] +screenchange-reload = true +;compositing-background = xor +;compositing-background = screen +;compositing-foreground = source +;compositing-border = over +;pseudo-transparency = false + +[global/wm] +margin-top = 0 +margin-bottom = 0 + +[module/options_open] +type = custom/text +content-foreground = ${colors.foreground} +content = "" +click-left = ~/.config/polybar/scripts/polybar_wrapper options + +[module/options_close] +type = custom/text +content-foreground = ${colors.primary} +content = "" +click-left = ~/.config/polybar/scripts/polybar_wrapper options + +;[bar/bottom] +;width = 8% +;height = 15 +;offset-x = 46% +;;offset-x = 35% +;;offset-x = 0.5% +;offset-y = 2.5% +;radius = 7.0 +;fixed-center = true +;bottom = false +;enable-ipc = true +;;tray-offset-x = 515 +;;tray-detached = true +; +;background = ${colors.background} +;foreground = ${colors.foreground} +; +;line-size = 0 +;line-color = ${colors.background-alt} +; +;;border-top-size = 1 +;;border-bottom-size = 1 +;;border-right-size = 1 +;;border-left-size = 1 +;;border-color = ${colors.foreground} +;;border-size = 2 +;;border-color = ${colors.background} +; +;padding-left = 0 +;padding-right = 0 +; +;module-margin-left = 0 +;module-margin-right = 0 +;; Font for date +;font-0 = "SF Pro Mono:style=Display Bold:size=10;2" +;; Font for bspwm/workspaces +;font-1 = "UbuntuMono Nerd font:size=10.5;2" +;; Font for crypto, dunst +;font-2 = "Material Design Icons:style=Bold:size=11;3" +;; Font for menu +;font-3 = "Material Design Icons:style=Bold:size=14;5" +;; Font for search and controlCenter +;font-4 = "SF Pro:style=Medium:size=10.5;3" +; +;modules-center = bspwm sepp +; +;;wm-restack = bspwm +; +;override-redirect = true +; +;;; scroll-up = bspwm-desknext +;;; scroll-down = bspwm-deskprev +; +;;scroll-up = i3wm-wsnext +;;scroll-down = i3wm-wsprev +; +;cursor-click = pointer +;cursor-scroll = ns-resize +; +; +;[bar/left] +;width = 5% +;height = 15 +;offset-x = 2.5% +;;offset-x = 35% +;;offset-x = 0.5% +;offset-y = 2.5% +;radius = 7.0 +;fixed-center = true +;bottom = false +;enable-ipc = true +;;tray-offset-x = 515 +;;tray-detached = true +; +;background = ${colors.background} +;foreground = ${colors.foreground} +; +;line-size = 0 +;line-color = ${colors.background-alt} +; +;;border-top-size = 1 +;;border-bottom-size = 1 +;;border-right-size = 1 +;;border-left-size = 1 +;;border-color = ${colors.foreground} +;;border-size = 2 +;;border-color = ${colors.background} +; +;padding-left = 0 +;padding-right = 0 +; +;module-margin-left = 0 +;module-margin-right = 0 +;; Font for date +;font-0 = "SF Pro Mono:style=Display Bold:size=10;2" +;; Font for bspwm/workspaces +;font-1 = "UbuntuMono Nerd font:size=11.5;2" +;; Font for crypto, dunst +;font-2 = "Material Design Icons:style=Bold:size=11;3" +;; Font for menu +;font-3 = "Material Design Icons:style=Bold:size=14;5" +;; Font for search and controlCenter +;font-4 = "SF Pro:style=Medium:size=10.5;3" +; +;modules-left = close blank minimize blank maximize blank +; +;;wm-restack = bspwm +; +;override-redirect = true +; +;;; scroll-up = bspwm-desknext +;;; scroll-down = bspwm-deskprev +; +;;scroll-up = i3wm-wsnext +;;scroll-down = i3wm-wsprev +; +;cursor-click = pointer +;cursor-scroll = ns-resize +; +;;[module/decorations] +;;type = custom/text +; +;[module/blank] +;type = custom/text +;content = " " + +; vim:ft=dosini diff --git a/.config/polybar/launch.sh b/.config/polybar/launch.sh new file mode 100755 index 0000000..1c0ac10 --- /dev/null +++ b/.config/polybar/launch.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env sh + +# Terminate already running bar instances +killall -q polybar + +# Wait until the processes have been shut down +while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done + +# Launch bar +polybar top & +#polybar bottom & +#polybar left & +#polybar top_external & + +#sleep 5 && xdo raise -N "polybar-bottom_LVDS-1" & +if [[ $(xrandr -q | grep 'HDMI-1 connected') ]]: then + polybar top_external & +fi diff --git a/.config/polybar/scripts/bluetooth.sh b/.config/polybar/scripts/bluetooth.sh new file mode 100755 index 0000000..061604b --- /dev/null +++ b/.config/polybar/scripts/bluetooth.sh @@ -0,0 +1,12 @@ +#!/bin/sh +if [ $(bluetoothctl show | grep "Powered: yes" | wc -c) -eq 0 ] +then + echo "" +else + if [ $(echo info | bluetoothctl | grep 'Device' | wc -c) -eq 0 ] + then + echo "" + fi + echo "" +fi + diff --git a/.config/polybar/scripts/check-network.sh b/.config/polybar/scripts/check-network.sh new file mode 100755 index 0000000..dabe74c --- /dev/null +++ b/.config/polybar/scripts/check-network.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +count=0 +disconnected="睊" +wireless_connected="直" +ethernet_connected="泌" + +ID="$(ip link | awk '/state UP/ {print $2}')" + +while true; do + if (ping -c 1 archlinux.org || ping -c 1 google.com || ping -c 1 bitbucket.org || ping -c 1 github.com || ping -c 1 sourceforge.net) &>/dev/null; then + if [[ $ID == e* ]]; then + echo "$ethernet_connected" ; sleep 25 + else + echo "$wireless_connected" ; sleep 25 + fi + else + echo "$disconnected" ; sleep 0.5 + fi +done + diff --git a/.config/polybar/scripts/check_updates.sh b/.config/polybar/scripts/check_updates.sh new file mode 100755 index 0000000..52e51a9 --- /dev/null +++ b/.config/polybar/scripts/check_updates.sh @@ -0,0 +1,118 @@ + +#!/usr/bin/bash +# +# checkupdates: Safely print a list of pending updates. +# +# Copyright (c) 2013 Kyle Keen <keenerd@gmail.com> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +declare -r myname='checkupdates' +declare -r myver='1.0.0' + +plain() { + (( QUIET )) && return + local mesg=$1; shift + printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&1 +} + +msg() { + (( QUIET )) && return + local mesg=$1; shift + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&1 +} + +msg2() { + (( QUIET )) && return + local mesg=$1; shift + printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&1 +} + +ask() { + local mesg=$1; shift + printf "${BLUE}::${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}" "$@" >&1 +} + +warning() { + local mesg=$1; shift + printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +error() { + local mesg=$1; shift + printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +# check if messages are to be printed using color +unset ALL_OFF BOLD BLUE GREEN RED YELLOW +if [[ -t 2 && ! $USE_COLOR = "n" ]]; then + # prefer terminal safe colored and bold text when tput is supported + if tput setaf 0 &>/dev/null; then + ALL_OFF="$(tput sgr0)" + BOLD="$(tput bold)" + BLUE="${BOLD}$(tput setaf 4)" + GREEN="${BOLD}$(tput setaf 2)" + RED="${BOLD}$(tput setaf 1)" + YELLOW="${BOLD}$(tput setaf 3)" + else + ALL_OFF="\e[1;0m" + BOLD="\e[1;1m" + BLUE="${BOLD}\e[1;34m" + GREEN="${BOLD}\e[1;32m" + RED="${BOLD}\e[1;31m" + YELLOW="${BOLD}\e[1;33m" + fi +fi +readonly ALL_OFF BOLD BLUE GREEN RED YELLOW + + +if (( $# > 0 )); then + echo "${myname} v${myver}" + echo + echo "Safely print a list of pending updates" + echo + echo "Usage: ${myname}" + echo + echo 'Note: Export the "CHECKUPDATES_DB" variable to change the path of the temporary database.' + exit 0 +fi + +if ! type -P fakeroot >/dev/null; then + error 'Cannot find the fakeroot binary.' + exit 1 +fi + +if [[ -z $CHECKUPDATES_DB ]]; then + CHECKUPDATES_DB="${TMPDIR:-/tmp}/checkup-db-${USER}/" +fi + +trap 'rm -f $CHECKUPDATES_DB/db.lck' INT TERM EXIT + +DBPath="$(pacman-conf DBPath)" +if [[ -z "$DBPath" ]] || [[ ! -d "$DBPath" ]]; then + DBPath="/var/lib/pacman/" +fi + +mkdir -p "$CHECKUPDATES_DB" +ln -s "${DBPath}/local" "$CHECKUPDATES_DB" &> /dev/null +if ! fakeroot -- pacman -Sy --dbpath "$CHECKUPDATES_DB" --logfile /dev/null &> /dev/null; then + error 'Cannot fetch updates' + exit 1 +fi +pacman -Qu --dbpath "$CHECKUPDATES_DB" 2> /dev/null | grep -v '\[.*\]' + +exit 0 + +# vim: set noet: diff --git a/.config/polybar/scripts/cmus.sh b/.config/polybar/scripts/cmus.sh new file mode 100755 index 0000000..2f42c63 --- /dev/null +++ b/.config/polybar/scripts/cmus.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +prepend_zero () { + seq -f "%02g" $1 $1 +} + +artist=$(echo -n $(cmus-remote -C status | grep "tag artist" | cut -c 12-)) + +if [[ $artist = *[!\ ]* ]]; then + song=$(echo -n $(cmus-remote -C status | grep title | cut -c 11-)) + position=$(cmus-remote -C status | grep position | cut -c 10-) + minutes1=$(prepend_zero $(($position / 60))) + seconds1=$(prepend_zero $(($position % 60))) + duration=$(cmus-remote -C status | grep duration | cut -c 10-) + minutes2=$(prepend_zero $(($duration / 60))) + seconds2=$(prepend_zero $(($duration % 60))) + echo -n "$artist - $song " +else + echo +fi + +#prepend_zero () { +# seq -f "%02g" $1 $1 +#} +# +#artist=$(echo -n $(cmus-remote -C status | grep "tag artist" | cut -c 12-)) +# +#if [[ $artist = *[!\ ]* ]]; then +# song=$(echo -n $(cmus-remote -C status | grep title | cut -c 11-)) +# position=$(cmus-remote -C status | grep position | cut -c 10-) +# minutes1=$(prepend_zero $(($position / 60))) +# seconds1=$(prepend_zero $(($position % 60))) +# duration=$(cmus-remote -C status | grep duration | cut -c 10-) +# minutes2=$(prepend_zero $(($duration / 60))) +# seconds2=$(prepend_zero $(($duration % 60))) +# echo -n "$artist - $song [$minutes1:$seconds1/$minutes2:$seconds2]" +#else +# echo +#fi diff --git a/.config/polybar/scripts/get_spotify_status.sh b/.config/polybar/scripts/get_spotify_status.sh new file mode 100755 index 0000000..f04400d --- /dev/null +++ b/.config/polybar/scripts/get_spotify_status.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# The name of polybar bar which houses the main spotify module and the control modules. +PARENT_BAR="now-playing" +PARENT_BAR_PID=$(pgrep -a "polybar" | grep "$PARENT_BAR" | cut -d" " -f1) + +# Set the source audio player here. +# Players supporting the MPRIS spec are supported. +# Examples: spotify, vlc, chrome, mpv and others. +# Use `playerctld` to always detect the latest player. +# See more here: https://github.com/altdesktop/playerctl/#selecting-players-to-control +#PLAYER="spotify" +PLAYER="playerctld" + +# Format of the information displayed +# Eg. {{ artist }} - {{ album }} - {{ title }} +# See more attributes here: https://github.com/altdesktop/playerctl/#printing-properties-and-metadata +FORMAT="{{ title }} - {{ artist }}" + +# Sends $2 as message to all polybar PIDs that are part of $1 +update_hooks() { + while IFS= read -r id + do + polybar-msg -p "$id" hook spotify-play-pause $2 1>/dev/null 2>&1 + done < <(echo "$1") +} + +PLAYERCTL_STATUS=$(playerctl --player=$PLAYER status 2>/dev/null) +EXIT_CODE=$? + +if [ $EXIT_CODE -eq 0 ]; then + STATUS=$PLAYERCTL_STATUS +else + STATUS="No player is running" +fi + +if [ "$1" == "--status" ]; then + echo "$STATUS" +else + if [ "$STATUS" = "Stopped" ]; then + echo "No music is playing" + elif [ "$STATUS" = "Paused" ]; then + update_hooks "$PARENT_BAR_PID" 2 + playerctl --player=$PLAYER metadata --format "$FORMAT" + elif [ "$STATUS" = "No player is running" ]; then + echo "" + else + update_hooks "$PARENT_BAR_PID" 1 + playerctl --player=$PLAYER metadata --format "$FORMAT" + fi +fi + diff --git a/.config/polybar/scripts/menu.sh b/.config/polybar/scripts/menu.sh new file mode 100755 index 0000000..93f3779 --- /dev/null +++ b/.config/polybar/scripts/menu.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +# Custom Rofi Script + +BORDER="#1F1F1F" +SEPARATOR="#1F1F1F" +FOREGROUND="#A9ABB0" +BACKGROUND="#1F1F1F" +BACKGROUND_ALT="#252525" +HIGHLIGHT_BACKGROUND="#FF6F00" +HIGHLIGHT_FOREGROUND="#FFFFFF" + +BLACK="#000000" +WHITE="#ffffff" +RED="#e53935" +GREEN="#43a047" +YELLOW="#fdd835" +BLUE="#1e88e5" +MAGENTA="#00897b" +CYAN="#00acc1" +PINK="#d81b60" +PURPLE="#8e24aa" +INDIGO="#3949ab" +TEAL="#00897b" +LIME="#c0ca33" +AMBER="#ffb300" +ORANGE="#fb8c00" +BROWN="#6d4c41" +GREY="#757575" +BLUE_GREY="#546e7a" +DEEP_PURPLE="#5e35b1" +DEEP_ORANGE="#f4511e" +LIGHT_BLUE="#039be5" +LIGHT_GREEN="#7cb342" + +# Launch Rofi +rofi -no-lazy-grab -show drun -display-drun "Applications " -drun-display-format "{name}" -hide-scrollbar true \ +-hide-sidebar-mode true \ +-bw 0 \ +-lines 15 \ +-line-padding 10 \ +-padding 0 \ +-width 20 \ +-xoffset 7 -yoffset 28 \ +-location 1 \ +-columns 1 \ +-show-icons -icon-theme "Papirus" \ +-color-enabled true \ +-color-window "$BACKGROUND,$BORDER,$SEPARATOR" \ +-color-normal "$BACKGROUND_ALT,$FOREGROUND,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" \ +-color-active "$BACKGROUND,$MAGENTA,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" \ +-color-urgent "$BACKGROUND,$YELLOW,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" +#rofi -no-lazy-grab -show drun -display-drun "Applications " -drun-display-format "{name}" -hide-scrollbar true -sidebar-mode false -bw 0 -lines 6 -line-padding 10 -padding 20 -width 30 -xoffset 7 -yoffset 25 -location 1 -columns 2 -show-icons -icon-theme "Papirus" + +# More Options +# -fullscreen \ + +# Theming help +# color window = background, border, separator +# color normal = background, foreground, background-alt, highlight-background, highlight-foreground +# color active = background, foreground, background-alt, highlight-background, highlight-foreground +# color urgent = background, foreground, background-alt, highlight-background, highlight-foreground + diff --git a/.config/polybar/scripts/menu.shsave b/.config/polybar/scripts/menu.shsave new file mode 100755 index 0000000..ea5bf8e --- /dev/null +++ b/.config/polybar/scripts/menu.shsave @@ -0,0 +1,63 @@ +#!/bin/bash + +# Custom Rofi Script + +BORDER="#1F1F1F" +SEPARATOR="#1F1F1F" +FOREGROUND="#A9ABB0" +BACKGROUND="#1F1F1F" +BACKGROUND_ALT="#252525" +HIGHLIGHT_BACKGROUND="#FF6F00" +HIGHLIGHT_FOREGROUND="#FFFFFF" + +BLACK="#000000" +WHITE="#ffffff" +RED="#e53935" +GREEN="#43a047" +YELLOW="#fdd835" +BLUE="#1e88e5" +MAGENTA="#00897b" +CYAN="#00acc1" +PINK="#d81b60" +PURPLE="#8e24aa" +INDIGO="#3949ab" +TEAL="#00897b" +LIME="#c0ca33" +AMBER="#ffb300" +ORANGE="#fb8c00" +BROWN="#6d4c41" +GREY="#757575" +BLUE_GREY="#546e7a" +DEEP_PURPLE="#5e35b1" +DEEP_ORANGE="#f4511e" +LIGHT_BLUE="#039be5" +LIGHT_GREEN="#7cb342" + +# Launch Rofi +rofi -no-lazy-grab -show drun -display-drun "Applications " -drun-display-format "{name}" -hide-scrollbar false \ +-hide-sidebar-mode true \ +-bw 0 \ +-lines 15 \ +-line-padding 10 \ +-padding 0 \ +-width 20 \ +-xoffset 7 -yoffset 28 \ +-location 1 \ +-columns 1 \ +-show-icons -icon-theme "Papirus" \ +-color-enabled true \ +-color-window "$BACKGROUND,$BORDER,$SEPARATOR" \ +-color-normal "$BACKGROUND_ALT,$FOREGROUND,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" \ +-color-active "$BACKGROUND,$MAGENTA,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" \ +-color-urgent "$BACKGROUND,$YELLOW,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" +#rofi -no-lazy-grab -show drun -display-drun "Applications " -drun-display-format "{name}" -hide-scrollbar true -sidebar-mode false -bw 0 -lines 6 -line-padding 10 -padding 20 -width 30 -xoffset 7 -yoffset 25 -location 1 -columns 2 -show-icons -icon-theme "Papirus" + +# More Options +# -fullscreen \ + +# Theming help +# color window = background, border, separator +# color normal = background, foreground, background-alt, highlight-background, highlight-foreground +# color active = background, foreground, background-alt, highlight-background, highlight-foreground +# color urgent = background, foreground, background-alt, highlight-background, highlight-foreground + diff --git a/.config/polybar/scripts/menu_full.sh b/.config/polybar/scripts/menu_full.sh new file mode 100755 index 0000000..9f898a4 --- /dev/null +++ b/.config/polybar/scripts/menu_full.sh @@ -0,0 +1,65 @@ + +#!/bin/bash + +# Custom Rofi Script + +BORDER="#1F1F1F" +SEPARATOR="#1F1F1F" +FOREGROUND="#A9ABB0" +BACKGROUND="#1F1F1F" +BACKGROUND_ALT="#252525" +HIGHLIGHT_BACKGROUND="#FF6F00" +HIGHLIGHT_FOREGROUND="#FFFFFF" + +BLACK="#000000" +WHITE="#ffffff" +RED="#e53935" +GREEN="#43a047" +YELLOW="#fdd835" +BLUE="#1e88e5" +MAGENTA="#00897b" +CYAN="#00acc1" +PINK="#d81b60" +PURPLE="#8e24aa" +INDIGO="#3949ab" +TEAL="#00897b" +LIME="#c0ca33" +AMBER="#ffb300" +ORANGE="#fb8c00" +BROWN="#6d4c41" +GREY="#757575" +BLUE_GREY="#546e7a" +DEEP_PURPLE="#5e35b1" +DEEP_ORANGE="#f4511e" +LIGHT_BLUE="#039be5" +LIGHT_GREEN="#7cb342" + +# Launch Rofi +rofi -no-lazy-grab -show drun \ +-display-drun "Applications " -drun-display-format "{name}" \ +-hide-scrollbar true \ +-bw 0 \ +-lines 10 \ +-line-padding 15 \ +-padding 60 \ +-width 30 \ +-xoffset 10 -yoffset 40 \ +-location 1 \ +-fullscreen \ +-columns 4 \ +-show-icons -icon-theme "Papirus" \ +-font "Fantasque Sans Mono 10" \ +-color-enabled true \ +-color-window "$BACKGROUND,$BORDER,$SEPARATOR" \ +-color-normal "$BACKGROUND_ALT,$FOREGROUND,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" \ +-color-active "$BACKGROUND,$MAGENTA,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" \ +-color-urgent "$BACKGROUND,$YELLOW,$BACKGROUND_ALT,$HIGHLIGHT_BACKGROUND,$HIGHLIGHT_FOREGROUND" + +# More Options +# -fullscreen \ + +# Theming help +# color window = background, border, separator +# color normal = background, foreground, background-alt, highlight-background, highlight-foreground +# color active = background, foreground, background-alt, highlight-background, highlight-foreground +# color urgent = background, foreground, background-alt, highlight-background, highlight-foreground diff --git a/.config/polybar/scripts/now-playing.sh b/.config/polybar/scripts/now-playing.sh new file mode 100755 index 0000000..8fa6000 --- /dev/null +++ b/.config/polybar/scripts/now-playing.sh @@ -0,0 +1,217 @@ +#!/usr/bin/env python3 +import dbus +import signal +import time +from unicodedata import east_asian_width + +# Config options + +# (int) : Length of media info string. If length of string exceedes this value, the text will scroll. Default value is 20 +message_display_len = 20 + +# (int) : Font index of polybar. this value should be 1 more than the font value specified in polybar config. +font_index = 1 + +# (float) : Update speed of the text in seconds. +update_delay = 0.3 + +# (list) : list of chars containing previous, play, pause, next glyphs for media controls in respective order +control_chars = ['','','',''] + +# (dict) : dict of char icons to display as prefix. +# If player name is available as key, then use the corressponding icon, +# else default key value. +# example: +display_player_prefix = { + "spotify": ' ', + "firefox": ' ', + "default": ' ' +} + +# (list) : list of metadata fields based on mpris sepecification. +# For more details/ field names, refer [mpris sepecification](https://www.freedesktop.org/wiki/Specifications/mpris-spec/metadata/) +metadata_fields = ["xesam:title", "xesam:artist"] + +# (char) : separator for metadata fields +metadata_separator = "-" + +# (bool) : Hide text when no player is available? True disables the output for no players. +hide_output = False + +# Defult initialization +current_player = None +player_names = None +players = None +message = None +display_text = "" +display_prefix = " " +display_suffix = "" +last_player_name = None + +session_bus = dbus.SessionBus() + +def get_name(player_name ): + if player_name not in player_names: + return + name = ".".join(player_name.split(".")[3:]) + return name + +def get_name_by_index(index): + if index >= len(player_names): + return + return get_name(player_names[index]) + +def get_status(player): + status = "" + try: + status = player.Get('org.mpris.MediaPlayer2.Player', 'PlaybackStatus', dbus_interface='org.freedesktop.DBus.Properties') + except Exception as e: + pass + return status + +def get_metadata(player): + metadata = {} + try: + metadata = player.Get('org.mpris.MediaPlayer2.Player', 'Metadata', dbus_interface='org.freedesktop.DBus.Properties') + except Exception as e: + pass + return metadata + +def update_prefix_suffix(player_name="", status=""): + global display_prefix, display_suffix, status_paused + + player_option = "" + if player_name != "": + player_option = "-p " + player_name + + prev_button = "%%{A:playerctl %s previous :}%c%%{A}" %(player_option,control_chars[0]) + play_button = "%%{A:playerctl %s play :}%c%%{A}" %(player_option,control_chars[1]) + pause_button = "%%{A:playerctl %s pause :}%c%%{A}" %(player_option,control_chars[2]) + next_button = "%%{A:playerctl %s next :}%c%%{A}" %(player_option,control_chars[3]) + + suffix = "| " + prev_button + if status == "Playing": + suffix += " "+pause_button + status_paused = False + else: + suffix += " "+play_button + status_paused = True + suffix += " "+next_button + # print(suffix) + display_suffix = suffix + + for key in display_player_prefix.keys(): + if key in player_name: + display_prefix = display_player_prefix[key] + break + else: + display_prefix = display_player_prefix["default"] + +def update_players(): + global player_names, players, session_bus, current_player, last_player_name + player_names = [service for service in session_bus.list_names() if service.startswith('org.mpris.MediaPlayer2.')] + players = [session_bus.get_object(service, '/org/mpris/MediaPlayer2') for service in player_names] + if last_player_name != get_name(current_player): + for index, player in enumerate(player_names): + if get_name(player) == last_player_name: + current_player = index + +def handle_event(*args): + global current_player, players, last_player_name + update_players() + if len(players) == 0: + return + current_player += 1 + current_player %= len(players) + last_player_name = getname_by_index(current_player) +# print("SIGUSR1: updated values - current_player = %d players len = %d"%(current_player,len(players))) + +def update_message(): + global players, current_player,player_names, message, display_text, message_display_len, display_suffix, last_player_name + if len(players) == 0: + tmp_message = "No player available" + update_prefix_suffix() + else: + name = get_name_by_index(current_player) + status = get_status(players[current_player]) + metadata_obj = get_metadata(players[current_player]) + metadata_string_list = [] + for field in metadata_fields: + result = metadata_obj.get(field) + if type(result) == dbus.Array: + result = result[0] + if not result: + result = "No "+field.split(":")[1] + metadata_string_list.append(str(result)) + metadata_string = (" "+metadata_separator+" ").join(metadata_string_list) + if visual_len(metadata_string) > message_display_len: + metadata_string = " " + metadata_string + " |" + update_prefix_suffix(name,status) + tmp_message = "" + if metadata_string: + tmp_message += str(metadata_string) + last_player_name = name + if message != tmp_message: + message = tmp_message + display_text = message + +def scroll(): + global display_text, message_display_len, status_paused + if not status_paused: + if len(display_text) > message_display_len: + display_text = display_text[1:] + display_text[0] + elif len(display_text) < message_display_len: + display_text += " "*(message_display_len - len(display_text)) + +def visual_len(text): + visual_length = 0 + for ch in text: + width = east_asian_width(ch) + if width == 'W' or width == 'F': + visual_length += 1 + visual_length += 1 + return visual_length + +def make_visual_len(text, visual_desired_length): + visual_length = 0 + altered_text = '' + for char in text: + if visual_length < visual_desired_length: + width = east_asian_width(char) + if width == 'W' or width == 'F': + visual_length += 2 + else: + visual_length += 1 + altered_text += char + else: + break + if visual_length == visual_desired_length + 1: + altered_text = altered_text[:-1] + ' ' + elif visual_length < visual_desired_length: + altered_text += ' ' * (visual_desired_length - visual_length) + return altered_text + +def print_text(): + global display_text, message_display_len, players, player_names, display_prefix, display_suffix + if hide_output and len(players)==0: + print("", flush = True) + return + scroll() + print(display_prefix + " " + + "%%{T%d}" % (font_index) + + make_visual_len(display_text, message_display_len) + + "%{T-}" + display_suffix, flush=True) + +def main(): + global current_player, players + update_players() + current_player = 0 + while True: + time.sleep(update_delay) + update_players() + update_message() + print_text() + +if __name__ == '__main__': + signal.signal(signal.SIGUSR1, handle_event) + main() diff --git a/.config/polybar/scripts/polybar_wrapper b/.config/polybar/scripts/polybar_wrapper new file mode 100755 index 0000000..901bb28 --- /dev/null +++ b/.config/polybar/scripts/polybar_wrapper @@ -0,0 +1,92 @@ +#!/bin/bash + +DIR=$(dirname $(realpath $0)) + +WINDOW_ID_CONKY=/tmp/conky_window_id +WINDOW_ID_TOP=/tmp/polybar_top_window_id +WINDOW_ID_EXPANDED=/tmp/polybar_expanded_window_id + +conky_launch() { + # Hacky X11 magic to make Conky appear above polybar + killall conky + # xdotool search can't find Conky's window but fortunately Conky outputs it + conky -c ~/.config/conky/config 2> /tmp/conky_out + # Extract the hex window id from Conky's output + HEX=$(awk '/drawing to created window/ {print $NF}' /tmp/conky_out | tr -d '()' | awk -Fx '{print $2}') + WIN_ID=$(( 16#$HEX )) # convert to decimal + xdotool windowunmap $WIN_ID + echo $WIN_ID > $WINDOW_ID_CONKY +} + +polybar_launch() { + killall polybar + + polybar top & + xdotool search --sync --pid $! > $WINDOW_ID_TOP + + polybar expanded & + xdotool search --sync --pid $! > $WINDOW_ID_EXPANDED + + bar_collapse +} + +launch() { + # Temporarily disable conky until I update the config + # conky_launch + # sleep 0.2 + polybar_launch +} + +bar_expand() { + xdotool windowmap $(cat $WINDOW_ID_EXPANDED) + xdotool windowunmap $(cat $WINDOW_ID_TOP) +} + +bar_collapse() { + xdotool windowunmap $(cat $WINDOW_ID_EXPANDED) + xdotool windowmap $(cat $WINDOW_ID_TOP) +} + +rofi_open() { + options_close + bar_expand & + rofi -modi run -show run + bar_collapse +} + +drun_open() { + bar_expand & + rofi -theme drun -modi drun -show drun -drun-categories Custom + bar_collapse +} + +search_open() { + options_close + bar_expand & + rofi -theme window -modi window -show window + bar_collapse +} + +options_open() { + bar_expand + $DIR/rofi_option_menu + bar_collapse + # echo "open" > /tmp/polybar_side_panel_state + # ID_CONKY=$(cat $WINDOW_ID_CONKY) + # xdotool windowmap $ID_CONKY + # xdotool windowraise $ID_CONKY + # ~/.config/i3/scripts/music_player show_applet +} + +case "$1" in + rofi) + rofi_open;; + search) + search_open;; + drun) + drun_open;; + options) + options_open;; + launch) + launch;; +esac diff --git a/.config/polybar/scripts/popup-calendar.sh b/.config/polybar/scripts/popup-calendar.sh new file mode 100755 index 0000000..4e5303c --- /dev/null +++ b/.config/polybar/scripts/popup-calendar.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +BAR_HEIGHT=22 # polybar height +BORDER_SIZE=1 # border size from your wm settings +YAD_WIDTH=222 # 222 is minimum possible value +YAD_HEIGHT=193 # 193 is minimum possible value +DATE="$(date +"%a %d %b, %H:%M")" + +case "$1" in +--popup) + if [ "$(xdotool getwindowfocus getwindowname)" = "yad-calendar" ]; then + exit 0 + fi + + eval "$(xdotool getmouselocation --shell)" + eval "$(xdotool getdisplaygeometry --shell)" + + # X + if [ "$((X + YAD_WIDTH / 2 + BORDER_SIZE))" -gt "$WIDTH" ]; then #Right side + : $((pos_x = WIDTH - YAD_WIDTH - BORDER_SIZE)) + elif [ "$((X - YAD_WIDTH / 2 - BORDER_SIZE))" -lt 0 ]; then #Left side + : $((pos_x = BORDER_SIZE)) + else #Center + : $((pos_x = X - YAD_WIDTH / 2)) + fi + + # Y + if [ "$Y" -gt "$((HEIGHT / 2))" ]; then #Bottom + : $((pos_y = HEIGHT - YAD_HEIGHT - BAR_HEIGHT - BORDER_SIZE)) + else #Top + : $((pos_y = BAR_HEIGHT + BORDER_SIZE)) + fi + + yad --calendar --undecorated --fixed --close-on-unfocus --no-buttons \ + --width="$YAD_WIDTH" --height="$YAD_HEIGHT" --posx="$pos_x" --posy="$pos_y" \ + --title="yad-calendar" --borders=0 >/dev/null & + ;; +*) + echo "$DATE" + ;; +esac diff --git a/.config/polybar/scripts/rofi-power.sh b/.config/polybar/scripts/rofi-power.sh new file mode 100755 index 0000000..87ac92c --- /dev/null +++ b/.config/polybar/scripts/rofi-power.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env sh +# +# A rofi powered menu to execute power related action. +# Uses: amixer mpc poweroff reboot rofi rofi-prompt + +power_off='' +reboot='' +lock='' +suspend='鈴' +log_out='' + +chosen=$(printf '%s;%s;%s;%s;%s\n' "$power_off" "$reboot" "$lock" "$suspend" \ + "$log_out" \ + | rofi -theme '~/.config/rofi/themes/power.rasi' \ + -dmenu \ + -sep ';' \ + -selected-row 2) + +case "$chosen" in + "$power_off") + rofi-prompt --query 'Shutdown?' && poweroff + ;; + + "$reboot") + rofi-prompt --query 'Reboot?' && reboot + ;; + + "$lock") + # TODO Add your lockscreen command. + ;; + + "$suspend") + # Pause music and mute volume before suspending. + mpc --quiet pause + amixer set Master mute + # TODO Add your suspend command. + ;; + + "$log_out") + # TODO Add your log out command. + ;; + + *) exit 1 ;; +esac + diff --git a/.config/polybar/scripts/scroll_spotify_status.sh b/.config/polybar/scripts/scroll_spotify_status.sh new file mode 100755 index 0000000..74e0bfd --- /dev/null +++ b/.config/polybar/scripts/scroll_spotify_status.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# see man zscroll for documentation of the following parameters +zscroll -l 20 \ + --delay 0.1 \ + --scroll-padding " " \ + --match-command "$HOME/.config/polybar/scripts/get_spotify_status.sh --status" \ + --match-text "Playing" "--scroll 1" \ + --match-text "Paused" "--scroll 0" \ + --update-check true "$HOME/.config/polybar/scripts/get_spotify_status.sh" & + +wait diff --git a/.config/polybar/scripts/sysmenu.sh b/.config/polybar/scripts/sysmenu.sh new file mode 100755 index 0000000..721bc1d --- /dev/null +++ b/.config/polybar/scripts/sysmenu.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# display a power menu to: shutdown, reboot, +# lock, logout, and suspend. This script can be +# executed by clicking on the polybar powermenu module +# or with a keyboard shortcut + + +# options to be displayed +shutdown=" Shutdown" +reboot=" Reboot" +lock=" Lock" +logout=" Logout" +suspend=" Suspend" + +uptime=$(uptime -p | sed -e 's/up //g') + +# options passed into variable +options="$shutdown\n$reboot\n$lock\n$logout\n$suspend" + +chosen="$(echo -e "$options" | rofi -no-lazy-grab -sep -lines 5 -hide-scrollbar true -border 0 -padding 0 -height 2px -width 15 -xoffset -8 -yoffset 28 -location 3 -columns 1 -dmenu -p 'System ' "$uptime")" + +case $chosen in +$shutdown) + systemctl poweroff + ;; +$reboot) + systemctl reboot + ;; +$lock) + betterlockscreen --lock dimblur + ;; +$logout) + bspc quit + ;; +$suspend) + systemctl suspend + ;; +esac + diff --git a/.config/polybar/scripts/sysmenu.shsave b/.config/polybar/scripts/sysmenu.shsave new file mode 100755 index 0000000..00ce125 --- /dev/null +++ b/.config/polybar/scripts/sysmenu.shsave @@ -0,0 +1,40 @@ +#!/bin/bash + +# display a power menu to: shutdown, reboot, +# lock, logout, and suspend. This script can be +# executed by clicking on the polybar powermenu module +# or with a keyboard shortcut + + +# options to be displayed +shutdown=" Shutdown" +reboot=" Reboot" +lock=" Lock" +logout=" Logout" +suspend=" Suspend" + +uptime=$(uptime -p | sed -e 's/up //g') + +# options passed into variable +options="$shutdown\n$reboot\n$lock\n$logout\n$suspend" + +chosen="$(echo -e "$options" | rofi -no-lazy-grab -sep -lines 5 -hide-scrollbar true -border 0 -padding 0 -height 2px -width 15 -xoffset -10 -yoffset 28 -location 3 -columns 1 -dmenu -p 'System ' "$uptime")" + +case $chosen in +$shutdown) + systemctl poweroff + ;; +$reboot) + systemctl reboot + ;; +$lock) + betterlockscreen --lock dimblur + ;; +$logout) + bspc quit + ;; +$suspend) + systemctl suspend + ;; +esac + diff --git a/.config/polybar/scripts/system-usb-mount.sh b/.config/polybar/scripts/system-usb-mount.sh new file mode 100755 index 0000000..63e9187 --- /dev/null +++ b/.config/polybar/scripts/system-usb-mount.sh @@ -0,0 +1,53 @@ +#!/bin/sh + +devices=$(lsblk -Jplno NAME,TYPE,RM,SIZE,MOUNTPOINT,VENDOR) + +case "$1" in + --mount) + for mount in $(echo "$devices" | jq -r '.blockdevices[] | select(.type == "part") | select(.rm == true) | select(.mountpoint == null) | .name'); do + udisksctl mount --no-user-interaction -b "$mount" + + mountpoint=$(udisksctl mount --no-user-interaction -b $mount) + mountpoint=$(echo $mountpoint | cut -d " " -f 4- | tr -d ".") + kitty -e "bash -lc 'pcmanfm $mountpoint'" & + done + ;; + --unmount) + for unmount in $(echo "$devices" | jq -r '.blockdevices[] | select(.type == "part") | select(.rm == true) | select(.mountpoint != null) | .name'); do + udisksctl unmount --no-user-interaction -b "$unmount" + udisksctl power-off --no-user-interaction -b "$unmount" + done + ;; + *) + output="" + counter=0 + + for unmounted in $(echo "$devices" | jq -r '.blockdevices[] | select(.type == "part") | select(.rm == true) | select(.mountpoint == null) | .name'); do + unmounted=$(echo "$unmounted" | tr -d "[:digit:]") + unmounted=$(echo "$devices" | jq -r '.blockdevices[] | select(.name == "'"$unmounted"'") | .vendor') + unmounted=$(echo "$unmounted" | tr -d ' ') + + if [ $counter -eq 0 ]; then + space="" + else + space=" " + fi + counter=$((counter + 1)) + + output="$output$space#1 $unmounted" + done + + for mounted in $(echo "$devices" | jq -r '.blockdevices[] | select(.type == "part") | select(.rm == true) | select(.mountpoint != null) | .size'); do + if [ $counter -eq 0 ]; then + space="" + else + space=" " + fi + counter=$((counter + 1)) + + output="$output$space#2 $mounted" + done + + echo "$output" + ;; +esac diff --git a/.config/polybar/scripts/toggle_bluetooth.sh b/.config/polybar/scripts/toggle_bluetooth.sh new file mode 100755 index 0000000..899d5ec --- /dev/null +++ b/.config/polybar/scripts/toggle_bluetooth.sh @@ -0,0 +1,8 @@ +#!/bin/sh +if [ $(bluetoothctl show | grep "Powered: yes" | wc -c) -eq 0 ] +then + bluetoothctl power on +else + bluetoothctl power off +fi + diff --git a/.config/pypoetry/config.toml b/.config/pypoetry/config.toml new file mode 100644 index 0000000..53b35d3 --- /dev/null +++ b/.config/pypoetry/config.toml @@ -0,0 +1,3 @@ +[virtualenvs] +create = true +in-project = true diff --git a/.config/rofi/Notif.rasi b/.config/rofi/Notif.rasi new file mode 100644 index 0000000..47bc1af --- /dev/null +++ b/.config/rofi/Notif.rasi @@ -0,0 +1,153 @@ +configuration { + display-drun: " Apps"; + display-window: "缾 Windows"; + show-icons:true; + font: "Fira Code 10"; +} + +* { + background-color: #fffff7; + bg: #fffff7; + text-color: #927f70; + selbg: #927f70; + actbg: #eee8da; + urgbg: #eee8da; + winbg: #eee8da; + + selected-normal-foreground: @text-color; + normal-foreground: @text-color; + selected-normal-background: @actbg; + normal-background: @background-color; + + selected-urgent-foreground: @urgbg; + urgent-foreground: @text-color; + selected-urgent-background: @actbg; + urgent-background: @background-color; + urgent-foreground: @urgbg; + + selected-active-foreground: @selbg; + active-foreground: @selbg; + selected-active-background: @actbg; + active-background: @background-color; + + line-margin: 2; + line-padding: 2; + separator-style: "none"; + hide-scrollbar: "true"; + margin: 0; + padding: 5; +} + +window { + location: northeast; + anchor: northeast; + //height: 40%; + y-offset: 60px; + x-offset: -20px; + width: 16%; + orientation: horizontal; + children: [mainbox]; + border: 2px solid; + border-radius: 10px; + border-color: #eee8da; +} + +mainbox { + spacing: 0.8em; + orientation: vertical; + children: [ inputbar, listview ]; +} + +button { padding: 2px 2px; } + +button selected { + background-color: @active-background; + text-color: @background-color; +} + +inputbar { + padding: 2px; + spacing: 5px; +} + +listview { + spacing: 0.5em; + dynamic: true; + cycle: false; +} + +element { + padding: 10px; +} + +prompt { + padding: 10px 0px 0px 20px; + font: "Fira Code 10"; +} + +entry { + expand: true; + text-color: @normal-foreground; + vertical-align: 0; + padding: 5px 0px 0px 20px; + enabled: false; +} + +element normal.normal { + background-color: @bg; + border-radius: 8px; + text-color: @normal-foreground; +} + +element normal.urgent { + background-color: @bg; + border-radius: 8px; + text-color: @urgent-foreground; +} + +element normal.active { + background-color: @bg; + border-radius: 8px; + text-color: @active-foreground; +} + +element selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +element selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} + +element selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} + +element alternate.normal { + background-color: @bg; + border-radius: 8px; + text-color: @normal-foreground; +} + +element alternate.urgent { + background-color: @bg; + border-radius: 8px; + text-color: @urgent-foreground; +} + +element alternate.active { + background-color: @bg; + border-radius: 8px; + text-color: @active-foreground; +} +element-icon { + size: 7ch; +} +element.selected { + border-radius: 8px; + border: 0 0 0 5px solid; + border-color: @winbg; +} diff --git a/.config/rofi/colors/gruvbox.rasi b/.config/rofi/colors/gruvbox.rasi new file mode 100644 index 0000000..f5c9169 --- /dev/null +++ b/.config/rofi/colors/gruvbox.rasi @@ -0,0 +1,10 @@ +/* colors */ + +* { + al: #00000000; + bg: #32302f; + pg: #7c6f64; + se: #101010ff; + fg: #FFFFFFff; + ac: #fe8019; +} diff --git a/.config/rofi/colors/nord.rasi b/.config/rofi/colors/nord.rasi new file mode 100644 index 0000000..2e72da1 --- /dev/null +++ b/.config/rofi/colors/nord.rasi @@ -0,0 +1,10 @@ +/* colors */ + +* { + al: #00000000; + bg: #2e3440; + pg: #4c566a; + se: #101010ff; + fg: #FFFFFFff; + ac: #88c0d0; +} diff --git a/.config/rofi/colors/simple.rasi b/.config/rofi/colors/simple.rasi new file mode 100644 index 0000000..31f260e --- /dev/null +++ b/.config/rofi/colors/simple.rasi @@ -0,0 +1,10 @@ +/* colors */ + +* { + al: #00000000; + bg: #2c2f31; + pg: #666666; + se: #6cb6eb; + fg: #FFFFFFff; + ac: #3b4041; +} diff --git a/.config/rofi/config.rasi b/.config/rofi/config.rasi new file mode 100644 index 0000000..dfe7afd --- /dev/null +++ b/.config/rofi/config.rasi @@ -0,0 +1,178 @@ +configuration { + bw: 0; + columns: 1; + location: 0; + lines: 5; + padding: 0; + fixed-num-lines: true; + show-icons: true; + sidebar-mode: false; + separator-style: "beam"; + hide-scrollbar: false; + scroll-method: 0; + click-to-exit: true; + show-match: true; + combi-hide-mode-prefix: false; + display-combi: "Combi"; + display-drun: "Start"; + display-window: "Window"; + display-windowcd: "Windowcd"; + display-run: "Commands"; + display-ssh: "Ssh"; + modi: "drun,window,run,ssh,"; + opacity: "0"; + fake-transparency: false; + kb-row-up: "Up,Control+k,Shift+Tab,Shift+ISO_Left_Tab"; + kb-row-down: "Down,Control+j"; + kb-accept-entry: "Control+m,Return,KP_Enter"; + me-select-entry: ""; + me-accept-entry: "MousePrimary"; + terminal: "kitty"; + kb-remove-to-eol: "Control+Shift+e"; + kb-mode-next: "Shift+Right,Control+Tab,Control+l"; + kb-mode-previous: "Shift+Left,Control+Shift+Tab,Control+h"; + kb-remove-char-back: "BackSpace"; + kb-mode-complete: "Control+c"; +} + +* { + background-color: @background; + font: "Source Code Pro Semibold 9"; + spacing: 2; +} + +#window { + background-color: @background; + border: 3; + border-color: @cyber; + padding: 0.5ch; +} + +#mainbox { + border: 0; + border-color: @ac; + padding: 0; +} + +#message { + border: 0px 0px 0px; + border-color: @ac; + padding: 1px; +} + +#textbox { + text-color: @foreground; +} + +#inputbar { + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} + +#textbox-prompt-colon { + expand: false; + str: ":"; + margin: 0px 0.3em 0em 0em; + text-color: inherit; +} + +#listview { + fixed-height: 0; + border: 0px 0px 0px; + border-color: @ac; + spacing: 2px; + scrollbar: true; + padding: 2px 0px 0px; +} + +#element { + border: 0; + padding: 1px; +} + +#element.normal.normal { + background-color: @background; + text-color: @foreground; +} + +#element.normal.urgent { + background-color: @background; + text-color: @red; +} + +#element.normal.active { + background-color: @foreground; + text-color: @background; +} + +#element.selected.normal { + background-color: @foreground; + text-color: @black; +} + +#element.selected.urgent { + background-color: @foreground; + text-color: @black; +} + +#element.selected.active { + background-color: @foreground; + text-color: @black; +} + +#element.alternate.normal { + background-color: @background; + text-color: @foreground; +} + +#element.alternate.urgent { + background-color: @background; + text-color: @foreground; +} + +#element.alternate.active { + background-color: @background; + text-color: @foreground; +} + +#scrollbar { + width: 0px; + border: 0; + handle-width: 0px; + padding: 0; +} + +#sidebar { + border: 2px 0px 0px; + border-color: @ac; +} + +#button { + text-color: @background; +} + +#button.selected { + background-color: @ac; + text-color: @foreground; +} + +#inputbar { + spacing: 0; + text-color: @foreground; + padding: 1px; +} + +#case-indicator { + spacing: 0; + text-color: @foreground; +} + +#entry { + spacing: 0; + text-color: @foreground; +} + +#prompt { + spacing: 0; + text-color: @foreground; +} +@import "~/.config/rofi/themes/colors.rasi" diff --git a/.config/rofi/options_menu.rasi b/.config/rofi/options_menu.rasi new file mode 100644 index 0000000..173da88 --- /dev/null +++ b/.config/rofi/options_menu.rasi @@ -0,0 +1,71 @@ +configuration { + show-icons: false; + font: "Font Awesome 17"; +} + +window { + height: 300; + width: 300; + location: northeast; + anchor: northeast; + x-offset: -10; + y-offset: 10; + transparency: "real"; + background-color: #00000000; + border: 4px 4px solid 4px 4px; + border-radius: 8; + border-color: @primary; +} + +mainbox { + children: [message, listview]; + padding: 0px 0px; +} + + +textbox { + horizontal-align: 0.5; + border: 0px 0px 2px; + border-color: @primary; + margin: 12px; + padding: 12px; +} + +listview { + padding: 8px 32px; +} + +element { + padding: 8px; + orientation: horizontal; +} + +element normal.urgent, element alternate.urgent { + background-color: @urgent; +} + +element normal.active, element alternate.active { + background-color: @background-alt; + border: 4px 4px solid 4px 4px; + border-radius: 8; + border-color: transparent; +} + +element selected { + border: 4px 4px solid 4px 4px; + border-radius: 8; + border-color: @primary; +} + +element selected.urgent { + background-color: @urgent; +} + +element selected.active { + background-color: @background-alt; +} + +element-text { + horizontal-align: 0; + padding: 0px 8px; +} diff --git a/.config/rofi/styles/appmenu.rasi b/.config/rofi/styles/appmenu.rasi new file mode 100644 index 0000000..c2ba024 --- /dev/null +++ b/.config/rofi/styles/appmenu.rasi @@ -0,0 +1,83 @@ +@import "../colors/simple.rasi" + +window { + transparency: "real"; + background-color: @bg; + text-color: @fg; + border: 0px; + border-color: @ac; + border-radius: 5px; + width: 40%; + height: 40%; + location: center; + x-offset: 0; + y-offset: -100; +} + +prompt { + enabled: false; +} + +entry { + background-color: @al; + text-color: @fg; + placeholder-color: @pg; + expand: true; + horizontal-align: 0; + placeholder: "Search"; + padding: 0.10% 0% 0% 0%; + blink: false; +} + +inputbar { + background-color: @ac; +} + +listview { + background-color: @al; + padding: 5px; + columns: 1; + lines: 10; + spacing: 0%; + cycle: true; + dynamic: true; + layout: vertical; +} + +mainbox { + background-color: @al; + border: 0% 0% 0% 0%; + border-radius: 0% 0% 0% 0%; + border-color: @ac; + children: [ inputbar, listview ]; + spacing: 0%; + padding: 0%; +} + +element { + background-color: @al; + text-color: @fg; + orientation: horizontal; + border-radius: 0%; + padding: 1% 0.5% 1% 0.5%; +} + +element-icon { + size: 40px; + border: 0px; +} + +element-text { + expand: true; + horizontal-align: 0; + vertical-align: 0.5; + margin: 0% 0.25% 0% 0.25%; +} + +element selected { + background-color: @ac; + text-color: @fg; + border: 0% 0% 0% 0%; + border-radius: 5px; + border-color: @bg; +} diff --git a/.config/rofi/styles/powermenu.rasi b/.config/rofi/styles/powermenu.rasi new file mode 100644 index 0000000..0602482 --- /dev/null +++ b/.config/rofi/styles/powermenu.rasi @@ -0,0 +1,40 @@ +@import "../colors/simple.rasi" + +inputbar { + children: [ textbox-prompt-colon, prompt ]; + position: center; + border-radius: 0px; +} + +textbox-prompt-colon { + padding: 0% 0% 0% 2%; + str: " Syetem Uptime"; + background-color: @al; + text-color: @fg; +} + +prompt { + font: "Inter Bold 12"; + padding: 0% 4% 0% 2%; + enabled: true; + background-color: @al; + text-color: @fg; +} + +listview { + cycle: true; + lines: 5; + margin: 0 0 0 0; + scrollbar: false; + background-color: @al; +} + +element selected { + background-color: @ac; + text-color: @fg; + border-radius: 5px; +} + +element{ + padding: 12px; +} diff --git a/.config/rofi/themes/colors.rasi b/.config/rofi/themes/colors.rasi new file mode 100644 index 0000000..d1419e4 --- /dev/null +++ b/.config/rofi/themes/colors.rasi @@ -0,0 +1,18 @@ +/* colors */ + +* { + alternative: #00101212; + background: #101010ff; + seperator: #00101212; + foreground: #FAFAFA; + ac: #00000000; + red: #CECCC9; + green: #CECCC9; + yellow: #CECCC9; + blue: #CECCC9; + purple: #CECCC9; + cyan: #CECCC9; + black: #101212; + cyber: #53E2AE; + orange: #fe8019; +} diff --git a/.config/rofi/themes/dmenu.rasi b/.config/rofi/themes/dmenu.rasi new file mode 100644 index 0000000..1e8f319 --- /dev/null +++ b/.config/rofi/themes/dmenu.rasi @@ -0,0 +1,38 @@ + +* { + background-color: #1a2026; + border-color: #29343d; + text-color: #ffffff; + font: "Fira Code Nerd Font Mono 11"; +} + +window { + anchor: north; + location: north; + width: 100%; + padding: 4px; + children: [ horibox ]; +} + +horibox { + orientation: horizontal; + children: [ prompt, entry, listview ]; +} + +listview { + layout: horizontal; + spacing: 10px; + lines: 100; +} + +entry { + expand: false; + width: 14em; +} + +element { + padding: 2px 5px; +} +element selected { + color: #a9bcef; +} diff --git a/.config/rofi/themes/power.rasi b/.config/rofi/themes/power.rasi new file mode 100644 index 0000000..209a9ac --- /dev/null +++ b/.config/rofi/themes/power.rasi @@ -0,0 +1,34 @@ +/** + * This theme is intended for a 5 items wide menu + * on a 1366x768 pixels resolution. + */ +@import "colors.rasi" +#window { + width: 1366px; + height: 768px; + /* vertical horizontal */ + padding: 270px 88px; + children: [ horibox ]; +} +#horibox { + children: [ listview ]; +} +#listview { + layout: horizontal; + spacing: 56px; + lines: 5; +} +#element { + /** + * Values bellow are 'no-padding' ones, to which we add 70 + * top right bottom left + * -14px 0px -14px -93px */ + padding: 56px 70px 56px -23px; + background-color: @background-light; +} +#element.selected { + background-color: @accent; + text-color: @background; +} + + diff --git a/.config/sxhkd/show_help.sh b/.config/sxhkd/show_help.sh new file mode 100755 index 0000000..bd0cd6c --- /dev/null +++ b/.config/sxhkd/show_help.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cat ~/.config/sxhkd/sxhkdrc | awk '/^[a-z]/ && last {print $0,"\t",last} {last=""} /^#/{last=$0}' | column -t -s $'\t' | rofi -dmenu -i -no-show-icons -width 1000 + diff --git a/.config/sxhkd/sxhkdrc b/.config/sxhkd/sxhkdrc new file mode 100755 index 0000000..2dd76f3 --- /dev/null +++ b/.config/sxhkd/sxhkdrc @@ -0,0 +1,412 @@ +# __ __ __ +# /\ \ /\ \ /\ \ +# ____ __ _\ \ \___\ \ \/'\ \_\ \ +# /',__\/\ \/'\\ \ _ `\ \ , < /'_` \ +#/\__, `\/> </ \ \ \ \ \ \ \\`\ /\ \L\ \ +#\/\____//\_/\_\ \ \_\ \_\ \_\ \_\ \___,_\ +# \/___/ \//\/_/ \/_/\/_/\/_/\/_/\/__,_ / +# + +#--------------------------------------------------------------- +# +# WM independent hotkeys +# + +# Help +super + F1 + ~/.config/sxhkd/show_help.sh -m -3 + +# Application menu +super + a + ~/.config/polybar/scripts/menu.sh + +# Shutdown menu +#super + alt + Delete +# ~/.config/polybar/scripts/sysmenu.sh + +# lockscreen +super + Escape + betterlockscreen --lock blur + +# Program launcher +super + @space + rofi -show drun + +# Run launcher (commands) +super + r + rofi -show run + +# Task switcher +alt + Tab + rofi -show window + +# Turn off compositor +super + shift + p + toggleprogram "picom" "--experimental-backends" + +#picom-trans -c -10 +#picom-trans -c +10 + +# Launch eww +#super + ctrl + a +# ~/.config/eww/launch_widgets.sh + +# Terminal emulator +#super + Return +# $TERMINAL + +# Browser +super + w + $BROWSER + +# Show clipmenu +#alt + x +# parcellite + #~/.scripts/clip.sh + +# Screenshots tool (selection) +ctrl + Print + flameshot gui -p ~/pictures/screenshots + +# Screenshots tool (screen) +shift + Print + flameshot full -p ~/pictures/screenshots + +# make sxhkd reload its configuration files: +super + ctrl + x + pkill -USR1 -x sxhkd; dunstify "Sxhkd configuration reloaded" + + + +#--------------------------------------------------------------- +# +# bspwm hotkeys +# + +# Quit/restart bspwm +super + alt + shift + {q,r} + bspc {quit,wm -r} + +# Close and kill +super + d + bspc node -c + +# Alternate between the tiled and monocle layout +super + m + bspc desktop -l next +super + z + bspc desktop -l next + +# Send the newest marked node to the newest preselected node +super + y + bspc node newest.marked.local -n newest.!automatic.local + +# Swap the current node and the biggest window +super + g + bspc node -s biggest.window + + +#--------------------------------------------------------------- +# +# state/flags +# + +# Set the window state +#super + {t,shift + t,s,f} +# bspc node -t {tiled,pseudo_tiled,floating,fullscreen} + +# Floating into monocle layout +super + shift + m + bspc node -t pseudo_tiled; bspc node -t floating && wtp 10 40 1342 716 "$(pfw)" + +# Set the window state +super + {t,shift + t,s} + bspc node -t {tiled,pseudo_tiled,floating}; \ + xdo raise -N Plank; \ + xdo raise -N '*:*:Picture in picture'; \ + xdo raise -N "Picture-in-Picture" + +# Toggle fullscreen +super + {f} + bspc node -t \~fullscreen + +# Toggle sticky +#super + q +# bspc node -g sticky=on + +# Set the node flags +super + ctrl + {m,x,y,z} + bspc node -g {marked,locked,sticky,private} + +# Move layers of windows above/below each other (script) +super + {equal,minus} + layer.sh {+,-} + + +#--------------------------------------------------------------- +# +# Focus/Swap +# + +# Focus the node in the given direction +super + {_,shift + }{h,j,k,l} + bspc node -{f,s} {west,south,north,east} + +# Focus the node for the given path jump +#super + {p,b,comma,period} +# bspc node -f @{parent,brother,first,second} + +# Focus the next/previous window in the current desktop +super + {_,shift + }c + bspc node -f {next,prev}.local.!hidden.window + +# Focus the next/previous desktop in the current monitor +super + bracket{left,right} + bspc desktop -f {prev,next}.local + +# Focus the last node/desktop +super + {grave,Tab} + bspc {node,desktop} -f last + +# Focus the older or newer node in the focus history +#super + {o,i} +# bspc wm -h off; \ +# bspc node {older,newer} -f; \ +# bspc wm -h on + +# Focus or send to the given desktop +super + {_,shift + }{1-9,0} + bspc {desktop -f,node -d} '^{1-9,10}' + +# Hide window +super + comma + bspc node -g hidden + +# Unhide window (script) +super + period + ${HOME}/.config/bspwm/bspcmd unhide + +# Toggle the hidden state of the focused node +super + q + ~/.scripts/bspwm-toggle-visibility.sh + +#--------------------------------------------------------------- +# +# Preselect +# + +# Preselect the direction +super + ctrl + {h,j,k,l} + bspc node -p {west,south,north,east} + +# Preselect the ratio +super + ctrl + {1-9} + bspc node -o 0.{1-9} + +# Cancel the preselection for the focused node +super + ctrl + space + bspc node -p cancel + +# Cancel the preselection for the focused desktop +super + ctrl + shift + space + bspc query -N -d | xargs -I id -n 1 bspc node id -p cancel + +# Close all receptacle +super + shift + i + for win in `bspc query -N -n .leaf.\!window`; do bspc node $win -k ; done; + +# Insert receptacle +super + i; {h,j,k,l} + bspc node --presel-dir {west,south,north,east} -i + +# Move to rectacle +super + ctrl + i + bspreceptacle + +# Balance nodes +super + alt + i + bspc node @/ -B + + + +#--------------------------------------------------------------- +# +# Move/resize +# + +# Move a floating window or swap with any other adjacent tiled/pseudo_tiled window +ctrl + alt + {h,j,k,l} + { dir=west dx=-20 dy=0 \ + , dir=south dx=0 dy=20 \ + , dir=north dx=0 dy=-20 \ + , dir=east dx=20 dy=0 \ + }; \ + bspc node --move "$dx" "$dy" || bspc node --swap $dir + +# Move a tiled window to any direction +super + shift + {h,j,k,l} + /path/to/bspwm_smart_move {west,south,north,east} + +# Rotate windows to different nodes +super + ctrl + r + bspc node @parent -R 90 + +# Resize tiled/floating windows (script) +shift + alt + {h,j,k,l} + bspwm_resize.sh {west,south,north,east} + +# Resize window into predefined pseudo_tiled window +super + shift + s + bspc node -t pseudo_tiled; bspc node -t floating && wtp 396 185 570 394 "$(pfw)" + +# Spawn next window/program into predefined floating window +super + ctrl + s + bspc rule -a '*' -o state=floating rectangle=720x480+320+200 + +# Spawn next window/program into predefined smaller Heads-Up-Display like floating window +#ctrl + alt + 2 +# bspc rule -a '*' -o state=floating rectangle=320x140+1030+32 + +# Spawn next window/program into another desktop +super + alt + {1-9,0} + bspc rule -a '*' -o desktop=^{1-9,10} + + +#--------------------------------------------------------------- +# +# Multimedia +# +# Multimedia control +{XF86AudioStop,XF86AudioPlay,XF86AudioPrev,XF86AudioNext} + playerctl {stop,play-pause,previous,next} + +# Use arrow keys as multimedia keys +alt + shift + {Left,Up,Right} + playerctl {previous,play-pause,next} + +# Brightness control +XF86MonBrightness{Up,Down} + brightnessctl s 5%{+,-} + +# Use arrow keys as brightness keys +alt + {Up,Down} + brightnessctl s 5%{+,-} + +# Volume control +XF86Audio{Raise,Lower}Volume + pulsemixer --change-volume {+,-}5 + +# Use arrow keys as volume keys +alt + {Right,Left} + pulsemixer --change-volume {+,-}5 + + +#--------------------------------------------------------------- +# +# Xdotool keys +# + +# Move mouse cursor north, west, south, east +alt + {w,a,s,d} + xdotool mousemove_relative --sync {-- 0 -24, -- -24 0, 0 24, 24 0} + +# Move mouse cursor diagonally north-west, north-east, south-west, south-east +shift + alt + {q,e,a,d} + xdotool mousemove_relative --sync {-- -24 -24, -- 24 -24, -- -24 24,-- 24 24} + +# Emulate left mouse click +alt + i + xdotool click --clearmodifiers 1 + +# Emulate left mouse click select +alt + shift + i + xdotool mousedown 1 sleep 0.5 mousemove_relative --sync {-- -8 0, 0 8, -- 0 -8, 8 0} sleep 0.5 mouseup 1 + +# Emulate mouse right click +alt + o + xdotool click --clearmodifiers 3 + +# Emulate mouse scroll up +alt + n + xdotool click --clearmodifiers 4 + +# Emulate mouse scroll down +alt + m + xdotool click --clearmodifiers 5 + +# Emulate mouse scroll button +alt + p + xdotool click --clearmodifiers 2 + +# Emulate home key +alt + ctrl + Left + xdotool keyup Left key --clearmodifiers Home + +# Emulate end key +alt + ctrl + Right + xdotool keyup Right key --clearmodifiers End + +# Emulate delete key +~alt + BackSpace + xte 'keyup Alt_L' 'key Delete' 'keydown Alt_L' + + +#--------------------------------------------------------------- +# +# Programs +# + +# Scratchpd +super + semicolon + ~/.scripts/scratchpad + +super + x + ~/.scripts/scratchpad + +# Heads-Up-Display scratchpad terminal +super + e + ~/.scripts/Heads-Up-Display + +# File manager nnn +super + shift + n + $TERMINAL -e nnn + +# File manager pcmanfm (GUI) +super + shift + f + pcmanfm + +# Bitwarden-rofi +super + shift + b + rofi-rbw + +# Thunderbird mail +#super + shift + m +# thunderbird + +# VirtualBox gui +super + v + /usr/bin/VirtualBox -- :0 vt1 + +# Discord +super + shift + d + discord + +# Spotify +super + shift + y + spotify + +# Book reader (zathura) +super + shift + z + zathura + +# Dictionary +super + ctrl + w + goldendict + +# Thesaurus +super + shift + w + artha + +# Suspend +alt + F4 + systemctl suspend && betterlockscreen --lock dimblur diff --git a/.config/tmux/left-status.sh b/.config/tmux/left-status.sh new file mode 100755 index 0000000..e4a8c49 --- /dev/null +++ b/.config/tmux/left-status.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +function ip-address() { + # Loop through the interfaces and check for the interface that is up. + for file in /sys/class/net/*; do + iface=$(basename $file); + read status < $file/operstate; + [ "$status" == "up" ] && ip addr show $iface | awk '/inet /{printf $2""}' + done +} + +function vpn-connection() { + # Check for tun0 interface. + [ -d /sys/class/net/tun0 ] && printf "%s " 'VPN*' +} + +function main() { + # Comment out any function you do not need. + ip-address + vpn-connection +} + +# Calling the main function which will call the other functions. +main + diff --git a/.config/tmux/right-status.sh b/.config/tmux/right-status.sh new file mode 100755 index 0000000..a14bbe3 --- /dev/null +++ b/.config/tmux/right-status.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# Get CPU average +getCPU=$[100-$(vmstat 1 2|tail -1|awk '{print $15}')] + +# Grab the second line of the ouput produced by the command: free -g (displays output in Gb) +getMem=$(free -h | sed -n '2p') +getMemPct=$(free -g | sed -n '2p') + +# Split the string in secondLine into an array +read -ra ADDR <<< "$getMem" +read -ra ADDRPct <<< "$getMemPct" + +# Get the total RAM from arrays +totalRam="${ADDR[1]//[^0-9.0-9]/}" +totalRamPct="${ADDRPct[1]}" + +# Get the used RAM from arrays +usedRam="${ADDR[2]//[^0-9.0-9]/}" +usedRamPct="${ADDRPct[2]}" + +# Calculate and display the percentages +pct="$(($usedRamPct*100/$totalRamPct))" +usage="$usedRam/$totalRam" +#echo "cpu:$getCPU% | mem:$pct% ($usage""G)" +echo "Cpu:$getCPU% | Mem:$pct% |" + diff --git a/.config/tmux/tmux-toggle-option.sh b/.config/tmux/tmux-toggle-option.sh new file mode 100755 index 0000000..52d5fdb --- /dev/null +++ b/.config/tmux/tmux-toggle-option.sh @@ -0,0 +1,27 @@ +#!/usr/bin/bash + +#USAGE="USAGE: $0 OPTION_NAME ON_STATE OFF_STATE" + +#OPTION_NAME=$1 +#ON_STATE=$2 +#OFF_STATE=$3 +# +#if [[ "$#" != 3 ]]; then +# echo $USAGE +# exit 1 +#fi +# +#if [[ `tmux show-option -w | grep "$OPTION_NAME $ON_STATE"` ]]; then +# OPTION_VALUE=$OFF_STATE +#else +# OPTION_VALUE=$ON_STATE +#fi +# +#tmux display-message "monitor activity: $OPTION_NAME $OPTION_VALUE" +#tmux set-option -w $OPTION_NAME $OPTION_VALUE > /dev/null + +if [ $(tmux show-option -A status-left) != 'status-left* "#[fg=#50fa7b,bg=default] #[bg=#50fa7b,fg=black]❐ #S #[fg=#50fa7b,bg=default]"' ]; then + tmux set -g status-left "#[fg=#50fa7b,bg=default] #[bg=#50fa7b,fg=black]❐ #S #[fg=#50fa7b,bg=default] "; +else + tmux set -g status-left "#[fg=#50fa7b,bg=default]#[bg=#50fa7b,fg=black] ❐ #S #( ~/.config/tmux/left-status.sh ) #[fg=#50fa7b,bg=default]" && tmux set -g status-right "#[fg=#50fa7b,bg=default] #{?client_prefix,#[reverse] Prefix #[noreverse] ,}#[bg=default,fg=#50fa7b]#[bg=#50fa7b,fg=black] #( ~/.config/tmux/right-status.sh ) %d-%b-%y | %H:%M #[bg=default,fg=#50fa7b]"; +fi diff --git a/.config/tmux/tmux.conf b/.config/tmux/tmux.conf new file mode 100644 index 0000000..48a487a --- /dev/null +++ b/.config/tmux/tmux.conf @@ -0,0 +1,339 @@ +# ████████╗███╗ ███╗██╗ ██╗██╗ ██╗ +# ╚══██╔══╝████╗ ████║██║ ██║╚██╗██╔╝ +# ██║ ██╔████╔██║██║ ██║ ╚███╔╝ +# ██║ ██║╚██╔╝██║██║ ██║ ██╔██╗ +# ██║ ██║ ╚═╝ ██║╚██████╔╝██╔╝ ██╗ +# ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ +#―――――――――――――――――――――――――――――――――――――――――― + +### Options ### + +# Setting the Prefix from Ctrl+b to Ctrl+s +unbind C-b +set -g prefix C-s +#set -g prefix M-Space + +# Ensure that we can send Ctrl+s to other apps +bind C-s send-prefix + +# Send the prefix to client inside window (nested tmux) +bind-key -n C-a send-prefix + +# Disable local tmux keys (nested tmux) +bind -T root F12 \ + set prefix None \;\ + set key-table off \;\ + if -F '#{pane_in_mode}' 'send-keys -X cancel' \;\ + refresh-client -S \;\ + +bind -T off F12 \ + set -u prefix \;\ + set -u key-table \;\ + refresh-client -S + +# Setting the delay between Prefix and Command +set -sg escape-time 10 +#set-option -sg escape-time 10 + +# Reload tmux with <Prefix>r +#bind r source-file ~/.tmux.conf \; display "Reloaded!" +bind r source-file ~/.config/tmux/tmux.conf \; display "Reloaded!" + +# Use <Prefix>L to clear terminal +bind -r L send-keys 'C-l' + +# Rename current window (Ctrl + A, A) +bind R rename-window '' \; \ + command-prompt -I "#W" "rename-window -- '%%'" + +# Mouse +set -g mouse on +#set -g mouse-select-pane on +#set -g mouse-resize-pane on +#set -g mouse-select-window on + +# Scrollback +#set -g history-limit 10000 + +# Sane scrolling +set -g terminal-overrides 'xterm*:smcup@:rmcup@' + +# Shift up/down copy-mode without prefix +bind-key -n S-Up copy-mode \; send-key Up +bind-key -n S-Down copy-mode \; send-key Down +bind-key -n Pageup copy-mode \; send-key Pageup +bind-key -n Pagedown copy-mode \; send-key Pagedown +is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ + | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'" +#bind -n M-k if-shell "$is_vim" "send-keys Pageup" "copy-mode -u" +bind -n Pageup if-shell "$is_vim" "send-keys Pageup" "copy-mode -u" +bind -n S-Pageup if-shell "$is_vim" "send-keys Pageup" "copy-mode -u" +bind -n S-Pagedown send-keys Pagedown +#bind -n M-j send-keys Pagedown + +# Focus events, allow supported requests from applications to passthrough/run in tmux +set-option -g focus-events on + +# Update the TERM variable of terminal emulator when creating a new session or attaching a existing session +set -g update-environment 'DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY TERM' + + +#―――――――――――――――――――――――――――――――――――――――――― + +### Window Movement/Control ### + +# Aggressive resizing, useful when using "grouped sessions" and multi-monitor setup +setw -g aggressive-resize on + +# Popup scratch session +#bind -n M-g display-popup -E "tmux new-session -A -s scratch" + +# Toggle popup scratch session +bind-key -n M-g if-shell -F '#{==:#{session_name},note}' { +detach-client +} { +display-popup -E "tmux new-session -A -s note" +} + +# Non-popup +#bind C-k new-window -n "session-switcher" "\ +# tmux list-sessions -F '#{?session_attached,,#{session_name}}' |\ +# sed '/^$/d' |\ +# fzf --reverse --header jump-to-session --preview 'tmux capture-pane -pt {}' |\ +# xargs tmux switch-client -t" + +# Popup +bind -n M-f display-popup -E "\ + tmux list-sessions -F '#{?session_attached,,#{session_name}}' |\ + sed '/^$/d' |\ + fzf --reverse --header jump-to-session --preview 'tmux capture-pane -pt {}' |\ + xargs tmux switch-client -t" + +# Quick window select +bind -n M-? list-keys +bind -n M-1 select-window -t :=1 +bind -n M-2 select-window -t :=2 +bind -n M-3 select-window -t :=3 +bind -n M-4 select-window -t :=4 +bind -n M-5 select-window -t :=5 +bind -n M-6 select-window -t :=6 +bind -n M-7 select-window -t :=7 +bind -n M-8 select-window -t :=8 +bind -n M-9 select-window -t :=9 +bind -n M-0 select-window -t :=0 + + +#―――――――――――――――――――――――――――――――――――――――――― + +### Pane Movement/Control ### + +# Smart pane switching with awareness of Vim splits. +# See: https://github.com/christoomey/vim-tmux-navigator +# Navigate across tmux-vim +is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ + | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'" + +# {{{ keybinds: select-pane +bind -Tnav h select-pane -L +bind h select-pane -L +bind -Tnav C-h select-pane -L +bind C-h select-pane -L +bind -Tnav j select-pane -D +bind j select-pane -D +bind -Tnav C-j select-pane -D +bind C-j select-pane -D +bind -Tnav k select-pane -U +bind k select-pane -U +bind -Tnav C-k select-pane -U +bind C-k select-pane -U +bind -Tnav l select-pane -R +bind l select-pane -R +bind -Tnav C-l select-pane -R +bind C-l select-pane -R +bind -Tnav p select-pane -l +bind p select-pane -l +bind -Tnav C-p select-pane -l +bind C-p select-pane -l +# keybinds: select-pane }}} + +# {{{ keybinds: split-window +bind -Tnav "\\" split-window -h -c "#{pane_current_path}" # vertical +bind "\\" split-window -h -c "#{pane_current_path}" # vertical +bind -Tnav "|" split-window -fh -c "#{pane_current_path}" # full vertical +bind "|" split-window -fh -c "#{pane_current_path}" # full vertical +bind -Tnav "-" split-window -v -c "#{pane_current_path}" # horizontal +bind "-" split-window -v -c "#{pane_current_path}" # horizontal +bind -Tnav "_" split-window -fv -c "#{pane_current_path}" # full horizontal +bind "_" split-window -fv -c "#{pane_current_path}" # full horizontal +# keybinds: split-window }}} + +# {{{ keybinds: resize-pane +bind -r -Tnav M-h resize-pane -L 10 +bind -r M-h resize-pane -L 10 +bind -r -Tnav M-j resize-pane -D 5 +bind -r M-j resize-pane -D 5 +bind -r -Tnav M-k resize-pane -U 5 +bind -r M-k resize-pane -U 5 +bind -r -Tnav M-l resize-pane -R 10 +bind -r M-l resize-pane -R 10 +# keybinds: resize-pane }}} + +# Hide a pane and bring it back with <Prefix>! and <Prefix>@ respectively +bind-key ! break-pane -d -n _hidden_pane +bind-key @ join-pane -s $.0 + +# Send Pane to another session/window +bind-key = command-prompt -p "send pane to:" "join-pane -t '%%'" + + +#―――――――――――――――――――――――――――――――――――――――――― + +### Copy Mode (Copy/Paste) ### + +# Set Vi copy mode, use <prefix>[ to enter copy mode +setw -g mode-keys vi # `<prefix>:list-keys -T copy-mode-vi` to confirm + +# Change selection <space> and enter to vi keybinding +bind-key -T copy-mode-vi 'v' send -X begin-selection +bind-key -T copy-mode-vi 'y' send -X copy-selection-and-cancel + +# Copy to system clipboard (requires xclip) +if-shell -b 'echo $XDG_SESSION_TYPE | grep -q x11' "\ + bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard > /dev/null'; \ + bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard > /dev/null'; \ + bind-key C-M-v run 'xclip -out -selection clipboard | tmux load-buffer - ; tmux paste-buffer'" + +# Wayland support +if-shell -b 'echo $XDG_SESSION_TYPE | grep -q wayland' "\ + bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel 'wl-copy'; \ + bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'wl-copy'; \ + bind-key C-p run 'wl-paste --no-newline | tmux load-buffer - ; tmux paste-buffer'" "\ + \ + bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel 'cat - >/dev/clipboard'; \ + bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel 'cat - >/dev/clipboard'; \ + bind-key C-M-v run 'cat /dev/clipboard | tmux load-buffer - ; tmux paste-buffer'" + +# + +### Colors ### + +## Assume external terminal supports the 256 colors palette (when TERM=xterm-256color) +#set -sa terminal-features ",xterm-256color:256" +## Assume external terminal supports RGB colors (when TERM=xterm-256color) +#set -sa terminal-features ",xterm-256color:RGB" +# +## Set TERM for proper colors +#set -g default-terminal "tmux-256color" +set -g default-terminal "xterm-256color" + + +# Set 256 color terminal +#set-option -sa terminal-overrides ",tmux-256color:Tc" +#set-option -sa terminal-overrides ",xterm*:Tc,alacritty*:Tc" + +# Colors for pane borders(default) +setw -g pane-border-style fg=white +setw -g pane-active-border-style fg=green + +# Active pane normal, other shaded out +setw -g window-style fg=colour240 +setw -g window-active-style fg=white + + +# + +### Status ### + +set -g status-position bottom # [top, bottom] +set -g status on +#set -g status-interval 1 +set -g status-interval 500 +set -g status-style fg=#50fa7b,bg=default + +## Left +#set -g status-left "" +set -g status-left-length 60 +#set -g status-left "#[fg=#50fa7b,bg=default]#[bg=#50fa7b,fg=black] ❐ #S #[fg=#50fa7b,bg=default]" +set -g status-left "#(cat ~/.vi-mode | awk '/-- NORMAL --/ {print \"#[fg=#39BAE6]#[bg=default]#[bg=#39BAE6,fg=#000000] ❐ #S #[fg=#39BAE6,bg=default]\"} /-- INSERT --/ {print \"#[fg=#50fa7b]#[bg=default]#[bg=#50fa7b,fg=#000000] ❐ #S #[fg=#50fa7b,bg=default]\"}')" + +## Centre +#set -g window-status-current-format "#[bg=default,fg=#50fa7b]#[fg=black,bg=#50fa7b] #I:#W #[bg=default,fg=#50fa7b]" +set -g window-status-current-format "#(cat ~/.vi-mode | awk '/-- NORMAL --/ {print \"#[fg=#39BAE6]#[bg=default]#[fg=#000000,bg=#39BAE6] #I:#W #[bg=default,fg=#39BAE6]\"} /-- INSERT --/ {print \"#[fg=#50fa7b]#[bg=default]#[fg=#000000,bg=#50fa7b] #I:#W #[bg=default,fg=#50fa7b]\"}')" +set -g status-justify absolute-centre + +## Right +set-option -g status-right "" +set -g status-right-length 60 +#set -g status-right "#[fg=#50fa7b,bg=default] #{?client_prefix,#[reverse] Prefix #[noreverse] ,} #[bg=default,fg=#50fa7b]#[bg=#50fa7b,fg=black] %H:%M #[bg=default,fg=#50fa7b]" +local_keys_off="#[fg=#50fa7b,bg=default]#([ $(tmux show-option -qv key-table) = 'off' ] && echo 'OFF')#[default]" +set -g status-right "$local_keys_off #(cat ~/.vi-mode | awk '/-- NORMAL --/ {print \"#[fg=#50fa7b,bg=default] #{?client_prefix,#[reverse] Prefix #[noreverse] ,} #[fg=#39BAE6]#[bg=default]#[bg=#39BAE6,fg=#000000] %H:%M #[bg=default,fg=#39BAE6]\"} /-- INSERT --/ {print \"#[fg=#39BAE6,bg=default] #{?client_prefix,#[reverse] Prefix #[noreverse] ,} #[fg=#50fa7b]#[bg=default]#[bg=#50fa7b,fg=#000000] %H:%M #[bg=default,fg=#50fa7b]\"}')" + +#set -g status-right "#[fg=white,bg=black]#(cat ~/.vi-mode)" +#set -g status-right "#[fg=white,bg=black]#(cat ~/.vi-mode | awk '/-- NORMAL --/ {print \"#[fg=blue]#[bg=black]-- NORMAL --\"} /-- INSERT --/ {print \"#[fg=green]#[bg=black]-- INSERT --\"}')" + +## Reload Status with IP addr, Cpu, Mem and Date +bind a run-shell ~/.config/tmux/tmux-toggle-option.sh + +## Reload Config/Status silently +bind b source-file ~/.config/tmux/tmux.conf + +set-option -g default-shell "/usr/bin/zsh" + + +#―――――――――――――――――――――――――――――――――――――――――― + +### Plugin Install ### + +set -g @plugin "tmux-plugins/tpm" +#set -g @plugin "tmux-plugins/tmux-sensible" +set -g @plugin "tmux-plugins/tmux-resurrect" +set -g @plugin "tmux-plugins/tmux-continuum" +set -g @plugin "christoomey/vim-tmux-navigator" +#set -g @plugin "tmux-plugins/tmux-yank" +#set -g @plugin 'srdusr/tmux-vi-mode' +#set -g @plugin 'vi-mode ~/.config/tmux/plugins/vi-mode.sh' + + +#―――――――――――――――――――――――――――――――――――――――――― + +### Plugins Settings ### + +# Plugin to save and restore tmux sessions after restart +# * Save with: <Prefix> + Ctrl-s +# * Restore with: <Prefix> + Ctlr-r +# Change default save and restore keybindings + set -g @resurrect-save "W" # <Prefix> + W + set -g @resurrect-restore "E" # <Prefix> + E + +# Restore vim and nvim sessions as well +# For vim: + set -g @resurrect-strategy-vim "session" +# For neovim: + set -g @resurrect-strategy-nvim "session" + +# Automatic restore + #set -g @continuum-restore "on" + #set -g @continuum-boot "on" + +# Restore Panes + set -g @resurrect-capture-pane-contents "on" + +# This is a hook for tmux-resurrect which tells it to kill session 0 before restoring the panels + set -g @resurrect-hook-pre-restore-pane-processes "tmux switch-client -n && tmux kill-session -t=0" + +# Plugin uninstall + # Delete or comment out the plugin in .tmux.conf. + # Press <prefix> + alt + u to remove the plugin. + +# TMUX plugin manager (keep at the bottom of tmux.conf) + #run "~/.config/tmux/plugins/tpm/tpm" + if "test ! -d ~/.config/tmux/plugins/tpm" \ + "run 'git clone https://github.com/tmux-plugins/tpm ~/.config/tmux/plugins/tpm && ~/.config/tmux/plugins/tpm/bin/install_plugins'" +run -b "~/.config/tmux/plugins/tpm/tpm" +# Load the vi-mode plugin + +#run-shell '~/.config/tmux/plugins/tmux-vi-mode/tmux-vi-mode.tmux' +#run-shell '~/.config/tmux/vi-mode' +# Load the vi-mode plugin +#run '~/.config/tmux/plugins/tpm/plugins/tmux-vi-mode/tmux-vi-mode.tmux' +#―――――――――――――――――――――――――――――――――――――――――― diff --git a/.config/user-dirs.dirs b/.config/user-dirs.dirs new file mode 100644 index 0000000..0db0cae --- /dev/null +++ b/.config/user-dirs.dirs @@ -0,0 +1,15 @@ +# This file is written by xdg-user-dirs-update +# If you want to change or add directories, just edit the line you're +# interested in. All local changes will be retained on the next run. +# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped +# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an +# absolute path. No other format is supported. +# +XDG_DESKTOP_DIR="$HOME/" +XDG_DOWNLOAD_DIR="$HOME/downloads" +XDG_TEMPLATES_DIR="$HOME/" +XDG_PUBLICSHARE_DIR="$HOME/" +XDG_DOCUMENTS_DIR="$HOME/documents" +XDG_MUSIC_DIR="$HOME/music" +XDG_PICTURES_DIR="$HOME/pictures" +XDG_VIDEOS_DIR="$HOME/videos" diff --git a/.config/user-dirs.locale b/.config/user-dirs.locale new file mode 100644 index 0000000..3e0b419 --- /dev/null +++ b/.config/user-dirs.locale @@ -0,0 +1 @@ +en_US
\ No newline at end of file diff --git a/.config/vimiv/keys.conf b/.config/vimiv/keys.conf new file mode 100644 index 0000000..089209b --- /dev/null +++ b/.config/vimiv/keys.conf @@ -0,0 +1,194 @@ +# Keybinding file for the vimiv image viewer +# Modifiers: Shift (through Shift+), Ctrl (through ^), Alt (through Alt+) +# Please refer to vimivrc(5) for further information + +[IMAGE] ######################################################################## +a: autorotate +Shift+w: center +Escape: clear_status +colon: command +Shift+y: copy_abspath +y: copy_basename +x: delete +g: first +e: fit_horiz +Shift+e: fit_vert +underscore: flip 0 +bar: flip 1 +Shift+o: focus_library +f: fullscreen +Shift+g: last +o: library +c: manipulate +m: mark +Shift+m: mark_toggle +u: move_up +n: next +p: prev +^q: q +q: q +less: rotate 1 +greater: rotate 3 +h: scroll h +Left: scroll h +Shift+h: scroll H +j: scroll j +Down: scroll j +Shift+j: scroll J +k: scroll k +Up: scroll k +Shift+k: scroll K +l: scroll l +Right: scroll l +Shift+l: scroll L +slash: search +Shift+n: search_next +Shift+p: search_prev +space: set play_animations! +r: set rescale_svg! +b: set display_bar! +s: slideshow +comma: set slideshow_delay -0.2 +period: set slideshow_delay +0.2 +t: thumbnail +plus: zoom_in +minus: zoom_out +w: zoom_to + +Button2: library +Button1: next +Button3: prev + +[THUMBNAIL] #################################################################### +a: autorotate +Escape: clear_status +colon: command +Shift+y: copy_abspath +y: copy_basename +x: delete +g: first +underscore: flip 0 +bar: flip 1 +Shift+o: focus_library +f: fullscreen +Shift+g: last +o: library +m: mark +Shift+m: mark_toggle +u: move_up +^q: q +q: q +less: rotate 1 +greater: rotate 3 +h: scroll h +Left: scroll h +Shift+h: scroll H +j: scroll j +Down: scroll j +Shift+j: scroll J +k: scroll k +Up: scroll k +Shift+k: scroll K +l: scroll l +Right: scroll l +Shift+l: scroll L +slash: search +Shift+n: search_next +Shift+p: search_prev +r: set rescale_svg! +b: set display_bar! +comma: set slideshow_delay -0.2 +period: set slideshow_delay +0.2 +t: thumbnail +plus: zoom_in +minus: zoom_out + +[LIBRARY] ###################################################################### +a: autorotate +Shift+w: center +Escape: clear_status +colon: command +Shift+y: copy_abspath +y: copy_basename +x: delete +g: first_lib +e: fit_horiz +Shift+e: fit_vert +underscore: flip 0 +bar: flip 1 +f: fullscreen +Shift+l: set library_width +20 +Shift+g: last_lib +o: library +m: mark +Shift+m: mark_toggle +u: move_up +n: next +p: prev +^q: q +q: q +less: rotate 1 +greater: rotate 3 +h: scroll_lib h +Left: scroll_lib h +j: scroll_lib j +Down: scroll_lib j +k: scroll_lib k +Up: scroll_lib k +l: scroll_lib l +Right: scroll_lib l +slash: search +Shift+n: search_next +Shift+p: search_prev +r: set rescale_svg! +^h: set show_hidden! +b: set display_bar! +Shift+h: set library_width -20 +comma: set slideshow_delay -0.2 +period: set slideshow_delay +0.2 +t: thumbnail +Shift+o: unfocus_library +plus: zoom_in +minus: zoom_out +w: zoom_to + +Button3: move_up + +[MANIPULATE] ################################################################### +Space: accept_changes +Return: accept_changes +a: autorotate +Shift+w: center +colon: command +Shift+y: copy_abspath +y: copy_basename +Escape: discard_changes +w: zoom_to +e: fit_horiz +Shift+e: fit_vert +underscore: flip 0 +bar: flip 1 +b: focus_slider bri +c: focus_slider con +s: focus_slider sat +f: fullscreen +m: mark +Shift+m: mark_toggle +less: rotate 1 +greater: rotate 3 +h: slider -1 +l: slider +1 +Shift+h: slider -10 +Shift+l: slider +10 + +[COMMAND] ###################################################################### +Tab: complete +Shift+Tab: complete_inverse +Escape: discard_command +^n: history_down +Down: history_down +^p: history_up +Up: history_up +^q: q + +# vim:ft=dosini diff --git a/.config/vimiv/vimivrc b/.config/vimiv/vimivrc new file mode 100644 index 0000000..1a16a90 --- /dev/null +++ b/.config/vimiv/vimivrc @@ -0,0 +1,39 @@ +# Configuration file for the vimiv image viewer +# Please refer to vimivrc(5) for further information + +[GENERAL] ###################################################################### +start_fullscreen: no +start_slideshow: no +slideshow_delay: 2 +shuffle: no +display_bar: yes +default_thumbsize: (128, 128) +geometry: 800x600 +recursive: no +rescale_svg: yes +overzoom: 1 +search_case_sensitive: yes +incsearch: yes +copy_to_primary: no +commandline_padding: 6 +thumb_padding: 10 +completion_height: 200 +play_animations: yes + +[LIBRARY] ###################################################################### +start_show_library: no +library_width: 300 +expand_lib: yes +border_width: 0 +markup: <span foreground="#875FFF"> +show_hidden: no +desktop_start_dir: . +file_check_amount: 30 +tilde_in_statusbar: yes + +[EDIT] ######################################################################### +autosave_images: yes + +[ALIASES] ###################################################################### + +# vim:ft=config diff --git a/.config/waybar/config.jsonc b/.config/waybar/config.jsonc new file mode 100644 index 0000000..dbf6556 --- /dev/null +++ b/.config/waybar/config.jsonc @@ -0,0 +1,292 @@ +{ + "layer": "top", // Waybar at top layer + "position": "top", // Waybar position (top|bottom|left|right) + //"gtk-layer-shell": "false", + "height": 45, // Waybar height (to be removed for auto height) + // "width": 2560, // Waybar width + "spacing": 0, // Gaps between modules (0px) Adjusted in the css + "margin-top": 0, + //"margin-bottom":-10, + "margin-left": 10, + "margin-right": 10, + // Choose the order of the modules + "modules-left": [ + "custom/launcher", + "wlr/workspaces", + "cpu", + "memory", + "temperature", + "disk", + "custom/updates" + ], + "modules-center": [ + "custom/music" + ], + "modules-right": [ + "network", + "pulseaudio", + "backlight", + "battery", + "custom/notifications", + "tray", + "clock", + "custom/weather", + "custom/cycle_wall", + "custom/clipboard", + "custom/power", + "custom/custom" + ], + "custom/launcher": { + "format": "{}", + "tooltip": true, + "exec": "echo '{\"text\":\"💧\",\"tooltip\":\"Drun | Run\"}'", + "return-type": "json", + "on-click": "pkill wofi || wofi --show drun -n", + "on-click-right": "pkill wofi || wofi --show run -n", + }, + "wlr/workspaces": { + // "format": "{icon} {name}", + "format": "", + "format-icons": { + "active": "", + "default": "" + }, + "on-scroll-up": "hyprctl dispatch workspace e-1", + "on-scroll-down": "hyprctl dispatch workspace e+1", + "on-click": "activate" + }, + "cpu": { + "format": " {usage}%", + "tooltip": true, + "on-click": "kitty --start-as=fullscreen --title all_is_kitty sh -c 'btop'", + "interval": 2 + }, + "memory": { + "format": " {}%", + "tooltip": true, + "on-click": "kitty --start-as=fullscreen --title all_is_kitty sh -c 'btop'", + "interval": 2 + }, + "temperature": { + // "thermal-zone": 2, + // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input", + "critical-threshold": 40, + "format-critical": "{icon} {temperatureC}°C", + "format": "{icon} {temperatureC}°C", + "format-icons": [ + "", + "", + "" + ], + "tooltip": true, + "on-click": "kitty --start-as=fullscreen --title all_is_kitty sh -c 'btop'", + "interval": 2 + }, + "disk": { + "format": " {percentage_used}% ({free})", + "tooltip": true, + "on-click": "kitty --start-as=fullscreen --title all_is_kitty sh -c 'btop'", + "interval": 2 + }, + "custom/updates": { + "format": "{}", + "exec": "~/.scripts/updates", + "on-click": "~/.scripts/updates update", + "interval": 300, + "tooltip": true, + // "tooltip-format": "{}", + // "exec-tooltip": "~/.scripts/updates tooltip" + }, + "custom/music": { + "format": "{icon}{}", + "format-icons": { + // "Playing": " ", // Uncomment if not using the dynamic script + "Paused": " ", + "Stopped": "‭ﭥ " // This stop symbol is RTL. So ‭ is left-to-right override. + }, + "escape": true, + "tooltip": true, + "exec": "~/.scripts/caway -b 10", + "return-type": "json", + "on-click": "playerctl play-pause", + "on-scroll-up": "playerctl previous", + "on-scroll-down": "playerctl next", + "on-click-right": "g4music", + "max-length": 35 + }, + "hyprland/window": { + "format": "{}", + "separate-outputs": true, + "max-length": 35 + }, + "network": { + // "interface": "wlp2*", // (Optional) To force the use of this interface + "format": "↕{bandwidthTotalBytes}", + "format-disconnected": "{icon} No Internet", + "format-linked": " {ifname} (No IP)", + "format-alt": "↕{bandwidthUpBytes} | ↕{bandwidthDownBytes}", + "tooltip-format": "{ifname}: {ipaddr}/{cidr} {gwaddr}", + "tooltip-format-wifi": "{icon} {essid} ({signalStrength}%)", + "tooltip-format-ethernet": "{icon} {ipaddr}/{cidr}", + "tooltip-format-disconnected": "{icon} Disconnected", + "on-click-right": "nm-connection-editor", + "format-icons": { + "ethernet": "", + "disconnected": "⚠", + "wifi": [ + "睊", + "直" + ] + }, + "interval": 2 + }, + "pulseaudio": { + // "scroll-step": 1, // %, can be a float + "format": "{icon} {volume}%", // {format_source} + "format-bluetooth": "{icon} {volume}%", // {format_source} + "format-bluetooth-muted": "", // {format_source} + "format-muted": "", // {format_source} + "format-source": "{volume}% ", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "headset": "", + "phone": "", + "portable": "", + "car": " ", + "default": [ + "", + "", + "" + ] + }, + "on-click": "pavucontrol" + }, + "backlight": { + // "device": "acpi_video1", + "format": "{icon} {percent}%", + "format-icons": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "on-scroll-up": "light -A 1", + "on-scroll-down": "light -U 1", + "interval": 2 + }, + "battery": { + "states": { + "good": 100, + "warning": 30, + "critical": 10 + }, + "format": "{icon} {capacity}%", + "format-charging": " {capacity}%", + "format-plugged": " {capacity}%", + "format-alt": "{icon} {time}", + // "format-good": "", // An empty format will hide the module + "format-full": " {capacity}%", + "format-icons": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "interval": 2 + }, + "custom/notifications": { + "tooltip": false, + "format": "{icon}", + "format-icons": { + "notification": "<span foreground='red'><sup></sup></span>", + "none": "", + "dnd-notification": "<span foreground='red'><sup></sup></span>", + "dnd-none": "" + }, + "return-type": "json", + "exec-if": "which swaync-client", + "exec": "swaync-client -swb", + "on-click": "swaync-client -t -sw", + "on-click-right": "swaync-client -d -sw", + "escape": true + }, + "tray": { + "icon-size": 15, + "spacing": 15 + }, + "clock": { + "timezone": "Asia/Calcutta", + "format": " {:%d <small>%a</small> %H:%M}", + //"format": " {:%a %b %d %Y | %H:%M}", + "format-alt": " {:%A %B %d %Y (%V) | %r}", + "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>", + "calendar-weeks-pos": "right", + "today-format": "<span color='#f38ba8'><b><u>{}</u></b></span>", + "format-calendar": "<span color='#f2cdcd'><b>{}</b></span>", + "format-calendar-weeks": "<span color='#94e2d5'><b>W{:%U}</b></span>", + "format-calendar-weekdays": "<span color='#f9e2af'><b>{}</b></span>", + "interval": 60 + }, + "idle_inhibitor": { + "format": "{icon}", + "format-icons": { + "activated": "", + "deactivated": "" + } + }, + "custom/weather": { + "tooltip": true, + "format": "{}", + "exec": "~/.scripts/tools/expand weather", + "return-type": "json" + }, + "custom/ss": { + "format": "{}", + "exec": "~/./scripts/tools/expand ss-icon", + "return-type": "json", + "on-click": "~/.scripts/screenshot_full" + }, + "custom/cycle_wall": { + "format": "{}", + "exec": "~/.scripts/tools/expand wall", + "return-type": "json", + // "interval": 1, + "on-click": "~/.scripts/tools/expand cycle", + "on-click-right": "~/.scripts/tools/expand cycler" + }, + "custom/clipboard": { + "format": "{}", + "exec": "~/.scripts/tools/expand clipboard", + "return-type": "json", + // Here "-l top_right -x -15 -y 10" doesn't matter as '-n' mode is used + // Window position is managed in Hyperland config's windowrulev2 + "on-click": "pkill wofi || cliphist list | wofi --dmenu -p clippick -l top_right -x -15 -y 10 -n | cliphist decode | wl-copy", + "on-click-middle": "rm -f ~/.cache/cliphist/db", + "on-click-right": "pkill wofi || cliphist list | wofi --dmenu -p clippick -l top_right -x -15 -y 10 -n | cliphist delete", + "escape": true + }, + "custom/power": { + "format": "{}", + "exec": "~/.scripts/tools/expand power", + "return-type": "json", + "on-click": "~/.config/wlogout/launch.sh" + }, + "custom/custom": { + "format": "{}", + "exec": "~/.scripts/tools/expand arrow-icon", + "on-click": "~/.scripts/tools/expand_toolbar", + "return-type": "json" + } +} diff --git a/.config/waybar/style.css b/.config/waybar/style.css new file mode 100644 index 0000000..348bb04 --- /dev/null +++ b/.config/waybar/style.css @@ -0,0 +1,434 @@ +/* +@import "catppuccin/mocha.css"; +*/ + +/* +* Catppuccin Mocha palette +*/ + +@define-color base #1e1e2e; +@define-color mantle #181825; +@define-color crust #11111b; + +@define-color text #cdd6f4; +@define-color subtext0 #a6adc8; +@define-color subtext1 #bac2de; + +@define-color surface0 rgba(22, 25, 37, 0.9); +@define-color surface1 #45475a; +@define-color surface2 #585b70; +@define-color surface3 #394161; + +@define-color overlay0 #6c7086; +@define-color overlay1 #7f849c; +@define-color overlay2 #9ba3c3; + +@define-color blue #89b4fa; +@define-color lavender #b4befe; +@define-color sapphire #74c7ec; +@define-color sky #89dceb; +@define-color teal #94e2d5; +@define-color green #a6e3a1; +@define-color yellow #f9e2af; +@define-color peach #fab387; +@define-color maroon #eba0ac; +@define-color red #f38ba8; +@define-color mauve #cba6f7; +@define-color pink #f5c2e7; +@define-color flamingo #f2cdcd; +@define-color rosewater #f5e0dc; + +/* =============================== */ +/* Universal Styling */ +* { + border: none; + border-radius: 0; + font-family: 'CaskaydiaCove Nerd Font', monospace; + font-size: 13px; + min-height: 0; +} + +/* =============================== */ + + +/* =============================== */ +/* Bar Styling */ +#waybar { + background: transparent; + color: @text; +} + +/* =============================== */ + + +/* =============================== */ +/* Main Modules */ +#custom-launcher, +#workspaces, +#window, +#tray, +#backlight, +#clock, +#battery, +#pulseaudio, +#network, +#mpd, +#cpu, +#memory, +#disk, +#temperature, +#custom-music, +#custom-updates, +#custom-nordvpn, +#custom-notifications, +#custom-power, +#custom-custom, +#custom-cycle_wall, +#custom-clipboard, +#custom-ss, +#custom-weather { + background-color: @surface0; + color: @text; + border-radius: 16px; + padding: 0.5rem 1rem; + box-shadow: rgba(0, 0, 0, 0.116) 2px 2px 5px 2px; + margin-top: 10px; + /* + margin-bottom: 10px; +*/ + margin-right: 10px; +} + +/* =============================== */ +/* Launcher Module */ +#custom-launcher { + color: @green; + padding-top: 0px; + padding-bottom: 0px; + padding-right: 10px; +} + +/* =============================== */ +/* Workspaces */ +#workspaces { + padding-left: 8px; + padding-right: 8px; +} + +#workspaces * { + font-size: 0px; +} + +#workspaces button { + background-color: @surface3; + color: @mauve; + border-radius: 100%; + min-height: 14px; + min-width: 14px; + margin: 5px 8px; + padding: 0px; + /*transition: all 0.5s cubic-bezier(0.33, 1.0, 0.68, 1.0); easeInOutCubic */ + transition: all 0.5s cubic-bezier(.55, -0.68, .48, 1.68); + box-shadow: rgba(0, 0, 0, 0.288) 2px 2px 5px 2px; +} + +#workspaces button.active { + /*color: @surface0; + border-radius: 1rem; + padding: 0rem 10px;*/ + background: radial-gradient(circle, rgba(203, 166, 247, 1) 0%, rgba(193, 168, 247, 1) 12%, rgba(249, 226, 175, 1) 19%, rgba(189, 169, 247, 1) 20%, rgba(182, 171, 247, 1) 24%, rgba(198, 255, 194, 1) 36%, rgba(177, 172, 247, 1) 37%, rgba(170, 173, 248, 1) 48%, rgba(255, 255, 255, 1) 52%, rgba(166, 174, 248, 1) 52%, rgba(160, 175, 248, 1) 59%, rgba(148, 226, 213, 1) 66%, rgba(155, 176, 248, 1) 67%, rgba(152, 177, 248, 1) 68%, rgba(205, 214, 244, 1) 77%, rgba(148, 178, 249, 1) 78%, rgba(144, 179, 250, 1) 82%, rgba(180, 190, 254, 1) 83%, rgba(141, 179, 250, 1) 90%, rgba(137, 180, 250, 1) 100%); + background-size: 400% 400%; + animation: gradient_f 20s ease-in-out infinite; + transition: all 0.3s cubic-bezier(.55, -0.68, .48, 1.682); +} + +#workspaces button:hover { + background-color: @mauve; +} + +@keyframes gradient { + 0% { + background-position: 0% 50%; + } + + 50% { + background-position: 100% 30%; + } + + 100% { + background-position: 0% 50%; + } +} + +@keyframes gradient_f { + 0% { + background-position: 0% 200%; + } + + 50% { + background-position: 200% 0%; + } + + 100% { + background-position: 400% 200%; + } +} + +@keyframes gradient_f_nh { + 0% { + background-position: 0% 200%; + } + + 100% { + background-position: 200% 200%; + } +} + +/* =============================== */ + + +/* =============================== */ +/* System Monitoring Modules */ +#cpu, +#memory, +#temperature { + color: @blue; +} + +#cpu { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-right: 0px; + padding-right: 5px; +} + +#memory { + border-radius: 0px; + margin-right: 0px; + padding-left: 5px; + padding-right: 5px; +} + +#temperature { + border-radius: 0px; + margin-right: 0px; + padding-left: 5px; + padding-right: 5px; +} + +#disk { + color: @peach; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + padding-left: 5px; + padding-right: 1rem; +} + +/* Updates Module */ +#custom-updates { + color: @sky; +} + +/* =============================== */ + + +/* =============================== */ +/* Clock Module */ +#clock { + color: @flamingo; +} + +/* =============================== */ + + +#custom-music.low { + background: rgb(148, 226, 213); + background: linear-gradient(52deg, rgba(148, 226, 213, 1) 0%, rgba(137, 220, 235, 1) 19%, rgba(116, 199, 236, 1) 43%, rgba(137, 180, 250, 1) 56%, rgba(180, 190, 254, 1) 80%, rgba(186, 187, 241, 1) 100%); + background-size: 300% 300%; + text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.377); + animation: gradient 15s ease infinite; + font-weight: bold; + color: #fff; +} + +#custom-music.random { + background: rgb(148, 226, 213); + background: radial-gradient(circle, rgba(148, 226, 213, 1) 0%, rgba(156, 227, 191, 1) 21%, rgba(249, 226, 175, 1) 34%, rgba(158, 227, 186, 1) 35%, rgba(163, 227, 169, 1) 59%, rgba(148, 226, 213, 1) 74%, rgba(164, 227, 167, 1) 74%, rgba(166, 227, 161, 1) 100%); + background-size: 400% 400%; + animation: gradient_f 4s ease infinite; + text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.377); + font-weight: bold; + color: #fff; +} + +#custom-music.critical { + background: rgb(235, 160, 172); + background: linear-gradient(52deg, rgba(235, 160, 172, 1) 0%, rgba(243, 139, 168, 1) 30%, rgba(231, 130, 132, 1) 48%, rgba(250, 179, 135, 1) 77%, rgba(249, 226, 175, 1) 100%); + background-size: 300% 300%; + animation: gradient 15s cubic-bezier(.55, -0.68, .48, 1.68) infinite; + text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.377); + font-weight: bold; + color: #fff; +} + +#custom-music.Playing { + background: rgb(137, 180, 250); + background: radial-gradient(circle, rgba(137, 180, 250, 120) 0%, rgba(142, 179, 250, 120) 6%, rgba(148, 226, 213, 1) 14%, rgba(147, 178, 250, 1) 14%, rgba(155, 176, 249, 1) 18%, rgba(245, 194, 231, 1) 28%, rgba(158, 175, 249, 1) 28%, rgba(181, 170, 248, 1) 58%, rgba(205, 214, 244, 1) 69%, rgba(186, 169, 248, 1) 69%, rgba(195, 167, 247, 1) 72%, rgba(137, 220, 235, 1) 73%, rgba(198, 167, 247, 1) 78%, rgba(203, 166, 247, 1) 100%); + background-size: 400% 400%; + animation: gradient_f 9s cubic-bezier(.72, .39, .21, 1) infinite; + text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.377); + font-weight: bold; + color: #fff; +} + +#custom-music.Paused, +#custom-music.Stopped { + background: @surface0; +} + + +/* =============================== */ +/* Music/PlayerCTL Module */ +#custom-music { + color: @mauve; +} + +/* =============================== */ + + +/* =============================== */ +/* Network Module */ +#network { + color: @blue; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-right: 0px; + padding-right: 5px; +} + +/* =============================== */ + + +/* =============================== */ +/* PulseAudio Module */ +#pulseaudio { + color: @mauve; + border-radius: 0; + margin-right: 0px; + padding-left: 5px; + padding-right: 5px; +} + +/* =============================== */ + + +/* =============================== */ +/* Backlight Module */ +#backlight { + color: @teal; + border-radius: 0; + margin-right: 0px; + padding-left: 5px; + padding-right: 5px; +} + +/* =============================== */ + + +/* =============================== */ +/* Battery Module */ +#battery { + color: @green; + border-radius: 0; + margin-right: 0px; + padding-left: 5px; + padding-right: 5px; +} + +#battery.charging { + color: @green; +} + +#battery.warning:not(.charging) { + color: @maroon; +} + +#battery.critical:not(.charging) { + color: @red; + animation-name: blink; + animation-duration: 1s; + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +@keyframes blink { + to { + background: @red; + color: @surface1; + } +} + +/* =============================== */ + +/* Notifications Module */ +#custom-notifications { + color: @mauve; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + padding-left: 5px; + padding-right: 1.25rem; +} + + +/* =============================== */ +/* Tray Module */ +#tray { + color: @mauve; + padding-right: 1.25rem; +} + +/* =============================== */ + + +/* =============================== */ +/* | Custom Modules | */ +/* =============================== */ +#custom-custom { + color: @peach; + padding-right: 1.25rem; + margin-right: 0px; +} + +/* Screenshot */ +#custom-ss { + color: @mauve; + padding-right: 1.5rem; +} + +/* Wallpaper */ +#custom-cycle_wall { + background: linear-gradient(45deg, rgba(245, 194, 231, 1) 0%, rgba(203, 166, 247, 1) 0%, rgba(243, 139, 168, 1) 13%, rgba(235, 160, 172, 1) 26%, rgba(250, 179, 135, 1) 34%, rgba(249, 226, 175, 1) 49%, rgba(166, 227, 161, 1) 65%, rgba(148, 226, 213, 1) 77%, rgba(137, 220, 235, 1) 82%, rgba(116, 199, 236, 1) 88%, rgba(137, 180, 250, 1) 95%); + background-size: 500% 500%; + animation: gradient 7s linear infinite; +} + +/* Notifications Module */ +#custom-clipboard { + color: @mauve; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-right: 0px; + padding-right: 8px; +} + +/* Powermenu Module */ +#custom-power { + color: @mauve; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + padding-left: 8px; + padding-right: 1.20rem; +} + +/* =============================== */ diff --git a/.config/wezterm/wezterm.lua b/.config/wezterm/wezterm.lua new file mode 100644 index 0000000..8a371a6 --- /dev/null +++ b/.config/wezterm/wezterm.lua @@ -0,0 +1,205 @@ +local wezterm = require("wezterm") + +---- Function to unset Ctrl+C keybinding +--local function unsetCtrlCKeybinding(window) +-- local keys = window:get_config().keys +-- for i, key in ipairs(keys) do +-- if key.key == 'c' and key.mods == 'CTRL' then +-- table.remove(keys, i) +-- break +-- end +-- end +-- window:set_config({ keys = keys }) +--end +-- +---- Event handler to unset Ctrl+C keybinding when using nvim +--wezterm.on("spawn_command", function(window, pane) +-- local cmd = pane:get_command() +-- if cmd and cmd[1] == "nvim" then +-- unsetCtrlCKeybinding(window) +-- end +--end) + +--local function isNvimRunning(window) +-- local pane = window.active_pane +-- local cmd = pane:get_command() +-- return cmd and cmd[1] == "nvim" +--end +-- +---- Function to modify keybindings based on the current program +--local function updateKeybindings(window) +-- local isNvim = isNvimRunning(window) +-- +-- local keys = {} +-- if not isNvim then +-- -- Add the default Ctrl+C keybinding +-- keys = { +-- { +-- key = "c", +-- mods = "CTRL", +-- action = wezterm.action{CopyTo = "ClipboardAndPrimarySelection"} +-- } +-- } +-- end +-- +-- window:set_config({ +-- keys = keys +-- }) +--end +-- +---- Event handler to update keybindings when the active program changes +--wezterm.on("update-right-status", function(window) +-- updateKeybindings(window) +--end) + +wezterm.on("toggle-opacity", function(window) + local overrides = window:get_config_overrides() or {} + if not overrides.window_background_opacity then + overrides.window_background_opacity = 1.0 + elseif overrides.window_background_opacity == 1.0 then + overrides.window_background_opacity = 0.6 + else + overrides.window_background_opacity = nil + end + window:set_config_overrides(overrides) +end) + +return { + front_end = "OpenGL", + --font = wezterm.font 'JetBrains Mono', + font = wezterm.font_with_fallback({ + { + family = "JetBrains Mono", + --intensity = 'Normal', + weight = "Medium", + italic = false, + harfbuzz_features = { "calt=0", "clig=0", "liga=0" }, + }, + { family = "Hack Nerd Font", weight = "Medium" }, + { + family = "Fira Code", + harfbuzz_features = { "zero" }, + }, + { family = "Terminus", weight = "Bold" }, + "Noto Color Emoji", + }), + font_size = 9, + warn_about_missing_glyphs = false, + adjust_window_size_when_changing_font_size = false, + line_height = 1.0, + --dpi = 96.0, + -- Keybinds + disable_default_key_bindings = true, + use_dead_keys = false, + mouse_bindings = { + -- Ctrl-click will open the link under the mouse cursor + { + event = { Up = { streak = 1, button = "Left" } }, + mods = "CTRL", + action = wezterm.action.OpenLinkAtMouseCursor, + }, + }, + keys = { + --leader = { key = 'a', mods = 'CTRL', timeout_milliseconds = 1000 }, + { + key = "O", + mods = "CTRL|SHIFT", + action = wezterm.action({ EmitEvent = "toggle-opacity" }), + }, + { key = "R", mods = "CTRL", action = "ReloadConfiguration" }, + { key = "Y", mods = "CTRL", action = "ShowDebugOverlay" }, + { + key = "-", + mods = "CTRL", + action = wezterm.action.DecreaseFontSize, + }, + { + key = "=", + mods = "CTRL", + action = wezterm.action.IncreaseFontSize, + }, + { + key = "0", + mods = "CTRL", + action = wezterm.action.ResetFontSize, + }, + { + key = "v", + mods = "CTRL", + action = wezterm.action({ PasteFrom = "Clipboard" }), + }, + --{ + -- key = "c", + -- mods = "CTRL", + -- action = wezterm.action({ CopyTo = "ClipboardAndPrimarySelection" }), + --}, + { + key = "c", + mods = "CTRL", + action = wezterm.action_callback(function(window, pane) + local has_selection = window:get_selection_text_for_pane(pane) ~= "" + if has_selection then + window:perform_action(wezterm.action({ CopyTo = "ClipboardAndPrimarySelection" }), pane) + window:perform_action("ClearSelection", pane) + else + window:perform_action(wezterm.action({ SendKey = { key = "c", mods = "CTRL" } }), pane) + end + end), + }, + }, + -- Aesthetic Night Colorscheme + bold_brightens_ansi_colors = true, + -- Padding + window_padding = { + left = 5, + right = 5, + top = 6, + bottom = 4, + }, + -- Cursor style + --default_cursor_style = "BlinkingUnderline", + default_cursor_style = "BlinkingBar", + cursor_blink_rate = 700, + -- needed to prevent 'easing' from using 40%+ cpu util ... + --animation_fps = 1, + force_reverse_video_cursor = true, + colors = { + cursor_bg = "white", + compose_cursor = "orange", + --cursor_border = 'white', + }, + + -- Tab Bar + enable_tab_bar = false, + --hide_tab_bar_if_only_one_tab = true, + --show_tab_index_in_tab_bar = false, + tab_bar_at_bottom = false, + + -- General + -- X11 + enable_wayland = false, + audible_bell = "Disabled", + + visual_bell = { + fade_in_duration_ms = 5, + fade_out_duration_ms = 5, + target = "CursorColor", + }, + automatically_reload_config = true, + scrollback_lines = 3500, + --inactive_pane_hsb = { saturation = 1.0, brightness = 1.0 }, + --text_background_opacity = 0.3, + window_background_opacity = 0.8, + --window_background_image = '/path/to/wallpaper.jpg', + --window_background_image_hsb = { + -- -- Darken the background image by reducing it to 1/3rd + -- brightness = 0.3, + -- -- You can adjust the hue by scaling its value. + -- -- a multiplier of 1.0 leaves the value unchanged. + -- hue = 1.0, + -- -- You can adjust the saturation also. + -- saturation = 1.0, + --}, + window_close_confirmation = "NeverPrompt", + --color_scheme = 'transparent', +} diff --git a/.config/wofi/config b/.config/wofi/config new file mode 100644 index 0000000..d1ea4c8 --- /dev/null +++ b/.config/wofi/config @@ -0,0 +1,17 @@ +width=420 +height=550 +location=center +show=drun +matching=fuzzy +prompt=Search... +filter_rate=100 +allow_markup=true +no_actions=true +halign=fill +orientation=vertical +content_halign=fill +insensitive=true +allow_images=true +image_size=28 +gtk_dark=false +term=kitty diff --git a/.config/wofi/style.css b/.config/wofi/style.css new file mode 100644 index 0000000..6fb5107 --- /dev/null +++ b/.config/wofi/style.css @@ -0,0 +1,99 @@ +* { + transition: 0.2s; +} + +window { + font-family: "FiraCode Nerd Font Mono"; + font-size: 13px; +} + +window { + margin: 0px; + border: 2px solid #cba6f7; +/* + background-color: #161925; +*/ + background-color: transparent; + border-radius: 16px; +} + +#input { + padding: 4px; + margin: 20px; + padding-left: 20px; + border: none; + color: #fff; + font-weight: bold; + background: linear-gradient(90deg, #cba6f7 0%, #94e2d5 100%); + outline: none; + border-radius: 16px; +} + +#input image { + color: #fff; +} + +#input:focus { + border: none; + outline: none; +} + +#inner-box { + margin: 20px; + margin-top: 0px; + border: none; + color: #cba6f7; + border-radius: 16px; +} + +#inner-box * { + transition: none; +} + +#outer-box { + margin: 0px; + border: none; + padding: 0px; + border-radius: 16px; +} + +#scroll { + margin-top: 5px; + border: none; + border-radius: 16px; + margin-bottom: 5px; +} + +#text:selected { + color: #fff; + font-weight: bold; +} + +#img { + margin-right: 20px; + background: transparent; +} + +#text { + margin: 0px; + border: none; + padding: 0px; + background: transparent; +} + +#entry { + margin: 0px; + border: none; + border-radius: 16px; + background-color: transparent; + min-height:32px; + font-weight: bold; +} + +#entry:selected { + outline: none; + margin: 0px; + border: none; + border-radius: 16px; + background: linear-gradient(90deg, #cba6f7 0%, #94e2d5 100%); +} diff --git a/.config/xkb/symbols/vim_keys b/.config/xkb/symbols/vim_keys new file mode 100644 index 0000000..34f2ca5 --- /dev/null +++ b/.config/xkb/symbols/vim_keys @@ -0,0 +1,52 @@ +// ~/.config/xkb/symbols/vim_keys + +xkb_symbols "basic" { + include "us(basic)" + include "custom(altgr)" + + clear lock; + clear mod5; + clear control; + + // Define a custom modifier (Mode_switch) + modifier_map Mod5 { <MDSW> }; + + // Remap Caps Lock to AltGr (ISO_Level3_Shift) + key <CAPS> { + type[Group1] = "ONE_LEVEL", + symbols[Group1] = [ ISO_Level3_Shift ], + actions[Group1] = [ SetMods(modifiers=Mod5) ] + }; + + // Remap h, j, k, l to arrow keys when Mode_switch is active + key <AC06> { [ Left ] }; + key <AC07> { [ Down ] }; + key <AC08> { [ Up ] }; + key <AC09> { [ Right ] }; + + // Assign keys to the CtrlMod modifier + key <RCTL> { [ Control_R, Control_R ] }; + key <LCTL> { [ Control_L, Control_L ] }; + + // Define Ctrl+Mode_switch+J as PageDown + key <I194> { [ Control_R, ISO_Level3_Shift, Prior ] }; + key <I194> { [ Control_L, ISO_Level3_Shift, Prior ] }; + + // Define Ctrl+Mode_switch+K as PageUp + key <I196> { [ Control_R, ISO_Level3_Shift, Next ] }; + key <I196> { [ Control_L, ISO_Level3_Shift, Next ] }; + + // Define Ctrl+Mode_switch+H as Home + key <AC06> { [ Control_R, ISO_Level3_Shift, Home ] }; + key <AC06> { [ Control_L, ISO_Level3_Shift, Home ] }; + + // Define Ctrl+Mode_switch+L as End + key <AC09> { [ Control_R, ISO_Level3_Shift, End ] }; + key <AC09> { [ Control_L, ISO_Level3_Shift, End ] }; + + // Make 'q' act as Escape when in Mode_switch + key <AD03> { [ q, Q, Escape ] }; + + // Shift+Caps to use normal Caps Lock + modifier_map Mod5 { Shift+CapsLock, <MDSW> }; +}; diff --git a/.config/zathura/zathurarc b/.config/zathura/zathurarc new file mode 100644 index 0000000..78d66a1 --- /dev/null +++ b/.config/zathura/zathurarc @@ -0,0 +1,27 @@ +set window-title-basename "true" + + + + +# Basic Settings + +set highlight-transparency .1 +set zoom-center "true" +set selection-clipboard "clipboard" +set render-loading "false" +set pages-per-row 1 +set scroll-page-aware "true" +set scroll-full-overlap 0.01 +set scroll-step 50 +set zoom-min 10 +set guioptions "" +set render-loading "false" + + +# Startup options +set adjust-open "best-fit" +set recolor true + +# Side by side view (view 2 pages like an open book) +map D set "first-page-column 1:1" +map <C-d> set "first-page-column 1:2" diff --git a/.config/zsh/.zshenv b/.config/zsh/.zshenv new file mode 100644 index 0000000..663b328 --- /dev/null +++ b/.config/zsh/.zshenv @@ -0,0 +1,259 @@ +# Load local/system wide binaries and scripts +export PATH=$HOME/.bin:$HOME/.local/bin:$HOME/.scripts:/usr/local/bin:/sbin:/usr/sbin:$PATH +export PATH="/data/data/com.termux/files/usr/local/bin:$PATH" + +# Skip the not really helpful global compinit +skip_global_compinit=1 + +## Conditionally set WM(window manager) +available_wms=("bspwm" "mutter" "i3") +for wm in "${available_wms[@]}"; do + if command -v "$wm" &> /dev/null; then + export WM="$wm" + break + fi +done + +# Set a flag to indicate if the display server type is found +display_server_found=0 + +# Conditionally set Display server +available_displays=("wayland" "x11") +for display in "${available_displays[@]}"; do + if [ "$WAYLAND_DISPLAY" = "$display" ]; then + export XDG_SESSION_TYPE="$display" + display_server_found=1 + break + fi +done + +# Check if XDG_SESSION_TYPE is "x11" and set X11-specific variables +if [ "$display_server_found" -eq 1 ] && [ "$XDG_SESSION_TYPE" == "x11" ]; then + # X11-specific variables + export XINITRC="$HOME/.config/X11/.xinitrc" + export XSERVERRC="$XDG_CONFIG_HOME/X11/xserverrc" + export USERXSESSION="$XDG_CONFIG_HOME/X11/xsession" + export USERXSESSIONRC="$XDG_CONFIG_HOME/X11/xsessionrc" + export ALTUSERXSESSION="$XDG_CONFIG_HOME/X11/Xsession" + export ERRFILE="$XDG_CONFIG_HOME/X11/xsession-errors" + export ICEAUTHORITY="$XDG_CACHE_HOME/.ICEauthority" +fi + +# Conditionally set default term +available_terms=("wezterm" "alacritty" "xterm") +for term in "${available_terms[@]}"; do + if command -v "$term" &> /dev/null; then + export TERMINAL="$term" + break + fi +done + +# Default Programs: +export EDITOR=$(command -v nvim || echo "vim") +export VISUAL=$EDITOR +export COLORTERM="truecolor" +export TERM="xterm-256color" +export READER="zathura" +export BROWSER="firefox" +export OPENER="xdg-open" +export MANPAGER="echo \$EDITOR +Man!" +export PAGER="less" +export FAQ_STYLE='github' +export VIDEO="vlc" +export IMAGE="sxiv" + +# XDG Paths: +export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:-$HOME/.config} +export XDG_DATA_HOME=${XDG_DATA_HOME:-$HOME/.local/share} +export XDG_CACHE_HOME=${XDG_CACHE_HOME:-$HOME/.cache} +export INPUTRC="${XDG_CONFIG_HOME:-$HOME/.config}/inputrc" +export ZDOTDIR="$XDG_CONFIG_HOME/zsh" +export HISTFILE="$ZDOTDIR/.zhistory" # History filepath +export HISTSIZE=1000000 # Maximum events for internal history +export SAVEHIST=1000000 # Maximum events in history file +export BANG_HIST # Treat the '!' character specially during expansion. +export EXTENDED_HISTORY # Write the history file in the ":start:elapsed;command" format. +export INC_APPEND_HISTORY # Write to the history file immediately, not when the shell exits. +export SHARE_HISTORY # Share history between all sessions. +export HIST_EXPIRE_DUPS_FIRST # Expire duplicate entries first when trimming history. +export HIST_IGNORE_DUPS # Don't record an entry that was just recorded again. +export HIST_IGNORE_ALL_DUPS # Delete old recorded entry if new entry is a duplicate. +export HIST_FIND_NO_DUPS # Do not display a line previously found. +export HIST_IGNORE_SPACE # Don't record an entry starting with a space. +export HIST_SAVE_NO_DUPS # Don't write duplicate entries in the history file. +export HIST_REDUCE_BLANKS # Remove superfluous blanks before recording entry. +export HIST_VERIFY # Don't execute immediately upon history expansion. +export HIST_BEEP # Beep when accessing nonexistent history. + +# Customize `ls` colours +export LSCOLORS=ExGxBxDxCxEgEdxbxgxcxd + +# Other XDG paths: +export RIPGREP_CONFIG_PATH="$XDG_CONFIG_HOME/ripgrep/ripgreprc" +export DOCKER_CONFIG="$XDG_CONFIG_HOME/docker" +export VSCODE_PORTABLE="$XDG_DATA_HOME/vscode" +export GTK2_RC_FILES="$XDG_CONFIG_HOME/gtk-2.0/gtkrc" +export PATH="/usr/bin/cmake:$PATH" +export PATH=$PATH:/opt/google/chrome + +# Manage Arch linux build sources +export ASPROOT="${XDG_CACHE_HOME:-$HOME/.cache}/asp" + +# GnuPG +export GPG_TTY=$(tty) +export GNUPGHOME="$XDG_CONFIG_HOME/gnupg" + +# Fzf +export PATH="$PATH:/usr/local/bin/fzf/bin" +export FZF_BASE="/usr/local/bin/fzf" + +# Android Home +export ANDROID_HOME=/opt/android-sdk +export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH +#export PATH=$ANDROID_HOME/cmdline-tools/bin:$PATH +export PATH=$ANDROID_HOME/tools:$PATH +export PATH=$ANDROID_HOME/tools/bin:$PATH +export PATH=$ANDROID_HOME/platform-tools:$PATH +# Android emulator PATH +export PATH=$ANDROID_HOME/emulator:$PATH +# Android SDK ROOT PATH +export ANDROID_SDK_ROOT=/opt/android-sdk +export PATH=$ANDROID_SDK_ROOT:$PATH +#export ANDROID_SDK_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/android" + +# Programming Environment Variables: + +# Rust +export RUSTUP_HOME=${XDG_DATA_HOME:-$HOME/.local/share}/rustup +export CARGO_HOME=${XDG_DATA_HOME:-$HOME/.local/share}/cargo +#[[ -d $CARGO_HOME/bin ]] && path=($CARGO_HOME/bin $path) +#if which rustc > /dev/null; then export RUST_BACKTRACE=1; fi +#export PATH="$HOME/.cargo/bin:$PATH" +#export CARGO_HOME=${XDG_DATA_HOME}/cargo +#export RUSTUP_HOME=${XDG_DATA_HOME}/rustup +#export PATH="${CARGO_HOME}/bin:${RUSTUP_HOME}/bin:$PATH" + + +# Java +#export JAVA_HOME=/usr/lib/jvm/default-java +#export JAVA_HOME='/usr/lib/jvm/java-8-openjdk' +#export JAVA_HOME='/usr/lib/jvm/java-10-openjdk' +#export JAVA_HOME='/usr/lib/jvm/java-11-openjdk' +#export JAVA_HOME='/usr/lib/jvm/java-17-openjdk' +export JAVA_HOME='/usr/lib/jvm/java-20-openjdk' +#export PATH=$JAVA_HOME/bin:$PATH +export _JAVA_OPTIONS=-Djava.util.prefs.userRoot="$XDG_CONFIG_HOME"/java +#export DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions' +#export _JAVA_AWT_WM_NONREPARENTING=1 +#export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee' +#export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.xml.bind' +#Windows: +#set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee + +# Dart/Flutter +export PATH="/opt/flutter/bin:/usr/lib/dart/bin:$PATH" + +# Go +export GO_PATH=${XDG_DATA_HOME}/go + + +# Javascript +# global node installs (gross) +[[ -d "$XDG_DATA_HOME/node/bin" ]] && path=($XDG_DATA_HOME/node/bin $path) +export NODE_REPL_HISTORY="$XDG_DATA_HOME"/node_repl_history +export NPM_CONFIG_USERCONFIG=$XDG_CONFIG_HOME/npm/npmrc +#export NPM_CONFIG_INIT_AUTHOR_NAME='srdusr' +#export NPM_CONFIG_INIT_AUTHOR_EMAIL='trevorgray@srdusr.com' +#export NPM_CONFIG_INIT_AUTHOR_URL='https://srdusr.com' +#export NPM_CONFIG_INIT_LICENSE='GPL-3.0' +#export NPM_CONFIG_INIT_VERSION='0.0.0' +#export NPM_CONFIG_SIGN_GIT_TAG='true' +export NVM_DIR="$HOME/.config/nvm" +[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" + + +# Ruby +export GEM_PATH="$XDG_DATA_HOME/ruby/gems" +export GEM_SPEC_CACHE="$XDG_DATA_HOME/ruby/specs" +export GEM_HOME="$XDG_DATA_HOME/ruby/gems" +#if [[ -d ~/.gem/ruby ]]; then +# ver=$(find ~/.gem/ruby/* -maxdepth 0 | sort -rV | head -n 1) +# export PATH="$PATH:${ver}/bin" +#fi + + +# Python +# lazy load pyenv +#export PYENV_ROOT=${PYENV_ROOT:-$HOME/.pyenv} +#[[ -a $PYENV_ROOT/bin/pyenv ]] && path=($PYENV_ROOT/bin $path) +#if type pyenv &> /dev/null || [[ -a $PYENV_ROOT/bin/pyenv ]]; then +# function pyenv() { +# unset pyenv +# path=($PYENV_ROOT/shims $path) +# eval "$(command pyenv init -)" +# if which pyenv-virtualenv-init > /dev/null; then +# eval "$(pyenv virtualenv-init -)" +# export PYENV_VIRTUALENV_DISABLE_PROMPT=1 +# fi +# pyenv $@ +# } +#fi +export WORKON_HOME="$XDG_DATA_HOME/virtualenvs" +export JUPYTER_CONFIG_DIR="$XDG_CONFIG_HOME/jupyter" +export IPYTHONDIR="$XDG_CONFIG_HOME/jupyter" +export VIRTUAL_ENV_DISABLE_PROMPT=true + +# PHP +PATH="$HOME/.config/composer/vendor/bin:$PATH" + + +# Lua +export PATH=$PATH:/usr/local/luarocks/bin +#export PATH="$XDG_DATA_HOME/luarocks/bin:$PATH" + +#ver=$(find lua* -maxdepth 0 | sort -rV | head -n 1) +#export LUA_PATH="$LUA_PATH:${ver}/share/lua/5.1/?.lua;${ver}/share/lua/5.1/?/init.lua;;" +#export LUA_CPATH="$LUA_CPATH:${ver}/lib/lua/5.1/?.so;;" + +#LUAROCKS_PREFIX=/usr/local +#export LUA_PATH="$LUAROCKS_PREFIX/share/lua/5.1/?.lua;$LUAROCKS_PREFIX/share/lua/5.1/?/init.lua;;" +#export LUA_CPATH="$LUAROCKS_PREFIX/lib/lua/5.1/?.so;;" + +#export LUA_PATH="<path-to-add>;;" +#export LUA_CPATH="./?.so;/usr/local/lib/lua/5.3/?.so; +# /usr/local/share/lua/5.3/?.so;<path-to-add>" + + +# Program settings +#export MOZ_USE_XINPUT2="1" # Mozilla smooth scrolling/touchpads. + + +# Scaling +#export QT_AUTO_SCREEN_SCALE_FACTOR=0 +#export QT_SCALE_FACTOR=1 +#export QT_SCREEN_SCALE_FACTORS="1;1;1" +#export GDK_SCALE=1 +#export GDK_DPI_SCALE=1 + + +#typeset -U PATH path +export GTK_IM_MODULE='fcitx' +export QT_IM_MODULE='fcitx' +export SDL_IM_MODULE='fcitx' +export XMODIFIERS='@im=fcitx' + + +# Start blinking +export LESS_TERMCAP_mb=$(tput bold; tput setaf 2) # green +# Start bold +export LESS_TERMCAP_md=$(tput bold; tput setaf 2) # green +# Start stand out +export LESS_TERMCAP_so=$(tput bold; tput setaf 3) # yellow +# End standout +export LESS_TERMCAP_se=$(tput rmso; tput sgr0) +# Start underline +export LESS_TERMCAP_us=$(tput smul; tput bold; tput setaf 1) # red +# End Underline +export LESS_TERMCAP_ue=$(tput sgr0) +# End bold, blinking, standout, underline +export LESS_TERMCAP_me=$(tput sgr0). diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc new file mode 100644 index 0000000..b0a6c7a --- /dev/null +++ b/.config/zsh/.zshrc @@ -0,0 +1,582 @@ + +# ███████╗███████╗██╗ ██╗██████╗ ██████╗ +# ╚══███╔╝██╔════╝██║ ██║██╔══██╗██╔════╝ +# ███╔╝ ███████╗███████║██████╔╝██║ +# ███╔╝ ╚════██║██╔══██║██╔══██╗██║ +# ███████╗███████║██║ ██║██║ ██║╚██████╗ +# ╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ + +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +if [[ -n "$SSH_CLIENT" ]]; then + export KEYTIMEOUT=1 +else + export KEYTIMEOUT=15 +fi + +# Tmux default session +if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then + tmux a -t tmux || exec tmux new -s tmux && exit; +fi + +# Enable various options +setopt interactive_comments beep extendedglob nomatch notify completeinword prompt_subst + +########## Vi mode ########## +bindkey -v +bindkey -M viins '^?' backward-delete-char +bindkey -M viins '^[[3~' delete-char +bindkey -M vicmd '^[[3~' delete-char +bindkey -v '^?' backward-delete-char +bindkey -r '\e/' +bindkey -s jk '\e' +bindkey "^W" backward-kill-word +bindkey "^H" backward-delete-char # Control-h also deletes the previous char +bindkey "^U" backward-kill-line +bindkey "^[j" history-search-forward # or you can bind it to the down key "^[[B" +bindkey "^[k" history-search-backward # or you can bind it to Up key "^[[A" + +# Define the 'autosuggest-execute' and 'autosuggest-accept' ZLE widgets +autoload -Uz autosuggest-execute autosuggest-accept +zle -N autosuggest-execute +zle -N autosuggest-accept +bindkey '^X' autosuggest-execute +bindkey '^Y' autosuggest-accept + +# Edit line in vim with alt-e +autoload edit-command-line; zle -N edit-command-line +bindkey '^e' edit-command-line +bindkey '^[e' edit-command-line # alt + e + +# Allow CTRL+D to exit zsh with partial command line (non empty line) +exit_zsh() { exit } +zle -N exit_zsh +bindkey '^D' exit_zsh + +# Auto-completion +autoload -Uz compinit +if [[ -n ${ZDOTDIR}/.zcompdump(#qN.mh+24) ]]; then + compinit; +else + compinit -C; +fi; + +# Accept completion with <tab> or Ctrl+i and go to next/previous suggestions with Vi like keys: Ctrl+n/p +zmodload -i zsh/complist +accept-and-complete-next-history() { + zle expand-or-complete-prefix +} + +zle -N accept-and-complete-next-history +bindkey -M menuselect '^i' accept-and-complete-next-history +bindkey '^n' expand-or-complete +bindkey '^p' reverse-menu-complete +zstyle ':completion:*' menu select=1 + +# Some other useful functionalities +setopt autocd # Automatically cd into typed directory. +stty intr '^q' # free Ctrl+C for copy use Ctrl+q instead +stty lnext '^-' # free Ctrl+V for paste use ^- instead +stty stop undef # Disable ctrl-s to freeze terminal. +stty start undef +#unsetopt BEEP + +# More history for cd and use "cd -TAB" +setopt AUTO_PUSHD # pushes the old directory onto the stack +zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12' + + +########## Prompt(s) ########## + +# Enable colors +autoload -U colors && colors + +# Prompt with Vi insert-mode/normal-mode and blinking '$', note blinking '$' only works on some terminals. +terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1] +git_branch_test_color() { + local ref=$(git symbolic-ref --short HEAD 2> /dev/null) + if [ -n "${ref}" ]; then + if [ -n "$(git status --porcelain)" ]; then + local gitstatuscolor='%F{196}' + else + local gitstatuscolor='%F{82}' + fi + echo "${gitstatuscolor}${ref}" + else + echo "" + fi +} + +# Job indicator +jobs_status_indicator() { + local jobs_output + declare -p jobs_output >/dev/null 2>&1 + if [[ $? -eq 0 ]]; then + unset jobs_output + fi + jobs_output=$(jobs -s) + if [[ -n "$jobs_output" ]]; then + local jobs_count=$(echo "$jobs_output" | wc -l) + echo "jobs: ${jobs_count}" + fi +} + +remote_indicator() { + if [[ -n "$SSH_CONNECTION" || -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then + echo 'ssh ' + else + echo '' + fi +} + +# Version control (git) +autoload -Uz add-zsh-hook vcs_info +zstyle ':vcs_info:*' stagedstr ' +%F{15}staged%f' +zstyle ':vcs_info:*' unstagedstr ' -%F{15}unstaged%f' +zstyle ':vcs_info:*' check-for-changes true +zstyle ':vcs_info:*' actionformats '%F{5}%F{2}%b%F{3}|%F{1}%a%F{5}%f ' +zstyle ':vcs_info:*' formats '%F{208} '$'\uE0A0'' %f$(git_branch_test_color)%f%F{76}%c%F{3}%u%f ' +zstyle ':vcs_info:git*+set-message:*' hooks git-untracked +zstyle ':vcs_info:*' enable git ++vi-git-untracked() { + if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \ + [[ $(git ls-files --other --directory --exclude-standard | sed q | wc -l | tr -d ' ') == 1 ]] ; then + hook_com[unstaged]+='%F{196} !%f%F{15}untracked%f' + fi +} + +# Prompt +function insert-mode() { + echo "-- INSERT --" +} + +function normal-mode() { + echo "-- NORMAL --" +} + +function my_precmd () { + vcs_info + PS1="%{┌─[%F{145}%n%f] %F{39}%0~%f%} ${vcs_info_msg_0_} \$(remote_indicator)\$(jobs_status_indicator) + %{%{$terminfo_down_sc$(insert-mode)$terminfo[rc]%}%{└─%{["%{$(tput setaf 226)%}""%{$(tput blink)%}"%{$%}"%{$(tput sgr0)%}"%{%G]%}%}%}%}" +} + +add-zsh-hook precmd my_precmd + +function set-prompt() { + if [[ ${KEYMAP} == vicmd || ${KEYMAP} == vi-cmd-mode ]]; then + echo -ne '\e[1 q' + VI_MODE=$(normal-mode) + elif [[ ${KEYMAP} == main || ${KEYMAP} == viins || ${KEYMAP} == '' ]]; then + echo -ne '\e[5 q' + VI_MODE=$(insert-mode) + fi + PS1="%{┌─[%F{145}%n%f] %F{39}%0~%f%} ${vcs_info_msg_0_} \$(remote_indicator)\$(jobs_status_indicator) + %{%{$terminfo_down_sc$VI_MODE$terminfo[rc]%}%{└─%{["%{$(tput setaf 226)%}""%{$(tput blink)%}"%{$%}"%{$(tput sgr0)%}"%{%G]%}%}%}%}" +} + +function update-mode-file() { + set-prompt + local current_mode=$(cat ~/.vi-mode) + local new_mode="$VI_MODE" + if [[ "$new_mode" != "$current_mode" ]]; then + echo "$new_mode" >| ~/.vi-mode + fi + if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then + tmux refresh-client -S + fi +} + +function check-nvim-running() { + if pgrep -x "nvim" > /dev/null; then + VI_MODE="" + update-mode-file + if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then + tmux refresh-client -S + fi + else + if [[ ${KEYMAP} == vicmd || ${KEYMAP} == vi-cmd-mode ]]; then + VI_MODE=$(normal-mode) + elif [[ ${KEYMAP} == main || ${KEYMAP} == viins || ${KEYMAP} == '' ]]; then + VI_MODE=$(insert-mode) + fi + update-mode-file + if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then + tmux refresh-client -S + fi + fi +} + +function zle-line-init() { + zle reset-prompt + case "${KEYMAP}" in + vicmd) + echo -ne '\e[1 q' + ;; + main|viins|*) + echo -ne '\e[5 q' + ;; + esac +} + +function zle-keymap-select() { + update-mode-file + zle reset-prompt + case "${KEYMAP}" in + vicmd) + echo -ne '\e[1 q' + ;; + main|viins|*) + echo -ne '\e[5 q' + ;; + esac +} + +preexec () { print -rn -- $terminfo[el]; echo -ne '\e[5 q' ; } + +zle -N zle-line-init +zle -N zle-keymap-select + +TRAPWINCH() { # Trap the WINCH signal to update the mode file on window size changes + update-mode-file +} + +#function nvim-listener() { +# local prev_nvim_status="inactive" +# local nvim_pid="" +# while true; do +# local current_nvim_pid=$(pgrep -x "nvim") +# if [[ -n "$current_nvim_pid" && "$current_nvim_pid" != "$nvim_pid" ]]; then +# # Neovim started +# prev_nvim_status="active" +# nvim_pid="$current_nvim_pid" +# VI_MODE="" # Clear VI_MODE to show Neovim mode +# update-mode-file +# if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then +# tmux refresh-client -S +# fi +# elif [[ -z "$current_nvim_pid" && "$prev_nvim_status" == "active" ]]; then +# # Neovim stopped +# prev_nvim_status="inactive" +# nvim_pid="" +# if [[ ${KEYMAP} == vicmd || ${KEYMAP} == vi-cmd-mode ]]; then +# VI_MODE=$(normal-mode) +# elif [[ ${KEYMAP} == main || ${KEYMAP} == viins || ${KEYMAP} == '' ]]; then +# VI_MODE=$(insert-mode) +# fi +# update-mode-file +# if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then +# tmux refresh-client -S +# fi +# fi +# done +#} + +# Start Neovim listener in the background +#nvim-listener &! +set-prompt + +RPROMPT='%(?..[%F{196}%?%f] )' + + +########## Useful Commands/Alias ########## + +# Define alias for nvim/vim (fallback to vim) +if command -v nvim > /dev/null; then + alias vi='nvim' +else + alias vi='vim' +fi + +# Confirmation # +alias mv='mv -i' +alias cp='cp -i' +alias ln='ln -i' +alias rm='rm -i' + +alias ls='ls --color=auto --group-directories-first' +alias lsd="lsd --group-directories-first" +alias grep='grep --colour=auto' +alias egrep='egrep --colour=auto' +alias fgrep='fgrep --colour=auto' + +# List upto last 10 visited directories using "d" and quickly cd into any specific one +alias d="dirs -v | head -10" + +# Using just a number from "0" to "9" +alias 0="cd +0" +alias 1="cd +1" +alias 2="cd +2" +alias 3="cd +3" +alias 4="cd +4" +alias 5="cd +5" +alias 6="cd +6" +alias 7="cd +7" +alias 8="cd +8" +alias 9="cd +9" + +alias sc="systemctl" +alias jc="journalctl xe" +alias suspend='systemctl suspend && betterlockscreen --lock dimblur' # Suspend(sleep) and lock screen if using systemctl +alias hibernate='systemctl hibernate' # Hibernate +alias lock='DISPLAY=:0 xautolock -locknow' # Lock my workstation screen from my phone +alias oports="sudo lsof -i -P -n | grep -i 'listen'" # List open ports +alias trash_restore='gio trash --restore "$(gio trash --list | fzf | cut -f 1)"' +alias keyname="xev | sed -n 's/[ ]*state.* \([^ ]*\)).*/\1/p'" +alias wget=wget --hsts-file="$XDG_CACHE_HOME/wget-hsts" # wget does not support environment variables + +alias pp='getlast 2>&1 |&tee -a output.txt' +alias -g cap='2>&1 | tee -a output.txt' # Print output of a command NOTE: Must be used in conjunction but no need for "|" symbol +#alias stashrebase='git stash save && git fetch && git rebase origin main && git stash apply' +#alias cfg-stash='config stash save && config fetch && config rebase origin main && config stash apply' + +# Time aliases +alias ber='TZ=Europe/Berlin date' +alias nyc='TZ=America/New_York date' +alias sfo='TZ=America/Los_Angeles date' +alias utc='TZ=Etc/UTC date' + +### Dotfiles +alias config='git --git-dir=$HOME/.cfg --work-tree=$HOME' +cfg_files=$(config ls-tree --name-only -r HEAD) +export CFG_FILES="$cfg_files" + +# Set bare dotfiles repository git environment variables dynamically +function set_git_env_vars() { + # Check if the current command is a package manager command + if [[ "${(%)${(z)history[1]}}" =~ ^(pacman|yay|apt|dnf|brew|npm|pip|gem|go|cargo) ]]; then + return + fi + local git_dir="$(git rev-parse --git-dir -C . 2>/dev/null)" + if [[ -n "$git_dir" ]]; then + local is_bare="$(git -C "$git_dir" rev-parse --is-bare-repository 2>/dev/null)" + if [[ "$is_bare" == "true" ]]; then + export GIT_DIR="$HOME/.cfg" + export GIT_WORK_TREE=$(realpath $(eval echo ~)) + else + unset GIT_DIR + unset GIT_WORK_TREE + fi + else + local root_dir="$(git rev-parse --show-toplevel 2>/dev/null)" + if [[ -n "$root_dir" ]]; then + unset GIT_DIR + export GIT_WORK_TREE="$root_dir" + else + export GIT_DIR="$HOME/.cfg" + export GIT_WORK_TREE=$(realpath $(eval echo ~)) + fi + fi +} + +# Define an auto_cd hook to automatically update Git environment variables +function chpwd() { + set_git_env_vars +} +# Call the function to set Git environment variables when the shell starts up +set_git_env_vars + +function gsp +{ + # Config file for subtrees + # + # Format: + # <prefix>;<remote address>;<remote branch> + # # Lines starting with '#' will be ignored + GIT_SUBTREE_FILE="$PWD/.gitsubtrees" + + if [ ! -f $GIT_SUBTREE_FILE ]; then + echo "Nothing to do - file <`basename $GIT_SUBTREE_FILE`> does not exist." + return + fi + + OLD_IFS=$IFS + IFS=$'\n' + for LINE in $(cat $GIT_SUBTREE_FILE); do + + # Skip lines starting with '#'. + if [[ $LINE = \#* ]]; then + continue + fi + + # Parse the current line. + PREFIX=`echo $LINE | cut -d';' -f 1` + REMOTE=`echo $LINE | cut -d';' -f 2` + BRANCH=`echo $LINE | cut -d';' -f 3` + + # Push to the remote. + echo "config subtree pull --prefix=$PREFIX $REMOTE $BRANCH" + config subtree pull --prefix=$PREFIX $REMOTE $BRANCH + done +} + +# Print previous command into a file +getlast () { + fc -nl $((HISTCMD - 1)) +} + +# Enter directory and list contents +cd() { + if [ -n "$1" ]; then + builtin cd "$@" && ls -pvA --color=auto --group-directories-first + else + builtin cd ~ && ls -pvA --color=auto --group-directories-first + fi +} + +# cd using "up n" as a command up as many directories, example "up 3" +up() { + # default parameter to 1 if non provided + declare -i d=${@:-1} + # ensure given parameter is non-negative. Print error and return if it is + (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1; + # remove last d directories from pwd, append "/" in case result is empty + cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/"; +} + +# cd into $XDG_CONFIG_HOME/$1 directory +c() { + local root=${XDG_CONFIG_HOME:-~/.config} + local dname="$root/$1" + if [[ ! -d "$dname" ]]; then + return + fi + cd "$dname" +} + +# Make and cd into directory and any parent directories +mkcd () { + if [[ -z "$1" ]]; then + echo "Usage: mkcd <dir>" 1>&2 + return 1 + fi + mkdir -p "$1" + cd "$1" +} + +# Back up a file. Usage "backupthis <filename>" +backupthis() { + cp -riv $1 ${1}-$(date +%Y%m%d%H%M).backup; +} + +# Let FZF use ripgrep by default +if type rg &> /dev/null; then + export FZF_DEFAULT_COMMAND='rg --files' + export FZF_DEFAULT_OPTS='-m --height 50% --border' +fi + +# Spawn a clone of current terminal +putstate () { + declare +x >~/environment.tmp + declare -x >>~/environment.tmp + echo cd "$PWD" >>~/environment.tmp +} + +getstate () { + . ~/environment.tmp +} + +# use ctrl-z to toggle in and out of bg +function toggle_fg_bg() { + if [[ $#BUFFER -eq 0 ]]; then + BUFFER="fg" + zle accept-line + else + BUFFER="" + zle clear-screen + fi +} +zle -N toggle_fg_bg +bindkey '^Z' toggle_fg_bg + +# Tmux layout +openSession () { + tmux split-window -h -t + tmux split-window -v -t + tmux resize-pane -U 5 +} + +# Allow nnn filemanager to cd on quit +nnn() { + declare -x +g NNN_TMPFILE=$(mktemp --tmpdir $0.XXXX) + trap "rm -f $NNN_TMPFILE" EXIT + =nnn $@ + [ -s $NNN_TMPFILE ] && source $NNN_TMPFILE +} + +# Extract with one command +extract () { + if [ -f $1 ] ; then + case $1 in + *.tar.bz2) tar xjf $1 ;; + *.tar.gz) tar xzf $1 ;; + *.bz2) bunzip2 $1 ;; + *.rar) rar x $1 ;; + *.gz) gunzip $1 ;; + *.tar) tar xf $1 ;; + *.tbz2) tar xjf $1 ;; + *.tgz) tar xzf $1 ;; + *.zip) unzip $1 ;; + *.Z) uncompress $1 ;; + *.7z) 7z x $1 ;; + *) echo "'$1' cannot be extracted via extract()" ;; + esac + else + echo "'$1' is not a valid file" + fi +} + +# Kubernetes +# kubernetes aliases +if command -v kubectl > /dev/null; then + replaceNS() { kubectl config view --minify --flatten --context=$(kubectl config current-context) | yq ".contexts[0].context.namespace=\"$1\"" ; } + alias kks='KUBECONFIG=<(replaceNS "kube-system") kubectl' + alias kam='KUBECONFIG=<(replaceNS "authzed-monitoring") kubectl' + alias kas='KUBECONFIG=<(replaceNS "authzed-system") kubectl' + alias kar='KUBECONFIG=<(replaceNS "authzed-region") kubectl' + alias kt='KUBECONFIG=<(replaceNS "tenant") kubectl' + + if command -v kubectl-krew > /dev/null; then + path=($XDG_CONFIG_HOME/krew/bin $path) + fi + + rmfinalizers() { + kubectl get deployment "$1" -o json | jq '.metadata.finalizers = null' | kubectl apply -f - + } +fi + +# Alias for android-studio +alias android-studio='/opt/android-studio/bin/studio.sh' + +# NVM +#nvm() { +# local green_color +# green_color=$(tput setaf 2) +# local reset_color +# reset_color=$(tput sgr0) +# echo -e "${green_color}nvm${reset_color} $@" +#} +if [ -s "$NVM_DIR/nvm.sh" ]; then + nvm_cmds=(nvm node npm yarn) + for cmd in "${nvm_cmds[@]}"; do + alias "$cmd"="unalias ${nvm_cmds[*]} && unset nvm_cmds && . $NVM_DIR/nvm.sh && $cmd" + done +fi + + +########## Source Plugins, should be last ########## +#source /usr/share/nvm/init-nvm.sh + +# Load fzf keybindings and completion +source /usr/local/bin/fzf/shell/key-bindings.zsh +source /usr/local/bin/fzf/shell/completion.zsh + +# Suggest aliases for commands +source ~/.config/zsh/plugins/zsh-you-should-use/you-should-use.plugin.zsh + +# Load zsh-syntax-highlighting +source ~/.config/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh + +# Load fish like auto suggestions +source ~/.config/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.plugin.zsh +source ~/.config/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8f91c16 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,76 @@ + +root = true + + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 4 +max_line_length = 10000 + +# Makefile-specific settings +[Makefile] +indent_style = tab +indent_size = 4 + +# C/C++ source files +[*.c] +indent_style = tab +indent_size = 4 + +# TypeScript/JavaScript config +[**.{ts,js}] +indent_size = 2 + +# Json config +[**.json] +indent_size = 2 + +# Lua config +[*.lua] +indent_size = 2 +tab_width = 2 +# [none/single/double] +quote_style = single +# [line break] +break_all_list_when_line_exceed = false +auto_collapse_lines = false +break_before_braces = false +# [preference] +ignore_space_after_colon = false +remove_call_expression_list_finish_comma = false +end_statement_with_semicolon = keep + +# Python config +[*.py] +indent_size = 4 + +# Bash config +[*.bash] +indent_size = 4 + +# Yaml config +[*.yml] +indent_size = 2 + +# Latex config +[**.tex] +trim_trailing_whitespace = false + +# Markdown config +[**.md] +indent_size = 2 +trim_trailing_whitespace = false + +# Textfile config +[**.txt] +trim_trailing_whitespace = false +insert_final_newline = false + +# Snippets config +[**.snippets] +indent_style = tab + diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 0000000..a5555dc --- /dev/null +++ b/.gitconfig @@ -0,0 +1,12 @@ +[user] + name = srdusr + email = trevorgray@srdusr.com +[init] + defaultBranch = main +[alias] + sba ="!f() { git subtree add --prefix $2 $1 main; }; f" + sbu ="!f() { git subtree pull --prefix $2 $1 main; }; f" + stashrebase = "!f() { if [ \"$(git symbolic-ref --short HEAD)\" = \"main\" ]; then git stash save && git fetch && git rebase origin main && git stash apply; else git stash save && git fetch && git rebase origin master && git stash apply; fi; }; f" + dotfiles = "!f() { git --git-dir=$HOME/.cfg --work-tree=$HOME stashrebase; }; f" + + @@ -1,4 +1,48 @@ -plugin/packer_compiled.lua -startup.log -tmp -*.log +.cfg + +# Ignore Packer's compiled files +packer_compiled.lua + +# Ignore Zsh plugins directory +~/.config/zsh/plugins + +# Ignore zcompdump files +zcompdump + +# Ignore .DS_Store files (macOS) +*.DS_Store + +# Ignore .git directory +.git/ + +# Ignore .spl files +*.spl + +# Ignore node_modules directory +node_modules/ + +## Ignore .png files +#*.png + +# Ignore .zip files +*.zip + +# Ignore .pxd files +*.pxd + +# Ignore .local directory +#^.local/ + +# Ignore .cache directory +^.cache/ + +# Ignore downloads directory +^downloads/ + +# Ignore music directory +^music/ + +^images/ +^pictures/ +^machines/ + diff --git a/.gitsubtrees b/.gitsubtrees new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/.gitsubtrees diff --git a/.local/share/fonts/fantasque_sans_mono.ttf b/.local/share/fonts/fantasque_sans_mono.ttf Binary files differnew file mode 100644 index 0000000..2fa4311 --- /dev/null +++ b/.local/share/fonts/fantasque_sans_mono.ttf diff --git a/.local/share/fonts/fira_code_nerd_fonts.ttf b/.local/share/fonts/fira_code_nerd_fonts.ttf Binary files differnew file mode 100644 index 0000000..b19b2f8 --- /dev/null +++ b/.local/share/fonts/fira_code_nerd_fonts.ttf diff --git a/.local/share/fonts/hack_nerd_fonts_mono.ttf b/.local/share/fonts/hack_nerd_fonts_mono.ttf Binary files differnew file mode 100644 index 0000000..cd3d793 --- /dev/null +++ b/.local/share/fonts/hack_nerd_fonts_mono.ttf diff --git a/.local/share/fonts/iosevka_nerd_font.ttf b/.local/share/fonts/iosevka_nerd_font.ttf Binary files differnew file mode 100644 index 0000000..bbb351c --- /dev/null +++ b/.local/share/fonts/iosevka_nerd_font.ttf diff --git a/.local/share/fonts/material_design_iconic_font.ttf b/.local/share/fonts/material_design_iconic_font.ttf Binary files differnew file mode 100644 index 0000000..5d489fd --- /dev/null +++ b/.local/share/fonts/material_design_iconic_font.ttf diff --git a/.local/share/fonts/symbola.ttf b/.local/share/fonts/symbola.ttf Binary files differnew file mode 100644 index 0000000..1248c29 --- /dev/null +++ b/.local/share/fonts/symbola.ttf diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 0000000..c5d13e2 --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,5 @@ +semi: true +singleQuote: true +jsxSingleQuote: true +trailingComma: all +arrowParens: avoid diff --git a/.profile b/.profile new file mode 100644 index 0000000..8def135 --- /dev/null +++ b/.profile @@ -0,0 +1,5 @@ +#!/bin/sh + +[[ -f ~/.config/zsh/.zshenv ]] && source ~/.config/zsh/.zshenv + +export DISPLAY=:0 diff --git a/.scripts/Heads-Up-Display b/.scripts/Heads-Up-Display new file mode 100755 index 0000000..8680123 --- /dev/null +++ b/.scripts/Heads-Up-Display @@ -0,0 +1,28 @@ +#!/bin/sh + +# Created By: srdusr +# Created On: Wed 05 Feb 2023 01:24:37 AM CAT +# Project: bspwm scratchpad (Heads-Up-Display) with tmux session + +if id="$(xdo id -N Heads-Up-Display)" + then bspc node "$id" -g hidden -f + else kitty --class "Heads-Up-Display" -e tmux new-session -A -s HUD -e bash > /dev/null 2>&1 & +fi + +#- - - - - - - - - - + + +### Alternative method + +#id=$(xdotool search --class Heads-Up-Display); +#if [ -z "$id" ]; then +# #kitty --class "Heads-Up-Display" -e tmux new-session -A -s HUD -e bash > /dev/null 2>&1 & +# alacritty --class "Heads-Up-Display" -e tmux new-session -A -s HUD -e bash > /dev/null 2>&1 & +#else +# if [ ! -f /tmp/hide_hud ]; then +# touch /tmp/hide_hud && xdo hide "$id" +# elif [ -f /tmp/hide_hud ]; then +# rm /tmp/hide_hud && xdo show "$id" +# fi +#fi + diff --git a/.scripts/README.md b/.scripts/README.md new file mode 100644 index 0000000..458b3cc --- /dev/null +++ b/.scripts/README.md @@ -0,0 +1 @@ +# scripts diff --git a/.scripts/bspwm-toggle-visibility.sh b/.scripts/bspwm-toggle-visibility.sh new file mode 100755 index 0000000..45a4c53 --- /dev/null +++ b/.scripts/bspwm-toggle-visibility.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Created By: srdusr +# Created On: Mon 18 Sep 2023 18:37:21 CAT +# Project: Bspwm script to toggle visibility of initial window and bring focus back to it + +# Get the ID of the currently focused desktop +current_desktop_id=$(bspc query -D -d focused --names) + +# Get the ID of the first hidden window in the current desktop +hidden_window_id=$(bspc query -N -d "$current_desktop_id" -n .hidden | head -n 1) + +# Check if there's a hidden window in the current desktop +if [[ -n "$hidden_window_id" ]]; then + # There's a hidden window, so unhide it + bspc node "$hidden_window_id" -g hidden=off + # Bring focus back to the previously hidden window + bspc node -f "$hidden_window_id" +else + # There's no hidden window in the current desktop, hide the first available window + first_window_id=$(bspc query -N -n focused.window) + bspc node "$first_window_id" -g hidden=on +fi diff --git a/.scripts/bspwm_resize.sh b/.scripts/bspwm_resize.sh new file mode 100755 index 0000000..29ab5cf --- /dev/null +++ b/.scripts/bspwm_resize.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +size=${2:-'10'} +dir=$1 + +# Find current window mode +is_tiled() { +bspc query -T -n | grep -q '"state":"tiled"' +} +# If the window is floating, move it +if ! is_tiled; then +#only parse input if window is floating,tiled windows accept input as is + case "$dir" in + west) switch="-w" + sign="-" + ;; + east) switch="-w" + sign="+" + ;; + north) switch="-h" + sign="-" + ;; + south) switch="-h" + sign="+" + ;; + esac + xdo resize ${switch} ${sign}${size} + +# Otherwise, window is tiled: switch with window in given direction +else + case "$dir" in + west) bspc node @west -r -$size || bspc node @east -r -${size} + ;; + east) bspc node @west -r +$size || bspc node @east -r +${size} + ;; + north) bspc node @south -r -$size || bspc node @north -r -${size} + ;; + south) bspc node @south -r +$size || bspc node @north -r +${size} + ;; + esac +fi + +##!/bin/bash +# +#[ "$#" -eq 3 ] || { echo "Needs exactly three arguments."; exit 1; } +# +#motion="$1" +#direction="$2" +#size="$3" +# +#if [ "$motion" = 'expand' ]; then +# # These expand the window's given side +# case "$direction" in +# north) bspc node -z top 0 -"$size" ;; +# east) bspc node -z right "$size" 0 ;; +# south) bspc node -z bottom 0 "$size" ;; +# west) bspc node -z left -"$size" 0 ;; +# esac +#else +# # These contract the window's given side +# case "$direction" in +# north) bspc node -z top 0 "$size" ;; +# east) bspc node -z right -"$size" 0 ;; +# south) bspc node -z bottom 0 -"$size" ;; +# west) bspc node -z left "$size" 0 ;; +# esac +#fi diff --git a/.scripts/check-updates.sh b/.scripts/check-updates.sh new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/.scripts/check-updates.sh diff --git a/.scripts/colors.sh b/.scripts/colors.sh new file mode 100755 index 0000000..fc1c10c --- /dev/null +++ b/.scripts/colors.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +colors=$@ +for (( n=0; n < $colors; n++ )) do + printf " [%d] $(tput setaf $n)%s$(tput sgr0)" $n "Hello World! +" +done +PADDING='Padding' + +main() { + local xterm_start=0 \ + xterm_width=8 \ + xterm_height=2 + + local cube_start=$((xterm_start + xterm_width * xterm_height)) \ + cube_width=6 \ + cube_height=$((6 * 6)) + + local greys_start=$((cube_start + cube_width * cube_height)) \ + greys_width=8 \ + greys_height=3 + + color_block $xterm_start $xterm_width $xterm_height + color_block $cube_start $cube_width $cube_height use_padding + color_block $greys_start $greys_width $greys_height + echo +} + +color_block() { + local start=$1 width=$2 height=$3 use_padding=$4 + local max s color_nums colors + + max=$((start + width * height - 1)) + + echo + for s in $(seq $start $width $max); do + color_nums=$(seq $s $((s + width - 1))) + colors="${use_padding:+$PADDING }${color_nums}${use_padding:+ $PADDING}" + + printf '%s%s %s%s\n' \ + "$(fg_bars $colors)" $ansi_reset \ + "$(bg_bars $colors)" $ansi_reset + done +} + +fg_bars() { + for color in $@; do + color_bar ansi_fg $color '' + done +} + +bg_bars() { + for color in $@; do + color_bar ansi_bg $color ' ' + done +} + +color_bar() { + local ansi=$1 color=$2 trail=$3 + + if [ "$color" == $PADDING ]; then + printf '%s %s' $ansi_reset "$trail" + else + local color_seq=$($ansi $color) + printf '%s %03d%s' $color_seq $color "$trail" + fi +} + +ansi_reset=$'\033[0m' + +ansi_fg() { + printf '\033[38;5;%dm' $1 +} + +ansi_bg() { + printf '\033[48;5;%dm' $1 +} + +main diff --git a/.scripts/cryptocheck b/.scripts/cryptocheck new file mode 100755 index 0000000..02ba42d --- /dev/null +++ b/.scripts/cryptocheck @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +if [ ! -d ~/.cache/crypto ]; then + mkdir ~/.cache/crypto +fi +ticker=(BTC ETH ADA DOT SOL XMR) + +for currency in "${ticker[@]}"; do + echo "$currency" +done | while read coin + do + price=$(curl rate.sx/1$coin) + if [ $coin = "BTC" ]; then + icon= + elif [ $coin = "ETH" ]; then + icon= + elif [ $coin = "ADA" ]; then + icon= + elif [ $coin = "DOT" ]; then + icon= + elif [ $coin = "SOL" ]; then + icon= + elif [ $coin = "XMR" ]; then + icon= + fi + + echo "$icon $coin: $price" > ~/.cache/crypto/$coin + + done + +date > ~/.cache/crypto/time + diff --git a/.scripts/cryptonotify b/.scripts/cryptonotify new file mode 100755 index 0000000..47883c3 --- /dev/null +++ b/.scripts/cryptonotify @@ -0,0 +1,19 @@ +#!/bin/sh +source cryptocheck +Output= +for file in ~/.cache/crypto/* +do + if [ ! -z "$Output" ]; then + if [ ! $(basename $file) = "time" ]; then + Output="$Output\n$(cat $file)" + fi + else + if [ ! $(basename $file) = "time" ]; then + Output="$Output$(cat $file)" + fi + fi + +done + +Output="$Output\n$(cat ~/.cache/crypto/time)" +notify-send "Crypto Prices" "$Output" diff --git a/.scripts/dotfiles.sh b/.scripts/dotfiles.sh new file mode 100755 index 0000000..b231367 --- /dev/null +++ b/.scripts/dotfiles.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# Set the bare dotfiles repo directory +dotfiles_dir="$HOME/.cfg" + +# Set the home directory +home_dir="$HOME" + +# Exclude the .cfg directory and any other files/directories you want to ignore +exclude_list=(".cfg") + +# Change to the home directory +cd "$home_dir" + +# Get a list of all dotfiles in the repository +files=$(find "$dotfiles_dir" -maxdepth 1 -type f -not -name ".*" -not -name "${exclude_list[*]}" -printf "%f\n") + +# Link each file to its corresponding location in $HOME +for file in $files; do + ln -sf "$dotfiles_dir/$file" "$home_dir/.$file" +done + +# Get a list of all dot directories in the repository +dirs=$(find "$dotfiles_dir" -maxdepth 1 -type d -not -path "$dotfiles_dir" -not -name ".*" -not -name "${exclude_list[*]}" -printf "%f\n") + +# Link each directory to its corresponding location in $HOME +for dir in $dirs; do + ln -sf "$dotfiles_dir/$dir" "$home_dir/.$dir" +done + +# Remove any symlinks that are no longer present in the repo +while IFS= read -r -d '' link; do + if [[ ! -e "$link" ]]; then + rm "$link" + fi +done < <(find "$home_dir" -maxdepth 1 -type l -name ".*" -not -name ".cfg" -print0) + diff --git a/.scripts/ffmpeg b/.scripts/ffmpeg new file mode 100755 index 0000000..2258fbd --- /dev/null +++ b/.scripts/ffmpeg @@ -0,0 +1,24 @@ +#!/bin/bash + +# audio +A="$(pactl list sources | grep 'analog.*monitor' | awk '{print $2}')" +# screen size +S="$(xdpyinfo | grep dimensions | awk '{print $2}')" +# file name +N="$(date +"%m-%d-%Y_%I:%M%p").mp4" + +# Desktop audio + screen recording +ffmpeg \ +-s "$S" -r 25 -f x11grab -i :0.0+0,0 \ +-ac 2 ~/"$N" + +# ffmpeg can output high quality GIF. Before you start it is always recommended to use a recent version: download or compile. + +# ffmpeg -ss 30 -t 3 -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif + +# This example will skip the first 30 seconds (-ss 30) of the input and create a 3 second output (-t 3). +# fps filter sets the frame rate. A rate of 10 frames per second is used in the example. +# scale filter will resize the output to 320 pixels wide and automatically determine the height while preserving the aspect ratio. The lanczos scaling algorithm is used in this example. +# palettegen and paletteuse filters will generate and use a custom palette generated from your input. These filters have many options, so refer to the links for a list of all available options and values. Also see the Advanced options section below. +# split filter will allow everything to be done in one command and avoids having to create a temporary PNG file of the palette. +# Control looping with -loop output option but the values are confusing. A value of 0 is infinite looping, -1 is no looping, and 1 will loop once meaning it will play twice. So a value of 10 will cause the GIF to play 11 times. diff --git a/.scripts/get_zle_keymap_select.sh b/.scripts/get_zle_keymap_select.sh new file mode 100755 index 0000000..1e2eaf4 --- /dev/null +++ b/.scripts/get_zle_keymap_select.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# Get the value of the zle-keymap-select variable +value=$(print -v zle-keymap-select) + +# Specify the file path to save the value +file_path="~/file.txt" + +# Write the value to the file +echo "$value" > "$file_path" + +# Optionally, you can also print the value to the console +echo "The value of zle-keymap-select is: $value" diff --git a/.scripts/gsettings.sh b/.scripts/gsettings.sh new file mode 100755 index 0000000..0cd28c2 --- /dev/null +++ b/.scripts/gsettings.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# Disable screen lock +gsettings set org.gnome.desktop.screensaver lock-enabled false +gsettings set org.gnome.desktop.session idle-delay 0 + +# Mutter Overlay Key +gsettings set org.gnome.mutter overlay-key '' + +# Disable update notification +#gsettings set org.gnome.software download-updates false +#gsettings set com.ubuntu.update-notifier no-show-notifications true +#sudo rm /etc/xdg/autostart/upg-notifier-autostart.desktop + +#sudo mv /etc/xdg/autostart/update-notifier.desktop /etc/xdg/autostart/update-notifier.desktop.old +#sudo mv /etc/xdg/autostart/gnome-software-service.desktop /etc/xdg/autostart/gnome-software-service.desktop.old + +# Custom Keybinding Names +gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']" + +# Custom Keybinding 0 +gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ binding "<Alt>T" +gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ command "scratchpad" +gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ name "scratchpad" + +# Disable keyboard plugin +gsettings set org.gnome.settings-daemon.plugins.keyboard active false diff --git a/.scripts/killandnotify b/.scripts/killandnotify new file mode 100755 index 0000000..2e7222e --- /dev/null +++ b/.scripts/killandnotify @@ -0,0 +1,4 @@ +#!/bin/sh +# Kills an application and sends a notification that it's been killed + +killall "$1" && notify-send "$1" "$2" diff --git a/.scripts/layer.sh b/.scripts/layer.sh new file mode 100755 index 0000000..4b17ed1 --- /dev/null +++ b/.scripts/layer.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +current_layer="$(bspc query -T -n | jq -r '.client.layer')" +case $1 in + +|-) + declare -A _layers=( [below]=0 [normal]=1 [above]=2 ) + layers=( below normal above ) + maxl=$(( ${#layers[@]} - 1 )) + current_layer="$(bspc query -T -n | jq -r '.client.layer')" + i=$(( ${_layers[$current_layer]} $1 1 )) + if [[ $i -lt 0 ]]; then + i=0 + elif [[ $i -gt $maxl ]]; then + i=$maxl + fi + #cycle? nah + #i=$(( (${_layers[$current_layer]} + ${#layers[@]} ${1} 1) % ${#layers[@]} )) + new_layer="${layers[$i]}" + ;; + *) + new_layer="$(bspc query -T -n | jq -r '.client.lastLayer')" + ;; +esac +[[ "$current_layer" != "$new_layer" ]] && bspc node -l "$new_layer" diff --git a/.scripts/neovim.sh b/.scripts/neovim.sh new file mode 100755 index 0000000..39554cb --- /dev/null +++ b/.scripts/neovim.sh @@ -0,0 +1,421 @@ +#!/bin/bash + +# Created By: srdusr +# Created On: Sat 12 Aug 2023 13:11:39 CAT +# Project: Install/update/uninstall/change version Neovim script, primarily for Linux but may work in other platforms + +# Dependencies: wget/curl, fuse + +# Color definitions +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +# Function to handle errors +handle_error() { + local message="$1" + printf "${RED}Error: $message${NC}\n" +} + +# Check if necessary dependencies are installed +check_dependencies() { + if [ -x "$(command -v wget)" ]; then + DOWNLOAD_COMMAND="wget" + elif [ -x "$(command -v curl)" ]; then + DOWNLOAD_COMMAND="curl" + else + printf "${RED}Error: Neither wget nor curl found. Please install one of them to continue!${NC}\n" + exit 1 + fi +} + +# Check for privilege escalation tools +check_privilege_tools() { + if [ -x "$(command -v sudo)" ]; then + PRIVILEGE_TOOL="sudo" + elif [ -x "$(command -v doas)" ]; then + PRIVILEGE_TOOL="doas" + elif [ -x "$(command -v pkexec)" ]; then + PRIVILEGE_TOOL="pkexec" + elif [ -x "$(command -v dzdo)" ]; then + PRIVILEGE_TOOL="dzdo" + elif [ "$(id -u)" -eq 0 ]; then + PRIVILEGE_TOOL="" # root + else + PRIVILEGE_TOOL="" # No privilege escalation mechanism found + printf "\n${RED}Error: No privilege escalation tool (sudo, doas, pkexec, dzdo, or root privileges) found. You may not have sufficient permissions to run this script.${NC}\n" + printf "\nAttempt to continue Installation (might fail without a privilege escalation tool)? [yes/no] " + read continue_choice + case $continue_choice in + [Yy] | [Yy][Ee][Ss]) ;; + [Nn] | [Nn][Oo]) exit ;; + *) handle_error "Invalid choice. Exiting..." && exit ;; + esac + fi +} + +# Check if Neovim is already installed +check_neovim_installed() { + if [ -x "$(command -v nvim)" ]; then + return 0 # Neovim is installed + else + return 1 # Neovim is not installed + fi +} + +# Nightly version +nightly_version() { + local url="https://github.com/neovim/neovim/releases/download/nightly/nvim.appimage" + install_neovim "$url" + local version_output=$(nvim --version) + version_id="Nightly $(echo "$version_output" | grep -oP 'NVIM \d+\.\d+')" +} + +# Stable version +stable_version() { + local url="https://github.com/neovim/neovim/releases/download/stable/nvim.appimage" + install_neovim "$url" + local version_output=$(nvim --version) + version_id="Stable $(echo "$version_output" | grep -oP 'NVIM \d+\.\d+')" +} + +# Specific version +specific_version() { + local version="$1" + + # Add 'v' prefix if not present + if [[ $version != v* ]]; then + version="v$version" + fi + + local url="https://github.com/neovim/neovim/releases/download/$version/nvim.appimage" + install_neovim "$url" + local version_output=$(nvim --version) + version_id="Version $version $(echo "$version_output" | grep -oP 'NVIM \d+\.\d+')" +} + +# Function to download a file using wget or curl +download_file() { + local url="$1" + local output="$2" + + if [ "$DOWNLOAD_COMMAND" = "wget" ]; then + if ! "$DOWNLOAD_COMMAND" -q --show-progress -O "$output" "$url"; then + handle_error "Download failed. Exiting..." + exit 1 + fi + elif [ "$DOWNLOAD_COMMAND" = "curl" ]; then + if ! "$DOWNLOAD_COMMAND" --progress-bar -# -o "$output" "$url"; then + handle_error "Download failed. Exiting..." + exit 1 + fi + else + echo "Unsupported download command: $DOWNLOAD_COMMAND" + exit 1 + fi +} + +# Check if a specific version of Neovim exists +version_exists() { + local version="$1" + + # Add 'v' prefix if not present + if [[ $version != v* ]]; then + version="v$version" + fi + + # Fetch all the release tags from GitHub + ALL_TAGS=$(curl -s "https://api.github.com/repos/neovim/neovim/tags" | grep '"name":' | cut -d '"' -f 4) + + # Check if the desired version is in the list of release tags + if echo "$ALL_TAGS" | grep -q "$version"; then + return 0 # Version exists + else + return 1 # Version does not exist + fi +} + +# Update Neovim to the latest version (nightly/stable) +update_version() { + valid_choice=false + while [ "$valid_choice" = false ]; do + # Determine which version to update to (nightly/stable) + printf "Select version to install/update to:\n" + printf " 1. Nightly\n" + printf " 2. Stable\n" + printf " 3. Choose specific version by tag\n" + printf "Enter the number corresponding to your choice (1/2/3): " + read update_choice + + case $update_choice in + 1) + version="Nightly" + nightly_version + valid_choice=true + ;; + 2) + version="Stable" + stable_version + valid_choice=true + ;; + 3) + # Ask user for specific version + read -p "Enter the specific version (e.g., v0.1.0): " version + # Normalize version + if [[ $version != v* ]]; then + version="v$version" + fi + # Check if the specific version exists on GitHub releases + if version_exists "$version"; then + # Install specific version + specific_version "$version" # Pass the normalized version to the function + valid_choice=true + else + printf "${RED}The specified version $version does not exist.${NC}\n" + fi + ;; + + *) + handle_error "Invalid choice. Please enter a valid option (1, 2 or 3)." + ;; + esac + done + +} + +# Install Neovim +install_neovim() { + local url="$1" + local install_action="$3" + + if [ "$install_action" = "installed" ]; then + printf "Downloading and installing Neovim $version...\n" + else + printf "${GREEN}Updating Neovim to the latest version ($version)...${NC}\n" + fi + + # Determine the platform-specific installation steps + case "$(uname -s)" in + Linux) + printf "Detected Linux OS.\n" + if [ -x "$(command -v fusermount)" ]; then + printf "FUSE is available. Downloading and running the AppImage...\n" + download_file "$url" "nvim.appimage" + chmod u+x nvim.appimage + "$PRIVILEGE_TOOL" cp nvim.appimage /usr/local/bin/nvim + "$PRIVILEGE_TOOL" mv nvim.appimage /usr/bin/nvim + else + printf "FUSE is not available. Downloading and extracting the AppImage...\n" + download_file "$url" "nvim.appimage" + chmod u+x nvim.appimage + ./nvim.appimage --appimage-extract + "$PRIVILEGE_TOOL" cp squashfs-root/usr/bin/nvim /usr/local/bin + "$PRIVILEGE_TOOL" mv squashfs-root/usr/bin/nvim /usr/bin + fi + ;; + + Darwin) + printf "Detected macOS.\n" + download_file "$url" "nvim-macos.tar.gz" + xattr -c ./nvim-macos.tar.gz + tar xzvf nvim-macos.tar.gz + "$PRIVILEGE_TOOL" cp nvim-macos/bin/nvim /usr/local/bin + "$PRIVILEGE_TOOL" mv nvim-macos/bin/nvim /usr/bin/nvim + ;; + + MINGW*) + printf "Detected Windows.\n" + download_file "$url" "nvim.appimage" + chmod +x nvim.appimage + if [ "$PRIVILEGE_TOOL" = "sudo" ]; then + "$PRIVILEGE_TOOL" cp nvim.appimage /usr/local/bin/nvim + "$PRIVILEGE_TOOL" mv /usr/local/bin/nvim /usr/bin + elif [ "$PRIVILEGE_TOOL" = "" ]; then + cp nvim.appimage /usr/local/bin/nvim + mv /usr/local/bin/nvim /usr/bin + else + printf "No privilege escalation tool found. Cannot install Neovim on Windows.\n" + fi + ;; + + *) + printf "Unsupported operating system.\n" + exit 1 + ;; + esac + # Check if the installation was successful + if [ $? -eq 0 ]; then + if [ "$install_action" = "installed" ]; then + printf "${GREEN}Neovim $version has been installed successfully!${NC}\n" + else + printf "${GREEN}Neovim has been updated successfully to $version!${NC}\n" + fi + else + printf "${RED}Error: Neovim installation/update failed.${NC}\n" + exit 1 + fi +} + +# Uninstall Neovim +uninstall_neovim() { + printf "${RED}Uninstalling Neovim...${NC}\n" + + # Detect the operating system to determine the appropriate uninstallation method + case "$(uname -s)" in + Linux) + printf "Detected Linux OS.\n" + "$PRIVILEGE_TOOL" rm /usr/local/bin/nvim + "$PRIVILEGE_TOOL" rm /usr/bin/nvim + ;; + + Darwin) + printf "Detected macOS.\n" + "$PRIVILEGE_TOOL" rm /usr/local/bin/nvim + "$PRIVILEGE_TOOL" rm /usr/bin/nvim + ;; + + MINGW*) + printf "Detected Windows.\n" + if [ "$PRIVILEGE_TOOL" = "sudo" ]; then + "$PRIVILEGE_TOOL" rm /usr/local/bin/nvim + "$PRIVILEGE_TOOL" rm /usr/bin/nvim + else + [ "$PRIVILEGE_TOOL" = "" ] + rm /usr/local/bin/nvim + rm /usr/bin/nvim + fi + ;; + *) + printf "Unsupported operating system.\n" + ;; + esac + + printf "${GREEN}Neovim has been uninstalled successfully!${NC}\n" +} + +# Check if Neovim is running +check_neovim_running() { + if pgrep nvim >/dev/null; then + printf "${RED}Error: Neovim is currently running. Please close Neovim before proceeding.${NC}\n" + read -p "Do you want to forcefully terminate Neovim and continue? [yes/no] " terminate_choice + + case $terminate_choice in + [Yy] | [Yy][Ee][Ss]) + pkill nvim # Forcefully terminate Neovim + ;; + [Nn] | [Nn][Oo]) + echo "Exiting..." + exit 1 + ;; + *) + handle_error "Invalid choice." + ;; + esac + fi +} + +check_neovim_running + +# Define the variable to control the prompt +SHOW_PROMPT=1 + +# Check if necessary dependencies are installed +check_dependencies + +# Check for privilege escalation tools +check_privilege_tools + +# Check if Neovim is already installed and ask the user if want to install it +if check_neovim_installed; then + printf "${GREEN}Neovim is already installed!${NC}\n" +else + printf "${RED}Neovim is not installed.${NC}\n" + read -p "Install Neovim? (y/n): " install_choice + + case $install_choice in + [Yy]) + update_version + ;; + [Nn]) + echo "Exiting..." + exit + ;; + *) + handle_error "Invalid choice. Please enter 'y' for yes or 'n' for no." + ;; + esac +fi + +# Function to check for updates and display breaking changes +check_version_updates() { + local latest_version_url="https://api.github.com/repos/neovim/neovim/releases/latest" + local latest_version="" + + if [ -x "$(command -v curl)" ]; then + latest_version=$(curl -sSL "$latest_version_url" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') + elif [ -x "$(command -v wget)" ]; then + latest_version=$(wget -qO - "$latest_version_url" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') + else + printf "${RED}Error: Neither curl nor wget found. Please install one of them to continue!${NC}\n" + exit 1 + fi + + if version_exists "$latest_version"; then + printf "${GREEN}An update is available!${NC}\n" + display_breaking_changes "$latest_version" + else + printf "You have the latest version of Neovim.\n" + fi +} + +# Function to display breaking changes for a specific version +display_breaking_changes() { + local version="$1" + local changelog_url="https://github.com/neovim/neovim/releases/tag/$version" + local changelog="" + + if [ -x "$(command -v curl)" ]; then + changelog=$(curl -sSL "$changelog_url" | grep -oE '<h1>Breaking Changes.*?</ul>' | sed 's/<[^>]*>//g') + elif [ -x "$(command -v wget)" ]; then + changelog=$(wget -qO - "$changelog_url" | grep -oE '<h1>Breaking Changes.*?</ul>' | sed 's/<[^>]*>//g') + else + printf "${RED}Error: Neither curl nor wget found. Please install one of them to continue!${NC}\n" + exit 1 + fi + + printf "\nBreaking Changes in Neovim $version:\n" + printf "$changelog\n" +} + +# Main loop +while [ "$SHOW_PROMPT" -gt 0 ]; do + printf "Select an option:\n" + printf " 1. Install/update Neovim\n" + printf " 2. Check for updates\n" + printf " 3. Uninstall Neovim\n" + printf " 4. Run Neovim\n" + printf " 5. Quit\n" + read -p "Enter a number or press 'q' to quit: " choice + + case $choice in + 1) + update_version + ;; + 2) + check_version_updates + ;; + 3) + uninstall_neovim + ;; + 4) + nvim + ;; + 5 | [Qq]) + echo "Exiting..." + exit + ;; + *) + handle_error "Invalid choice. Please choose a valid option by entering the corresponding number or press 'q' to 'quit'." + ;; + esac +done diff --git a/.scripts/opacity-change.sh b/.scripts/opacity-change.sh new file mode 100755 index 0000000..b509936 --- /dev/null +++ b/.scripts/opacity-change.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +set -eu +[[ -n ${DEBUG:-} ]] && set -x + +#### Example alacritty.yml usage +#key_bindings: +# - { key: N, mods: Control|Shift, action: SpawnNewInstance } +# - { key: O, mods: Control|Shift, command: { program: "opacity-change.sh", args: ["-"] } } +# - { key: P, mods: Control|Shift, command: { program: "opacity-change.sh", args: ["+"] } } + + +operation="${1:-}${2:-}" # Arg #1 & #2 (in case the user misinterpreted a space in the usage), Default '' +step="${operation:1}" # Substring from char index 1 +step="${step:-1}" # Default '1' +operation="${operation:0:1}" # Substring from char index 0 length of 1 +config_file="$HOME/.config/alacritty/alacritty.yml" +config_field="opacity" +tmp_file="/tmp/$(basename $config_file).$(date +%s)" +current_value=$(sed 's/#.*//g; /\b'"$config_field"':/!d; s/.*: \?//' < "$config_file") + +case $operation in +"-") + verb="Decreasing" ;; +"+") + verb="Increasing" ;; +*) + echo "Usage: ${BASH_SOURCE[0]} (-|+)[int]"; exit 255 ;; +esac + +new_value="$(awk '{n=$1+$2/10; print (n<0 ? 0 : n>1 ? 1 : n)}' <<<"$current_value $operation$step")" +echo "$verb $config_field from $current_value to $new_value" >&2 +cp "$config_file" "$tmp_file" +sed "s/\b$config_field:.*/$config_field: $new_value/" "$tmp_file" > "$config_file" + diff --git a/.scripts/powermenu b/.scripts/powermenu new file mode 100755 index 0000000..7bd913e --- /dev/null +++ b/.scripts/powermenu @@ -0,0 +1,38 @@ +#!/bin/bash + +# display a power menu to: shutdown, reboot, +# lock, logout, and suspend. This script can be +# executed by clicking on the polybar powermenu module +# or with a keyboard shortcut + +# options to be displayed +shutdown=" Shutdown" +reboot=" Reboot" +lock=" Lock" +logout=" Logout" +suspend=" Suspend" + +uptime=$(uptime -p | sed -e 's/up //g') + +# options passed into variable +options="$shutdown\n$reboot\n$lock\n$logout\n$suspend" + +chosen="$(echo -e "$options" | rofi -theme ~/.config/rofi/styles/powermenu.rasi -lines 5 -dmenu -p "$uptime")" + +case $chosen in +$shutdown) + systemctl poweroff + ;; +$reboot) + systemctl reboot + ;; +$lock) + betterlockscreen --lock dimblur + ;; +$logout) + bspc quit + ;; +$suspend) + systemctl suspend + ;; +esac diff --git a/.scripts/qemu-helper.sh b/.scripts/qemu-helper.sh new file mode 100755 index 0000000..0d38aba --- /dev/null +++ b/.scripts/qemu-helper.sh @@ -0,0 +1,172 @@ +#!/bin/bash + +# Created By: srdusr +# Created On: Wed 02 Aug 2023 16:16:21 PM CAT +# Project: QEMU setup/opener helper wrapper script + +# Set global variables for VM parameters +ram_size="4G" + +# Function to prompt user for VM parameters +function get_vm_parameters() { + read -p "Enter VM name (default: vm): " vm_name + vm_name=${vm_name:-vm} + + # Set the default ISO file path to ~/machines/images + default_iso_path="$HOME/machines/images" + + # Generate completions for ISO and IMG files in the images directory + COMPREPLY=() + local files=$(compgen -G "$default_iso_path/*.{iso,img}" -o plusdirs) + for file in $files; do + COMPREPLY+=("$file") + done + + # Use read with -i and -e options for tab-completion + read -ep "Enter ISO file path (default: $default_iso_path): " -i "$default_iso_path" iso_path + + # Manually expand the ~ to the user's home directory + iso_path=$(eval echo "$iso_path") + + # Validate the user input + while [ ! -f "$iso_path" ]; do + read -ep "Invalid file path. Enter a valid ISO file path: " iso_path + done + + # Check if the selected file is an IMG file + if [[ "$iso_path" == *.img ]]; then + guest_os="windows" + else + guest_os="linux" + fi + + # Show available disk space before asking for disk image size + echo "Available disk space:" + df -h "$vm_images_path" + + read -p "Enter disk image size in GB (default: 10G): " disk_size + disk_size=${disk_size:-10G} + + read -p "Enter RAM size in GB (default: 4G): " ram_size + ram_size=${ram_size:-4G} + + # Check if the RAM size is in the correct format (e.g., "4G") + while ! [[ $ram_size =~ ^[0-9]+[kKmMgGtTpPeE]$ ]]; do + read -p "Invalid RAM size format. Enter RAM size in GB (e.g., 4G): " ram_size + done + + read -p "Enter number of CPU cores (default: 2): " cpu_cores + cpu_cores=${cpu_cores:-2} +} + + +# Function to list available VMs +function list_vms() { + echo "Available VMs:" + for vm_file in "$vm_images_path"/*.qcow2; do + vm=$(basename "$vm_file" .qcow2) + echo " - $vm" + done +} + +# Function to list available ISO and IMG files in the images directory +function list_iso_img_files() { + echo "Available ISO and IMG files in $iso_images_path:" + iso_img_files=() + while IFS= read -r -d $'\0' file; do + iso_img_files+=("$file") + done < <(find "$iso_images_path" -type f \( -iname \*.iso -o -iname \*.img \) -print0) + + for ((i = 0; i < ${#iso_img_files[@]}; i++)); do + echo " $((i + 1)). ${iso_img_files[i]##*/}" + done +} + +# Function to check if VM is already running +function is_vm_running() { + vm_name=$1 + if ps aux | grep -v grep | grep -q "[q]emu-system-x86_64.*$vm_name"; then + return 0 + else + return 1 + fi +} + +# Function to start VM +function start_vm() { + vm_name=$1 + is_vm_running "$vm_name" + if [ $? -eq 0 ]; then + echo "VM '$vm_name' is already running." + return + fi + + # VM parameters + qemu_cmd="qemu-system-x86_64 -enable-kvm -machine type=q35 -m $ram_size -cpu host -smp 2 -vga virtio" + qemu_cmd+=" -device qemu-xhci -device usb-tablet -device usb-kbd -device virtio-net,netdev=user0 -netdev user,id=user0,hostfwd=tcp::5555-:22" + qemu_cmd+=" -cdrom \"$iso_path\" -drive file=\"$vm_images_path/$vm_name.qcow2\",index=0,media=disk,if=virtio" + + if [[ $guest_os == "windows" ]]; then + qemu_cmd+=" -drive file=\"$iso_images_path/virtio-win.iso\",index=3,media=cdrom" + fi + + qemu_cmd+=" -boot menu=on" + qemu_cmd+=" -net nic -net user,hostname=$vm_name -name \"$vm_name\"" + + echo "Starting VM: $vm_name" + eval "$qemu_cmd" +} + +# Main script starts here +vm_images_path="$HOME/machines/vm" +iso_images_path="$HOME/machines/images" + +# Check if directories exist +mkdir -p "$vm_images_path" +mkdir -p "$iso_images_path" + +# List available VMs +list_vms + +# List available ISO and IMG files in the images directory +list_iso_img_files + +# Ask the user if they want to use an existing VM or create a new one +read -p "Do you want to use an existing VM? (y/n): " use_existing_vm +if [[ $use_existing_vm =~ ^[Yy]$ ]]; then + read -p "Enter the name of the existing VM: " existing_vm_name + while [ ! -f "$vm_images_path/$existing_vm_name.qcow2" ]; do + echo "VM '$existing_vm_name' does not exist." + read -p "Enter a valid existing VM name: " existing_vm_name + done + vm_name=$existing_vm_name +else + # Prompt user for VM parameters + get_vm_parameters + + # Check if VM already exists + if [ -f "$vm_images_path/$vm_name.qcow2" ]; then + read -p "VM '$vm_name' already exists. Do you want to start it? (y/n): " start_vm_choice + if [[ $start_vm_choice =~ ^[Yy]$ ]]; then + start_vm "$vm_name" + exit 0 + fi + else + # Create new VM + echo "Creating new VM: $vm_name" + qemu-img create -f qcow2 "$vm_images_path/$vm_name.qcow2" "$disk_size" + start_vm "$vm_name" + exit 0 + fi +fi + +# If an existing VM is selected, ask if the user wants to modify its parameters +read -p "Do you want to modify the VM parameters? (y/n): " modify_vm_params +if [[ $modify_vm_params =~ ^[Yy]$ ]]; then + get_vm_parameters +fi + +# Start the VM +start_vm "$vm_name" + +echo "Script execution completed." diff --git a/.scripts/random_data.py b/.scripts/random_data.py new file mode 100755 index 0000000..071ab7c --- /dev/null +++ b/.scripts/random_data.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 + +import os +import random +import string +import json +import datetime +import csv + + +def generate_random_string(length, charset=string.ascii_letters): + """Generate a random string of given length and character set.""" + return ''.join(random.choice(charset) for _ in range(length)) + + +def generate_random_number(min_value, max_value): + """Generate a random number within the specified range.""" + return random.randint(min_value, max_value) + + +def generate_random_date(start_date, end_date): + """Generate a random date within the specified range.""" + time_between_dates = end_date - start_date + days_between_dates = time_between_dates.days + random_number_of_days = random.randrange(days_between_dates) + random_date = start_date + datetime.timedelta(days=random_number_of_days) + return random_date.strftime("%Y-%m-%d") + + +def generate_sql_insert(table_name, columns, num_records): + """Generate SQL INSERT statements for populating a table.""" + sql_statements = [] + for _ in range(num_records): + values = [f"'{generate_random_string(int(input(f'Enter length for {column}: ')))}'" for column in columns] + sql = f"INSERT INTO {table_name} ({', '.join(columns)}) VALUES ({', '.join(values)});" + sql_statements.append(sql) + return sql_statements + + +def generate_placeholder_data(num_records, data_format): + """Generate placeholder data based on user-defined format.""" + placeholder_data = [] + for _ in range(num_records): + record = {} + for field, field_data in data_format.items(): + data_type = field_data['type'] + if data_type == 'string': + length = field_data['length'] + charset = field_data['charset'] + record[field] = generate_random_string(length, charset) + elif data_type == 'number': + min_value = field_data['min'] + max_value = field_data['max'] + record[field] = generate_random_number(min_value, max_value) + elif data_type == 'date': + start_date = datetime.datetime.strptime(field_data['start_date'], "%Y-%m-%d") + end_date = datetime.datetime.strptime(field_data['end_date'], "%Y-%m-%d") + record[field] = generate_random_date(start_date, end_date) + elif data_type == 'boolean': + record[field] = random.choice([True, False]) + placeholder_data.append(record) + return placeholder_data + + +def get_data_format_from_user(): + """Prompt the user for data format preferences.""" + data_format = {} + while True: + field = input("Enter field name (or 'done' to finish): ").strip() + if field.lower() == 'done': + break + + data_type = input(f"Enter data type for '{field}' (string/number/date/boolean): ").strip() + if data_type not in ['string', 'number', 'date', 'boolean']: + print("Invalid data type. Please enter 'string', 'number', 'date', or 'boolean'.") + continue + + if data_type == 'string': + length = int(input(f"Enter length for '{field}' (integer): ")) + charset = input(f"Enter character set for '{field}' (optional, press Enter for default): ").strip() + if not charset: + charset = string.ascii_letters + data_format[field] = {'type': 'string', 'length': length, 'charset': charset} + elif data_type == 'number': + min_value = int(input(f"Enter minimum value for '{field}' (integer): ")) + max_value = int(input(f"Enter maximum value for '{field}' (integer): ")) + data_format[field] = {'type': 'number', 'min': min_value, 'max': max_value} + elif data_type == 'date': + start_date = input(f"Enter start date for '{field}' (YYYY-MM-DD): ") + end_date = input(f"Enter end date for '{field}' (YYYY-MM-DD): ") + data_format[field] = {'type': 'date', 'start_date': start_date, 'end_date': end_date} + elif data_type == 'boolean': + data_format[field] = {'type': 'boolean'} + + return data_format + + +def get_file_type_from_user(): + """Prompt the user for the desired file type (e.g., JSON, CSV, SQL, TXT, MD, HTML).""" + while True: + file_type = input("Enter the desired file type for saving the data (json/csv/sql/txt/md/html): ").strip().lower() + if file_type in ['json', 'csv', 'sql', 'txt', 'md', 'html']: + return file_type + else: + print("Invalid file type. Please enter 'json', 'csv', 'sql', 'txt', 'md', or 'html'.") + + +def save_data_to_file(data, file_type): + """Save the generated data to a file of the specified type.""" + if file_type == 'json': + with open('placeholder_data.json', 'w') as json_file: + json.dump(data, json_file, indent=4) + elif file_type == 'csv': + with open('placeholder_data.csv', 'w', newline='') as csv_file: + fieldnames = data[0].keys() + writer = csv.DictWriter(csv_file, fieldnames=fieldnames) + writer.writeheader() + for record in data: + writer.writerow(record) + elif file_type == 'sql': + table_name = input("Enter the SQL table name: ") + columns = input("Enter column names separated by commas: ").split(',') + sql_statements = generate_sql_insert(table_name, columns, len(data)) + with open('generated_data.sql', 'w') as sql_file: + sql_file.write('\n'.join(sql_statements)) + elif file_type == 'txt': + with open('placeholder_data.txt', 'w') as txt_file: + for record in data: + txt_file.write(str(record) + '\n') + elif file_type == 'md': + with open('placeholder_data.md', 'w') as md_file: + for record in data: + md_file.write('- ' + ', '.join([f"{key}: {value}" for key, value in record.items()]) + '\n') + elif file_type == 'html': + with open('placeholder_data.html', 'w') as html_file: + html_file.write('<html>\n<head>\n<title>Placeholder Data</title>\n</head>\n<body>\n') + for record in data: + html_file.write('<ul>\n') + for key, value in record.items(): + html_file.write(f'<li>{key}: {value}</li>\n') + html_file.write('</ul>\n') + + +if __name__ == "__main__": + num_records = int(input("Enter the number of records to generate: ")) + data_format = get_data_format_from_user() + file_type = get_file_type_from_user() + + placeholder_data = generate_placeholder_data(num_records, data_format) + + save_data_to_file(placeholder_data, file_type) + + print(f"Data will be saved to: {os.path.abspath('generated_data.sql')}") diff --git a/.scripts/scratchpad b/.scripts/scratchpad new file mode 100755 index 0000000..8a1aea0 --- /dev/null +++ b/.scripts/scratchpad @@ -0,0 +1,64 @@ +#!/bin/bash + +# Created By: srdusr +# Created On: Tue 07 Mar 2023 15:06:47 PM CAT +# Project: Agnostic scratchpad/dropdown terminal that works on most window managers + +# Dependencies: wmctrl, xprop, xdo, xdotool +# NOTE: Ensure script is included in system's path and can therefore be invoked with the command 'scratchpad'. +# Furthermore make sure the terminal is using x11 as a backend in wayland to allow this to work. +# Example: wezterm.lua: enable_wayland = false, +# kitty.conf: linux_display_server x11 + +# Set the environment variables to x11 to allow working in Wayland +export GDK_BACKEND=x11 +export QT_QPA_PLATFORM=xcb +export WAYLAND_DISPLAY="" +export WINIT_UNIX_BACKEND=x11 + +# Supported terminals and dropdown class +supported_terminals=("wezterm" "kitty" "alacritty") + +# Check if any supported terminal with scratchpad class is running +for term in "${supported_terminals[@]}"; do + if pgrep -f "$term.*--class scratchpad" >/dev/null; then + my_term="$term" + break + fi +done + +# If no supported terminal is running, start the first available one +if [ "$my_term" = "" ]; then + for term in "${supported_terminals[@]}"; do + if command -v "$term" >/dev/null 2>&1; then + my_term="$term" + break + fi + done + if [ "$my_term" = "" ]; then + echo "No supported terminal found." && exit 1 + fi + + # Start terminal with scratchpad class + case "$my_term" in + "wezterm") wezterm start --class scratchpad -e tmux new-session -A -s tmux -e bash & ;; + "kitty") kitty --class scratchpad tmux new-session -A -s tmux -e bash & ;; + "alacritty") alacritty --class scratchpad -e tmux new-session -A -s tmux -e bash & ;; + esac +fi + +# Get the window ID of the scratchpad terminal +id="$(xdo id -N scratchpad)" + +# Toggle scratchpad terminal visibility +if [ "$id" != "" ]; then + if xwininfo -id "$id" | grep "Map State: IsViewable" >/dev/null; then + # Scratchpad is visible, hide it + dimensions="$(xwininfo -id "$id" | awk '/Width:|Height:/ { printf("%s=%s;", tolower($1), $2) }')" + xdo hide "$id" 2>/dev/null + else + # Scratchpad is hidden, show it and restore dimensions + xdo show "$id" + xdotool windowsize "$id" "$(echo "$dimensions" | tr ';' ' ')" 2>/dev/null + fi +fi diff --git a/.scripts/spec b/.scripts/spec new file mode 100755 index 0000000..19810fc --- /dev/null +++ b/.scripts/spec @@ -0,0 +1,73 @@ +#!/usr/bin/env bash + +# Created By: srdusr +# Created On: Wed 18 Oct 2023 20:19:03 CAT +# Project: Create Spectrograms of audio files + +# Dependencies: sox + +# Define the timestamp function +timestamp() { + date +%Y%m%d%H%M%S +} + +spec() { + + if [[ $# -eq 0 ]]; then + echo "No audio files provided." + return + fi + + local outdir + + if [[ -d "$HOME/pictures" ]]; then + outdir="$HOME/pictures/spectrograms" + elif [[ -d "$HOME/Pictures" ]]; then + outdir="$HOME/Pictures/Spectrograms" + elif [[ -d "$HOME/Images" ]]; then + outdir="$HOME/Images/Spectrograms" + else + outdir="./spectrograms" # Save to the current directory if none of the expected directories exist + fi + + for file in "$@"; do + if [[ -f "$file" ]]; then + local filename + filename=$(basename "$file") + local filename_no_extension="${filename%.*}" + local target_dir="$outdir" + local outname="$target_dir/sox-spec-$(timestamp)-${filename_no_extension}.png" + + if [[ ! -d "$target_dir" ]]; then + mkdir -p "$target_dir" # Create the directory if it doesn't exist + fi + + sox "$file" -S -n spectrogram -o "$outname" + + # Add the generated spectrogram file name to the array + spectrogram_files+=("$outname") + else + echo "File not found: $file" + fi + done + + if [[ ${#} -gt 0 ]]; then + read -p "Do you want to open the spectrogram(s)? (y/n): " open_choice + case "$open_choice" in + [Yy]) + for file in "${spectrogram_files[@]}"; do + xdg-open "$file" # Open the spectrogram images generated from the provided audio files + done + ;; + [Nn]) + echo "Not opening the spectrogram(s)." + ;; + *) + echo "Invalid choice. Not opening the spectrogram(s)." + ;; + esac + fi +} + +# Call the spec function with provided arguments +spec "$@" diff --git a/.scripts/track-books.sh b/.scripts/track-books.sh new file mode 100755 index 0000000..f13add8 --- /dev/null +++ b/.scripts/track-books.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Created By: srdusr +# Created On: Wed 25 Oct 2023 13:45:52 CAT +# Project: Simple script to track most recent books opened, mainly for neovim usage. + +# Dependencies: inotify-tools + +books_directory="$HOME/documents/books" +recent_books_file="$HOME/.config/nvim/tmp/recent_books.txt" + +inotifywait -m -e CREATE -e OPEN -r "$books_directory" | + while read -r path action file; do + if [[ $file == *.pdf || $file == *.epub ]]; then + echo "$path/$file" >>"$recent_books_file" + # Remove duplicates and overwrite the recent_books_file + sort -u -o "$recent_books_file" "$recent_books_file" + fi + done diff --git a/.scripts/win-nvim.bat b/.scripts/win-nvim.bat new file mode 100644 index 0000000..c99374d --- /dev/null +++ b/.scripts/win-nvim.bat @@ -0,0 +1,37 @@ +@echo off + +REM Install NeoVim with winget, if not already present on the system +where nvim >nul 2>nul +if %errorlevel% neq 0 ( + winget install Neovim.Neovim -q +) + +REM Clone my dotfiles repo +set dotFilesRoot=%USERPROFILE%\dotfiles +if not exist "%dotFilesRoot%\." ( + git clone git@github.com:srdusr/dotfiles.git "%dotFilesRoot%" +) + +REM Link NeoVim configuration +set localConfiguration=%LOCALAPPDATA%\nvim +set dotfilesConfiguration=%dotFilesRoot%\.config\nvim + +if not exist "%localConfiguration%\." ( + mklink /D "%localConfiguration%" "%dotfilesConfiguration%" +) + +REM Clone Packer.nvim, if not already present on the system +set localPacker=%LOCALAPPDATA%\nvim-data\site\pack\packer\start\packer.nvim + +if not exist "%localPacker%\." ( + git clone https://github.com/wbthomason/packer.nvim "%localPacker%" +) + +REM Run the script by using this command in the same existing directory: win-nvim.bat + +@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://aka.ms/install-winget'))" +iex ((new-object net.webclient).DownloadString('https://aka.ms/install-winget')) +curl -o winget-cli.appxbundle https://aka.ms/winget-cli-appxbundle + +powershell Add-AppxPackage -Path "winget-cli.appxbundle" + diff --git a/.scripts/win-nvim.ps1 b/.scripts/win-nvim.ps1 new file mode 100644 index 0000000..ca67755 --- /dev/null +++ b/.scripts/win-nvim.ps1 @@ -0,0 +1,39 @@ +# Install NeoVim with winget, if not already present on the system +if (!(Get-Command nvim -ErrorAction SilentlyContinue)) { + winget install Neovim.Neovim +} + +# Clone my dotfiles repo +$dotFilesRoot = Join-Path $HOME "dotfiles" + +if (!(Test-Path $dotFilesRoot -PathType Container)) { + git clone https://github.com/srdusr/dotfiles.git $dotFilesRoot +} + +# Link NeoVim configuration +$localConfiguration = Join-Path $env:LOCALAPPDATA "nvim" +$dotfilesConfiguration = Join-Path $dotFilesRoot ".config" "nvim" + +if (!(Test-Path $localConfiguration -PathType Container)) { + Start-Process -FilePath "cmd.exe" -ArgumentList "/c mklink /D $localConfiguration $dotfilesConfiguration" -Verb runas +} + +# Clone Packer.nvim, if not already present on the system +$localPacker = Join-Path $env:LOCALAPPDATA "nvim-data" "site" "pack" "packer" "start" "packer.nvim" + +if (!(Test-Path $localPacker -PathType Container)) { + git clone https://github.com/wbthomason/packer.nvim $localPacker +} + +# To allow script execution, run the following command in PowerShell as an administrator: +# Set-ExecutionPolicy RemoteSigned +# Then run the script by using this command in the same existing directory: +# ./win-nvim.ps1 +#curl -o winget-cli.appxbundle https://aka.ms/winget-cli-appxbundle +#powershell Add-AppxPackage -Path "winget-cli.appxbundle" +#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')) +#use `-y` or consider: choco feature enable -n allowGlobalConfirmation +#choco install git +#- Refresh the environment +#Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1 +#refreshenv diff --git a/.vim/vimrc b/.vim/vimrc new file mode 100644 index 0000000..1a46d3d --- /dev/null +++ b/.vim/vimrc @@ -0,0 +1,465 @@ + +"=============================================================================== +" Mappings/Keybindings/Commands +"=============================================================================== + +let mapleader = ";" " map leader to Semi colon +" Use <jk> to escape +inoremap jk <Esc> +" Easier split navigations, just ctrl-j instead of ctrl-w then j +nnoremap <C-J> <C-W><C-J> +nnoremap <C-K> <C-W><C-K> +nnoremap <C-L> <C-W><C-L> +nnoremap <C-H> <C-W><C-H> +" Combine buffers list with buffer name +nnoremap <Leader>b :buffers<CR>:buffer<Space> +" Map buffer next, prev and delete to <leader+(n/p/d)> +map <leader>n :bn<cr> +map <leader>p :bp<cr> +map <leader>d :bd<cr> +" Set alt + j/k to switch lines of texts or simply move them +:nnoremap <silent><A-k> :let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr> +:nnoremap <silent><A-j> :let save_a=@a<Cr>"add"ap:let @a=save_a<Cr> +" Swap two pieces of text, use x to cut in visual mode, then use Ctrl-x in +" visual mode to select text to swap with +:vnoremap <C-X> <Esc>`.``gvP``P +" To resize in different steps, you can create maps that will adjust the window +" size differently. For example to increase the window size by a factor of 1.5 +" and decrease the window size by 0.67, you can map this: +"nnoremap <silent> <Leader>+ :exe "resize " . (winheight(0) * 3/2)<CR> +"nnoremap <silent> <Leader>- :exe "resize " . (winheight(0) * 2/3)<CR> +nnoremap <Leader>+ :resize +5<CR> +nnoremap <Leader>- :resize -5<CR> +nnoremap <Leader>> :vertical resize +5<CR> +nnoremap <Leader>< :vertical resize -5<CR> +" Toggle set number +nnoremap <leader>$ :NumbersToggle<CR> +"nnoremap <leader>% :NumbersOnOff<CR> +" Copy and Paste with <C-c> and <C-v> +"vmap <C-c> y:call system("xclip -i -selection clipboard", getreg("\""))<CR>:call system("xclip -i", getreg("\""))<CR> +"nmap <C-v> :call setreg("\"",system("xclip -o -selection clipboard"))<CR>p +nnoremap <expr> p (v:register == '"' && &clipboard =~ 'unnamed' ? '"*p' : '"' . v:register . 'p') +" Use command :Vb for Visual Block or <C-q> since <C-v> is used for Copy +command! Vb normal! <C-v> +" Map <w!!> to save/edit a root permission/read-only file, only works in +" traditional vim and not neovim +cmap w!! %!sudo tee > /dev/null +nnoremap <leader>x :silent !chmod +x %<CR> +"nnoremap <[-p> m`o<ESC>p`` +"nnoremap <]-p> m`O<ESC>p`` +" Paste on next line +"inoremap <C-CR> <C-R>" +set keywordprg=:help +runtime ftplugin/man.vim + + +"=============================================================================== +" Settings +"=============================================================================== + +"let g:nvim_system_wide = 1 " let whole system use nvim config +set shell=zsh +set termguicolors +set guicursor= +let &t_SI = "\e[6 q" +let &t_EI = "\e[2 q" + +" reset the cursor on start (for older versions of vim, usually not required) +augroup myCmds +au! +autocmd VimEnter * silent !echo -ne "\e[2 q" +augroup END +" Neovim requires xclip, check if normal vim has +clipboard by +" <:echo has('clipboard')> from within Vim (if the output is 1, good to +" go otherwise 0 then need a build that has it +" Next two commands make vim use X11 clipboard +set clipboard+=unnamedplus +let g:clipbrdDefaultReg = '+' +"let g:loaded_clipboard_provider = 1 +" <:e %:h/filename> will create a new file named filename in the same +" directory as the currently open file, and write it. +set autochdir " or use this to use <:e> to create a file in current directory +set splitright " make vsplit put the new buffer on the right of the current buffer +set splitbelow " make split put the new buffer below the current buffer +" :Bclose script (delete a buffer without closing the window) sourced as a +" plugin in ~/.config/nvim/plugin/bclose.vim | keymap: <leader>bd +let bclose_multiple = 1 +"set syntax +" Compute syntax highlighting from beginning of file. (By default, vim only +" looks 200 lines back, which can make it highlight code incorrectly in some +" long files.) +autocmd BufEnter * :syntax sync fromstart +" Don't syntax highlight markdown because it's often wrong +autocmd! FileType mkd setlocal syn=off +"set ttyfast +"set lazyredraw +set timeout timeoutlen=1000 ttimeoutlen=100 " fix slow O inserts +set scrolloff=8 sidescrolloff=8 +set tabstop=4 softtabstop=4 shiftwidth=4 expandtab +set autoindent +set smartindent +" Also load indent files, to automatically do language-dependent indenting. +filetype plugin indent on +set exrc +set number +set hidden +set noerrorbells +set nowrap +set ignorecase +set smartcase +set noswapfile +set nobackup +set incsearch +set cursorline +set showmatch +set showcmd +set incsearch +set hlsearch +set laststatus=2 +let g:python3_host_prog = '/usr/bin/python3' +"let g:loaded_python3_provider = 1 +let g:sh_noisk=1 +set modeline +set modelines=3 " modelines (comments that set vim options on a per-file basis) +set foldmethod=manual +set nofoldenable " turn folding off +" Insert only one space when joining lines that contain sentence-terminating +" punctuation like `.`. +set nojoinspaces +set autoread " if a file is changed outside of vim, automatically reload it without asking +set diffopt=vertical " diffs are shown side-by-side not above/below +set signcolumn=no " always show the sign column +set textwidth=80 +"------------------------------------------------------------------------------- + + +"=============================================================================== +" Plugins +"=============================================================================== + +" Auto-Install vim-plug +if empty(glob('~/.vim/autoload/plug.vim')) + silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs + \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + "autocmd VimEnter * PlugInstall + "autocmd VimEnter * PlugInstall | source $MYVIMRC +endif + +" :so % :PlugInstall +call plug#begin('~/.vim/autoload/plugged') +"Plug 'glepnir/dashboard-nvim' +Plug 'christoomey/vim-tmux-navigator' +Plug 'preservim/vimux' +Plug 'myusuf3/numbers.vim' +Plug 'romainl/vim-cool' +"Plug 'ervandew/supertab' +"Plug 'neoclide/coc.nvim', {'branch': 'release'} +Plug 'sheerun/vim-polyglot' +Plug 'vim-airline/vim-airline' +Plug 'ryanoasis/vim-devicons' +Plug 'rbgrouleff/bclose.vim' +"Plug 'ms-jpq/chadtree', {'branch': 'chad', 'do': 'python3 -m chadtree deps'} +Plug 'lambdalisue/fern.vim' +Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } +Plug 'junegunn/fzf.vim' +Plug 'airblade/vim-rooter' +"Plug 'SirVer/ultisnips' +"Plug 'honza/vim-snippets' +Plug 'airblade/vim-gitgutter' +Plug 'tpope/vim-eunuch' +Plug 'tpope/vim-fugitive' +Plug 'tpope/vim-surround' +Plug 'tpope/vim-obsession' +Plug 'tpope/vim-unimpaired' +Plug 'scrooloose/syntastic' +Plug 'w0rp/ale' +Plug 'davidhalter/jedi-vim' +"Plug 'valloric/youcompleteme' " vim needs to be compiled with python/ compiled with install.py in plugin directory +Plug 'Lenovsky/nuake' +Plug 'voldikss/vim-floaterm' +Plug 'gruvbox-community/gruvbox' +Plug 'srcery-colors/srcery-vim' +Plug 'tomasr/molokai' +Plug 'ayu-theme/ayu-vim' +Plug 'sjl/badwolf' +Plug 'joshdick/onedark.vim' +call plug#end() + +"source $HOME/.vim/plug-config/coc.vim + +"------------------------------------------------------------------------------- + + +"=============================================================================== +" Plugin Settings +"=============================================================================== + +" Fugitive statusline +"--------------------------------------- +"set statusline=%{fugitive#statusline()}%F%m%r%h%w\ (%{&ff}){%Y}\ [%l,%v][%p%%] +"------------------------------------------------------------------------------- +"" Show the buffer number in the status line. +"set statusline=%02n:%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P +"set statusline=%{fugitive#statusline()}02n:%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P +"------------------------------------------------------------------------------- + +" Airline +"--------------------------------------- +let g:airline#extensions#tabline#enabled = 1 +let g:airline#extensions#tabline#show_buffers = 1 +let g:airline_powerline_fonts = 1 +let g:airline#extensions#tabline#buffer_nr_show = 1 +let g:airline_theme='onedark' +"------------------------------------------------------------------------------- + +" Float Term +"--------------------------------------- +" Configuration example +let g:floaterm_keymap_new = '<Leader>t' +let g:floaterm_keymap_prev = '<Leader>tn' +let g:floaterm_keymap_next = '<Leader>tp' +let g:floaterm_keymap_toggle = '<Leader>tt' +"------------------------------------------------------------------------------- + +" Nuake +"--------------------------------------- +" Toggle Nuake terminal panel +nnoremap <A-t> :Nuake<CR> +inoremap <A-t> <C-\><C-n>:Nuake<CR> +tnoremap <A-t> <C-\><C-n>:Nuake<CR> +let g:nuake_per_tab = 1 " Enable the Nuake instance per tab page. (default 1) +let g:close_if_last_standing = 1 " Close the editor if the Nuake window is the last one. (default 1) +let g:nuake_position = 'right' +"let g:nuake_size = 0.2 +"------------------------------------------------------------------------------- + +" Vimux +"--------------------------------------- +" Prompt for a command to run +map <Leader>vp :VimuxPromptCommand<CR> +" Run last command executed by VimuxRunCommand +map <Leader>vl :VimuxRunLastCommand<CR> +" Inspect runner pane +map <Leader>vi :VimuxInspectRunner<CR> +" Zoom the tmux runner pane +map<leader>vz :VimuxZoomRunner<CR> +"------------------------------------------------------------------------------- + +" Snippets +"--------------------------------------- +" Snippets — code snippets allow you to quickly write some boilerplate code +" that is often repetitive. To add code snippets support, you will have to add +" UltiSnips. +let g:UltiSnipsExpandTrigger = "<c-tab>" +"let g:UltiSnipsJumpForwardTrigger = "<tab>" +"let g:UltiSnipsJumpBackwardTrigger = "<s-tab>" +"------------------------------------------------------------------------------- + +" Youcompleteme +"--------------------------------------- +"let g:ycm_global_ycm_extra_conf = '~/.config/nvim/autoload/plugged/youcompleteme/.ycm_extra_conf.py' +" ---> compatibility with another plugin (ultisnips) <--- +"let g:ycm_key_list_select_completion = [ '<C-n>', '<Down>' ] +"let g:ycm_key_list_previous_completion = [ '<C-p>', '<Up>' ] +"let g:SuperTabDefaultCompletionType = '<C-n>' +" ---> disable preview window <--- +"set completeopt-=preview +" ---> navigating to the definition of a a symbol <--- +"map <leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR> +"------------------------------------------------------------------------------- + + +"=============================================================================== +" File Manager & FZF +"=============================================================================== + +" CHADTree Filemanager/project drawer (NerdTree killer) +"--------------------------------------- +"" to toggle CHADTree run command :CHADopen or use hotkey <leader>v : +"nnoremap <leader>f <cmd>CHADopen<cr> +""nnoremap <leader>v <cmd>CHADopen<cr> " Default Behaviour +"nnoremap <A-f> <cmd>CHADopen<cr> +"" :CHADhelp to view documentation +"" Add a hotkey to clear quickfix list: +""nnoremap <leader>qk <cmd>call setqflist([])<cr> +"let g:chadtree_settings = { 'view.width': 25 } +"------------------------------------------------------------------------------- + +" FZF fuzzy finder +"--------------------------------------- +" Enable per-command history. +" CTRL-N and CTRL-P will be automatically bound to next-history and +" previous-history instead of down and up. If you don't like the change, +" explicitly bind the keys to down and up in your $FZF_DEFAULT_OPTS. +let g:fzf_history_dir = '~/.local/share/fzf-history' +map <leader>z :FZF<CR> +map <leader>a :Files<CR> +map <leader>l :Lines<CR> +map <leader>L :BLines<CR> +map <leader>B :Buffers<CR> +map <leader>h :History:<CR> +nnoremap <leader>g :Rg<CR> +"nnoremap <leader>t :Tags<CR> +nnoremap <leader>m :Marks<CR> +" This is the default extra key bindings +let g:fzf_action = { + \ 'ctrl-t': 'tab split', + \ 'ctrl-x': 'split', + \ 'ctrl-y': 'vsplit' } +let g:fzf_tags_command = 'ctags -R' +" Border color +let g:fzf_layout = {'up':'~90%', 'window': { 'width': 0.8, 'height': 0.8,'yoffset':0.5,'xoffset': 0.5, 'highlight': 'Todo', 'border': 'sharp' } } +let $FZF_DEFAULT_OPTS = '--layout=reverse --info=inline' +let $FZF_DEFAULT_COMMAND="rg --files --hidden" +" Customize fzf colors to match your color scheme +let g:fzf_colors = + \ { 'fg': ['fg', 'Normal'], + \ 'bg': ['bg', 'Normal'], + \ 'hl': ['fg', 'Comment'], + \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'], + \ 'bg+': ['bg', 'CursorLine', 'CursorColumn'], + \ 'hl+': ['fg', 'Statement'], + \ 'info': ['fg', 'PreProc'], + \ 'border': ['fg', 'Ignore'], + \ 'prompt': ['fg', 'Conditional'], + \ 'pointer': ['fg', 'Exception'], + \ 'marker': ['fg', 'Keyword'], + \ 'spinner': ['fg', 'Label'], + \ 'header': ['fg', 'Comment'] } +" Get Files +command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(<q-args>, fzf#vim#with_preview({'options': ['--layout=reverse', '--info=inline']}), <bang>0) +" Get text in files with Rg +command! -bang -nargs=* Rg + \ call fzf#vim#grep( + \ 'rg --column --line-number --no-heading --color=always --smart-case '.shellescape(<q-args>), 1, + \ fzf#vim#with_preview(), <bang>0) +" Ripgrep advanced +function! RipgrepFzf(query, fullscreen) + let command_fmt = 'rg --column --line-number --no-heading --color=always --smart-case %s || true' + let initial_command = printf(command_fmt, shellescape(a:query)) + let reload_command = printf(command_fmt, '{q}') + let spec = {'options': ['--phony', '--query', a:query, '--bind', 'change:reload:'.reload_command]} + call fzf#vim#grep(initial_command, 1, fzf#vim#with_preview(spec), a:fullscreen) +endfunction +command! -nargs=* -bang RG call RipgrepFzf(<q-args>, <bang>0) +" Git grep +command! -bang -nargs=* GGrep + \ call fzf#vim#grep( + \ 'git grep --line-number '.shellescape(<q-args>), 0, + \ fzf#vim#with_preview({'dir': systemlist('git rev-parse --show-toplevel')[0]}), <bang>0) +command! -bang FM call fzf#run(fzf#wrap({'source': 'cat ~/.fzf-marks | sed "s/.*: \(.*\)$/\1/" | sed "s#~#${HOME}#"', 'sink': 'lcd'}, <bang>0)) +"------------------------------------------------------------------------------- + + +"=============================================================================== +" Colorscheme +"=============================================================================== + +"colorscheme gruvbox +"colorscheme srcery +"colorscheme molokai +"colorscheme ayu +"let ayucolor="light" " for light version of theme +"let ayucolor="mirage" " for mirage version of theme +"let ayucolor="dark" " for dark version of theme +"colorscheme badwolf +"let g:badwolf_darkgutter = 0 " Make the gutters darker than the background. Default 0. +"let g:badwolf_tabline = 1 " 1 is default, 0 is lighter and 2 or 3 is darker a tabline + +" Try to use a colorscheme plugin +" but fallback to a default one +try + colorscheme gruvbox +catch /^Vim\%((\a\+)\)\=:E185/ + " no plugins available + colorscheme elflord +endtry +highlight Normal guibg=NONE +"set background=dark +"------------------------------------------------------------------------------- + + +"=============================================================================== +" Functions/Scripts +"=============================================================================== + +" Enable mouse scrollback +"--------------------------------------- +set mouse=a +tnoremap <Esc> <C-\><C-n> +tnoremap <c-b> <c-\><c-n> +function! ClearTerminal() + set scrollback=1 + let &g:scrollback=1 + echo &scrollback + call feedkeys("\i") + call feedkeys("clear\<CR>") + call feedkeys("\<C-\>\<C-n>") + call feedkeys("\i") + sleep 100m + let &scrollback=s:scroll_value +endfunction +"------------------------------------------------------------------------------- + +" :Rename {newname} +"--------------------------------------- +function! RenameFile() + let old_name = expand('%') + let new_name = input('New file name: ', expand('%'), 'file') + if new_name != '' && new_name != old_name + exec ':saveas ' . new_name + exec ':silent !rm ' . old_name + redraw! + endif +endfunction +map <leader>r :call RenameFile()<cr> +"------------------------------------------------------------------------------- + +" Return to the same line when we reopen a file +"--------------------------------------- + augroup line_return + au! + au BufReadPost * + \ if line("'\"") > 0 && line("'\"") <= line("$") | + \ execute 'normal! g`"zvzz' | + \ endif + augroup END +"------------------------------------------------------------------------------- + +" Update Tmux Status Vi-mode +"--------------------------------------- +function! UpdateTmuxStatus() + let mode = mode() + " Determine the mode name based on the mode value + let mode_name = '' + if mode ==# 'n' + let mode_name = '-- NORMAL --' + elseif mode ==# 'i' || mode ==# 'ic' + let mode_name = '-- INSERT --' + else + let mode_name = '-- NORMAL --' " -- COMMAND --" + endif + + " Write the mode name to the file + let file = $HOME . '/.vi-mode' + call writefile([mode_name], file) + + if exists('g:nvim_running') + " Neovim is running, update the mode file and refresh tmux + let VI_MODE = '' " Clear VI_MODE to show Neovim mode + silent !tmux refresh-client -S + endif + " Force tmux to update the status + silent !tmux refresh-client -S +endfunction + +augroup TmuxStatus + autocmd! + autocmd InsertLeave,InsertEnter * call UpdateTmuxStatus() + autocmd VimEnter * call UpdateTmuxStatus() + autocmd BufEnter * call UpdateTmuxStatus() + autocmd ModeChanged * call UpdateTmuxStatus() + autocmd WinEnter,WinLeave * call UpdateTmuxStatus() +augroup END +"------------------------------------------------------------------------------- diff --git a/.vnc/config b/.vnc/config new file mode 100644 index 0000000..5c1462c --- /dev/null +++ b/.vnc/config @@ -0,0 +1,4 @@ +session=bspwm +geometry=1920x1080 +localhost +alwaysshared diff --git a/.vnc/xstartup b/.vnc/xstartup new file mode 100755 index 0000000..bbbc0db --- /dev/null +++ b/.vnc/xstartup @@ -0,0 +1,16 @@ +#!/data/data/com.termux/files/usr/bin/sh + +## file is executed during VNC server +## startup. + +# Launch terminal emulator Aterm. +# Requires package 'aterm'. + +unset SESSION_MANAGER +unset DBUS_SESSION_BUS_ADDRESS + +export PULSE_SERVER=127.0.0.1 && pulseaudio --start --disable-shm=1 --exit-idle-time=-1 + +# Launch Window Manager/Desktop Environment +bspwm & + diff --git a/.zprofile b/.zprofile new file mode 100644 index 0000000..322d2ce --- /dev/null +++ b/.zprofile @@ -0,0 +1 @@ +emulate sh -c '. ~/.profile' @@ -1,33 +1,631 @@ -## Neovim - -#### Dependencies - -nvm -nvm install --lts - -#### TODOS: - -- [ ] Markdown filetype plugin or autocommand to add two spaces each line -- [ ] Markdown filetype plugin or autocommand to make backtick auto-correct properly -- [x] Indent by filetype/fix global indent (2) -- [x] Check history or telescope history of last files edited or opened. -- [ ] - Windows native support configuration -- [ ] - Python debugger -- [ ] README file heirachcy -- [ ] Markdown snippet for code blocks with list, ie.- ``and -` ` -- [ ] Snippet for filler text with variations, ie. common sentences: The quick brown fox... and more and placeholder words -- [ ] Configure snippets.lua -- [ ] Documentation shortcuts for different languages quote in quote "locally" (preffered) or opening web browser -- [ ] Dictionary, an actual dictionary -- [ ] Null-ls/lsp keymap to check current buffer servers must check both same time - > NOTE: Different servers must be configured only to one or another, research null-ls being archived -- [ ] Don't highlight whitespaces in lazygit (maybe exclusively markdown) -- [ ] Configure prettier/prettierd servers to join a lot of different files (null-ls) -- [ ] Nvim-tree preview window similar to telescope -- [x] Nvim-tree behaviour when delete current buffer - > NOTE: One idea is to create an autocmd to make a blank window (hidden) as a secondary window but when creating a opening a new file it does not ask which split to open in -- [ ] Nvim-tree conditionally when open going in the opposite direction will go back to nvim-tree ie. going right then goes to nvim-tree but is conditionally because of tmux etc... -- [x] Substitute keybinding -- [ ] Snippet/filetype plugin for markdown tick boxes -- [ ] Delete lua/user/func.lua -- [ ] Clean entire config by prioritizing single quotation marks over double +# Dotfiles + +### Welcome, and make yourself at ***$HOME*** +> NOTE: Primarily for Linux but currently under work to make this as agnostic/cross-platform as possible + +- - - + +### Installing onto a new system (bare git repository) + +1. Avoid weird behaviour/recursion issues when .cfg tries to track itself + +```bash +$ echo ".cfg" >> .gitignore +``` + +2. Clone this repo + +```bash +$ git clone --bare https://github.com/srdusr/dotfiles.git $HOME/.cfg +``` + +3. Set up the alias 'config' + +```bash +$ alias config='git --git-dir=$HOME/.cfg --work-tree=$HOME' +``` + +4. Set local configuration into .cfg to ignore untracked files + +```bash +$ config config --local status.showUntrackedFiles no +``` + +5. Checkout + +```bash +$ config checkout +``` + +--- + +## Dependencies + +- curl +- git +- clang +- gcc +- make +- ninja +- cmake +- wmctrl +- xdo +- xdotool +- ripgrep +- fd +- tmux +- tree-sitter +- vim +- zsh + +--- + +### Fzf + +- Install Fzf + +``` +$ sudo git clone --depth 1 https://github.com/junegunn/fzf.git /usr/local/bin/fzf +``` + +- Put this into `.bashrc`/`.zshrc` or any similar shell configuration file to make it persistent across sessions + +```bash +export PATH="$PATH:/usr/local/bin/fzf/bin" +export FZF_BASE="/usr/local/bin/fzf" +``` + +- Also put this in to load fzf keybindings and completions + +```bash +# bash +source /usr/local/bin/fzf/shell/key-bindings.bash +source /usr/local/bin/fzf/shell/completion.bash +``` + +```bash +# zsh +source /usr/local/bin/fzf/shell/key-bindings.zsh +source /usr/local/bin/fzf/shell/completion.zsh +``` + +--- + +### Zsh plugins + +- Install the plugins + +```bash +# Clone zsh-you-should-use +$ git clone https://github.com/MichaelAquilina/zsh-you-should-use.git ~/.config/zsh/plugins/zsh-you-should-use + +# Clone zsh-syntax-highlighting +$ git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.config/zsh/plugins/zsh-syntax-highlighting + +# Clone zsh-autosuggestions +$ git clone https://github.com/zsh-users/zsh-autosuggestions.git ~/.config/zsh/plugins/zsh-autosuggestions +``` + +- Put this into `.zshrc` (preferably at the very end of the file) to allow it to source the plugins across sessions + +```bash +# Suggest aliases for commands +source ~/.config/zsh/plugins/zsh-you-should-use/you-should-use.plugin.zsh + +# Load zsh-syntax-highlighting +source ~/.config/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh + +# Load fish like auto suggestions +source ~/.config/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.plugin.zsh +source ~/.config/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh +``` + +--- + +### Wezterm + +- Make sure Rust is installed first + +```bash +$ curl https://sh.rustup.rs -sSf | sh -s +``` + +- Install and build Wezterm + +```bash +$ git clone --depth=1 --branch=main --recursive https://github.com/wez/wezterm.git +$ cd wezterm +$ git submodule update --init --recursive +$ ./get-deps +$ cargo build --release +$ cargo run --release --bin wezterm -- start +``` + +--- + +### Neovim + +> Dependencies + +| Platform | ninja-build | ninja | base-devel | build-base | coreutils | gmake | cmake | make | gcc | g++ | gcc-c++ | unzip | wget | curl | gettext | gettext-tools | gettext-tiny-dev | automake | autoconf | libtool | libtool-bin | pkg-config | pkgconfig | pkgconf | tree-sitter | patch | doxygen | sha | git | Pack Manager | +| ------------------ | ----------- | ----- | ---------- | ---------- | --------- | ----- | ----- | ---- | --- | --- | ------- | ----- | ---- | ---- | ------- | ------------- | ---------------- | -------- | -------- | ------- | ----------- | ---------- | --------- | ------- | ----------- | ----- | ------- | --- | --- | ------------ | +| Ubuntu/Debian | ✓ | | | | | | ✓ | | | ✓ | | ✓ | | ✓ | ✓ | | | ✓ | ✓ | ✓ | ✓ | ✓ | | | | | ✓ | | | apt-get | +| CentOS/RHEL/Fedora | ✓ | | | | | | ✓ | ✓ | ✓ | | ✓ | ✓ | | ✓ | ✓ | | | ✓ | ✓ | ✓ | | | ✓ | | | ✓ | | | | dnf | +| openSUSE | | ✓ | | | | | ✓ | | | | ✓ | | | ✓ | | ✓ | | ✓ | ✓ | ✓ | | | | | | | | | | zypper | +| Arch Linux | | ✓ | ✓ | | | | ✓ | | | | | ✓ | | ✓ | | | | | | | | | | | ✓ | | | | | pacman | +| Alpine Linux | | | | | ✓ | | ✓ | | | | | ✓ | | ✓ | | | ✓ | ✓ | ✓ | ✓ | | | | ✓ | | | | | | apk | +| Void Linux | | | ✓ | ✓ | | | ✓ | | | | | | | ✓ | | | | | | | | | | | | | | | ✓ | xbps | +| FreeBSD | | | | | | ✓ | ✓ | | | | | ✓ | ✓ | ✓ | ✓ | | | | | ✓ | | | | ✓ | | | | ✓ | | pkg | +| OpenBSD | | | | | | ✓ | ✓ | | | | | ✓ | | ✓ | | ✓ | | ✓ | ✓ | ✓ | | | | | | | | | | pkg_add | +| macOS/Homebrew | | ✓ | | | | | ✓ | | | | | | | ✓ | ✓ | | | ✓ | | ✓ | | ✓ | | | | | | | | brew | +| macOS/MacPorts | | ✓ | | | | | ✓ | | | | | | | | ✓ | | | | | | | | | | | | | | | port | + +- Install (default is nightly) + ```bash + $ git clone https://github.com/neovim/neovim.git + $ cd neovim + ``` + - Optional install stable version + ```bash + $ git checkout stable + ``` + - or specific version by tag + ```bash + $ git checkout release-0.7 + ``` +- Build nvim + ```bash + $ make CMAKE_BUILD_TYPE=Release + $ sudo make install + ``` +- Install Packer (package manager) + ```bash + $ git clone --depth 1 https://github.com/wbthomason/packer.nvim\ + ~/.local/share/nvim/site/pack/packer/start/packer.nvim + ``` +- Post-installation: + - Install plugins + ```vi + :PackerSync + ``` + - or save/write on .config/nvim/lua/user/pack.lua to automatically install plugins + ```vi + :w + ``` + - Install language servers + ```vi + :Mason + ``` + - Exit out of Mason with `q`, configured language servers should then install automatically + > NOTE: If any errors occur, npm needs to be installed and executable, complete **_Development Environment/Languages/Javascript_** section to install nvm/npm + - Reload nvim/config with `<leader><space>` where `<leader>` is `;` +- Uninstall: + ```bash + $ sudo rm /usr/local/bin/nvim + $ sudo rm -r /usr/local/share/nvim/ + ``` + +--- + +### Gnome Custom Settings + +- Run gnome custom settings script, located at `~/.scripts`: +```bash +$ gsettings.sh +``` + +--- + +## Development Environment + +### Languages + +#### Python + +```bash + +``` + +--- + +#### Java + +Recommended to choose Openjdk 8 or 10 otherwise get an error when using Android tools + +```bash + +``` + +--- + +#### Rust + +- Download and run rustup script + +```bash +$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +--- + +#### Go + +```bash + +``` + +--- + +#### Lua + +- Download LuaRocks + +```bash +$ git clone git://github.com/luarocks/luarocks.git +``` + +- Install and specify the installation directory to build and configure LuaRocks + +```bash +$ ./configure --prefix=/usr/local/luarocks +$ make build +$ sudo make install +``` + +- Add LuaRocks to system's environment variables by running the following command or add it `.bashrc`/`.zshrc` or any similar shell configuration file to make it persistent across sessions + +```bash +export PATH=$PATH:/usr/local/luarocks/bin +``` + +- Install Lua + +```bash +$ luarocks install lua +``` + +--- + +#### PHP + +- Install PHP +- Install Web server (Apache or Nginx) +- Install PHP extensions + +``` +php-apache php-cgi php-fpm php-gd php-embed php-intl php-redis php-snmp +mysql-server php8.1-mysql +phpmyadmin +``` + +- Install composer (Dependency Manager for PHP) + +```bash +$ curl -sS https://getcomposer.org/installer | php +``` + +- Install laravel + +```bash +$ composer global require laravel/installer +``` + +- Edit PHP config + +```bash +$ sudoedit /etc/php/php.ini +``` + +- Enable PHP extensions, make sure these lines are uncommented (remove the `;` from each line) + +``` +extention=bcmath +extention=zip +extension=pdo_mysql +extension=mysqli +extension=iconv + +extension=gd +extension=imagick +extension=pdo_pgsql +extension=pgsql +``` + +- Recommended to set correct timezone + +``` +date.timezone = <Continent/City> +``` + +- Display errors to debug PHP code + +``` +display_errors = On +``` + +- Allow paths to be accessed by PHP + +``` +open_basedir = /srv/http/:/var/www/:/home/:/tmp/:/var/tmp/:/var/cache/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/ +``` + +--- + +#### Dart + +- Install dart or skip and install flutter (recommended) that includes dart + +```bash +$ curl -O "https://storage.googleapis.com/dart-archive/channels/be/raw/latest/sdk/dartsdk-linux-x64-release.zip" +$ unzip dartsdk-linux-x64-release.zip +$ sudo mv dart-sdk /usr/lib/dart +``` + +NOTE: If Dart SDK is downloaded separately, make sure that the Flutter version of dart is first in path, as the two versions might not be compatible. Use this command `which flutter dart` to see if flutter and dart originate from the same bin directory and are therefore compatible. + +- Install flutter + +```bash +$ git clone https://github.com/flutter/flutter.git -b stable +``` + +- Move flutter to the `/opt` directory + +```bash +$ sudo mv flutter /opt/ +``` + +- Export Flutter over Dart by putting this into `.bashrc`/`.zshrc` or any similar shell configuration file to make it persistent across sessions + +```bash +# Flutter/dart path +export PATH="/opt/flutter:/usr/lib/dart/bin:$PATH" +# Flutter Web Support +export PATH=$PATH:/opt/google/chrome +``` + +- Set permissions since only Root has access + +```bash +$ sudo groupadd flutterusers +$ sudo gpasswd -a $USER flutterusers +$ sudo chown -R :flutterusers /opt/flutter +$ sudo chmod -R g+w /opt/flutter/ +``` + +- If still getting any permission denied errors then do this + +```bash +$ sudo chown -R $USER /opt/flutter +``` + +- Continue to step **_Development Tools/Android Studio_** section to complete setup + +--- + +#### Javascript + +- nvm install/update script + +```bash +$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash +``` + +- Put these lines into `.bashrc`/`.zshrc` or any similar shell configuration file to make it persistent across sessions + +```bash +export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm +``` + +- Install node + +```bash +$ nvm install node +``` + +- Install the latest version in order to make npm executable + +```bash +$ nvm install --lts +``` + +--- + +### Development Tools + +#### MySQL + +- Install MySQL +- Ensure the MySQL service starts when reboot or startup machine. + +```bash +$ sudo systemctl start mysqld +``` + +- Setup MySQL for use + +```bash +$ sudo mysql_secure_installation +``` + +- To check its installed and working just open up mysql command prompt with + +``` +$ sudo mysql +``` + +--- + +#### Android Studio/SDK + +> NOTE: Android Studio is an Integrated Development Environment (IDE) that provides a comprehensive set of tools for Android app development. It includes the Android SDK (Software Development Kit), which consists of various libraries, tools, and system images necessary for developing Android applications. + +> The Android SDK can be installed separately without Android Studio, allowing you to use alternative text editors or IDEs for development. However, Android Studio provides a more streamlined and feature-rich development experience. + +> Make sure to properly set the Java environment (either 8 or 10, eg., java-8-openjdk) otherwise android-studio will not start. + +> If Android Studio shows up as a blank window try exporting `_JAVA_AWT_WM_NONREPARENTING=1`. + +- Install android studio + - Directly from the official website + ```bash + $ curl -L -o android-studio.tar.gz "$(curl -s "https://developer.android.com/studio#downloads" | grep -oP 'https://redirector\.gvt1\.com/[^"]+' | head -n 1)" + $ tar -xvzf android-studio.tar.gz + $ sudo mv android-studio /opt/ + $ cd /opt/android-studio/bin script # Configure Android Studio by running this script + $ ./studio.sh + ``` + - Or optionally install jetbrains-toolbox that includes android-studio amongst many other applications/tools from jetbrains + ```bash + $ latest_url=$(curl -sL "https://data.services.jetbrains.com/products/releases?code=TBA" | grep -oP 'https://download.jetbrains.com/toolbox/jetbrains-toolbox-\d+\.\d+\.\d+\.\d+\.tar\.gz' | head -n 1) && curl -L -o jetbrains-toolbox.tar.gz "$latest_url" + $ tar -xvzf jetbrains-toolbox.tar.gz + $ sudo mv jetbrains-toolbox /opt/jetbrains + ``` +- Complete the Android Studio Setup Wizard + - Click `Next` on the Welcome Window + - Click `Custom` and `Next` + - Make sure `/opt/android-sdk` directory exists otherwise create it by typing in the following command in a terminal + ```bash + $ sudo mkdir /opt/android-sdk + ``` + - Click on the folder icon next to the SDK path field. + - In the file picker dialog, navigate to the /opt directory and select the android-sdk directory. + - Proceed with the setup wizard, following the remaining instructions to complete the installation. +- If already installed and prefer not to have a `$HOME/Android` directory but rather use `/opt/android-sdk` + + - Launch Android Studio. + - Go to "File" > "Settings" (on Windows/Linux) or "Android Studio" > "Preferences" (on macOS) to open the settings. + - In the settings, navigate to "Appearance & Behavior" > "System Settings" > "Android SDK". + - In the "Android SDK Location" field, update the path to `/opt/android-sdk`. + - Click "Apply" or "OK" to save the settings. + +- Put these lines into `.bashrc`/`.zshrc` or any similar shell configuration file to make it persistent across sessions + +``` +# Android Home +export ANDROID_HOME=/opt/android-sdk +export PATH=$ANDROID_HOME/tools:$PATH +export PATH=$ANDROID_HOME/tools/bin:$PATH +export PATH=$ANDROID_HOME/platform-tools:$PATH +export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH +# Android emulator PATH +export PATH=$ANDROID_HOME/emulator:$PATH +# Android SDK ROOT PATH +export ANDROID_SDK_ROOT=/opt/android-sdk +export PATH=$ANDROID_SDK_ROOT:$PATH +# Alias for android-studio +alias android-studio='/opt/android-studio/bin/studio.sh' +``` + +- Android SDK and tools installation + > NOTE: Can be installed either through Android Studio or separately. + - Android Studio Installed: Launch Android Studio and go to the "SDK Manager" (usually found under "Configure" or "Preferences" menu). From the SDK Manager, select the desired SDK components (platforms, build tools, system images, etc.) and click "Apply" to install them. + - To install Android SDK separately (without Android Studio): + ```bash + $ curl -L -o commandlinetools.zip "$(curl -s "https://developer.android.com/studio#downloads" | grep -oP 'https://dl.google.com/android/repository/commandlinetools-linux-\d+_latest\.zip' | head -n 1)" + $ unzip commandlinetools.zip -d android-sdk + $ mkdir android-sdk/cmdline-tools/latest + $ sudo mv android-sdk /opt/ + or + $ sudo mv android-sdk/cmdline-tools /opt/android-sdk/ + ``` +- If Android SDK was installed separately then configure the user's permissions since android-sdk is installed in /opt/android-sdk directory + +```bash +$ sudo groupadd android-sdk +$ sudo gpasswd -a $USER android-sdk +$ sudo setfacl -R -m g:android-sdk:rwx /opt/android-sdk +$ sudo setfacl -d -m g:android-sdk:rwX /opt/android-sdk +``` + +- If Android SDK has been installed separately then install platform-tools and build-tools like this: + - First list `sdkmanager`'s available/installed packages + ```bash + $ sdkmanager --list + ``` + - Install platform-tools and build-tools + > NOTE: Replace <version> with the specific version number for platforms and build tools to install (e.g., "platforms;android-`33`" "build-tools;`34.0.0`"). + ```bash + $ sdkmanager "platform-tools" "platforms;android-<version>" "build-tools;<version>" + ``` +- Android emulator + - List of available android system images. + ```bash + $ sdkmanager --list + ``` + - Install an android image of your choice. For example. + ```bash + $ sdkmanager --install "system-images;android-29;default;x86" + ``` + - Then create an android emulator using Android Virtual Devices Manager + ```bash + $ avdmanager create avd -n <name> -k "system-images;android-29;default;x86" + ``` +- Continuing from **_Dart(flutter)_** section + - Update Flutter Config SDK PATH for custom SDK PATH + ```bash + $ flutter config --android-sdk /opt/android-sdk + ``` + - Accept all andfoid licenses with this command + ``` + $ flutter doctor --android-licenses + ``` + - If licenses are still not accepted even after running `flutter doctor --android-licenses` try these commands and then run `flutter doctor --android-licenses again` + ``` + $ sudo chown -R $(whoami) $ANDROID_SDK_ROOT + ``` + - Run this + ``` + $ flutter doctor + ``` +- Update emulator binaries + +```bash +$ sdkmanager --sdk_root=${ANDROID_HOME} tools +``` + +- Accept emulator licenses + > NOTE: Required to accept the necessary license for each package installed. + +```bash +$ sdkmanager --licenses +``` + +--- + +## Commands + +--- + +#### Windows + +- Install nvim natively to Windows + - First allow script execution, run the following command in PowerShell as an administrator: + ```dos + Set-ExecutionPolicy RemoteSigned + # or + Set-ExecutionPolicy RemoteSigned -Scope CurrentUser + ``` + - Then run the script by using this command in the same existing directory: + ```dos + ./win-nvim.ps1 + ``` + ```dos + curl -o winget-cli.appxbundle https://aka.ms/winget-cli-appxbundle + powershell Add-AppxPackage -Path "winget-cli.appxbundle" + 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')) + ``` + - Use `-y` or consider: choco feature enable -n allowGlobalConfirmation + ```dos + choco install git + ``` + - Refresh the environment + ```dos + Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1 + refreshenv + ``` + ```dos + git config --global user.name "Firstname Lastname" + git config --global user.email "your_email@example.com" + ``` diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..2f26daf --- /dev/null +++ b/install.sh @@ -0,0 +1,316 @@ +#!/usr/bin/env bash + +# Color definitions +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +# Function to handle errors +handle_error() { + local message="$1" + printf "${RED}Error: $message${NC}\n" +} + +if [[ $EUID -eq 0 ]]; then + echo "This script must not be run as root" + exit 1 +fi + +# Check if necessary dependencies are installed +check_download_dependencies() { + if [ -x "$(command -v wget)" ]; then + DOWNLOAD_COMMAND="wget" + elif [ -x "$(command -v curl)" ]; then + DOWNLOAD_COMMAND="curl" + else + printf "${RED}Error: Neither wget nor curl found. Please install one of them to continue!${NC}\n" + exit 1 + fi +} + +function get_or_update_dotfiles() { + if [ -d "$HOME/.cfg" ]; then + set MY_CWD = "$PWD" + cd "$HOME"/.cfg + git pull + cd "$(echo "$MY_CWD")" + else + git clone --bare https://github.com/srdusr/dotfiles.git "$HOME"/.cfg + fi +} + +function config() { + /usr/bin/git --git-dir="$HOME"/.cfg/ --work-tree="$HOME" "$@" +} + +function checkout_config() { + echo "Checking out config files..." + config checkout + + if [ $? = 0 ]; then + echo "Checked out config." + else + echo "Backing up pre-existing dot files." + FILES=$(config checkout 2>&1 | egrep "\s+\." | awk {'print $1'}) + for file in "${FILES[@]}"; do + echo "Backing up $file" + mkdir -p .config-backup/"$(dirname "$file")" + mv "$file" .config-backup/"$file" + done + echo "Finished Backup" + fi + + echo "Verifying checkout..." + config checkout + config config status.showUntrackedFiles no +} + +# Check for privilege escalation tools +check_privilege_tools() { + if [ -x "$(command -v sudo)" ]; then + PRIVILEGE_TOOL="sudo" + elif [ -x "$(command -v doas)" ]; then + PRIVILEGE_TOOL="doas" + elif [ -x "$(command -v pkexec)" ]; then + PRIVILEGE_TOOL="pkexec" + elif [ -x "$(command -v dzdo)" ]; then + PRIVILEGE_TOOL="dzdo" + elif [ "$(id -u)" -eq 0 ]; then + PRIVILEGE_TOOL="" # root + else + PRIVILEGE_TOOL="" # No privilege escalation mechanism found + printf "\n${RED}Error: No privilege escalation tool (sudo, doas, pkexec, dzdo, or root privileges) found. You may not have sufficient permissions to run this script.${NC}\n" + printf "\nAttempt to continue Installation (might fail without a privilege escalation tool)? [yes/no] " + read continue_choice + case $continue_choice in + [Yy] | [Yy][Ee][Ss]) ;; + [Nn] | [Nn][Oo]) exit ;; + *) handle_error "Invalid choice. Exiting..." && exit ;; + esac + fi +} + +# Create needed dirs and set proper permissions +for d in .cache .config .local; do + d="$HOME/$d" + if [ ! -d "$d" ]; then + mkdir -p "$d" + "$PRIVILEGE_TOOL" chown -R "$USER" "$d" + echo "Created $d" + fi +done + +# Function to change directory names from uppercase to lowercase +change_dir_names() { + local config_file="$HOME/.config/user-dirs.dirs" + + # Check if the system is not macOS + if [[ ! "$OSTYPE" == "darwin"* ]]; then + # Check if the config file exists + if [ -f "$config_file" ]; then + echo "Changing directory names from uppercase to lowercase..." + + # Read the lines from the config file and process them + while read -r line; do + # Extract variable name and path from each line + if [[ $line =~ ^[[:space:]]*([A-Z_]+)=\"(.+)\" ]]; then + var_name="${BASH_REMATCH[1]}" + var_path="${BASH_REMATCH[2]}" + + # Convert the variable name to lowercase + var_name_lowercase="$(echo "$var_name" | tr '[:upper:]' '[:lower:]')" + + # Check if the directory exists + if [ -d "$var_path" ]; then + # Rename the directory to lowercase + new_var_path="$HOME/${var_name_lowercase}" + mv "$var_path" "$new_var_path" + echo "Renamed $var_path to $new_var_path" + fi + fi + done <"$config_file" + + echo "Directory names changed successfully." + else + echo "The config file $config_file does not exist. Skipping directory name changes." + fi + else + echo "macOS detected. Skipping directory name changes." + fi +} + +# Check if a command is available +check_command() { + command -v "$1" >/dev/null 2>&1 +} + +# Check for required dependencies +check_dependencies() { + local dependencies=("git" "clang" "gcc" "make" "ninja" "cmake" "wmctrl" "xdo" "xdotool" "ripgrep" "fd" "tmux" "tree-sitter" "vim" "zsh") + local missing_dependencies=() + + for dep in "${dependencies[@]}"; do + if ! check_command "$dep"; then + missing_dependencies+=("$dep") + fi + done + + if [ ${#missing_dependencies[@]} -gt 0 ]; then + echo "Error: The following dependencies are missing: ${missing_dependencies[*]}" + exit 1 + fi +} + +# Install Fzf +install_fzf() { + if ! check_command "fzf"; then + echo "Installing Fzf..." + local INSTALL_CMD="git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf && ~/.fzf/install" + if [ "$PRIVILEGE_TOOL" != "" ]; then + "$PRIVILEGE_TOOL" bash -c "$INSTALL_CMD" + else + bash -c "$INSTALL_CMD" + fi + else + echo "Fzf is already installed." + fi +} + +# Install Zsh plugins +install_zsh_plugins() { + local zsh_plugins_dir="$HOME/.config/zsh/plugins" + + if [ ! -d "$zsh_plugins_dir/zsh-you-should-use" ]; then + echo "Installing zsh-you-should-use..." + git clone https://github.com/MichaelAquilina/zsh-you-should-use.git "$zsh_plugins_dir/zsh-you-should-use" + else + echo "zsh-you-should-use is already installed." + fi + + if [ ! -d "$zsh_plugins_dir/zsh-syntax-highlighting" ]; then + echo "Installing zsh-syntax-highlighting..." + git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$zsh_plugins_dir/zsh-syntax-highlighting" + else + echo "zsh-syntax-highlighting is already installed." + fi + + if [ ! -d "$zsh_plugins_dir/zsh-autosuggestions" ]; then + echo "Installing zsh-autosuggestions..." + git clone https://github.com/zsh-users/zsh-autosuggestions.git "$zsh_plugins_dir/zsh-autosuggestions" + else + echo "zsh-autosuggestions is already installed." + fi +} + +# Install Rust using rustup +install_rust() { + if ! check_command "rustup"; then + echo "Installing Rust using rustup..." + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + else + echo "Rust is already installed." + fi +} + +# Install Wezterm +install_wezterm() { + if ! check_command "wezterm"; then + echo "Installing Wezterm..." + git clone --depth=1 --branch=main --recursive https://github.com/wez/wezterm.git ~/wezterm + cd ~/wezterm || exit + git submodule update --init --recursive + ./get-deps + cargo build --release + cargo run --release --bin wezterm -- start + else + echo "Wezterm is already installed." + fi +} + +function install_font() { + FONT=$1 + ZIPFILE_NAME="${FONT}.zip" + DOWNLOAD_URL="https://github.com/ryanoasis/nerd-fonts/releases/download/v${NERDFONTS_LATEST_VERSION}/${ZIPFILE_NAME}" + echo "Downloading $DOWNLOAD_URL" + wget "$DOWNLOAD_URL" + unzip -u "$ZIPFILE_NAME" -d "$FONTS_DIR" -x "*.txt/*" -x "*.md/*" + rm "$ZIPFILE_NAME" +} + +function install_nerd_fonts() { + echo "Installing Nerd fonts" + + declare -a fonts=( + AnonymousPro + CascadiaCode + FiraCode + FiraMono + Hack + Iosevka + LiberationMono + Noto + Overpass + RobotoMono + Terminus + Ubuntu + UbuntuMono + ) + + if [[ "$OSTYPE" == "darwin"* ]]; then + brew tap homebrew/cask-fonts + for FONT in "${fonts[@]}"; do + brew install "font-$(sed --expression 's/\([A-Z]\)/-\L\1/g' --expression 's/^-//' <<<"$FONT")-nerd-font" + done + else + NERDFONTS_LATEST_VERSION="$(gh release list \ + --exclude-drafts \ + --exclude-pre-releases \ + --limit 1 \ + --repo ryanoasis/nerd-fonts | + grep Latest | + awk '{print substr($1, 2);}')" # take the first word of the line and remove the first char + + FONTS_DIR="${HOME}/.local/share/fonts" + + if [[ ! -d "$FONTS_DIR" ]]; then + mkdir -p "$FONTS_DIR" + fi + + for FONT in "${fonts[@]}"; do + confirm "Install $FONT?" && install_font "$FONT" + done + + find "$FONTS_DIR" -name '*Windows Compatible*' -delete + + fc-cache -fv + fi +} +# Main installation function +install() { + check_privilege_tool + + echo "This script will install and configure various tools and settings on your system." + read -p "Do you want to continue (y/n)? " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi + + # Ask for privilege right away + "$PRIVILEGE_TOOL" echo -n + current_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + + check_dependencies + change_dir_names + install_fzf + install_zsh_plugins + configure_zshrc + install_rust + install_wezterm + install_nerd_fonts + + echo "Installation completed." +} + +# Run the installation process +install |
