feat: todos, decman config almost complete

This commit is contained in:
2026-06-14 17:58:00 +02:00
parent e74b162b91
commit 04a5d8919c
32 changed files with 1632 additions and 72 deletions
+17
View File
@@ -0,0 +1,17 @@
# TODOs
- [ ] Notifications management via dms
- [ ] Launcher via dms
- [ ] DMS screenshots
- [ ] Hyprland theming using mutagen with dms integration
- [ ] Copy the DMS configs here
- [ ] DMS config sync to here using script
- [ ] Binds for other DMS features (with subcommand)
- [ ] Finish decman config
- [ ] Remove wlogout and replace with dms setup
- [ ] Yazi theming
- [ ] Kitty theming
- [ ] Fish theming
- [ ] Fastfetch theming
- [ ] DMS instead of Hyprlock for locker?
- [ ] Zathura theming possible?
- [ ] Librewolf theme
+8 -5
View File
@@ -1,5 +1,8 @@
grub_theme = "/usr/share/grub/themes/monterey-grub-theme/theme.txt"
grub_os_prober = True
kernel_args_all = ""
kernel_args_debug_only = ""
kernel_args_normal_only = ""
grub_theme = {
"desktop": "/usr/share/grub/themes/monterey-grub-theme/theme.txt",
"laptop": "/usr/share/grub/themes/monterey-grub-theme/theme.txt",
}
grub_os_prober = {"desktop": True, "laptop": False}
kernel_args_all = {"desktop": "", "laptop": ""}
kernel_args_debug_only = {"desktop": "", "laptop": ""}
kernel_args_normal_only = {"desktop": "", "laptop": ""}
+1 -2
View File
@@ -8,7 +8,6 @@ hl.on("hyprland.start", function()
hl.exec_cmd("hyprlauncher -d")
hl.exec_cmd("nm-applet")
hl.exec_cmd("nextcloud --background")
hl.exec_cmd("quickshell")
hl.exec_cmd("matugen")
hl.exec_cmd("dms run")
hl.exec_cmd("wl-paste --type text --watch cliphist store")
end)
View File
+276
View File
@@ -0,0 +1,276 @@
# ─────────────────────────────────────────────────────────────────────
# ╭─────────────────────────────────────────────────╮
# │ clang-format config │
# ╰─────────────────────────────────────────────────╯
# ─────────────────────────────────────────────────────────────────────
BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: BlockIndent
AlignArrayOfStructures: Left
AlignConsecutiveAssignments:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: true
AlignConsecutiveBitFields:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveDeclarations:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveMacros:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveShortCaseStatements:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCaseArrows: false
AlignCaseColons: false
AlignConsecutiveTableGenBreakingDAGArgColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveTableGenCondOperatorColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveTableGenDefinitionColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignEscapedNewlines: Right
AlignOperands: Align
AlignTrailingComments:
Kind: Always
OverEmptyLines: 0
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowBreakBeforeNoexceptSpecifier: Never
AllowShortBlocksOnASingleLine: Never
AllowShortCaseExpressionOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: false
AllowShortCompoundRequirementOnASingleLine: true
AllowShortEnumsOnASingleLine: true
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AttributeMacros:
- __capability
BinPackArguments: false
BinPackParameters: false
BitFieldColonSpacing: Both
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: true
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakAdjacentStringLiterals: true
BreakAfterAttributes: Always
BreakAfterJavaFieldAnnotations: false
BreakAfterReturnType: None
BreakArrays: true
BreakBeforeBinaryOperators: All
BreakBeforeBraces: Attach
BreakBeforeConceptDeclarations: Always
BreakBeforeInlineASMColon: OnlyMultiline
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakFunctionDefinitionParameters: false
BreakInheritanceList: BeforeColon
BreakStringLiterals: true
BreakTemplateDeclarations: MultiLine
ColumnLimit: 100
CommentPragmas: "^ IWYU pragma:"
CompactNamespaces: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: true
DisableFormat: false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: Always
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Preserve
IncludeCategories:
- Regex: ^"(llvm|llvm-c|clang|clang-c)/
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: ^(<|"(gtest|gmock|isl|json)/)
Priority: 3
SortPriority: 0
CaseSensitive: false
- Regex: .*
Priority: 1
SortPriority: 0
CaseSensitive: false
IncludeIsMainRegex: (Test)?$
IncludeIsMainSourceRegex: ""
IndentAccessModifiers: true
IndentCaseBlocks: true
IndentCaseLabels: true
IndentExternBlock: AfterExternBlock
IndentGotoLabels: true
IndentPPDirectives: BeforeHash
IndentRequiresClause: true
IndentWidth: 4
IndentWrappedFunctionNames: true
InsertBraces: false
InsertNewlineAtEOF: false
InsertTrailingCommas: None
IntegerLiteralSeparator:
Binary: 0
BinaryMinDigits: 0
Decimal: 0
DecimalMinDigits: 0
Hex: 0
HexMinDigits: 0
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLines:
AtEndOfFile: false
AtStartOfBlock: true
AtStartOfFile: true
LambdaBodyIndentation: Signature
LineEnding: DeriveLF
MacroBlockBegin: ""
MacroBlockEnd: ""
MainIncludeChar: Quote
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PPIndentWidth: -1
PackConstructorInitializers: BinPack
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakOpenParenthesis: 0
PenaltyBreakScopeResolution: 500
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyIndentedWhitespace: 0
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right
QualifierAlignment: Left
ReferenceAlignment: Pointer
ReflowComments: true
RemoveBracesLLVM: true
RemoveParentheses: MultipleParentheses
RemoveSemicolon: false
RequiresClausePosition: OwnLine
RequiresExpressionIndentation: OuterScope
SeparateDefinitionBlocks: Always
ShortNamespaceLines: 1
SkipMacroDefinitionBody: false
SortIncludes: CaseSensitive
SortJavaStaticImport: Before
SortUsingDeclarations: LexicographicNumeric
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeJsonColon: false
SpaceBeforeParens: ControlStatements
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDeclarationName: true
AfterFunctionDefinitionName: true
AfterIfMacros: true
AfterOverloadedOperator: false
AfterPlacementOperator: true
AfterRequiresInClause: false
AfterRequiresInExpression: false
BeforeNonEmptyParentheses: false
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: Never
SpacesInContainerLiterals: true
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParens: Custom
SpacesInParensOptions:
ExceptDoubleParentheses: false
InConditionalStatements: true
InCStyleCasts: false
InEmptyParentheses: false
Other: true
SpacesInSquareBrackets: true
Standard: Latest
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 4
TableGenBreakInsideDAGArg: DontBreak
UseTab: Never
VerilogBreakBetweenInstancePorts: true
WhitespaceSensitiveMacros:
- BOOST_PP_STRINGIZE
- CF_SWIFT_NAME
- NS_SWIFT_NAME
- PP_STRINGIZE
- STRINGIZE
+744
View File
@@ -0,0 +1,744 @@
import eslint from '@eslint/js';
import globals from 'globals';
import stylistic from '@stylistic/eslint-plugin';
import tseslint from 'typescript-eslint';
import typescript from '@typescript-eslint/eslint-plugin';
import vue from 'eslint-plugin-vue';
const style = {
'plugins': {
'@stylistic': stylistic,
'@stylistic/js': stylistic,
'@stylistic/ts': stylistic
},
'files': [
'**/*.ts',
'**/*.js',
'**/*.mjs',
'**/*.cjs',
'**/*.tsx',
'**/*.jsx'
],
'rules': {
'sort-imports': [
'warn',
{
'ignoreCase': false,
'ignoreDeclarationSort': false,
'ignoreMemberSort': false,
'memberSyntaxSortOrder': [
'none',
'all',
'multiple',
'single'
],
'allowSeparatedGroups': false
}
],
// Formatting
'@stylistic/array-bracket-newline': [
'error',
{
'multiline': false,
'minItems': 2
}
],
'@stylistic/array-bracket-spacing': [
'error',
'always'
],
'@stylistic/array-element-newline': [
'error',
{
'consistent': false,
'multiline': false,
'minItems': 2
}
],
'@stylistic/arrow-parens': [
'error',
'as-needed'
],
'@stylistic/arrow-spacing': [
'error',
{
'before': true,
'after': true
}
],
'@stylistic/block-spacing': [
'error',
'always'
],
'@stylistic/brace-style': [
'error',
'1tbs',
{
'allowSingleLine': false
}
],
'@stylistic/comma-dangle': [
'error',
'never'
],
'@stylistic/comma-spacing': [
'error',
{
'before': false,
'after': true
}
],
'@stylistic/comma-style': [
'error',
'last'
],
'@stylistic/dot-location': [
'error',
'property'
],
'@stylistic/function-call-argument-newline': [
'error',
'consistent'
],
'@stylistic/function-call-spacing': [
'error',
'never'
],
'@stylistic/function-paren-newline': [
'error',
'multiline-arguments'
],
'@stylistic/implicit-arrow-linebreak': [
'error',
'beside'
],
'@stylistic/indent': [
'error',
4
],
'@stylistic/indent-binary-ops': [
'error',
4
],
'@stylistic/key-spacing': [
'error',
{
'beforeColon': false,
'afterColon': true
}
],
'@stylistic/keyword-spacing': [
'error',
{
'before': true,
'after': true
}
],
'@stylistic/lines-between-class-members': [
'error',
'always'
],
'@stylistic/max-len': [
'warn',
{
'code': 140,
'comments': 160,
'ignoreComments': false,
'ignoreUrls': true,
'ignoreStrings': true,
'ignoreTemplateLiterals': true,
'ignoreRegExpLiterals': true
}
],
'@stylistic/max-statements-per-line': [
'error',
{
'max': 1
}
],
'@stylistic/multiline-ternary': [
'error',
'always-multiline'
],
'@stylistic/new-parens': [
'error',
'always'
],
'@stylistic/newline-per-chained-call': 'error',
'@stylistic/no-confusing-arrow': 'error',
'@stylistic/no-extra-parens': [
'error',
'all',
{
'nestedBinaryExpressions': false,
'ternaryOperandBinaryExpressions': false,
'ignoreJSX': 'multi-line',
'nestedConditionalExpressions': false
}
],
'@stylistic/no-extra-semi': 'error',
'@stylistic/no-floating-decimal': 'error',
'@stylistic/no-mixed-operators': 'error',
'@stylistic/no-mixed-spaces-and-tabs': 'error',
'@stylistic/no-multi-spaces': 'error',
'@stylistic/no-multiple-empty-lines': [
'error',
{
'max': 3,
'maxEOF': 2
}
],
'@stylistic/no-tabs': 'error',
'@stylistic/no-trailing-spaces': 'error',
'@stylistic/no-whitespace-before-property': 'error',
'@stylistic/object-curly-newline': [
'error',
{
'multiline': true,
'minProperties': 1
}
],
'@stylistic/object-curly-spacing': [
'error',
'always'
],
'@stylistic/object-property-newline': 'error',
'@stylistic/one-var-declaration-per-line': 'error',
'@stylistic/operator-linebreak': [
'error',
'before'
],
'@stylistic/padded-blocks': [
'error',
{
'blocks': 'never',
'classes': 'always',
'switches': 'never'
}
],
// Padding lines. The most in-depth part of this config
'@stylistic/padding-line-between-statements': [
'error',
// Variables, Constants
{
'blankLine': 'never',
'prev': 'var',
'next': 'var'
},
{
'blankLine': 'never',
'prev': 'let',
'next': 'let'
},
{
'blankLine': 'never',
'prev': 'const',
'next': 'const'
},
{
'blankLine': 'always',
'prev': 'var',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'let',
'return',
'switch',
'throw',
'try',
'var',
'with'
]
},
{
'blankLine': 'always',
'prev': 'let',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
{
'blankLine': 'always',
'prev': 'const',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
// Import
{
'blankLine': 'never',
'prev': 'import',
'next': 'import'
},
{
'blankLine': 'never',
'prev': 'cjs-import',
'next': 'cjs-import'
},
{
'blankLine': 'always',
'prev': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
],
'next': 'cjs-import'
},
{
'blankLine': 'always',
'prev': 'cjs-import',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
{
'blankLine': 'always',
'prev': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
],
'next': 'import'
},
{
'blankLine': 'always',
'prev': 'import',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
// If
{
'blankLine': 'always',
'prev': '*',
'next': 'if'
},
{
'blankLine': 'always',
'prev': 'if',
'next': '*'
},
// For
{
'blankLine': 'always',
'prev': '*',
'next': 'for'
},
{
'blankLine': 'always',
'prev': 'for',
'next': '*'
},
// While
{
'blankLine': 'always',
'prev': '*',
'next': 'while'
},
{
'blankLine': 'always',
'prev': 'while',
'next': '*'
},
// Functions
{
'blankLine': 'always',
'prev': '*',
'next': 'function'
},
{
'blankLine': 'always',
'prev': 'function',
'next': '*'
},
// Block Statements
{
'blankLine': 'always',
'prev': '*',
'next': 'block-like'
},
{
'blankLine': 'always',
'prev': 'block-like',
'next': '*'
},
// Switch
{
'blankLine': 'always',
'prev': '*',
'next': 'switch'
},
{
'blankLine': 'always',
'prev': 'switch',
'next': '*'
},
// Try-Catch
{
'blankLine': 'always',
'prev': '*',
'next': 'try'
},
{
'blankLine': 'always',
'prev': 'try',
'next': '*'
},
// Throw
{
'blankLine': 'always',
'prev': '*',
'next': 'throw'
},
{
'blankLine': 'always',
'prev': 'throw',
'next': '*'
},
// Return
{
'blankLine': 'never',
'prev': 'return',
'next': '*'
},
{
'blankLine': 'always',
'prev': '*',
'next': 'return'
},
// Export
{
'blankLine': 'always',
'prev': '*',
'next': 'export'
},
{
'blankLine': 'always',
'prev': 'export',
'next': '*'
},
{
'blankLine': 'always',
'prev': '*',
'next': 'cjs-export'
},
{
'blankLine': 'always',
'prev': 'cjs-export',
'next': '*'
},
// Classes
{
'blankLine': 'always',
'prev': '*',
'next': 'class'
},
{
'blankLine': 'always',
'prev': 'class',
'next': '*'
}
],
'@stylistic/quote-props': [
'error',
'always'
],
'@stylistic/quotes': [
'error',
'single'
],
'@stylistic/rest-spread-spacing': [
'error',
'never'
],
'@stylistic/semi': [
'error',
'always'
],
'@stylistic/semi-spacing': [
'error',
{
'before': false,
'after': true
}
],
'@stylistic/semi-style': [
'error',
'last'
],
'@stylistic/space-before-blocks': [
'error',
'always'
],
'@stylistic/space-before-function-paren': [
'error',
'always'
],
'@stylistic/space-in-parens': [
'error',
'always'
],
'@stylistic/space-infix-ops': [
'error',
{
'int32Hint': false
}
],
'@stylistic/space-unary-ops': 'error',
'@stylistic/spaced-comment': [
'error',
'always'
],
'@stylistic/switch-colon-spacing': 'error',
'@stylistic/template-curly-spacing': [
'error',
'always'
],
'@stylistic/template-tag-spacing': [
'error',
'always'
],
'@stylistic/type-generic-spacing': 'error',
'@stylistic/type-named-tuple-spacing': 'error',
'@stylistic/wrap-iife': [
'error',
'inside'
],
'@stylistic/wrap-regex': 'error',
'@stylistic/ts/type-annotation-spacing': 'error'
}
};
/** @type {import('eslint').Linter.Config} */
export default tseslint.config(
// Base JavaScript rules
eslint.configs.recommended,
tseslint.configs.recommended,
style,
// Vue support (including TS and JSX inside SFCs)
{
'files': [ '**/*.vue' ],
'languageOptions': {
'sourceType': 'module',
'ecmaVersion': 'latest',
'globals': globals.browser,
'parserOptions': {
'parser': tseslint.parser
}
},
'plugins': {
'vue': vue,
'@stylistic': stylistic,
'@stylistic/js': stylistic,
'@stylistic/ts': stylistic,
'@typescript-eslint': typescript
},
'extends': [
eslint.configs.recommended,
...vue.configs['flat/recommended']
],
'rules': {
...typescript.configs.recommended.rules,
...style.rules,
// Vue specific rules
'@stylistic/indent': 'off',
'vue/html-indent': [
'error',
4
],
'vue/html-comment-indent': [
'error',
4
],
'vue/script-indent': [
'error',
4,
{
'baseIndent': 1,
'switchCase': 1
}
],
'vue/html-self-closing': [
'error',
{
'html': {
'void': 'never',
'normal': 'never',
'component': 'always'
},
'svg': 'always',
'math': 'never'
}
],
'vue/max-attributes-per-line': [
'error',
{
'singleline': 3,
'multiline': 1
}
]
}
}
);
+82
View File
@@ -0,0 +1,82 @@
# Use spaces for indent (because f*k tabs)
defaultIndent: " "
# Limit Number of backups
maxNumberOfBackups: 3
verbatimEnvironments:
verbatim: 1
lstlisting: 1
minted: 1
code: 1
indentRules:
recall: " "
remarks: " "
remark: " "
guides: " "
properties: " "
restrictions: " "
limitations: " "
terms: " "
notation: " "
usage: " "
task: " "
proof: " "
general: " "
simplebox: " "
definition: " "
theorem: " "
lemma: " "
corollary: " "
axiom: " "
fact: " "
proposition: " "
example: " "
formula: " "
conjugation: " "
forms: " "
lookForAlignDelims:
tables:
delims: 1
alignDoubleBackSlash: 1
spacesBeforeDoubleBackSlash: 1
multiColumnGrouping: 0
alignRowsWithoutMaxDelims: 1
spacesBeforeAmpersand: 1
spacesAfterAmpersand: 1
justification: left
alignFinalDoubleBackSlash: 0
dontMeasure: 0
delimiterRegEx: (?<!\\)(&)
delimiterJustification: left
lookForChildCodeBlocks: 1
alignContentAfterDoubleBackSlash: 0
spacesAfterDoubleBackSlash: 1
specialBeginEnd:
If:
begin: '\\If'
middle:
- '\\ElsIf'
- '\\Else'
end: '\\EndIf'
lookForThis: 1
For:
begin: '\\For'
end: '\\EndFor'
lookForThis: 1
Procedure:
begin: '\\Procedure'
end: '\\EndProcedure'
lookForThis: 1
Function:
begin: '\\Function'
end: '\\EndFunction'
lookForThis: 1
While:
begin: '\\While'
end: '\\EndWhile'
lookForThis: 1
specialBeforeCommand: 1
+8
View File
@@ -0,0 +1,8 @@
{
"devDependencies": {
"@eslint/js": "^9.28.0",
"@stylistic/eslint-plugin": "^4.4.1",
"eslint-plugin-vue": "^10.2.0",
"typescript-eslint": "^8.33.1"
}
}
+29
View File
@@ -1 +1,30 @@
import decman
from modules.core import utilities
from modules.core.system import base, pipewire
from modules.core.applications import dev_tools, games, steering_wheel, virtual_machines
from modules.core.ui import file_manager, fonts, hyprland, login, shell
from modules.coding import latex, neovim
if decman.aur:
decman.aur.ignored_packages |= {"yay"}
if decman.pacman:
decman.pacman.ignored_packages |= {"yay"}
user = "janis"
decman.modules += [
base.BasePackages(),
pipewire.Pipewire(),
dev_tools.DevTools(),
games.Games(),
steering_wheel.SteeringWheel(),
file_manager.FileManager(),
fonts.Fonts(),
hyprland.Hyprland(),
login.LoginManager("desktop"),
shell.DesktopShell(),
neovim.Neovim(),
latex.Latex(user),
utilities.UtilPackages(),
virtual_machines.VirtualMachines(user),
]
Executable
+27
View File
@@ -0,0 +1,27 @@
#!/bin/sh
echo "
_ _ ( ) ( )_
(_) _ _ ___ (_) ___| |__ _ _| _)____
| |/ _ ) _ \ | __) _ \ ) ( ) | (_ )
| | (_| | ( ) | |__ \ | | | (_) | |_ / /_
_ | |\__ _)_) (_)_)____/_) (_)\___/ \__)____)
( )_| |
\___/
=> Migration to V4
-> WARNING: This will remove the old configurations from the system
"
confirmation=""
read -p "Do you really want to remove the old configuration files and update to the new configs? (y/N) " confirmation
if [[ "$confirmation" == "y" ]]; then
rm -rf ~/.config/hypr
rm ~/.config/platform
rm -rf ~/.config/rofi
rm -rf ~/.config/ags
rm -rf ~/.config/astal
else
echo "Aborting."
fi
+38 -7
View File
@@ -2,22 +2,53 @@ import decman
from decman.plugins import pacman
class BaseModule(decman.Module):
def __init__(self):
class Latex(decman.Module):
def __init__(self, user: str):
"""Base packages that should never be uninstalled"""
self._user = user
super().__init__("latex")
@pacman.packages
def pkgs(self) -> set[str]:
return {
"texlive",
"texlive-langgerman",
"biber",
"perl-yaml-tiny",
"perl-file-homedir",
"biber",
"python-pygments",
"texlab",
"texlive-basic",
"texlive-bibtexextra",
"texlive-binextra",
"texlive-context",
"texlive-fontsextra",
"texlive-fontsrecommended",
"texlive-fontutils",
"texlive-formatsextra",
"texlive-games",
"texlive-humanities",
"texlive-latex",
"texlive-latexextra",
"texlive-latexrecommended",
"texlive-lualatex",
"texlive-mathscience",
"texlive-metapost",
"texlive-music",
"texlive-pictures",
"texlive-plaingeneric",
"texlive-pstricks",
"texlive-publishers",
"texlive-xetex",
"texlive-langgerman",
}
def on_enable(self, store: decman.Store):
# TODO: clone the git repo
return super().on_enable(store)
decman.prg(
[
"cd",
"~/projects/",
"git",
"clone",
"https://git.janishutz.com/janishutz/latex",
],
user=self._user,
)
+2 -1
View File
@@ -2,7 +2,7 @@ import decman
from decman.plugins import pacman, aur
class NeovimModule(decman.Module):
class Neovim(decman.Module):
def __init__(self):
"""Neovim Packages"""
super().__init__("neovim")
@@ -15,6 +15,7 @@ class NeovimModule(decman.Module):
"lua-language-server",
"tree-sitter",
"tree-sitter-cli",
"shell-color-scripts-git",
"stylua",
}
+21 -2
View File
@@ -17,12 +17,31 @@ class DevTools(decman.Module):
"docker-buildx",
"docker-compose",
"filezilla",
"kitty",
"lazygit",
"git-lfs",
"hugo",
"kitty",
"lazygit",
"meld",
"minisign",
"python-argcomplete",
"python-black",
"python-build",
"python-colorama",
"python-install",
"python-jsonschema",
"python-pip",
"python-numpy",
"python-scipy",
"python-sympy",
"serpl",
"terminator",
}
def directories(self) -> dict[str, decman.Directory]:
return {
"~/.config/lazygit": decman.Directory("./config/lazygit"),
"~/.config/kitty": decman.Directory("./config/kitty"),
}
def files(self) -> dict[str, decman.File]:
return {"~/.indentconfig.yaml": decman.File("./linters/indentconfig.yaml")}
+9 -5
View File
@@ -12,12 +12,16 @@ class Games(decman.Module):
return {
"android-udev",
"android-tools",
"lib32-vulkan-radeon",
"vulkan-radeon",
"steam",
"prismlauncher",
"gamemmode",
"gamemode",
"gamescope",
# "lib32-vulkan-radeon",
"lovr",
"obs-studio",
"obs-studio-plugin-browser",
"prismlauncher",
"steam",
"vulkan-radeon",
"v4l2loopback-dkms",
}
@aur.packages
+1 -1
View File
@@ -2,7 +2,7 @@ import decman
from decman.plugins import aur
class BasePackages(decman.Module):
class SteeringWheel(decman.Module):
def __init__(self):
"""Base packages that should never be uninstalled"""
super().__init__("steering-wheel")
@@ -0,0 +1,23 @@
import decman
from decman.plugins import pacman
class VirtualMachines(decman.Module):
def __init__(self, user: str):
"""Set up virtual machines"""
self._user = user
super().__init__("virtualmachines")
@pacman.packages
def pkgs(self) -> set[str]:
return {
"dnsmasq",
"ebtables",
"qemu-base",
"vde2" "virt-manager",
"virt-viewer",
}
def on_enable(self, store: decman.Store):
# TODO: Everywhere, make user configurable
decman.prg(["usermod", "-G", "libvirt", "-a", self._user])
+14 -6
View File
@@ -11,33 +11,41 @@ class BasePackages(decman.Module):
def pkgs(self) -> set[str]:
return {
"base",
"base-devel",
"cifs",
"cups",
"efibootmgr",
"git",
"grub",
"linux",
"linux-firmware",
"linux-headers",
"mesa",
"mesa-utils",
"networkmanager",
"git",
"paccache",
"plymouth",
"reflector",
"sudo",
"systemd-resolvconf",
"trash-cli",
"base-devel",
"cifs",
"reflector",
"paccache",
"plymouth"
}
@aur.packages
def aurpkgs(self) -> set[str]:
return {"decman"}
# TODO:
# def file_variables(self) -> dict[str, str]:
# return super().file_variables()
def files(self) -> dict[str, decman.File]:
# TODO: File substitutions (for PC and laptop)
return {
"/etc/mkinitcpio.conf": decman.File(source_file="./system/mkinitcpio.conf"),
"/etc/pacman.conf": decman.File(source_file="./system/pacman.conf"),
"/etc/default/grub": decman.File(source_file="./system/grub"),
"/etc/environment": decman.File(source_file="./system/environment"),
}
def on_change(self, store):
+3 -3
View File
@@ -1,11 +1,11 @@
import decman
from decman.plugins import pacman, aur
from decman.plugins import pacman
class BaseModule(decman.Module):
class Pipewire(decman.Module):
def __init__(self):
"""Base packages that should never be uninstalled"""
super().__init__("base")
super().__init__("pipewire")
@pacman.packages
def pkgs(self) -> set[str]:
+15 -10
View File
@@ -2,26 +2,31 @@ import decman
from decman.plugins import pacman, aur
class BaseModule(decman.Module):
class FileManager(decman.Module):
def __init__(self):
"""Base packages that should never be uninstalled"""
super().__init__("yazi")
super().__init__("filemanager")
@pacman.packages
def pkgs(self) -> set[str]:
return {
"yazi",
"ifuse",
"libimobiledevice",
"ouch",
"grub",
"linux",
"networkmanager",
"git",
"base-devel",
"yazi",
}
@aur.packages
def aurpkgs(self) -> set[str]:
return {"xdg-desktop-portal-termfilechooser-hunkyburrito-git"}
def files(self) -> dict[str, decman.File]:
return super().files()
def directories(self) -> dict[str, decman.Directory]:
return {
"~/.config/xdg-desktop-portal": decman.Directory(
"./config/xdg-desktop-portal"
),
"~/.config/xdg-desktop-portal-termfilechooser": decman.Directory(
"./config/xdg-desktop-portal-termfilechooser"
),
"~/.config/yazi": decman.Directory("./config/yazi"),
}
+2 -2
View File
@@ -2,7 +2,7 @@ import decman
from decman.plugins import pacman, aur
class BaseModule(decman.Module):
class Fonts(decman.Module):
def __init__(self):
"""Base packages that should never be uninstalled"""
super().__init__("fonts")
@@ -10,7 +10,7 @@ class BaseModule(decman.Module):
@pacman.packages
def pkgs(self) -> set[str]:
return {
"adobe-source-code-pro-fonts"
"adobe-source-code-pro-fonts",
"ttf-fantasque-nerd",
"ttf-jetbrains-mono-nerd",
"ttf-iosevka-nerd",
+4 -6
View File
@@ -1,11 +1,11 @@
import decman
from decman.plugins import pacman, aur
from decman.plugins import pacman
class BaseModule(decman.Module):
class Hyprland(decman.Module):
def __init__(self):
"""Base packages that should never be uninstalled"""
super().__init__("base")
super().__init__("hyprland")
@pacman.packages
def pkgs(self) -> set[str]:
@@ -15,19 +15,17 @@ class BaseModule(decman.Module):
"hypridle",
"hyprshutdown",
"grimblast",
"grim",
"xdg-desktop-portal-hyprland",
"hyprpolkitagent",
"hyprpaper",
"wl-clipboard",
"cliphist",
"hyrplauncher",
"hyprpwcenter",
"hyprtoolkit",
}
def directories(self) -> dict[str, decman.Directory]:
return super().directories()
return {"~/.config/hypr": decman.Directory("./config/hypr")}
def on_change(self, store: decman.Store):
return super().on_change(store)
+11 -4
View File
@@ -8,7 +8,7 @@ class LoginManager(decman.Module):
def __init__(self, platform: Literal["desktop", "laptop"]):
"""Base packages that should never be uninstalled"""
self._platform: Literal["desktop", "laptop"] = platform
super().__init__("base")
super().__init__("login")
@pacman.packages
def pkgs(self) -> set[str]:
@@ -20,12 +20,19 @@ class LoginManager(decman.Module):
else:
return {"gdm"}
# TODO: Config files for laptop and desktop
# TODO: Consider dms greetd for desktop
@systemd.units
def units(self) -> set[str]:
if self._platform == "desktop":
return {"greetd.service"}
else:
return {"gdm.service"}
def files(self) -> dict[str, decman.File]:
if self._platform == "desktop":
return {
"/etc/greetd/config.toml": decman.File("./system/greetd/config.toml"),
"/etc/pam.d/greetd": decman.File("./system/greetd/pam"),
}
else:
# TODO: GDM config files
return {}
+2 -5
View File
@@ -6,15 +6,12 @@ from decman.plugins import pacman
class DesktopShell(decman.Module):
def __init__(self):
"""DesktopShell"""
super().__init__("base")
super().__init__("desktopshell")
@pacman.packages
def pkgs(self) -> set[str]:
return {"dms-shell", "cava", "matugen"}
# TODO: Copy the config, once done
# TODO: Copy the config of dms, once done
def directories(self) -> dict[str, decman.Directory]:
return { "~/.config/matugen": decman.Directory("./config/matugen") }
def files(self) -> dict[str, decman.File]:
return { "~/.config/matugen": decman.File("") }
+19 -4
View File
@@ -12,8 +12,7 @@ class UtilPackages(decman.Module):
return {
"bashtop",
"bluez",
"bluez-utils",
"blueman",
"clamav",
"dig",
"evince",
"fastfetch",
@@ -31,9 +30,9 @@ class UtilPackages(decman.Module):
"man-db",
"mpv",
"nextcloud-client",
"obs-studio",
"okular",
"openconnect",
"os-prober",
"qalculate-qt",
"ripgrep",
"simple-scan",
@@ -48,8 +47,24 @@ class UtilPackages(decman.Module):
"zathura-pdf-poppler",
"zip",
"zoxide",
"networkmanager-openconnect",
}
@aur.packages
def aurpkgs(self) -> set[str]:
return {"librewolf-bin", "brave-bin", "vesktop-bin", "uxplay", "git-credential-manager-bin"}
return {
"librewolf-bin",
"brave-bin",
"vesktop-bin",
"uxplay",
"git-credential-manager-bin",
"gradia",
"parabolic"
}
def directories(self) -> dict[str, decman.Directory]:
return {
"~/.config/fish": decman.Directory("./config/fish"),
"~/.config/fastfetch": decman.Directory("./config/fastfetch"),
"~/.config/mpv": decman.Directory("./config/mpv"),
}
-5
View File
@@ -1,5 +0,0 @@
import decman
class SystemTheme(decman.Module):
pass
-4
View File
@@ -1,4 +0,0 @@
#!/bin/sh
mkdir ~/.config/quickshell | true
cp -r ./config/quickshell/* ~/.config/quickshell/
+18
View File
@@ -0,0 +1,18 @@
#
# This file is parsed by pam_env module
#
# Syntax: simple "KEY=VAL" pairs on separate lines
#
QT_QPA_PLATFORM=wayland
GCM_CREDENTIAL_STORE=secretservice
RADV_PERFTEST_RT=1
ANDROID_HOME=/home/janis/Android/Sdk
EDITOR=nvim
PAGER=nvimpager
MANPAGER=nvimpager
# QT_QPA_PLATFORMTHEME=gtk3
# GTK_THEME=Adaptive-Theme
# GTK_THEME=Material-Black-Blueberry
# QT_STYLE_OVERRIDE=kvantum
# VKD3D_CONFIG=dxr11,dxr
+13
View File
@@ -0,0 +1,13 @@
[terminal]
# The VT to run the greeter on. Can be "next", "current" or a number
# designating the VT.
vt = 1
# The default session, also known as the greeter.
[default_session]
command = "tuigreet --cmd Hyprland --time --remember --remember-user-session --asterisks --user-menu --sessions /usr/share/wayland-sessions"
# The user to run the command as. The privileges this user must have depends
# on the greeter. A graphical greeter may for example require the user to be
# in the `video` group.
user = "greeter"
+9
View File
@@ -0,0 +1,9 @@
#%PAM-1.0
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-local-login
auth optional pam_gnome_keyring.so
account include system-local-login
session include system-local-login
session optional pam_gnome_keyring.so auto_start
+63
View File
@@ -0,0 +1,63 @@
# GRUB boot loader configuration
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Arch"
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 module_blacklist=hid-thrustmaster,hid_thrustmaster quiet splash"
GRUB_CMDLINE_LINUX="module_blacklist=hid-thrustmaster,hid_thrustmaster"
# Preload both GPT and MBR modules so that they are not missed
GRUB_PRELOAD_MODULES="part_gpt part_msdos"
# Uncomment to enable booting from LUKS encrypted devices
#GRUB_ENABLE_CRYPTODISK=y
# Set to 'countdown' or 'hidden' to change timeout behavior,
# press ESC key to display menu.
GRUB_TIMEOUT_STYLE=menu
# Uncomment to use basic console
GRUB_TERMINAL_INPUT=console
# Uncomment to disable graphical terminal
#GRUB_TERMINAL_OUTPUT=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `videoinfo'
GRUB_GFXMODE=1920x1080
# Uncomment to allow the kernel use the same resolution used by grub
GRUB_GFXPAYLOAD_LINUX=keep
# Uncomment if you want GRUB to pass to the Linux kernel the old parameter
# format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx"
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
GRUB_DISABLE_RECOVERY=true
# Uncomment and set to the desired menu colors. Used by normal and wallpaper
# modes only. Entries specified as foreground/background.
#GRUB_COLOR_NORMAL="light-blue/black"
#GRUB_COLOR_HIGHLIGHT="light-cyan/blue"
# Uncomment one of them for the gfx desired, a image background or a gfxtheme
#GRUB_BACKGROUND="/path/to/wallpaper"
# Uncomment to get a beep at GRUB start
#GRUB_INIT_TUNE="480 440 1"
# Uncomment to make GRUB remember the last selection. This requires
# setting 'GRUB_DEFAULT=saved' above.
#GRUB_SAVEDEFAULT=true
# Uncomment to disable submenus in boot menu
#GRUB_DISABLE_SUBMENU=y
# Probing for other operating systems is disabled for security reasons. Read
# documentation on GRUB_DISABLE_OS_PROBER, if still want to enable this
# functionality install os-prober and uncomment to detect and include other
# operating systems.
GRUB_DISABLE_OS_PROBER=false
GRUB_THEME="/usr/share/grub/themes/monterey-grub-theme/theme.txt"
+73
View File
@@ -0,0 +1,73 @@
# vim:set ft=sh
# MODULES
# The following modules are loaded before any boot hooks are
# run. Advanced users may wish to specify all system modules
# in this array. For instance:
# MODULES=(usbhid xhci_hcd)
MODULES=()
# BINARIES
# This setting includes any additional binaries a given user may
# wish into the CPIO image. This is run last, so it may be used to
# override the actual binaries included by a given hook
# BINARIES are dependency parsed, so you may safely ignore libraries
BINARIES=()
# FILES
# This setting is similar to BINARIES above, however, files are added
# as-is and are not parsed in any way. This is useful for config files.
FILES=()
# HOOKS
# This is the most important setting in this file. The HOOKS control the
# modules and scripts added to the image, and what happens at boot time.
# Order is important, and it is recommended that you do not change the
# order in which HOOKS are added. Run 'mkinitcpio -H <hook name>' for
# help on a given hook.
# 'base' is _required_ unless you know precisely what you are doing.
# 'udev' is _required_ in order to automatically load modules
# 'filesystems' is _required_ unless you specify your fs modules in MODULES
# Examples:
## This setup specifies all modules in the MODULES setting above.
## No RAID, lvm2, or encrypted root is needed.
# HOOKS=(base)
#
## This setup will autodetect all modules for your system and should
## work as a sane default
# HOOKS=(base udev autodetect modconf block filesystems fsck)
#
## This setup will generate a 'full' image which supports most systems.
## No autodetection is done.
# HOOKS=(base udev modconf block filesystems fsck)
#
## This setup assembles a mdadm array with an encrypted root file system.
## Note: See 'mkinitcpio -H mdadm_udev' for more information on RAID devices.
# HOOKS=(base udev modconf keyboard keymap consolefont block mdadm_udev encrypt filesystems fsck)
#
## This setup loads an lvm2 volume group.
# HOOKS=(base udev modconf block lvm2 filesystems fsck)
#
## NOTE: If you have /usr on a separate partition, you MUST include the
# usr and fsck hooks.
HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems fsck plymouth)
# COMPRESSION
# Use this to compress the initramfs image. By default, zstd compression
# is used. Use 'cat' to create an uncompressed image.
#COMPRESSION="zstd"
#COMPRESSION="gzip"
#COMPRESSION="bzip2"
#COMPRESSION="lzma"
#COMPRESSION="xz"
#COMPRESSION="lzop"
#COMPRESSION="lz4"
# COMPRESSION_OPTIONS
# Additional options for the compressor
#COMPRESSION_OPTIONS=()
# MODULES_DECOMPRESS
# Decompress kernel modules during initramfs creation.
# Enable to speedup boot process, disable to save RAM
# during early userspace. Switch (yes/no).
#MODULES_DECOMPRESS="yes"
+100
View File
@@ -0,0 +1,100 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
ILoveCandy
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
Color
#NoProgressBar
CheckSpace
#VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Arch Linux
# packagers with `pacman-key --populate archlinux`.
#
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here
# - local/custom mirrors can be added here or in separate files
# - repositories listed first will take precedence when packages
# have identical names, regardless of version number
# - URLs will have $repo replaced by the name of the current repo
# - URLs will have $arch replaced by the name of the architecture
#
# Repository entries are of the format:
# [repo-name]
# Server = ServerName
# Include = IncludePath
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The testing repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
#[testing]
#Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
#[extra-testing]
#Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the multilib repositories as required here.
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist
[multilib]
Include = /etc/pacman.d/mirrorlist
[arch4edu]
Server = https://de.arch4edu.mirror.kescher.at/$arch
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs