diff --git a/.gitignore b/.gitignore index e5cd05f..32a3502 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,5 @@ common/fzfrc platforms/win/komorebi/applications.json gitconfig + +check_update diff --git a/bootstrap/Windows.ps1 b/bootstrap/Windows.ps1 index 2c1046d..4d59e65 100644 --- a/bootstrap/Windows.ps1 +++ b/bootstrap/Windows.ps1 @@ -16,10 +16,9 @@ Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression # Set Environment Variables # Use %PATH_EXT% to prevent PATH from being too long [System.Environment]::SetEnvironmentVariable("Path_EXT_0", "D:\bin", "User") -[System.Environment]::SetEnvironmentVariable("Path_EXT_0", "C:\Users\citoy\AppData\Local\Cargo\bin", "User") -[System.Environment]::SetEnvironmentVariable("Path_EXT_1", "C:\Users\citoy\AppData\Local\Cargo\bin", "User") -[System.Environment]::SetEnvironmentVariable("Path_EXT_2", "C:\Users\citoy\AppData\Local\Cargo\bin", "User") -[System.Environment]::SetEnvironmentVariable("Path_EXT_2", "", "User") +[System.Environment]::SetEnvironmentVariable("Path_EXT_0", "C:\Users\jsony\AppData\Local\Cargo\bin", "User") +[System.Environment]::SetEnvironmentVariable("Path_EXT_1", "C:\Users\jsony\AppData\Local\Go\bin", "User") +[System.Environment]::SetEnvironmentVariable("Path_EXT_2", "C:\Users\jsony\AppData\Local\Cargo\bin", "User") $currentPath = [System.Environment]::GetEnvironmentVariable("Path", "User") if ($currentPath -notlike "*%PATH_EXT%*") { $currentPath += ";%PATH_EXT_0%;%PATH_EXT_1%;%PATH_EXT_2%" diff --git a/bootstrap/set_symlink_unix.bash b/bootstrap/set_symlink_unix.bash index faeb3a8..6c7227c 100644 --- a/bootstrap/set_symlink_unix.bash +++ b/bootstrap/set_symlink_unix.bash @@ -8,7 +8,6 @@ mkdir -p $XDG_CONFIG_HOME/conda $XDG_CONFIG_HOME/git $XDG_CONFIG_HOME/ideavim $X mkdir -p ~/.config/zellij ~/.config/yazi ~/.config/glow # mkdir -p $WAKATIME_HOME # mkdir -p $XDG_STATE_HOME/vim/undo $XDG_STATE_HOME/vim/backup $XDG_STATE_HOME/vim/swap $XDG_STATE_HOME/vim/view -mkdir -p $HOME/Obsidian # $DOTFILES/common ln -sf $DOTFILES/common/condarc.yaml $XDG_CONFIG_HOME/conda/.condarc # ln -sf $DOTFILES/common/gitconfig $XDG_CONFIG_HOME/git/config @@ -19,7 +18,6 @@ ln -sf $DOTFILES/common/ideavimrc $XDG_CONFIG_HOME/ideavim/ideavimrc ln -sf $DOTFILES/common/lesskey $XDG_CONFIG_HOME/lesskey # ln -sf $DOTFILES/common/npmrc $NPM_CONFIG_USERCONFIG ln -sf $DOTFILES/common/NuGet.Config $XDG_CONFIG_HOME/NuGet/NuGet.Config -ln -sf $DOTFILES/common/obsidian.vimrc $HOME/Obsidian/.obsidian.vimrc ln -sf $DOTFILES/common/pip.conf $XDG_CONFIG_HOME/pip/pip.conf ln -sf $DOTFILES/common/tmux.conf $XDG_CONFIG_HOME/tmux/tmux.conf ln -sf $DOTFILES/common/vimrc $XDG_CONFIG_HOME/vim/vimrc diff --git a/common/condarc.yaml b/common/condarc.yaml index c589efc..e2000b1 100644 --- a/common/condarc.yaml +++ b/common/condarc.yaml @@ -1,7 +1,12 @@ -# $XDG_CONFIG_HOME/conda/condarc.yaml -# ================================================================== -# New-Item -ItemType SymbolicLink -Path $Env:XDG_CONFIG_HOME\conda\.condarc -Target $DOTFILES\.config\conda\condarc.yaml +# $DOTFILES/common/condarc.yaml +# Date: 2024-12-22 +# Author: js0ny + +# Location: +# $XDG_CONFIG_HOME/conda/.condarc +# Linking: # ln -s $DOTFILES/.config/conda/condarc.yaml $XDG_CONFIG_HOME/conda/.condarc -# ================================================================== +# ================================================================================ +# Reference: # https://docs.conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html auto_activate_base: false diff --git a/common/gitconfig.example b/common/gitconfig.example index b161479..234d58a 100644 --- a/common/gitconfig.example +++ b/common/gitconfig.example @@ -1,14 +1,19 @@ -# $XDG_CONFIG_HOME/git/config -# %USERPROFILE%\.gitconfig # No XDG support on Windows -# ln -sf $DOTFILES/.config/git/.gitconfig $XDG_CONFIG_HOME/git/config -# New-Item -ItemType SymbolicLink -Path "$Env:XDG_CONFIG_HOME\git\config" -Target "$DOTFILES\.config\git\.gitconfig" -[user] +# $DOTFILES/common/gitconfig.example +# Date: 2024-12-22 +# Author: js0ny + +# Location: +# Windows: %USERPROFILE%\.gitconfig +# *nix: ~/.config/git/config +# Linking: (Note that this file is an example, only copy this then edit) +# cp $DOTFILES/common/gitconfig.example ~/.config/git/config +[user] # Modify the name and email name = whoami email = whoami@example.com [core] editor = nvim pager = delta - autocrlf = input + autocrlf = input # Force End of Line in different platforms [interactive] diffFilter = delta --color-only [delta] @@ -19,5 +24,5 @@ smudge = git-lfs smudge -- %f process = git-lfs filter-process required = true -[url "git@github.com:"] - insteadOf = https://github.com/ +# [url "git@github.com:"] # Force ssh +# insteadOf = https://github.com/ diff --git a/common/glow.yaml b/common/glow.yaml index 30de003..8c813e7 100644 --- a/common/glow.yaml +++ b/common/glow.yaml @@ -1,5 +1,10 @@ -# ~/.config/glow/glow.yaml -# ln -sf $DOTFILES/glow/glow.yaml ~/.config/glow/glow.yaml +# $DOTFILES/common/glow.yaml +# Date: 2024-12-22 +# Author: js0ny + +# Location: +# ~/.config/glow/config.yml +# ln -sf $DOTFILES/glow/glow.yaml ~/.config/glow/config.yml # style name or JSON path (default "auto") style: "auto" # mouse support (TUI-mode only) diff --git a/common/haskeline b/common/haskeline index 66ff3be..bf0b6cd 100644 --- a/common/haskeline +++ b/common/haskeline @@ -1 +1 @@ -editMode: Vi \ No newline at end of file +editMode: Vi diff --git a/common/ideavimrc b/common/ideavimrc index 789945b..9e0505c 100644 --- a/common/ideavimrc +++ b/common/ideavimrc @@ -1,6 +1,12 @@ -"$XDG_CONFIG_HOME/ideavim/ideavimrc -" New-Item -ItemType SymbolicLink -Path ~\.ideavimrc -Target $DOTFILES\.config\ideavim\ideavimrc.vimrc -" ln -sf $DOTFILES/.config/ideavim/ideavimrc.vimrc $XDG_CONFIG_HOME/ideavim/ideavimrc +" $DOTFILES/common/ideavimrc +" Date: 2024-12-22 +" Author: js0ny + +" Location: +" $XDG_CONFIG_HOME/ideavim/ideavimrc +" Linking: +" ln -sf $DOTFILES/common/ideavimrc $XDG_CONFIG_HOME/ideavim/ideavimrc + """ Basic Configs """ let mapleader = " " " set to diff --git a/common/inputrc b/common/inputrc index 9cffebe..9611b92 100644 --- a/common/inputrc +++ b/common/inputrc @@ -1,4 +1,13 @@ +# $DOTFILES/common/gitconfig.example +# Date: 2024-12-22 +# Author: js0ny +# GNU Readline config file, works for programs that use that library +# e.g. Python REPL, Lua REPL, Bash on Linux + +# Location: # $XDG_CONFIG_HOME/readline/inputrc +# Linking: +# ln -sf $DOTFILES/common/inputrc $XDG_CONFIG_HOME/readline/inputrc # Colemak Key Remaps set editing-mode vi diff --git a/common/lazygit.yaml b/common/lazygit.yaml new file mode 100644 index 0000000..c4a5cc5 --- /dev/null +++ b/common/lazygit.yaml @@ -0,0 +1,606 @@ +# $DOTFILES/common/lazygit.yaml +# Date: 2024-12-22 +# Author: js0ny + +# Location: +# macOS: ~/Library/Application Support/lazygit/config.yml +# Linux: ~/.config/lazygit/config.yml +# Windows: %APPDATA%\lazygit\config.yml + +yaml-language-server: $schema=https://raw.githubusercontent.com/jesseduffield/lazygit/master/schema/config.json + +# Config relating to the Lazygit UI +gui: + # The number of lines you scroll by when scrolling the main window + scrollHeight: 2 + + # If true, allow scrolling past the bottom of the content in the main window + scrollPastBottom: true + + # See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#scroll-off-margin + scrollOffMargin: 2 + + # One of: 'margin' (default) | 'jump' + scrollOffBehavior: margin + + # If true, capture mouse events. + # When mouse events are captured, it's a little harder to select text: e.g. requiring you to hold the option key when on macOS. + mouseEvents: true + + # If true, do not show a warning when discarding changes in the staging view. + skipDiscardChangeWarning: false + + # If true, do not show warning when applying/popping the stash + skipStashWarning: false + + # If true, do not show a warning when attempting to commit without any staged files; instead stage all unstaged files. + skipNoStagedFilesWarning: false + + # If true, do not show a warning when rewording a commit via an external editor + skipRewordInEditorWarning: false + + # Fraction of the total screen width to use for the left side section. You may want to pick a small number (e.g. 0.2) if you're using a narrow screen, so that you can see more of the main section. + # Number from 0 to 1.0. + sidePanelWidth: 0.3333 + + # If true, increase the height of the focused side window; creating an accordion effect. + expandFocusedSidePanel: false + + # The weight of the expanded side panel, relative to the other panels. 2 means + # twice as tall as the other panels. Only relevant if `expandFocusedSidePanel` is true. + expandedSidePanelWeight: 2 + + # Sometimes the main window is split in two (e.g. when the selected file has both staged and unstaged changes). This setting controls how the two sections are split. + # Options are: + # - 'horizontal': split the window horizontally + # - 'vertical': split the window vertically + # - 'flexible': (default) split the window horizontally if the window is wide enough, otherwise split vertically + mainPanelSplitMode: flexible + + # How the window is split when in half screen mode (i.e. after hitting '+' once). + # Possible values: + # - 'left': split the window horizontally (side panel on the left, main view on the right) + # - 'top': split the window vertically (side panel on top, main view below) + enlargedSideViewLocation: left + + # One of 'auto' (default) | 'en' | 'zh-CN' | 'zh-TW' | 'pl' | 'nl' | 'ja' | 'ko' | 'ru' + language: auto + + # Format used when displaying time e.g. commit time. + # Uses Go's time format syntax: https://pkg.go.dev/time#Time.Format + timeFormat: 02 Jan 06 + + # Format used when displaying time if the time is less than 24 hours ago. + # Uses Go's time format syntax: https://pkg.go.dev/time#Time.Format + shortTimeFormat: 3:04PM + + # Config relating to colors and styles. + # See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#color-attributes + theme: + # Border color of focused window + activeBorderColor: + - green + - bold + + # Border color of non-focused windows + inactiveBorderColor: + - default + + # Border color of focused window when searching in that window + searchingActiveBorderColor: + - cyan + - bold + + # Color of keybindings help text in the bottom line + optionsTextColor: + - blue + + # Background color of selected line. + # See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#highlighting-the-selected-line + selectedLineBgColor: + - blue + + # Background color of selected line when view doesn't have focus. + inactiveViewSelectedLineBgColor: + - bold + + # Foreground color of copied commit + cherryPickedCommitFgColor: + - blue + + # Background color of copied commit + cherryPickedCommitBgColor: + - cyan + + # Foreground color of marked base commit (for rebase) + markedBaseCommitFgColor: + - blue + + # Background color of marked base commit (for rebase) + markedBaseCommitBgColor: + - yellow + + # Color for file with unstaged changes + unstagedChangesColor: + - red + + # Default text color + defaultFgColor: + - default + + # Config relating to the commit length indicator + commitLength: + # If true, show an indicator of commit message length + show: true + + # If true, show the '5 of 20' footer at the bottom of list views + showListFooter: true + + # If true, display the files in the file views as a tree. If false, display the files as a flat list. + # This can be toggled from within Lazygit with the '~' key, but that will not change the default. + showFileTree: true + + # If true, show the number of lines changed per file in the Files view + showNumstatInFilesView: false + + # If true, show a random tip in the command log when Lazygit starts + showRandomTip: true + + # If true, show the command log + showCommandLog: true + + # If true, show the bottom line that contains keybinding info and useful buttons. If false, this line will be hidden except to display a loader for an in-progress action. + showBottomLine: true + + # If true, show jump-to-window keybindings in window titles. + showPanelJumps: true + + # Deprecated: use nerdFontsVersion instead + showIcons: false + + # Nerd fonts version to use. + # One of: '2' | '3' | empty string (default) + # If empty, do not show icons. + nerdFontsVersion: "" + + # If true (default), file icons are shown in the file views. Only relevant if NerdFontsVersion is not empty. + showFileIcons: true + + # Length of author name in (non-expanded) commits view. 2 means show initials only. + commitAuthorShortLength: 2 + + # Length of author name in expanded commits view. 2 means show initials only. + commitAuthorLongLength: 17 + + # Length of commit hash in commits view. 0 shows '*' if NF icons aren't on. + commitHashLength: 8 + + # If true, show commit hashes alongside branch names in the branches view. + showBranchCommitHash: false + + # Whether to show the divergence from the base branch in the branches view. + # One of: 'none' | 'onlyArrow' | 'arrowAndNumber' + showDivergenceFromBaseBranch: none + + # Height of the command log view + commandLogSize: 8 + + # Whether to split the main window when viewing file changes. + # One of: 'auto' | 'always' + # If 'auto', only split the main window when a file has both staged and unstaged changes + splitDiff: auto + + # Default size for focused window. Window size can be changed from within Lazygit with '+' and '_' (but this won't change the default). + # One of: 'normal' (default) | 'half' | 'full' + windowSize: normal + + # Window border style. + # One of 'rounded' (default) | 'single' | 'double' | 'hidden' + border: rounded + + # If true, show a seriously epic explosion animation when nuking the working tree. + animateExplosion: true + + # Whether to stack UI components on top of each other. + # One of 'auto' (default) | 'always' | 'never' + portraitMode: auto + + # How things are filtered when typing '/'. + # One of 'substring' (default) | 'fuzzy' + filterMode: substring + + # Config relating to the spinner. + spinner: + # The frames of the spinner animation. + frames: + - "|" + - / + - "-" + - \ + + # The "speed" of the spinner in milliseconds. + rate: 50 + + # Status panel view. + # One of 'dashboard' (default) | 'allBranchesLog' + statusPanelView: dashboard + + # If true, jump to the Files panel after popping a stash + switchToFilesAfterStashPop: true + + # If true, jump to the Files panel after applying a stash + switchToFilesAfterStashApply: true + + # If true, when using the panel jump keys (default 1 through 5) and target panel is already active, go to next tab instead + switchTabsWithPanelJumpKeys: false + +# Config relating to git +git: + # See https://github.com/jesseduffield/lazygit/blob/master/docs/Custom_Pagers.md + paging: + # Value of the --color arg in the git diff command. Some pagers want this to be set to 'always' and some want it set to 'never' + colorArg: always + + # e.g. + # diff-so-fancy + # delta --dark --paging=never + # ydiff -p cat -s --wrap --width={{columnWidth}} + pager: "" + + # If true, Lazygit will use whatever pager is specified in `$GIT_PAGER`, `$PAGER`, or your *git config*. If the pager ends with something like ` | less` we will strip that part out, because less doesn't play nice with our rendering approach. If the custom pager uses less under the hood, that will also break rendering (hence the `--paging=never` flag for the `delta` pager). + useConfig: false + + # e.g. 'difft --color=always' + externalDiffCommand: "" + + # Config relating to committing + commit: + # If true, pass '--signoff' flag when committing + signOff: false + + # Automatic WYSIWYG wrapping of the commit message as you type + autoWrapCommitMessage: true + + # If autoWrapCommitMessage is true, the width to wrap to + autoWrapWidth: 72 + + # Config relating to merging + merging: + # If true, run merges in a subprocess so that if a commit message is required, Lazygit will not hang + # Only applicable to unix users. + manualCommit: false + + # Extra args passed to `git merge`, e.g. --no-ff + args: "" + + # The commit message to use for a squash merge commit. Can contain "{{selectedRef}}" and "{{currentBranch}}" placeholders. + squashMergeMessage: Squash merge {{selectedRef}} into {{currentBranch}} + + # list of branches that are considered 'main' branches, used when displaying commits + mainBranches: + - master + - main + + # Prefix to use when skipping hooks. E.g. if set to 'WIP', then pre-commit hooks will be skipped when the commit message starts with 'WIP' + skipHookPrefix: WIP + + # If true, periodically fetch from remote + autoFetch: true + + # If true, periodically refresh files and submodules + autoRefresh: true + + # If true, pass the --all arg to git fetch + fetchAll: true + + # If true, lazygit will automatically stage files that used to have merge + # conflicts but no longer do; and it will also ask you if you want to + # continue a merge or rebase if you've resolved all conflicts. If false, it + # won't do either of these things. + autoStageResolvedConflicts: true + + # Command used when displaying the current branch git log in the main window + branchLogCmd: git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium {{branchName}} -- + + # Command used to display git log of all branches in the main window. + # Deprecated: Use `allBranchesLogCmds` instead. + allBranchesLogCmd: git log --graph --all --color=always --abbrev-commit --decorate --date=relative --pretty=medium + + # If true, do not spawn a separate process when using GPG + overrideGpg: false + + # If true, do not allow force pushes + disableForcePushing: false + + # See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#predefined-commit-message-prefix + commitPrefix: + # pattern to match on. E.g. for 'feature/AB-123' to match on the AB-123 use "^\\w+\\/(\\w+-\\w+).*" + pattern: "" + + # Replace directive. E.g. for 'feature/AB-123' to start the commit message with 'AB-123 ' use "[$1] " + replace: "" + + # See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#predefined-branch-name-prefix + branchPrefix: "" + + # If true, parse emoji strings in commit messages e.g. render :rocket: as 🚀 + # (This should really be under 'gui', not 'git') + parseEmoji: false + + # Config for showing the log in the commits view + log: + # One of: 'date-order' | 'author-date-order' | 'topo-order' | 'default' + # 'topo-order' makes it easier to read the git log graph, but commits may not + # appear chronologically. See https://git-scm.com/docs/ + # + # Deprecated: Configure this with `Log menu -> Commit sort order` ( in the commits window by default). + order: topo-order + + # This determines whether the git graph is rendered in the commits panel + # One of 'always' | 'never' | 'when-maximised' + # + # Deprecated: Configure this with `Log menu -> Show git graph` ( in the commits window by default). + showGraph: always + + # displays the whole git graph by default in the commits view (equivalent to passing the `--all` argument to `git log`) + showWholeGraph: false + + # When copying commit hashes to the clipboard, truncate them to this + # length. Set to 40 to disable truncation. + truncateCopiedCommitHashesTo: 12 + +# Periodic update checks +update: + # One of: 'prompt' (default) | 'background' | 'never' + method: prompt + + # Period in days between update checks + days: 14 + +# Background refreshes +refresher: + # File/submodule refresh interval in seconds. + # Auto-refresh can be disabled via option 'git.autoRefresh'. + refreshInterval: 10 + + # Re-fetch interval in seconds. + # Auto-fetch can be disabled via option 'git.autoFetch'. + fetchInterval: 60 + +# If true, show a confirmation popup before quitting Lazygit +confirmOnQuit: false + +# If true, exit Lazygit when the user presses escape in a context where there is nothing to cancel/close +quitOnTopLevelReturn: false + +# Config relating to things outside of Lazygit like how files are opened, copying to clipboard, etc +os: + # Command for editing a file. Should contain "{{filename}}". + edit: "" + + # Command for editing a file at a given line number. Should contain + # "{{filename}}", and may optionally contain "{{line}}". + editAtLine: "" + + # Same as EditAtLine, except that the command needs to wait until the + # window is closed. + editAtLineAndWait: "" + + # For opening a directory in an editor + openDirInEditor: "" + + # A built-in preset that sets all of the above settings. Supported presets + # are defined in the getPreset function in editor_presets.go. + editPreset: "" + + # Command for opening a file, as if the file is double-clicked. Should + # contain "{{filename}}", but doesn't support "{{line}}". + open: "" + + # Command for opening a link. Should contain "{{link}}". + openLink: "" + + # EditCommand is the command for editing a file. + # Deprecated: use Edit instead. Note that semantics are different: + # EditCommand is just the command itself, whereas Edit contains a + # "{{filename}}" variable. + editCommand: "" + + # EditCommandTemplate is the command template for editing a file + # Deprecated: use EditAtLine instead. + editCommandTemplate: "" + + # OpenCommand is the command for opening a file + # Deprecated: use Open instead. + openCommand: "" + + # OpenLinkCommand is the command for opening a link + # Deprecated: use OpenLink instead. + openLinkCommand: "" + + # CopyToClipboardCmd is the command for copying to clipboard. + # See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#custom-command-for-copying-to-and-pasting-from-clipboard + copyToClipboardCmd: "" + + # ReadFromClipboardCmd is the command for reading the clipboard. + # See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#custom-command-for-copying-to-and-pasting-from-clipboard + readFromClipboardCmd: "" + +# If true, don't display introductory popups upon opening Lazygit. +disableStartupPopups: false + +# What to do when opening Lazygit outside of a git repo. +# - 'prompt': (default) ask whether to initialize a new repo or open in the most recent repo +# - 'create': initialize a new repo +# - 'skip': open most recent repo +# - 'quit': exit Lazygit +notARepository: prompt + +# If true, display a confirmation when subprocess terminates. This allows you to view the output of the subprocess before returning to Lazygit. +promptToReturnFromSubprocess: true + +# Keybindings +keybinding: + universal: + quit: q + quit-alt1: + return: + quitWithoutChangingDirectory: Q + togglePanel: + prevItem: + nextItem: + prevItem-alt: e + nextItem-alt: "n" + prevPage: "," + nextPage: . + scrollLeft: H + scrollRight: L + gotoTop: < + gotoBottom: ">" + toggleRangeSelect: v + rangeSelectDown: + rangeSelectUp: + prevBlock: + nextBlock: + prevBlock-alt: h + nextBlock-alt: i + nextBlock-alt2: + prevBlock-alt2: + jumpToBlock: + - "1" + - "2" + - "3" + - "4" + - "5" + nextMatch: "k" + prevMatch: "K" + startSearch: / + optionMenu: + optionMenu-alt1: "?" + select: + goInto: + confirm: + confirmInEditor: + remove: d + new: "n" + edit: l + openFile: o + scrollUpMain: + scrollDownMain: + scrollUpMain-alt1: K + scrollDownMain-alt1: J + scrollUpMain-alt2: + scrollDownMain-alt2: + executeShellCommand: ":" + createRebaseOptionsMenu: m + + # 'Files' appended for legacy reasons + pushFiles: P + + # 'Files' appended for legacy reasons + pullFiles: p + refresh: R + createPatchOptionsMenu: + nextTab: "]" + prevTab: "[" + nextScreenMode: + + prevScreenMode: _ + undo: z + redo: + filteringMenu: + diffingMenu: W + diffingMenu-alt: + copyToClipboard: + openRecentRepos: + submitEditorText: + extrasMenu: "@" + toggleWhitespaceInDiffView: + increaseContextInDiffView: "}" + decreaseContextInDiffView: "{" + increaseRenameSimilarityThreshold: ) + decreaseRenameSimilarityThreshold: ( + openDiffTool: + status: + checkForUpdate: u + recentRepos: + allBranchesLogGraph: a + files: + commitChanges: c + commitChangesWithoutHook: w + amendLastCommit: A + commitChangesWithEditor: C + findBaseCommitForFixup: + confirmDiscard: x + ignoreFile: i + refreshFiles: r + stashAllChanges: s + viewStashOptions: S + toggleStagedAll: a + viewResetOptions: D + fetch: f + toggleTreeView: "`" + openMergeTool: M + openStatusFilter: + copyFileInfoToClipboard: "y" + branches: + createPullRequest: o + viewPullRequestOptions: O + copyPullRequestURL: + checkoutBranchByName: c + forceCheckoutBranch: F + rebaseBranch: r + renameBranch: R + mergeIntoCurrentBranch: M + viewGitFlowOptions: i + fastForward: f + createTag: T + pushTag: P + setUpstream: u + fetchRemote: f + sortOrder: s + worktrees: + viewWorktreeOptions: w + commits: + squashDown: s + renameCommit: r + renameCommitWithEditor: R + viewResetOptions: g + markCommitAsFixup: f + createFixupCommit: F + squashAboveCommits: S + moveDownCommit: + moveUpCommit: + amendToCommit: A + resetCommitAuthor: a + pickCommit: p + revertCommit: t + cherryPickCopy: C + pasteCommits: V + markCommitAsBaseForRebase: B + tagCommit: T + checkoutCommit: + resetCherryPick: + copyCommitAttributeToClipboard: "y" + openLogMenu: + openInBrowser: o + viewBisectOptions: b + startInteractiveRebase: i + amendAttribute: + resetAuthor: a + setAuthor: A + addCoAuthor: c + stash: + popStash: g + renameStash: r + commitFiles: + checkoutCommitFile: c + main: + toggleSelectHunk: a + pickBothHunks: b + editSelectHunk: E + submodules: + init: i + update: u + bulkMenu: b + commitMessage: + commitMenu: diff --git a/common/lesskey b/common/lesskey index eee8fa7..8eb0c4f 100644 --- a/common/lesskey +++ b/common/lesskey @@ -1,6 +1,16 @@ -# $XDG_CONFIG_HOME/lesskey -- less options -# ln -sf $DOTFILES/.config/lesskey $XDG_CONFIG_HOME/lesskey +# $DOTFILES/common/lesskey +# Date: 2024-12-22 +# Author: js0ny +# Less the pager. + +# Location: +# $XDG_CONFIG_HOME/lesskey +# Or specified by the environment variable $LESSKEYIN +# Linking: +# ln -sf $DOTFILES/common/lesskey ~/.config/lesskey +# =========================================================== # work for less -V > 582, for mac, use brew install less to override the system less +# In Windows (current version), the default pager is `more`, should be specifed to `less` by `$Env:Pager = less` # Format: key action diff --git a/common/npmrc b/common/npmrc index 5f0ed17..97aa418 100644 --- a/common/npmrc +++ b/common/npmrc @@ -1,6 +1,14 @@ +# $DOTFILES/common/npmrc +# Date: 2024-12-22 +# Author: js0ny + +# Location: +# $NPM_CONFIG_USERCONFIG +# ~/.npmrc (Default location) +# Linking: # export NPM_CONFIG_USERCONFIG="$XDG_CONFIG_HOME"/npm/npmrc -# =========================================================== -# $XDG_CONFIG_HOME/npm/npmrc # ln -s $DOTFILES/.config/npm/npmrc $NPM_CONFIG_USERCONFIG # New-Item -ItemType SymbolicLink -Path $env:NPM_CONFIG_USERCONFIG -Value $env:DOTFILES/.config/npm/npmrc + + # registry=https://registry.npmmirror.com diff --git a/common/tmux.conf b/common/tmux.conf index d603667..4323f06 100644 --- a/common/tmux.conf +++ b/common/tmux.conf @@ -1,5 +1,12 @@ +# $DOTFILES/common/tmux.conf +# Date: 2024-12-22 +# Author: js0ny +# `tmux` - Terminal Multiplexer + +# Location: # $XDG_CONFIG_HOME/tmux/tmux.conf -# ln -sf $DOTFILES/.config/tmux/tmux.conf $XDG_CONFIG_HOME/tmux/tmux.conf +# Linking: +# ln -sf $DOTFILES/common/tmux.conf $XDG_CONFIG_HOME/tmux/tmux.conf # Prefix # ----------------- @@ -14,7 +21,7 @@ set-option -g allow-rename on set-option -g alternate-screen on set-option -g visual-activity on set-option -g pane-border-style fg=colour244 -set-option -g pane-activity-border-style fg=colour239 +# set-option -g pane-activity-border-style fg=colour239 # Index # ----------------- @@ -54,17 +61,17 @@ bind ` resize-pane -Z # Status Bar # ----------------- -# set -g status-position top -# set-option -g status-bg black -# set-option -g status-fg white -# set-option -g status-left '#[fg=green][#S] ' -# setw -g window-status-current-format '#[fg=colour236,bg=colour39] #I #W ' - set -g status-position top -set -g @catppuccin_flavor "frappe" -run ~/.config/tmux/plugins/catppuccin/tmux/catppuccin.tmux -set -g status-right-length 100 -set -g status-left-length 100 -set -g status-left "" -set -g status-right "#{E:@catppuccin_status_application}" -set -ag status-right "#{E:@catppuccin_status_session}" +set-option -g status-bg black +set-option -g status-fg white +set-option -g status-left '#[fg=green][#S] ' +setw -g window-status-current-format '#[fg=colour236,bg=colour39] #I #W ' + +# set -g status-position top +# set -g @catppuccin_flavor "frappe" +# run ~/.config/tmux/plugins/catppuccin/tmux/catppuccin.tmux +# set -g status-right-length 100 +# set -g status-left-length 100 +# set -g status-left "" +# set -g status-right "#{E:@catppuccin_status_application}" +# set -ag status-right "#{E:@catppuccin_status_session}" diff --git a/common/zellij.config.kdl b/common/zellij.config.kdl index f08db80..5114373 100644 --- a/common/zellij.config.kdl +++ b/common/zellij.config.kdl @@ -13,9 +13,9 @@ keybinds { } pane { bind "h" "Left" { MoveFocus "Left"; } - bind "i" "Right" { MoveFocus "Right"; } bind "n" "Down" { MoveFocus "Down"; } bind "e" "Up" { MoveFocus "Up"; } + bind "i" "Right" { MoveFocus "Right"; } bind "p" { SwitchFocus; } } locked { diff --git a/platforms/linux/.gitkeep b/platforms/linux/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/platforms/linux/hyprland/code-flags.conf b/platforms/linux/hyprland/code-flags.conf new file mode 100644 index 0000000..0119c79 --- /dev/null +++ b/platforms/linux/hyprland/code-flags.conf @@ -0,0 +1,12 @@ +# $DOTFILES/platforms/linux/hyprland/code-flags.conf +# Date: 2024-12-22 +# Author: js0ny +# Force VSCode to use Wayland + +# Location: +# ~/.config/code-flags.conf +# Linking: +# ln -sf $DOTFILES/platforms/linux/hyprland/code-flags.conf ~/.config/ + +--enable-features=UseOzonePlatform +--ozone-platform=wayland diff --git a/platforms/linux/hyprland/electron-flags.conf b/platforms/linux/hyprland/electron-flags.conf new file mode 100644 index 0000000..560f083 --- /dev/null +++ b/platforms/linux/hyprland/electron-flags.conf @@ -0,0 +1,13 @@ +# $DOTFILES/platforms/linux/hyprland/electron-flags.conf +# Date: 2024-12-22 +# Author: js0ny +# Force electron apps to use Wayland + +# Location: +# ~/.config/electron-flags.conf +# Linking: +# ln -sf $DOTFILES/platforms/linux/hyprland/electron-flags.conf ~/.config/ + +--enable-features=UseOzonePlatform +--ozone-platform=wayland +--enable-icd diff --git a/platforms/linux/hyprland/hypr/hyprland.conf b/platforms/linux/hyprland/hypr/hyprland.conf new file mode 100644 index 0000000..6a37019 --- /dev/null +++ b/platforms/linux/hyprland/hypr/hyprland.conf @@ -0,0 +1,315 @@ +# $DOTFILES/platforms/linux/hyprland/hypr/hyprland.conf +# Date: 2024-12-22 +# Author: js0ny +# Hyprland Window Manager Configuration + +# Location: +# $XDG_CONFIG_HOME/hypr/hyprland.conf +# Linking: (Link the whole `hypr` directory) +# ln -sf $DOTFILES/platforms/linux/hyprland/hypr $XDG_CONFIG_HOME/hypr + +# ####################################################################################### +# AUTOGENERATED HYPRLAND CONFIG. +# PLEASE USE THE CONFIG PROVIDED IN THE GIT REPO /examples/hyprland.conf AND EDIT IT, +# OR EDIT THIS ONE ACCORDING TO THE WIKI INSTRUCTIONS. +# ####################################################################################### + +autogenerated = 0 # remove this line to remove the warning + +# This is an example Hyprland config file. +# Refer to the wiki for more information. +# https://wiki.hyprland.org/Configuring/ + +# Please note not all available settings / options are set here. +# For a full list, see the wiki + +# You can split this configuration into multiple files +# Create your files separately and then link them to this file like this: +# source = ~/.config/hypr/myColors.conf +# + +xwayland { + force_zero_scaling = true +} + + +################ +### MONITORS ### +################ + +# See https://wiki.hyprland.org/Configuring/Monitors/ +monitor=,preferred,auto,auto + + +################### +### MY PROGRAMS ### +################### + +# See https://wiki.hyprland.org/Configuring/Keywords/ + +# Set programs that you use +$terminal = kitty +$fileManager = dolphin +$menu = wofi --show drun + + +################# +### AUTOSTART ### +################# + +# Autostart necessary processes (like notifications daemons, status bars, etc.) +# Or execute your favorite apps at launch like this: + +# exec-once = $terminal +# exec-once = nm-applet & +exec-once = waybar & hyprpaper & mako & systemctl --user start hyprpolkitagent + + +############################# +### ENVIRONMENT VARIABLES ### +############################# + +# See https://wiki.hyprland.org/Configuring/Environment-variables/ + +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 + + +##################### +### LOOK AND FEEL ### +##################### + +# Refer to https://wiki.hyprland.org/Configuring/Variables/ + +# https://wiki.hyprland.org/Configuring/Variables/#general +general { + gaps_in = 5 + gaps_out = 20 + + border_size = 2 + + # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors + col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg + col.inactive_border = rgba(595959aa) + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false + + # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + allow_tearing = false + + layout = dwindle +} + +# https://wiki.hyprland.org/Configuring/Variables/#decoration +decoration { + rounding = 10 + + # Change transparency of focused and unfocused windows + active_opacity = 1.0 + inactive_opacity = 1.0 + + shadow { + enabled = true + range = 4 + render_power = 3 + color = rgba(1a1a1aee) + } + + # https://wiki.hyprland.org/Configuring/Variables/#blur + blur { + enabled = true + size = 3 + passes = 1 + + vibrancy = 0.1696 + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#animations +animations { + enabled = yes, please :) + + # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + + bezier = easeOutQuint,0.23,1,0.32,1 + bezier = easeInOutCubic,0.65,0.05,0.36,1 + bezier = linear,0,0,1,1 + bezier = almostLinear,0.5,0.5,0.75,1.0 + bezier = quick,0.15,0,0.1,1 + + animation = global, 1, 10, default + animation = border, 1, 5.39, easeOutQuint + animation = windows, 1, 4.79, easeOutQuint + animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% + animation = windowsOut, 1, 1.49, linear, popin 87% + animation = fadeIn, 1, 1.73, almostLinear + animation = fadeOut, 1, 1.46, almostLinear + animation = fade, 1, 3.03, quick + animation = layers, 1, 3.81, easeOutQuint + animation = layersIn, 1, 4, easeOutQuint, fade + animation = layersOut, 1, 1.5, linear, fade + animation = fadeLayersIn, 1, 1.79, almostLinear + animation = fadeLayersOut, 1, 1.39, almostLinear + animation = workspaces, 1, 1.94, almostLinear, fade + animation = workspacesIn, 1, 1.21, almostLinear, fade + animation = workspacesOut, 1, 1.94, almostLinear, fade +} + +# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/ +# "Smart gaps" / "No gaps when only" +# uncomment all if you wish to use that. +# workspace = w[tv1], gapsout:0, gapsin:0 +# workspace = f[1], gapsout:0, gapsin:0 +# windowrulev2 = bordersize 0, floating:0, onworkspace:w[tv1] +# windowrulev2 = rounding 0, floating:0, onworkspace:w[tv1] +# windowrulev2 = bordersize 0, floating:0, onworkspace:f[1] +# windowrulev2 = rounding 0, floating:0, onworkspace:f[1] + +# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more +dwindle { + pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = true # You probably want this +} + +# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more +master { + new_status = master +} + +# https://wiki.hyprland.org/Configuring/Variables/#misc +misc { + force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( +} + + +############# +### INPUT ### +############# + +# https://wiki.hyprland.org/Configuring/Variables/#input +input { + kb_layout = us + kb_variant = + kb_model = + kb_options = + kb_rules = + + follow_mouse = 1 + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + + touchpad { + natural_scroll = false + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#gestures +gestures { + workspace_swipe = false +} + +# Example per-device config +# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more +device { + name = epic-mouse-v1 + sensitivity = -0.5 +} + + +################### +### KEYBINDINGS ### +################### + +# See https://wiki.hyprland.org/Configuring/Keywords/ +$mainMod = SUPER # Sets "Windows" key as main modifier + +# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more +bind = $mainMod, R, exec, $terminal +bind = $mainMod, Q, killactive, +bind = $mainMod, M, exit, +bind = $mainMod, F, exec, $fileManager +bind = $mainMod, V, togglefloating, +bind = $mainMod, space, exec, $menu +bind = $mainMod, P, pseudo, # dwindle +bind = $mainMod, X, togglesplit, # dwindle + +# Move focus with mainMod + arrow keys +bind = $mainMod, left, movefocus, l +bind = $mainMod, right, movefocus, r +bind = $mainMod, up, movefocus, u +bind = $mainMod, down, movefocus, d +bind = $mainMod, h, movefocus, l +bind = $mainMod, i, movefocus, r +bind = $mainMod, e, movefocus, u +bind = $mainMod, n, movefocus, d + +# Switch workspaces with mainMod + [0-9] +bind = $mainMod, 1, workspace, 1 +bind = $mainMod, 2, workspace, 2 +bind = $mainMod, 3, workspace, 3 +bind = $mainMod, 4, workspace, 4 +bind = $mainMod, 5, workspace, 5 +bind = $mainMod, 6, workspace, 6 +bind = $mainMod, 7, workspace, 7 +bind = $mainMod, 8, workspace, 8 +bind = $mainMod, 9, workspace, 9 +bind = $mainMod, 0, workspace, 10 + +# Move active window to a workspace with mainMod + SHIFT + [0-9] +bind = $mainMod SHIFT, 1, movetoworkspace, 1 +bind = $mainMod SHIFT, 2, movetoworkspace, 2 +bind = $mainMod SHIFT, 3, movetoworkspace, 3 +bind = $mainMod SHIFT, 4, movetoworkspace, 4 +bind = $mainMod SHIFT, 5, movetoworkspace, 5 +bind = $mainMod SHIFT, 6, movetoworkspace, 6 +bind = $mainMod SHIFT, 7, movetoworkspace, 7 +bind = $mainMod SHIFT, 8, movetoworkspace, 8 +bind = $mainMod SHIFT, 9, movetoworkspace, 9 +bind = $mainMod SHIFT, 0, movetoworkspace, 10 + +# Example special workspace (scratchpad) +bind = $mainMod, S, togglespecialworkspace, magic +bind = $mainMod SHIFT, S, movetoworkspace, special:magic + +# Scroll through existing workspaces with mainMod + scroll +bind = $mainMod, mouse_down, workspace, e+1 +bind = $mainMod, mouse_up, workspace, e-1 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +# Laptop multimedia keys for volume and LCD brightness +bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ +bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle +bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+ +bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%- + +# Requires playerctl +bindl = , XF86AudioNext, exec, playerctl next +bindl = , XF86AudioPause, exec, playerctl play-pause +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPrev, exec, playerctl previous + +############################## +### WINDOWS AND WORKSPACES ### +############################## + +# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more +# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules + +# Example windowrule v1 +# windowrule = float, ^(kitty)$ + +# Example windowrule v2 +# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$ + +# Ignore maximize requests from apps. You'll probably like this. +windowrulev2 = suppressevent maximize, class:.* + +# Fix some dragging issues with XWayland +windowrulev2 = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 diff --git a/platforms/linux/hyprland/hypr/hyprpaper.conf b/platforms/linux/hyprland/hypr/hyprpaper.conf new file mode 100644 index 0000000..51d9aa6 --- /dev/null +++ b/platforms/linux/hyprland/hypr/hyprpaper.conf @@ -0,0 +1,12 @@ +# $DOTFILES/platforms/linux/hyprland/hypr/hyprpaper.conf +# Date: 2024-12-22 +# Author: js0ny +# Hyprland Wallpaper autoloader + +# Location: +# $XDG_CONFIG_HOME/hypr/hyprpaper.conf +# Linking: (Link the whole `hypr` directory) +# ln -sf $DOTFILES/platforms/linux/hyprland/hypr $XDG_CONFIG_HOME/hypr + +preload = ~/Pictures/Wallpaper/current.jpg +wallpaper = DP-2, ~/Pictures/Wallpaper/current.jpg diff --git a/platforms/linux/dolphinrc b/platforms/linux/kde/dolphinrc similarity index 73% rename from platforms/linux/dolphinrc rename to platforms/linux/kde/dolphinrc index 4bc015d..61043b0 100644 --- a/platforms/linux/dolphinrc +++ b/platforms/linux/kde/dolphinrc @@ -1,7 +1,16 @@ +# $DOTFILES/platforms/linux/kde/dolphinrc +# Date: 2024-12-22 +# Author: js0ny +# Dolphin - KDE File Explorer + +# Location: +# $XDG_CONFIG_HOME/dolphinrc +# Linking: +# ln -sf $DOTFILES/platforms/linux/kde/dolphinrc $XDG_CONFIG_HOME/dolphinrc + [General] Version=202 ViewPropsTimestamp=2024,12,10,0,19,35.931 - [IconsMode] PreviewSize=80 diff --git a/platforms/linux/kde/krunnerrc b/platforms/linux/kde/krunnerrc new file mode 100644 index 0000000..e81746a --- /dev/null +++ b/platforms/linux/kde/krunnerrc @@ -0,0 +1,19 @@ +# $DOTFILES/platforms/linux/kde/krunnerrc +# Date: 2024-12-22 +# Author: js0ny +# Krunner Config + +# Location: +# $XDG_CONFIG_HOME/krunnerrc +# Linking: +# ln -sf $DOTFILES/platforms/linux/kde/krunnerrc $XDG_CONFIG_HOME/krunnerrc + +[General] +FreeFloating=true +historyBehavior=ImmediateCompletion + +[Plugins][Favorites] +plugins=krunner_dictionary,krunner_services,krunner_systemsettings + +[Runners][krunner_dictionary] +triggerWord=d diff --git a/platforms/linux/krunnerrc b/platforms/linux/krunnerrc deleted file mode 100644 index c180753..0000000 --- a/platforms/linux/krunnerrc +++ /dev/null @@ -1,9 +0,0 @@ -[General] -FreeFloating=true -historyBehavior=ImmediateCompletion - -[Plugins][Favorites] -plugins=krunner_dictionary,krunner_services,krunner_systemsettings - -[Runners][krunner_dictionary] -triggerWord=d diff --git a/platforms/linux/zshrc b/platforms/linux/zshrc index 4f81dbe..5fa6f30 100644 --- a/platforms/linux/zshrc +++ b/platforms/linux/zshrc @@ -1,15 +1,13 @@ -# Use powerline -USE_POWERLINE="true" -# Has weird character width -# Example: -#  is not a diamond -HAS_WIDECHARS="false" -alias open=dolphin -# Source manjaro-zsh-configuration -if [[ -e /usr/share/zsh/manjaro-zsh-config ]]; then - source /usr/share/zsh/manjaro-zsh-config +# $DOTFILES/platforms/linux/zshrc +# Date: 2024-12-22 +# Author: js0ny +# Sourced by user's zshrc if is Linux 在用户的 zshrc 中被引用 +# Entry point in $DOTFILES/tools/zsh/common.zshrc (入口点) + + +if [ -n "$WAYLAND_DISPLAY" ]; then + alias clip="wl-copy" + alias paste="wl-paste" +else [ -n "$DISPLAY" ]; then + alias clip="xclip" fi -# Use manjaro zsh prompt -# if [[ -e /usr/share/zsh/manjaro-zsh-prompt ]]; then -# source /usr/share/zsh/manjaro-zsh-prompt -# fi diff --git a/platforms/mac/sketchybar/LICENSE.md b/platforms/mac/sketchybar/LICENSE.md new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/platforms/mac/sketchybar/LICENSE.md @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/platforms/mac/zshrc b/platforms/mac/zshrc index 43661fd..4a4dd35 100644 --- a/platforms/mac/zshrc +++ b/platforms/mac/zshrc @@ -6,7 +6,6 @@ # macOS # -alias xclip="pbcopy" alias clip="pbcopy" alias paste="pbpaste" diff --git a/tools/fastfetch/win.jsonc b/platforms/win/fastfetch.jsonc similarity index 96% rename from tools/fastfetch/win.jsonc rename to platforms/win/fastfetch.jsonc index 2b5c2e6..dcdcad7 100644 --- a/tools/fastfetch/win.jsonc +++ b/platforms/win/fastfetch.jsonc @@ -1,4 +1,4 @@ -// ~\.config\fastfetch\config.jsonc +// %UserProfile%\.config\fastfetch\config.jsonc { "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", "logo": { @@ -59,4 +59,4 @@ "poweradapter", "locale" ] -} +} \ No newline at end of file diff --git a/platforms/wsl/winterop.zsh b/platforms/wsl/winterop.zsh index e053174..1d074a9 100644 --- a/platforms/wsl/winterop.zsh +++ b/platforms/wsl/winterop.zsh @@ -6,7 +6,7 @@ export FILE_EXPLORER="explorer.exe" # Directory Opus alias clip="clip.exe" -alias xclip="clip.exe" +alias clip="clip.exe" alias paste='pwsh.exe -NoProfile -Command "Get-Clipboard"' alias dark-mode='pwsh.exe -Command "dark-mode" 2>&1 /dev/null' alias winfetch='pwsh.exe -NoProfile -Command "winfetch"' diff --git a/scripts/Completions.ps1 b/scripts/Completions.ps1 deleted file mode 100644 index 2050048..0000000 --- a/scripts/Completions.ps1 +++ /dev/null @@ -1,9 +0,0 @@ -function Invoke-Completion { - param ([string]$command) - switch ($command) { - 'docker' { docker completion powershell | Out-String | Invoke-Expression } - 'git' { Import-Module Posh-Git } - 'hugo' { hugo completion powershell | Out-String | Invoke-Expression } - 'pip' { pip completion --powershell | Out-String | Invoke-Expression } - } -} diff --git a/tools/fish/conf.d/alias.fish b/tools/fish/conf.d/alias.fish index a234a81..5a62f5f 100644 --- a/tools/fish/conf.d/alias.fish +++ b/tools/fish/conf.d/alias.fish @@ -1,4 +1,11 @@ +# $DOTFILES/tools/fish/conf.d/alias.fish +# Date: 2024-12-22 +# Author: js0ny +# Location: +# ~/.config/fish/conf.d/alias.fish +# Linking: Link the whole directory for submodules +# ln -sf $DOTFILES/tools/fish ~/.config/fish # Powershell equivalent abbr --add ni touch @@ -8,7 +15,7 @@ abbr --add ii open # Editors # abbr --add v nvim abbr --add c code -alias sv="sudo vim -u ~/.config/vim/vimrc" +alias sv="sudo vim -u ~/.dotfiles/common/vim.noxdg.vimrc" alias sn="sudo nvim -u ~/.config/nvim/init.lua" # Dev # diff --git a/tools/fish/conf.d/keymap.fish b/tools/fish/conf.d/keymap.fish index a6526cb..2969ffe 100644 --- a/tools/fish/conf.d/keymap.fish +++ b/tools/fish/conf.d/keymap.fish @@ -1,10 +1,20 @@ +# $DOTFILES/tools/fish/conf.d/keymap.fish +# Date: 2024-12-22 +# Author: js0ny + +# Location: +# ~/.config/fish/conf.d/keymap.fish +# Linking: Link the whole directory for submodules +# ln -sf $DOTFILES/tools/fish ~/.config/fish + + fish_vi_key_bindings # Colemak hnei # ^ -# n -# < h i > # e +# < h i > +# n # v # bind -M default 'h' backward-char bind -M default 'n' down-or-search @@ -14,3 +24,5 @@ bind -M default 'i' forward-char # Similar position to [i] in QWERTY bind -M default -m insert l repaint-mode bind -M default -m insert L beginning-of-line repaint-mode + +# TODO: Add more key bindings here diff --git a/tools/fish/conf.d/navi.fish b/tools/fish/conf.d/navi.fish index 2f8f6b1..e247aa7 100644 --- a/tools/fish/conf.d/navi.fish +++ b/tools/fish/conf.d/navi.fish @@ -1,3 +1,11 @@ +# $DOTFILES/tools/fish/conf.d/navi.fish +# Date: 2024-12-22 +# Author: js0ny + +# Location: +# ~/.config/fish/conf.d/navi.fish +# Linking: Link the whole directory for submodules +# ln -sf $DOTFILES/tools/fish ~/.config/fish alias ..="cd .." diff --git a/tools/fish/conf.d/prompt.fish b/tools/fish/conf.d/prompt.fish index bde5d56..0760923 100644 --- a/tools/fish/conf.d/prompt.fish +++ b/tools/fish/conf.d/prompt.fish @@ -1,3 +1,11 @@ +# $DOTFILES/tools/fish/conf.d/prompt.fish +# Date: 2024-12-22 +# Author: js0ny + +# Location: +# ~/.config/fish/conf.d/prompt.fish +# Linking: Link the whole directory for submodules +# ln -sf $DOTFILES/tools/fish ~/.config/fish if command -v starship > /dev/null set -gx STARSHIP_CONFIG $DOTFILES/tools/starship/starship_fish.toml diff --git a/tools/nvim/lua/plugins/init.lua b/tools/nvim/lua/plugins/init.lua index 7fa8521..866228d 100644 --- a/tools/nvim/lua/plugins/init.lua +++ b/tools/nvim/lua/plugins/init.lua @@ -1,17 +1,21 @@ -- Entry point of the plugin manager local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" -if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "https://github.com/folke/lazy.nvim.git", - "--branch=stable", - lazypath, - }) +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end end vim.opt.rtp:prepend(lazypath) + require("lazy").setup({ { import = "plugins.appearance" }, { import = "plugins.completion" }, diff --git a/tools/powershell/Aliases.ps1 b/tools/powershell/Aliases.ps1 index 35986f6..367eced 100644 --- a/tools/powershell/Aliases.ps1 +++ b/tools/powershell/Aliases.ps1 @@ -31,5 +31,6 @@ Set-Alias "py" "python" Set-Alias "ipy" "ipython" if ($isWindows) { -function kex { wsl -d kali-linux kex --sl -s } + # Debugging + # function kex { wsl -d kali-linux kex --sl -s } } diff --git a/tools/powershell/Completions.ps1 b/tools/powershell/Completions.ps1 new file mode 100644 index 0000000..1647b2e --- /dev/null +++ b/tools/powershell/Completions.ps1 @@ -0,0 +1,32 @@ +function Invoke-Completion { + param ([string]$command) + switch ($command) { + 'docker' { docker completion powershell | Out-String | Invoke-Expression } + 'git' { Import-Module Posh-Git } + 'hugo' { hugo completion powershell | Out-String | Invoke-Expression } + 'pip' { pip completion --powershell | Out-String | Invoke-Expression } + 'uv' { uv generate-shell-completion powershell | Out-String | Invoke-Expression } + 'wezterm' { wezterm shell-completion --shell power-shell | Out-String | Invoke-Expression } + 'winget' { + # https://learn.microsoft.com/en-us/windows/package-manager/winget/tab-completion + Register-ArgumentCompleter -Native -CommandName winget -ScriptBlock { + param($wordToComplete, $commandAst, $cursorPosition) + [Console]::InputEncoding = [Console]::OutputEncoding = $OutputEncoding = [System.Text.Utf8Encoding]::new() + $Local:word = $wordToComplete.Replace('"', '""') + $Local:ast = $commandAst.ToString().Replace('"', '""') + winget complete --word="$Local:word" --commandline "$Local:ast" --position $cursorPosition | ForEach-Object { + [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) + } + } + } + } +} +Set-Alias "icmp" "Invoke-Completion" + +Register-ArgumentCompleter -CommandName Invoke-Completion -ParameterName 'command' -ScriptBlock { + param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter) + + $cmds = @('docker', 'git', 'hugo', 'pip', 'uv', 'wezterm', 'winget') + + $cmds | Where-Object { $_ -like "$wordToComplete*" } +} diff --git a/tools/powershell/Config.ps1 b/tools/powershell/Config.ps1 index e7cb656..4d5ed8c 100644 --- a/tools/powershell/Config.ps1 +++ b/tools/powershell/Config.ps1 @@ -1,7 +1,18 @@ # Use XDG Base Directory Specification and its similar structure for Windows # wget -${function:wget} = {wget --hsts-file $XDG_CACHE_HOME/wget-hsts $args} +if (Get-Command wget -ErrorAction SilentlyContinue) { + ${function:wget} = {wget --hsts-file $XDG_CACHE_HOME/wget-hsts $args} +} # yarn v1 -${function:yarn} = {yarn --use-yarnrc $XDG_CONFIG_HOME/yarn/config.yaml $args} +if (Get-Command yarn -ErrorAction SilentlyContinue) { + ${function:yarn} = {yarn --use-yarnrc $XDG_CONFIG_HOME/yarn/config.yaml $args} +} + +if ($Env:WEZTERM) { # Environment variable injected by wezterm/wezterm.lua + ${function:icat} = {wezterm imgcat $args} +} +elseif ($Env:KITTY) { + ${function:icat} = {kitty +kitten icat $args} +} diff --git a/tools/powershell/Keymap.ps1 b/tools/powershell/Keymap.ps1 index ca110f3..41e78f8 100644 --- a/tools/powershell/Keymap.ps1 +++ b/tools/powershell/Keymap.ps1 @@ -23,6 +23,9 @@ Set-PSReadLineKeyHandler -Chord "N" -Function ViJoinLines -ViMode Command Set-PSReadLineKeyHandler -Chord "Control+Oem4" -Function ViCommandMode -ViMode Insert # ^[ to Escape Set-PSReadLineKeyHandler -Chord "Ctrl+a" -Function BeginningOfLine Set-PSReadLineKeyHandler -Chord "Ctrl+e" -Function EndOfLine +Set-PSReadLineKeyHandler -Chord "Ctrl+p" -Function PreviousHistory +Set-PSReadLineKeyHandler -Chord "Ctrl+p" -Function PreviousHistory +Set-PSReadLineKeyHandler -Chord "Ctrl+n" -Function NextHistory ## Use to Invoke MenuComplete Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete diff --git a/tools/powershell/Modules.ps1 b/tools/powershell/Modules.ps1 index 0137d59..8236f40 100644 --- a/tools/powershell/Modules.ps1 +++ b/tools/powershell/Modules.ps1 @@ -1,4 +1,4 @@ -Import-Module -Name Terminal-Icons +# Import-Module -Name Terminal-Icons Import-Module -Name CompletionPredictor if ($IsWindows) { # Chocolatey diff --git a/tools/powershell/Prompt.ps1 b/tools/powershell/Prompt.ps1 index 9f43a8a..da645ef 100644 --- a/tools/powershell/Prompt.ps1 +++ b/tools/powershell/Prompt.ps1 @@ -4,7 +4,7 @@ # Use starship to set prompt $ENV:STARSHIP_CONFIG = Join-Path $DOTFILES "tools" "starship" "starship_pwsh.toml" -# Invoke-Expression (&starship init powershell) +Invoke-Expression (&starship init powershell) # Below is the backup of original prompt function # $promptTime = $true diff --git a/tools/powershell/readme.md b/tools/powershell/readme.md index 7cd9a86..db44094 100644 --- a/tools/powershell/readme.md +++ b/tools/powershell/readme.md @@ -20,3 +20,20 @@ This is the cross-platform PowerShell profile for PowerShell Core | `^a` | To Beginning of Line | All | | `^e` | To End of Line | All | | `^[` | To Normal Mode | Insert | + +## `Get-Command` vs `which.exe` under Windows + +```powershell +PS > hyperfine "pwsh.exe -NoProfile -Command 'Get-Command which'" "pwsh.exe -NoProfile -Command 'which which'" --warmup 10 +Benchmark 1: pwsh.exe -NoProfile -Command 'Get-Command which' + Time (mean ± σ): 152.1 ms ± 1.3 ms [User: 112.2 ms, System: 89.3 ms] + Range (min … max): 150.0 ms … 155.3 ms 18 runs + +Benchmark 2: pwsh.exe -NoProfile -Command 'which which' + Time (mean ± σ): 153.7 ms ± 6.4 ms [User: 126.7 ms, System: 101.9 ms] + Range (min … max): 147.8 ms … 169.5 ms 19 runs + +Summary + pwsh.exe -NoProfile -Command 'Get-Command which' ran + 1.01 ± 0.04 times faster than pwsh.exe -NoProfile -Command 'which which' +``` diff --git a/tools/wezterm/wezterm.lua b/tools/wezterm/wezterm.lua new file mode 100644 index 0000000..3c8affb --- /dev/null +++ b/tools/wezterm/wezterm.lua @@ -0,0 +1,121 @@ +-- $DOTFILES/tools\wezterm\wezterm.lua +-- Date: 2024-12-22 +-- Author: js0ny + +-- Location: +-- $XDG_CONFIG_HOME/wezterm/wezterm.lua +-- Linking: +-- ln -sf $DOTFILES/tools/wezterm/wezterm.lua $XDG_CONFIG_HOME/wezterm/wezterm.lua + +local wezterm = require 'wezterm' + +local config = {} + +local os_type = "" +if package.config:sub(1,1) == "\\" then + -- Windows + os_type = "Windows" +elseif package.config:sub(1,1) == "/" then + -- Unix-like (Linux, macOS, etc.) + if os.getenv("HOME") then + os_type = "Unix-like" + -- You can differentiate further by checking for macOS or Linux if needed + if os.getenv("XDG_SESSION_TYPE") then + -- Likely Linux + os_type = "Linux" + elseif os.execute("uname -s | grep -i darwin") == 0 then + -- macOS + os_type = "macOS" + end + end +end + +print("[DEBUG] Detected OS: " .. os_type) + + +-- Appearance +------------------ +-- Font and color scheme +config.font = wezterm.font("FiraCode Nerd Font") +config.color_scheme = "Ayu Mirage" +config.font_size = 12.0 +if os_type == "Windows" then + config.window_background_opacity = 0.7 + config.win32_system_backdrop = 'Acrylic' +end +-- Tab appearance +config.hide_tab_bar_if_only_one_tab = true +config.tab_bar_at_bottom = true + +-- Keybindings +------------------ +config.leader = { key="q", mods="CTRL" } +config.keys = { + { + key = 'q', + mods = 'LEADER', + action = wezterm.action.SendKey {key = 'q', mods = 'CTRL'}, + }, + -- Windows Management + { + key = '|', + mods = 'LEADER|SHIFT', + action = wezterm.action.SplitHorizontal{domain="CurrentPaneDomain"} + }, + { + key = '-', + mods = 'LEADER', + action = wezterm.action.SplitVertical{domain="CurrentPaneDomain"} + }, + { + key = 'h', + mods = 'LEADER', + action = wezterm.action.ActivatePaneDirection 'Left' + }, + { + key = 'n', + mods = 'LEADER', + action = wezterm.action.ActivatePaneDirection 'Down' + }, + { + key = 'e', + mods = 'LEADER', + action = wezterm.action.ActivatePaneDirection 'Up' + }, + { + key = 'i', + mods = 'LEADER', + action = wezterm.action.ActivatePaneDirection 'Right' + }, + { + key = 'H', + mods = 'LEADER', + action = wezterm.action.AdjustPaneSize { 'Left', 5 }, + }, + { + key = 'N', + mods = 'LEADER', + action = wezterm.action.AdjustPaneSize { 'Down', 5 }, + }, + { + key = 'E', + mods = 'LEADER', + action = wezterm.action.AdjustPaneSize { 'Up', 5 }, + }, + { + key = 'I', + mods = 'LEADER', + action = wezterm.action.AdjustPaneSize { 'Right', 5 }, + }, +} +-- Environment +------------------ +if os_type == "Windows" then + config.default_prog = { "pwsh.exe" } +else + config.default_prog = { "fish" } +end +config.set_environment_variables = { + WEZTERM="true", +} +return config diff --git a/tools/zsh/mod/alias.zsh b/tools/zsh/mod/alias.zsh index 9ca36f7..46d9786 100644 --- a/tools/zsh/mod/alias.zsh +++ b/tools/zsh/mod/alias.zsh @@ -26,7 +26,7 @@ alias pulldots="cd $DOTFILES && git pull" # Editors # alias v=nvim alias c=code -alias sv="sudo vim -u ~/.config/vim/vimrc" +alias sv="sudo vim -u ~/.dotfiles/common/vim.noxdg.vimrc" alias sn="sudo nvim -u ~/.config/nvim/init.lua" # lsd - modern ls