Migrate to chezmoi
Move config files from config to chezmoi Add script to auto install packages with DNF and Cargo
This commit is contained in:
parent
110e0882c6
commit
224c7ed45c
1654 changed files with 470035 additions and 51 deletions
7
chezmoi/.chezmoi.toml.tmpl
Normal file
7
chezmoi/.chezmoi.toml.tmpl
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
{{- $osid := .chezmoi.os -}}
|
||||
{{- if hasKey .chezmoi.osRelease "id" -}}
|
||||
{{- $osid = printf "%s-%s" .chezmoi.os .chezmoi.osRelease.id -}}
|
||||
{{- end -}}
|
||||
|
||||
[data]
|
||||
osid = {{ $osid | quote }}
|
||||
38
chezmoi/.chezmoidata/packages.yaml
Normal file
38
chezmoi/.chezmoidata/packages.yaml
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
packages:
|
||||
cargo:
|
||||
- mise
|
||||
- yazi-fm
|
||||
dnf:
|
||||
copr:
|
||||
- atim/lazygit
|
||||
- atim/starship
|
||||
- the4runner/firefox-dev
|
||||
packages:
|
||||
- bat
|
||||
- dnf-plugin-system-upgrade
|
||||
- duf
|
||||
- eza
|
||||
- fd-find
|
||||
- firefox-dev
|
||||
- flatpak
|
||||
- fzf
|
||||
- gcc
|
||||
- gcc-c++
|
||||
- git
|
||||
- gitlint
|
||||
- gnome-software
|
||||
- lazygit
|
||||
- neovim
|
||||
- nodejs
|
||||
- openssl
|
||||
- openssl-devel
|
||||
- papirus-icon-theme
|
||||
- remove-retired-packages
|
||||
- ripgrep
|
||||
- sd
|
||||
- starship
|
||||
- tealdeer
|
||||
- tmux
|
||||
- tree-sitter-cli
|
||||
- zoxide
|
||||
- zsh
|
||||
47
chezmoi/.chezmoiscripts/run_onchange_bootstrap.tmpl
Normal file
47
chezmoi/.chezmoiscripts/run_onchange_bootstrap.tmpl
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
NO_FORMAT="\033[0m"
|
||||
C_DODGERBLUE1="\033[38;5;33m"
|
||||
echo -e "${C_DODGERBLUE1}Installing packages...${NO_FORMAT}"
|
||||
|
||||
{{- if eq .osid "darwin" }}
|
||||
# macOS-specific code
|
||||
{{- else if eq .osid "linux-debian" }}
|
||||
# Debian-specific code
|
||||
{{- else if eq .osid "linux-fedora" }}
|
||||
|
||||
# ╭──────────────────────────────────────────────────────────╮
|
||||
# │ Add COPR repos │
|
||||
# ╰──────────────────────────────────────────────────────────╯
|
||||
|
||||
sudo dnf install -yq 'dnf-command(copr)'
|
||||
|
||||
{{ range .packages.dnf.copr -}}
|
||||
sudo dnf copr enable -y {{ . | quote }} &> /dev/null
|
||||
{{ end -}}
|
||||
|
||||
# ╭──────────────────────────────────────────────────────────╮
|
||||
# │ Install DNF packages │
|
||||
# ╰──────────────────────────────────────────────────────────╯
|
||||
|
||||
sudo dnf install -y {{ range .packages.dnf.packages }} {{ . | quote }} {{- end -}}
|
||||
|
||||
{{ end }}
|
||||
|
||||
# ╭──────────────────────────────────────────────────────────╮
|
||||
# │ Install Rust │
|
||||
# ╰──────────────────────────────────────────────────────────╯
|
||||
|
||||
if ! command -v cargo > /dev/null; then
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path
|
||||
fi
|
||||
|
||||
|
||||
# ╭──────────────────────────────────────────────────────────╮
|
||||
# │ Install Cargo Packages │
|
||||
# ╰──────────────────────────────────────────────────────────╯
|
||||
|
||||
cargo install {{ range .packages.cargo }} {{ . | quote }} {{- end -}}
|
||||
|
||||
8
chezmoi/dot_config/LazyVim/dot_gitignore
Normal file
8
chezmoi/dot_config/LazyVim/dot_gitignore
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
tt.*
|
||||
.tests
|
||||
doc/tags
|
||||
debug
|
||||
.repro
|
||||
foo.*
|
||||
*.log
|
||||
data
|
||||
15
chezmoi/dot_config/LazyVim/dot_neoconf.json
Normal file
15
chezmoi/dot_config/LazyVim/dot_neoconf.json
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"neodev": {
|
||||
"library": {
|
||||
"enabled": true,
|
||||
"plugins": true
|
||||
}
|
||||
},
|
||||
"neoconf": {
|
||||
"plugins": {
|
||||
"lua_ls": {
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
2
chezmoi/dot_config/LazyVim/init.lua
Normal file
2
chezmoi/dot_config/LazyVim/init.lua
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
-- bootstrap lazy.nvim, LazyVim and your plugins
|
||||
require("config.lazy")
|
||||
52
chezmoi/dot_config/LazyVim/lazy-lock.json
Normal file
52
chezmoi/dot_config/LazyVim/lazy-lock.json
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
{
|
||||
"LazyVim": { "branch": "main", "commit": "e9358d977a379e54d73dd29691d60f7a51ed6923" },
|
||||
"LuaSnip": { "branch": "master", "commit": "c7984d1cca3d8615e4daefc196597872a0b8d590" },
|
||||
"alpha-nvim": { "branch": "main", "commit": "9e33db324b8bb7a147bce9ea5496686ee859461d" },
|
||||
"bufferline.nvim": { "branch": "main", "commit": "60734264a8655a7db3595159fb50076dc24c2f2c" },
|
||||
"catppuccin": { "branch": "main", "commit": "8d02781a638123394f9bc160aad47a9560a113f9" },
|
||||
"cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" },
|
||||
"cmp-nvim-lsp": { "branch": "main", "commit": "44b16d11215dce86f253ce0c30949813c0a90765" },
|
||||
"cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" },
|
||||
"cmp_luasnip": { "branch": "master", "commit": "18095520391186d634a0045dacaa346291096566" },
|
||||
"dressing.nvim": { "branch": "master", "commit": "1cbc4eef2ef7d745aa1a559b22589e33860cf077" },
|
||||
"flit.nvim": { "branch": "main", "commit": "5c9a78b97f7f4301473ea5e37501b5b1d4da167b" },
|
||||
"friendly-snippets": { "branch": "main", "commit": "5749f093759c29e3694053d048ceb940fe12c3d3" },
|
||||
"gitsigns.nvim": { "branch": "main", "commit": "a36bc3360d584d39b4fb076d855c4180842d4444" },
|
||||
"indent-blankline.nvim": { "branch": "master", "commit": "7075d7861f7a6bbf0de0298c83f8a13195e6ec01" },
|
||||
"lazy.nvim": { "branch": "main", "commit": "b7043f2983d7aead78ca902f3f2053907081859a" },
|
||||
"leap.nvim": { "branch": "main", "commit": "3cc0e6a0b99dc18d4e5a88baa3cbe3c7b8b34566" },
|
||||
"lualine.nvim": { "branch": "master", "commit": "05d78e9fd0cdfb4545974a5aa14b1be95a86e9c9" },
|
||||
"mason-lspconfig.nvim": { "branch": "main", "commit": "d381fcb78d7a562c3244e1c8f76406954649db36" },
|
||||
"mason.nvim": { "branch": "main", "commit": "664c987c3b14d2262a4e580f993a3e5045baded0" },
|
||||
"mini.ai": { "branch": "main", "commit": "3f5963b3f5f42d5cf545b06192e1682395f90fb3" },
|
||||
"mini.bufremove": { "branch": "main", "commit": "14805473144fffbd019d07e51bed2d176e065ee9" },
|
||||
"mini.comment": { "branch": "main", "commit": "877acea5b2a32ff55f808fc0ebe9aa898648318c" },
|
||||
"mini.indentscope": { "branch": "main", "commit": "f60e9b51a6214c73a170ffc5445ce91560981031" },
|
||||
"mini.pairs": { "branch": "main", "commit": "963b800d0524eadd297199207011b98684205ada" },
|
||||
"mini.surround": { "branch": "main", "commit": "14f418209ecf52d1a8de9d091eb6bd63c31a4e01" },
|
||||
"neo-tree.nvim": { "branch": "v2.x", "commit": "eb9bbba751dbfca5dc717fe3e4e1b9708e6479a1" },
|
||||
"neoconf.nvim": { "branch": "main", "commit": "9625a1710a9be427a662f9ba0a383164588a41a8" },
|
||||
"neodev.nvim": { "branch": "main", "commit": "412776d881d7aa2bedbe8a2572e700f740440cad" },
|
||||
"noice.nvim": { "branch": "main", "commit": "0d672bd66dc0f77715a20cd149a3afe2ca1fed6d" },
|
||||
"nui.nvim": { "branch": "main", "commit": "d146966a423e60699b084eeb28489fe3b6427599" },
|
||||
"null-ls.nvim": { "branch": "main", "commit": "bbaf5a96913aa92281f154b08732be2f57021c45" },
|
||||
"nvim-cmp": { "branch": "main", "commit": "e1f1b40790a8cb7e64091fb12cc5ffe350363aa0" },
|
||||
"nvim-lspconfig": { "branch": "master", "commit": "b6b34b9acf84949f0ac1c00747765e62b81fb38d" },
|
||||
"nvim-navic": { "branch": "master", "commit": "32cff45f1c84bec5e2a7bf15c0f3c6739b64c85d" },
|
||||
"nvim-notify": { "branch": "master", "commit": "ea9c8ce7a37f2238f934e087c255758659948e0f" },
|
||||
"nvim-spectre": { "branch": "master", "commit": "f4dc98ec45ecded2344aa3aac2d7cc43ad236858" },
|
||||
"nvim-treesitter": { "branch": "master", "commit": "b75f79bc5f68b552743d2136b80fe545871d5501" },
|
||||
"nvim-treesitter-textobjects": { "branch": "master", "commit": "83c59ed1eeae70a55605990993cf4d208948fdf7" },
|
||||
"nvim-ts-context-commentstring": { "branch": "main", "commit": "7f625207f225eea97ef7a6abe7611e556c396d2f" },
|
||||
"nvim-web-devicons": { "branch": "master", "commit": "9ab9b0b894b2388a9dbcdee5f00ce72e25d85bf9" },
|
||||
"persistence.nvim": { "branch": "main", "commit": "4b8051c01f696d8849a5cb8afa9767be8db16e40" },
|
||||
"plenary.nvim": { "branch": "master", "commit": "36aaceb6e93addd20b1b18f94d86aecc552f30c4" },
|
||||
"telescope.nvim": { "branch": "master", "commit": "219584a6efd32d0478dcd62b501c348bc44d9d43" },
|
||||
"todo-comments.nvim": { "branch": "main", "commit": "09b0b17d824d2d56f02ff15967e8a2499a89c731" },
|
||||
"tokyonight.nvim": { "branch": "main", "commit": "fd0a005fd8986ec0d98a1938dc570303e8d8444b" },
|
||||
"trouble.nvim": { "branch": "main", "commit": "d99e2abd10808ef91738ce98a5c767e6a51df449" },
|
||||
"vim-illuminate": { "branch": "master", "commit": "a2907275a6899c570d16e95b9db5fd921c167502" },
|
||||
"vim-repeat": { "branch": "master", "commit": "24afe922e6a05891756ecf331f39a1f6743d3d5a" },
|
||||
"vim-startuptime": { "branch": "master", "commit": "454b3de856b7bd298700de33d79774ca9b9e3875" },
|
||||
"which-key.nvim": { "branch": "main", "commit": "d871f2b664afd5aed3dc1d1573bef2fb24ce0484" }
|
||||
}
|
||||
3
chezmoi/dot_config/LazyVim/lua/config/autocmds.lua
Normal file
3
chezmoi/dot_config/LazyVim/lua/config/autocmds.lua
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
-- Autocmds are automatically loaded on the VeryLazy event
|
||||
-- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua
|
||||
-- Add any additional autocmds here
|
||||
3
chezmoi/dot_config/LazyVim/lua/config/keymaps.lua
Normal file
3
chezmoi/dot_config/LazyVim/lua/config/keymaps.lua
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
-- Keymaps are automatically loaded on the VeryLazy event
|
||||
-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua
|
||||
-- Add any additional keymaps here
|
||||
46
chezmoi/dot_config/LazyVim/lua/config/lazy.lua
Normal file
46
chezmoi/dot_config/LazyVim/lua/config/lazy.lua
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
||||
if not vim.loop.fs_stat(lazypath) then
|
||||
-- bootstrap lazy.nvim
|
||||
-- stylua: ignore
|
||||
vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath })
|
||||
end
|
||||
vim.opt.rtp:prepend(vim.env.LAZY or lazypath)
|
||||
|
||||
require("lazy").setup({
|
||||
spec = {
|
||||
-- add LazyVim and import its plugins
|
||||
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
|
||||
-- import any extras modules here
|
||||
-- { import = "lazyvim.plugins.extras.lang.typescript" },
|
||||
-- { import = "lazyvim.plugins.extras.lang.json" },
|
||||
-- { import = "lazyvim.plugins.extras.ui.mini-animate" },
|
||||
-- import/override with your plugins
|
||||
{ import = "plugins" },
|
||||
},
|
||||
defaults = {
|
||||
-- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup.
|
||||
-- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default.
|
||||
lazy = false,
|
||||
-- It's recommended to leave version=false for now, since a lot the plugin that support versioning,
|
||||
-- have outdated releases, which may break your Neovim install.
|
||||
version = false, -- always use the latest git commit
|
||||
-- version = "*", -- try installing the latest stable version for plugins that support semver
|
||||
},
|
||||
install = { colorscheme = { "tokyonight", "habamax" } },
|
||||
checker = { enabled = true }, -- automatically check for plugin updates
|
||||
performance = {
|
||||
rtp = {
|
||||
-- disable some rtp plugins
|
||||
disabled_plugins = {
|
||||
"gzip",
|
||||
-- "matchit",
|
||||
-- "matchparen",
|
||||
-- "netrwPlugin",
|
||||
"tarPlugin",
|
||||
"tohtml",
|
||||
"tutor",
|
||||
"zipPlugin",
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
3
chezmoi/dot_config/LazyVim/lua/config/options.lua
Normal file
3
chezmoi/dot_config/LazyVim/lua/config/options.lua
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
-- Options are automatically loaded before lazy.nvim startup
|
||||
-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua
|
||||
-- Add any additional options here
|
||||
266
chezmoi/dot_config/LazyVim/lua/plugins/example.lua
Normal file
266
chezmoi/dot_config/LazyVim/lua/plugins/example.lua
Normal file
|
|
@ -0,0 +1,266 @@
|
|||
-- since this is just an example spec, don't actually load anything here and return an empty spec
|
||||
-- stylua: ignore
|
||||
if true then return {} end
|
||||
|
||||
-- every spec file under config.plugins will be loaded automatically by lazy.nvim
|
||||
--
|
||||
-- In your plugin files, you can:
|
||||
-- * add extra plugins
|
||||
-- * disable/enabled LazyVim plugins
|
||||
-- * override the configuration of LazyVim plugins
|
||||
return {
|
||||
-- add gruvbox
|
||||
{ "ellisonleao/gruvbox.nvim" },
|
||||
|
||||
-- Configure LazyVim to load gruvbox
|
||||
{
|
||||
"LazyVim/LazyVim",
|
||||
opts = {
|
||||
colorscheme = "gruvbox",
|
||||
},
|
||||
},
|
||||
|
||||
-- change trouble config
|
||||
{
|
||||
"folke/trouble.nvim",
|
||||
-- opts will be merged with the parent spec
|
||||
opts = { use_diagnostic_signs = true },
|
||||
},
|
||||
|
||||
-- disable trouble
|
||||
{ "folke/trouble.nvim", enabled = false },
|
||||
|
||||
-- add symbols-outline
|
||||
{
|
||||
"simrat39/symbols-outline.nvim",
|
||||
cmd = "SymbolsOutline",
|
||||
keys = { { "<leader>cs", "<cmd>SymbolsOutline<cr>", desc = "Symbols Outline" } },
|
||||
config = true,
|
||||
},
|
||||
|
||||
-- override nvim-cmp and add cmp-emoji
|
||||
{
|
||||
"hrsh7th/nvim-cmp",
|
||||
dependencies = { "hrsh7th/cmp-emoji" },
|
||||
---@param opts cmp.ConfigSchema
|
||||
opts = function(_, opts)
|
||||
local cmp = require("cmp")
|
||||
opts.sources = cmp.config.sources(vim.list_extend(opts.sources, { { name = "emoji" } }))
|
||||
end,
|
||||
},
|
||||
|
||||
-- change some telescope options and a keymap to browse plugin files
|
||||
{
|
||||
"nvim-telescope/telescope.nvim",
|
||||
keys = {
|
||||
-- add a keymap to browse plugin files
|
||||
-- stylua: ignore
|
||||
{
|
||||
"<leader>fp",
|
||||
function() require("telescope.builtin").find_files({ cwd = require("lazy.core.config").options.root }) end,
|
||||
desc = "Find Plugin File",
|
||||
},
|
||||
},
|
||||
-- change some options
|
||||
opts = {
|
||||
defaults = {
|
||||
layout_strategy = "horizontal",
|
||||
layout_config = { prompt_position = "top" },
|
||||
sorting_strategy = "ascending",
|
||||
winblend = 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- add telescope-fzf-native
|
||||
{
|
||||
"telescope.nvim",
|
||||
dependencies = {
|
||||
"nvim-telescope/telescope-fzf-native.nvim",
|
||||
build = "make",
|
||||
config = function()
|
||||
require("telescope").load_extension("fzf")
|
||||
end,
|
||||
},
|
||||
},
|
||||
|
||||
-- add pyright to lspconfig
|
||||
{
|
||||
"neovim/nvim-lspconfig",
|
||||
---@class PluginLspOpts
|
||||
opts = {
|
||||
---@type lspconfig.options
|
||||
servers = {
|
||||
-- pyright will be automatically installed with mason and loaded with lspconfig
|
||||
pyright = {},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- add tsserver and setup with typescript.nvim instead of lspconfig
|
||||
{
|
||||
"neovim/nvim-lspconfig",
|
||||
dependencies = {
|
||||
"jose-elias-alvarez/typescript.nvim",
|
||||
init = function()
|
||||
require("lazyvim.util").on_attach(function(_, buffer)
|
||||
-- stylua: ignore
|
||||
vim.keymap.set( "n", "<leader>co", "TypescriptOrganizeImports", { buffer = buffer, desc = "Organize Imports" })
|
||||
vim.keymap.set("n", "<leader>cR", "TypescriptRenameFile", { desc = "Rename File", buffer = buffer })
|
||||
end)
|
||||
end,
|
||||
},
|
||||
---@class PluginLspOpts
|
||||
opts = {
|
||||
---@type lspconfig.options
|
||||
servers = {
|
||||
-- tsserver will be automatically installed with mason and loaded with lspconfig
|
||||
tsserver = {},
|
||||
},
|
||||
-- you can do any additional lsp server setup here
|
||||
-- return true if you don't want this server to be setup with lspconfig
|
||||
---@type table<string, fun(server:string, opts:_.lspconfig.options):boolean?>
|
||||
setup = {
|
||||
-- example to setup with typescript.nvim
|
||||
tsserver = function(_, opts)
|
||||
require("typescript").setup({ server = opts })
|
||||
return true
|
||||
end,
|
||||
-- Specify * to use this function as a fallback for any server
|
||||
-- ["*"] = function(server, opts) end,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- for typescript, LazyVim also includes extra specs to properly setup lspconfig,
|
||||
-- treesitter, mason and typescript.nvim. So instead of the above, you can use:
|
||||
{ import = "lazyvim.plugins.extras.lang.typescript" },
|
||||
|
||||
-- add more treesitter parsers
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
opts = {
|
||||
ensure_installed = {
|
||||
"bash",
|
||||
"html",
|
||||
"javascript",
|
||||
"json",
|
||||
"lua",
|
||||
"markdown",
|
||||
"markdown_inline",
|
||||
"python",
|
||||
"query",
|
||||
"regex",
|
||||
"tsx",
|
||||
"typescript",
|
||||
"vim",
|
||||
"yaml",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- since `vim.tbl_deep_extend`, can only merge tables and not lists, the code above
|
||||
-- would overwrite `ensure_installed` with the new value.
|
||||
-- If you'd rather extend the default config, use the code below instead:
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
opts = function(_, opts)
|
||||
-- add tsx and treesitter
|
||||
vim.list_extend(opts.ensure_installed, {
|
||||
"tsx",
|
||||
"typescript",
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- the opts function can also be used to change the default opts:
|
||||
{
|
||||
"nvim-lualine/lualine.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = function(_, opts)
|
||||
table.insert(opts.sections.lualine_x, "😄")
|
||||
end,
|
||||
},
|
||||
|
||||
-- or you can return new options to override all the defaults
|
||||
{
|
||||
"nvim-lualine/lualine.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = function()
|
||||
return {
|
||||
--[[add your custom lualine config here]]
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
-- use mini.starter instead of alpha
|
||||
{ import = "lazyvim.plugins.extras.ui.mini-starter" },
|
||||
|
||||
-- add jsonls and schemastore ans setup treesitter for json, json5 and jsonc
|
||||
{ import = "lazyvim.plugins.extras.lang.json" },
|
||||
|
||||
-- add any tools you want to have installed below
|
||||
{
|
||||
"williamboman/mason.nvim",
|
||||
opts = {
|
||||
ensure_installed = {
|
||||
"stylua",
|
||||
"shellcheck",
|
||||
"shfmt",
|
||||
"flake8",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- Use <tab> for completion and snippets (supertab)
|
||||
-- first: disable default <tab> and <s-tab> behavior in LuaSnip
|
||||
{
|
||||
"L3MON4D3/LuaSnip",
|
||||
keys = function()
|
||||
return {}
|
||||
end,
|
||||
},
|
||||
-- then: setup supertab in cmp
|
||||
{
|
||||
"hrsh7th/nvim-cmp",
|
||||
dependencies = {
|
||||
"hrsh7th/cmp-emoji",
|
||||
},
|
||||
---@param opts cmp.ConfigSchema
|
||||
opts = function(_, opts)
|
||||
local has_words_before = function()
|
||||
unpack = unpack or table.unpack
|
||||
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
|
||||
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
|
||||
end
|
||||
|
||||
local luasnip = require("luasnip")
|
||||
local cmp = require("cmp")
|
||||
|
||||
opts.mapping = vim.tbl_extend("force", opts.mapping, {
|
||||
["<Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_next_item()
|
||||
-- You could replace the expand_or_jumpable() calls with expand_or_locally_jumpable()
|
||||
-- they way you will only jump inside the snippet region
|
||||
elseif luasnip.expand_or_jumpable() then
|
||||
luasnip.expand_or_jump()
|
||||
elseif has_words_before() then
|
||||
cmp.complete()
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { "i", "s" }),
|
||||
["<S-Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_prev_item()
|
||||
elseif luasnip.jumpable(-1) then
|
||||
luasnip.jump(-1)
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { "i", "s" }),
|
||||
})
|
||||
end,
|
||||
},
|
||||
}
|
||||
32
chezmoi/dot_config/alacritty/alacritty.toml
Normal file
32
chezmoi/dot_config/alacritty/alacritty.toml
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
import = ["/home/aleidk/.config/alacritty/themes/catppuccin/catppuccin-macchiato.toml"]
|
||||
|
||||
[env]
|
||||
TERM = "xterm-256color"
|
||||
|
||||
[font]
|
||||
size = 12.0
|
||||
|
||||
[font.bold]
|
||||
style = "Bold"
|
||||
|
||||
[font.bold_italic]
|
||||
style = "Bold Italic"
|
||||
|
||||
[font.italic]
|
||||
style = "italic"
|
||||
|
||||
[font.normal]
|
||||
family = "JetBrainsMono Nerd Font"
|
||||
style = "Regular"
|
||||
|
||||
[mouse]
|
||||
hide_when_typing = false
|
||||
|
||||
[window]
|
||||
decorations = "full"
|
||||
dynamic_padding = true
|
||||
opacity = 1
|
||||
|
||||
[window.padding]
|
||||
x = 10
|
||||
y = 10
|
||||
844
chezmoi/dot_config/alacritty/alacritty.yml
Normal file
844
chezmoi/dot_config/alacritty/alacritty.yml
Normal file
|
|
@ -0,0 +1,844 @@
|
|||
# Configuration for Alacritty, the GPU enhanced terminal emulator.
|
||||
|
||||
# Import additional configuration files
|
||||
#
|
||||
# Imports are loaded in order, skipping all missing files, with the importing
|
||||
# file being loaded last. If a field is already present in a previous import, it
|
||||
# will be replaced.
|
||||
#
|
||||
# All imports must either be absolute paths starting with `/`, or paths relative
|
||||
# to the user's home directory starting with `~/`.
|
||||
import:
|
||||
# - /path/to/alacritty.yml
|
||||
- ~/.config/alacritty/themes/catppuccin/catppuccin-macchiato.yml
|
||||
# Any items in the `env` entry below will be added as
|
||||
# environment variables. Some entries may override variables
|
||||
# set by alacritty itself.
|
||||
env:
|
||||
TERM: xterm-256color
|
||||
#
|
||||
# This value is used to set the `$TERM` environment variable for
|
||||
# each instance of Alacritty. If it is not present, alacritty will
|
||||
# check the local terminfo database and use `alacritty` if it is
|
||||
# available, otherwise `xterm-256color` is used.
|
||||
#TERM: alacritty
|
||||
|
||||
window:
|
||||
# Window dimensions (changes require restart)
|
||||
#
|
||||
# Number of lines/columns (not pixels) in the terminal. The number of columns
|
||||
# must be at least `2`, while using a value of `0` for columns and lines will
|
||||
# fall back to the window manager's recommended size.
|
||||
#dimensions:
|
||||
# columns: 0
|
||||
# lines: 0
|
||||
|
||||
# Window position (changes require restart)
|
||||
#
|
||||
# Specified in number of pixels.
|
||||
# If the position is not set, the window manager will handle the placement.
|
||||
#position:
|
||||
# x: 0
|
||||
# y: 0
|
||||
|
||||
# Window padding (changes require restart)
|
||||
#
|
||||
# Blank space added around the window in pixels. This padding is scaled
|
||||
# by DPI and the specified value is always added at both opposing sides.
|
||||
padding:
|
||||
x: 10
|
||||
y: 10
|
||||
# Spread additional padding evenly around the terminal content.
|
||||
dynamic_padding: true
|
||||
|
||||
# Window decorations
|
||||
#
|
||||
# Values for `decorations`:
|
||||
# - full: Borders and title bar
|
||||
# - none: Neither borders nor title bar
|
||||
#
|
||||
# Values for `decorations` (macOS only):
|
||||
# - transparent: Title bar, transparent background and title bar buttons
|
||||
# - buttonless: Title bar, transparent background and no title bar buttons
|
||||
decorations: full
|
||||
# Background opacity
|
||||
#
|
||||
# Window opacity as a floating point number from `0.0` to `1.0`.
|
||||
# The value `0.0` is completely transparent and `1.0` is opaque.
|
||||
opacity: 1
|
||||
|
||||
# Startup Mode (changes require restart)
|
||||
#
|
||||
# Values for `startup_mode`:
|
||||
# - Windowed
|
||||
# - Maximized
|
||||
# - Fullscreen
|
||||
#
|
||||
# Values for `startup_mode` (macOS only):
|
||||
# - SimpleFullscreen
|
||||
#startup_mode: Windowed
|
||||
|
||||
# Window title
|
||||
#title: Alacritty
|
||||
|
||||
# Allow terminal applications to change Alacritty's window title.
|
||||
#dynamic_title: true
|
||||
|
||||
# Window class (Linux/BSD only):
|
||||
#class:
|
||||
# Application instance name
|
||||
#instance: Alacritty
|
||||
# General application class
|
||||
#general: Alacritty
|
||||
|
||||
# GTK theme variant (Linux/BSD only)
|
||||
#
|
||||
# Override the variant of the GTK theme. Commonly supported values are `dark`
|
||||
# and `light`. Set this to `None` to use the default theme variant.
|
||||
#gtk_theme_variant: None
|
||||
|
||||
#scrolling:
|
||||
# Maximum number of lines in the scrollback buffer.
|
||||
# Specifying '0' will disable scrolling.
|
||||
#history: 10000
|
||||
|
||||
# Scrolling distance multiplier.
|
||||
#multiplier: 3
|
||||
|
||||
# Font configuration
|
||||
font:
|
||||
normal:
|
||||
family: JetBrainsMono Nerd Font
|
||||
style: Regular
|
||||
bold:
|
||||
# family: JetBrainsMono NF
|
||||
style: Bold
|
||||
italic:
|
||||
# family: JetBrainsMono NF
|
||||
style: italic
|
||||
|
||||
bold_italic:
|
||||
# family: monospace
|
||||
style: Bold Italic
|
||||
|
||||
# Point size
|
||||
size: 12.0
|
||||
# Offset is the extra space around each character. `offset.y` can be thought
|
||||
# of as modifying the line spacing, and `offset.x` as modifying the letter
|
||||
# spacing.
|
||||
#offset:
|
||||
# x: 0
|
||||
# y: 0
|
||||
|
||||
# Glyph offset determines the locations of the glyphs within their cells with
|
||||
# the default being at the bottom. Increasing `x` moves the glyph to the
|
||||
# right, increasing `y` moves the glyph upward.
|
||||
#glyph_offset:
|
||||
# x: 0
|
||||
# y: 0
|
||||
|
||||
# Thin stroke font rendering (macOS only)
|
||||
#
|
||||
# Thin strokes are suitable for retina displays, but for non-retina screens
|
||||
# it is recommended to set `use_thin_strokes` to `false`.
|
||||
#use_thin_strokes: true
|
||||
|
||||
# Use built-in font for box drawing characters.
|
||||
#
|
||||
# If `true`, Alacritty will use a custom built-in font for box drawing
|
||||
# characters (Unicode points 2500 - 259f).
|
||||
#
|
||||
#builtin_box_drawing: true
|
||||
|
||||
# If `true`, bold text is drawn using the bright color variants.
|
||||
#draw_bold_text_with_bright_colors: false
|
||||
|
||||
# Colors (Tomorrow Night)
|
||||
#colors:
|
||||
# Default colors
|
||||
#primary:
|
||||
# background: '#1d1f21'
|
||||
# foreground: '#c5c8c6'
|
||||
|
||||
# Bright and dim foreground colors
|
||||
#
|
||||
# The dimmed foreground color is calculated automatically if it is not
|
||||
# present. If the bright foreground color is not set, or
|
||||
# `draw_bold_text_with_bright_colors` is `false`, the normal foreground
|
||||
# color will be used.
|
||||
#dim_foreground: '#828482'
|
||||
#bright_foreground: '#eaeaea'
|
||||
|
||||
# Cursor colors
|
||||
#
|
||||
# Colors which should be used to draw the terminal cursor.
|
||||
#
|
||||
# Allowed values are CellForeground/CellBackground, which reference the
|
||||
# affected cell, or hexadecimal colors like #ff00ff.
|
||||
#cursor:
|
||||
# text: CellBackground
|
||||
# cursor: CellForeground
|
||||
|
||||
# Vi mode cursor colors
|
||||
#
|
||||
# Colors for the cursor when the vi mode is active.
|
||||
#
|
||||
# Allowed values are CellForeground/CellBackground, which reference the
|
||||
# affected cell, or hexadecimal colors like #ff00ff.
|
||||
#vi_mode_cursor:
|
||||
# text: CellBackground
|
||||
# cursor: CellForeground
|
||||
|
||||
# Search colors
|
||||
#
|
||||
# Colors used for the search bar and match highlighting.
|
||||
#search:
|
||||
# Allowed values are CellForeground/CellBackground, which reference the
|
||||
# affected cell, or hexadecimal colors like #ff00ff.
|
||||
#matches:
|
||||
# foreground: '#000000'
|
||||
# background: '#ffffff'
|
||||
#focused_match:
|
||||
# foreground: '#ffffff'
|
||||
# background: '#000000'
|
||||
|
||||
#bar:
|
||||
# background: '#c5c8c6'
|
||||
# foreground: '#1d1f21'
|
||||
|
||||
# Keyboard regex hints
|
||||
#hints:
|
||||
# First character in the hint label
|
||||
#
|
||||
# Allowed values are CellForeground/CellBackground, which reference the
|
||||
# affected cell, or hexadecimal colors like #ff00ff.
|
||||
#start:
|
||||
# foreground: '#1d1f21'
|
||||
# background: '#e9ff5e'
|
||||
|
||||
# All characters after the first one in the hint label
|
||||
#
|
||||
# Allowed values are CellForeground/CellBackground, which reference the
|
||||
# affected cell, or hexadecimal colors like #ff00ff.
|
||||
#end:
|
||||
# foreground: '#e9ff5e'
|
||||
# background: '#1d1f21'
|
||||
|
||||
# Line indicator
|
||||
#
|
||||
# Color used for the indicator displaying the position in history during
|
||||
# search and vi mode.
|
||||
#
|
||||
# By default, these will use the opposing primary color.
|
||||
#line_indicator:
|
||||
# foreground: None
|
||||
# background: None
|
||||
|
||||
# Selection colors
|
||||
#
|
||||
# Colors which should be used to draw the selection area.
|
||||
#
|
||||
# Allowed values are CellForeground/CellBackground, which reference the
|
||||
# affected cell, or hexadecimal colors like #ff00ff.
|
||||
#selection:
|
||||
# text: CellBackground
|
||||
# background: CellForeground
|
||||
|
||||
# Normal colors
|
||||
#normal:
|
||||
# black: '#1d1f21'
|
||||
# red: '#cc6666'
|
||||
# green: '#b5bd68'
|
||||
# yellow: '#f0c674'
|
||||
# blue: '#81a2be'
|
||||
# magenta: '#b294bb'
|
||||
# cyan: '#8abeb7'
|
||||
# white: '#c5c8c6'
|
||||
|
||||
# Bright colors
|
||||
#bright:
|
||||
# black: '#666666'
|
||||
# red: '#d54e53'
|
||||
# green: '#b9ca4a'
|
||||
# yellow: '#e7c547'
|
||||
# blue: '#7aa6da'
|
||||
# magenta: '#c397d8'
|
||||
# cyan: '#70c0b1'
|
||||
# white: '#eaeaea'
|
||||
|
||||
# Dim colors
|
||||
#
|
||||
# If the dim colors are not set, they will be calculated automatically based
|
||||
# on the `normal` colors.
|
||||
#dim:
|
||||
# black: '#131415'
|
||||
# red: '#864343'
|
||||
# green: '#777c44'
|
||||
# yellow: '#9e824c'
|
||||
# blue: '#556a7d'
|
||||
# magenta: '#75617b'
|
||||
# cyan: '#5b7d78'
|
||||
# white: '#828482'
|
||||
|
||||
# Indexed Colors
|
||||
#
|
||||
# The indexed colors include all colors from 16 to 256.
|
||||
# When these are not set, they're filled with sensible defaults.
|
||||
#
|
||||
# Example:
|
||||
# `- { index: 16, color: '#ff00ff' }`
|
||||
#
|
||||
#indexed_colors: []
|
||||
|
||||
# Transparent cell backgrounds
|
||||
#
|
||||
# Whether or not `window.opacity` applies to all cell backgrounds or only to
|
||||
# the default background. When set to `true` all cells will be transparent
|
||||
# regardless of their background color.
|
||||
#transparent_background_colors: false
|
||||
|
||||
# Bell
|
||||
#
|
||||
# The bell is rung every time the BEL control character is received.
|
||||
#bell:
|
||||
# Visual Bell Animation
|
||||
#
|
||||
# Animation effect for flashing the screen when the visual bell is rung.
|
||||
#
|
||||
# Values for `animation`:
|
||||
# - Ease
|
||||
# - EaseOut
|
||||
# - EaseOutSine
|
||||
# - EaseOutQuad
|
||||
# - EaseOutCubic
|
||||
# - EaseOutQuart
|
||||
# - EaseOutQuint
|
||||
# - EaseOutExpo
|
||||
# - EaseOutCirc
|
||||
# - Linear
|
||||
#animation: EaseOutExpo
|
||||
|
||||
# Duration of the visual bell flash in milliseconds. A `duration` of `0` will
|
||||
# disable the visual bell animation.
|
||||
#duration: 0
|
||||
|
||||
# Visual bell animation color.
|
||||
#color: '#ffffff'
|
||||
|
||||
# Bell Command
|
||||
#
|
||||
# This program is executed whenever the bell is rung.
|
||||
#
|
||||
# When set to `command: None`, no command will be executed.
|
||||
#
|
||||
# Example:
|
||||
# command:
|
||||
# program: notify-send
|
||||
# args: ["Hello, World!"]
|
||||
#
|
||||
#command: None
|
||||
|
||||
#selection:
|
||||
# This string contains all characters that are used as separators for
|
||||
# "semantic words" in Alacritty.
|
||||
#semantic_escape_chars: ",│`|:\"' ()[]{}<>\t"
|
||||
|
||||
# When set to `true`, selected text will be copied to the primary clipboard.
|
||||
#save_to_clipboard: false
|
||||
|
||||
#cursor:
|
||||
# Cursor style
|
||||
#style:
|
||||
# Cursor shape
|
||||
#
|
||||
# Values for `shape`:
|
||||
# - ▇ Block
|
||||
# - _ Underline
|
||||
# - | Beam
|
||||
#shape: Block
|
||||
|
||||
# Cursor blinking state
|
||||
#
|
||||
# Values for `blinking`:
|
||||
# - Never: Prevent the cursor from ever blinking
|
||||
# - Off: Disable blinking by default
|
||||
# - On: Enable blinking by default
|
||||
# - Always: Force the cursor to always blink
|
||||
#blinking: Off
|
||||
|
||||
# Vi mode cursor style
|
||||
#
|
||||
# If the vi mode cursor style is `None` or not specified, it will fall back to
|
||||
# the style of the active value of the normal cursor.
|
||||
#
|
||||
# See `cursor.style` for available options.
|
||||
#vi_mode_style: None
|
||||
|
||||
# Cursor blinking interval in milliseconds.
|
||||
#blink_interval: 750
|
||||
|
||||
# If this is `true`, the cursor will be rendered as a hollow box when the
|
||||
# window is not focused.
|
||||
#unfocused_hollow: true
|
||||
|
||||
# Thickness of the cursor relative to the cell width as floating point number
|
||||
# from `0.0` to `1.0`.
|
||||
#thickness: 0.15
|
||||
|
||||
# Live config reload (changes require restart)
|
||||
#live_config_reload: true
|
||||
|
||||
# Shell
|
||||
#
|
||||
# You can set `shell.program` to the path of your favorite shell, e.g.
|
||||
# `/bin/fish`. Entries in `shell.args` are passed unmodified as arguments to the
|
||||
# shell.
|
||||
#
|
||||
# Default:
|
||||
# - (macOS) /bin/bash --login
|
||||
# - (Linux/BSD) user login shell
|
||||
# - (Windows) powershell
|
||||
# shell:
|
||||
# program: /bin/zsh
|
||||
# args:
|
||||
# - -l
|
||||
# - -c
|
||||
# # Open tmux session selector on startup
|
||||
# - "source ~/.config/zsh/functions/tmux.zsh && tm || echo 'Error running tmux...'"
|
||||
# Startup directory
|
||||
#
|
||||
# Directory the shell is started in. If this is unset, or `None`, the working
|
||||
# directory of the parent process will be used.
|
||||
#working_directory: None
|
||||
|
||||
# Send ESC (\x1b) before characters when alt is pressed.
|
||||
#alt_send_esc: true
|
||||
|
||||
# Offer IPC using `alacritty msg` (unix only)
|
||||
#ipc_socket: true
|
||||
|
||||
mouse:
|
||||
# Click settings
|
||||
#
|
||||
# The `double_click` and `triple_click` settings control the time
|
||||
# alacritty should wait for accepting multiple clicks as one double
|
||||
# or triple click.
|
||||
#double_click: { threshold: 300 }
|
||||
#triple_click: { threshold: 300 }
|
||||
|
||||
# If this is `true`, the cursor is temporarily hidden when typing.
|
||||
hide_when_typing: false
|
||||
# Regex hints
|
||||
#
|
||||
# Terminal hints can be used to find text in the visible part of the terminal
|
||||
# and pipe it to other applications.
|
||||
#hints:
|
||||
# Keys used for the hint labels.
|
||||
#alphabet: "jfkdls;ahgurieowpq"
|
||||
|
||||
# List with all available hints
|
||||
#
|
||||
# Each hint must have a `regex` and either an `action` or a `command` field.
|
||||
# The fields `mouse`, `binding` and `post_processing` are optional.
|
||||
#
|
||||
# The fields `command`, `binding.key`, `binding.mods`, `binding.mode` and
|
||||
# `mouse.mods` accept the same values as they do in the `key_bindings` section.
|
||||
#
|
||||
# The `mouse.enabled` field controls if the hint should be underlined while
|
||||
# the mouse with all `mouse.mods` keys held or the vi mode cursor is above it.
|
||||
#
|
||||
# If the `post_processing` field is set to `true`, heuristics will be used to
|
||||
# shorten the match if there are characters likely not to be part of the hint
|
||||
# (e.g. a trailing `.`). This is most useful for URIs.
|
||||
#
|
||||
# Values for `action`:
|
||||
# - Copy
|
||||
# Copy the hint's text to the clipboard.
|
||||
# - Paste
|
||||
# Paste the hint's text to the terminal or search.
|
||||
# - Select
|
||||
# Select the hint's text.
|
||||
# - MoveViModeCursor
|
||||
# Move the vi mode cursor to the beginning of the hint.
|
||||
#enabled:
|
||||
# - regex: "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)\
|
||||
# [^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+"
|
||||
# command: xdg-open
|
||||
# post_processing: true
|
||||
# mouse:
|
||||
# enabled: true
|
||||
# mods: None
|
||||
# binding:
|
||||
# key: U
|
||||
# mods: Control|Shift
|
||||
|
||||
# Mouse bindings
|
||||
#
|
||||
# Mouse bindings are specified as a list of objects, much like the key
|
||||
# bindings further below.
|
||||
#
|
||||
# To trigger mouse bindings when an application running within Alacritty
|
||||
# captures the mouse, the `Shift` modifier is automatically added as a
|
||||
# requirement.
|
||||
#
|
||||
# Each mouse binding will specify a:
|
||||
#
|
||||
# - `mouse`:
|
||||
#
|
||||
# - Middle
|
||||
# - Left
|
||||
# - Right
|
||||
# - Numeric identifier such as `5`
|
||||
#
|
||||
# - `action` (see key bindings for actions not exclusive to mouse mode)
|
||||
#
|
||||
# - Mouse exclusive actions:
|
||||
#
|
||||
# - ExpandSelection
|
||||
# Expand the selection to the current mouse cursor location.
|
||||
#
|
||||
# And optionally:
|
||||
#
|
||||
# - `mods` (see key bindings)
|
||||
#mouse_bindings:
|
||||
# - { mouse: Right, action: ExpandSelection }
|
||||
# - { mouse: Right, mods: Control, action: ExpandSelection }
|
||||
# - { mouse: Middle, mode: ~Vi, action: PasteSelection }
|
||||
|
||||
# Key bindings
|
||||
#
|
||||
# Key bindings are specified as a list of objects. For example, this is the
|
||||
# default paste binding:
|
||||
#
|
||||
# `- { key: V, mods: Control|Shift, action: Paste }`
|
||||
#
|
||||
# Each key binding will specify a:
|
||||
#
|
||||
# - `key`: Identifier of the key pressed
|
||||
#
|
||||
# - A-Z
|
||||
# - F1-F24
|
||||
# - Key0-Key9
|
||||
#
|
||||
# A full list with available key codes can be found here:
|
||||
# https://docs.rs/glutin/*/glutin/event/enum.VirtualKeyCode.html#variants
|
||||
#
|
||||
# Instead of using the name of the keys, the `key` field also supports using
|
||||
# the scancode of the desired key. Scancodes have to be specified as a
|
||||
# decimal number. This command will allow you to display the hex scancodes
|
||||
# for certain keys:
|
||||
#
|
||||
# `showkey --scancodes`.
|
||||
#
|
||||
# Then exactly one of:
|
||||
#
|
||||
# - `chars`: Send a byte sequence to the running application
|
||||
#
|
||||
# The `chars` field writes the specified string to the terminal. This makes
|
||||
# it possible to pass escape sequences. To find escape codes for bindings
|
||||
# like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside
|
||||
# of tmux. Note that applications use terminfo to map escape sequences back
|
||||
# to keys. It is therefore required to update the terminfo when changing an
|
||||
# escape sequence.
|
||||
#
|
||||
# - `action`: Execute a predefined action
|
||||
#
|
||||
# - ToggleViMode
|
||||
# - SearchForward
|
||||
# Start searching toward the right of the search origin.
|
||||
# - SearchBackward
|
||||
# Start searching toward the left of the search origin.
|
||||
# - Copy
|
||||
# - Paste
|
||||
# - IncreaseFontSize
|
||||
# - DecreaseFontSize
|
||||
# - ResetFontSize
|
||||
# - ScrollPageUp
|
||||
# - ScrollPageDown
|
||||
# - ScrollHalfPageUp
|
||||
# - ScrollHalfPageDown
|
||||
# - ScrollLineUp
|
||||
# - ScrollLineDown
|
||||
# - ScrollToTop
|
||||
# - ScrollToBottom
|
||||
# - ClearHistory
|
||||
# Remove the terminal's scrollback history.
|
||||
# - Hide
|
||||
# Hide the Alacritty window.
|
||||
# - Minimize
|
||||
# Minimize the Alacritty window.
|
||||
# - Quit
|
||||
# Quit Alacritty.
|
||||
# - ToggleFullscreen
|
||||
# - SpawnNewInstance
|
||||
# Spawn a new instance of Alacritty.
|
||||
# - CreateNewWindow
|
||||
# Create a new Alacritty window from the current process.
|
||||
# - ClearLogNotice
|
||||
# Clear Alacritty's UI warning and error notice.
|
||||
# - ClearSelection
|
||||
# Remove the active selection.
|
||||
# - ReceiveChar
|
||||
# - None
|
||||
#
|
||||
# - Vi mode exclusive actions:
|
||||
#
|
||||
# - Open
|
||||
# Perform the action of the first matching hint under the vi mode cursor
|
||||
# with `mouse.enabled` set to `true`.
|
||||
# - ToggleNormalSelection
|
||||
# - ToggleLineSelection
|
||||
# - ToggleBlockSelection
|
||||
# - ToggleSemanticSelection
|
||||
# Toggle semantic selection based on `selection.semantic_escape_chars`.
|
||||
#
|
||||
# - Vi mode exclusive cursor motion actions:
|
||||
#
|
||||
# - Up
|
||||
# One line up.
|
||||
# - Down
|
||||
# One line down.
|
||||
# - Left
|
||||
# One character left.
|
||||
# - Right
|
||||
# One character right.
|
||||
# - First
|
||||
# First column, or beginning of the line when already at the first column.
|
||||
# - Last
|
||||
# Last column, or beginning of the line when already at the last column.
|
||||
# - FirstOccupied
|
||||
# First non-empty cell in this terminal row, or first non-empty cell of
|
||||
# the line when already at the first cell of the row.
|
||||
# - High
|
||||
# Top of the screen.
|
||||
# - Middle
|
||||
# Center of the screen.
|
||||
# - Low
|
||||
# Bottom of the screen.
|
||||
# - SemanticLeft
|
||||
# Start of the previous semantically separated word.
|
||||
# - SemanticRight
|
||||
# Start of the next semantically separated word.
|
||||
# - SemanticLeftEnd
|
||||
# End of the previous semantically separated word.
|
||||
# - SemanticRightEnd
|
||||
# End of the next semantically separated word.
|
||||
# - WordLeft
|
||||
# Start of the previous whitespace separated word.
|
||||
# - WordRight
|
||||
# Start of the next whitespace separated word.
|
||||
# - WordLeftEnd
|
||||
# End of the previous whitespace separated word.
|
||||
# - WordRightEnd
|
||||
# End of the next whitespace separated word.
|
||||
# - Bracket
|
||||
# Character matching the bracket at the cursor's location.
|
||||
# - SearchNext
|
||||
# Beginning of the next match.
|
||||
# - SearchPrevious
|
||||
# Beginning of the previous match.
|
||||
# - SearchStart
|
||||
# Start of the match to the left of the vi mode cursor.
|
||||
# - SearchEnd
|
||||
# End of the match to the right of the vi mode cursor.
|
||||
#
|
||||
# - Search mode exclusive actions:
|
||||
# - SearchFocusNext
|
||||
# Move the focus to the next search match.
|
||||
# - SearchFocusPrevious
|
||||
# Move the focus to the previous search match.
|
||||
# - SearchConfirm
|
||||
# - SearchCancel
|
||||
# - SearchClear
|
||||
# Reset the search regex.
|
||||
# - SearchDeleteWord
|
||||
# Delete the last word in the search regex.
|
||||
# - SearchHistoryPrevious
|
||||
# Go to the previous regex in the search history.
|
||||
# - SearchHistoryNext
|
||||
# Go to the next regex in the search history.
|
||||
#
|
||||
# - macOS exclusive actions:
|
||||
# - ToggleSimpleFullscreen
|
||||
# Enter fullscreen without occupying another space.
|
||||
#
|
||||
# - Linux/BSD exclusive actions:
|
||||
#
|
||||
# - CopySelection
|
||||
# Copy from the selection buffer.
|
||||
# - PasteSelection
|
||||
# Paste from the selection buffer.
|
||||
#
|
||||
# - `command`: Fork and execute a specified command plus arguments
|
||||
#
|
||||
# The `command` field must be a map containing a `program` string and an
|
||||
# `args` array of command line parameter strings. For example:
|
||||
# `{ program: "alacritty", args: ["-e", "vttest"] }`
|
||||
#
|
||||
# And optionally:
|
||||
#
|
||||
# - `mods`: Key modifiers to filter binding actions
|
||||
#
|
||||
# - Command
|
||||
# - Control
|
||||
# - Option
|
||||
# - Super
|
||||
# - Shift
|
||||
# - Alt
|
||||
#
|
||||
# Multiple `mods` can be combined using `|` like this:
|
||||
# `mods: Control|Shift`.
|
||||
# Whitespace and capitalization are relevant and must match the example.
|
||||
#
|
||||
# - `mode`: Indicate a binding for only specific terminal reported modes
|
||||
#
|
||||
# This is mainly used to send applications the correct escape sequences
|
||||
# when in different modes.
|
||||
#
|
||||
# - AppCursor
|
||||
# - AppKeypad
|
||||
# - Search
|
||||
# - Alt
|
||||
# - Vi
|
||||
#
|
||||
# A `~` operator can be used before a mode to apply the binding whenever
|
||||
# the mode is *not* active, e.g. `~Alt`.
|
||||
#
|
||||
# Bindings are always filled by default, but will be replaced when a new
|
||||
# binding with the same triggers is defined. To unset a default binding, it can
|
||||
# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for
|
||||
# a no-op if you do not wish to receive input characters for that binding.
|
||||
#
|
||||
# If the same trigger is assigned to multiple actions, all of them are executed
|
||||
# in the order they were defined in.
|
||||
#key_bindings:
|
||||
#- { key: Paste, action: Paste }
|
||||
#- { key: Copy, action: Copy }
|
||||
#- { key: L, mods: Control, action: ClearLogNotice }
|
||||
#- { key: L, mods: Control, mode: ~Vi|~Search, chars: "\x0c" }
|
||||
#- { key: PageUp, mods: Shift, mode: ~Alt, action: ScrollPageUp, }
|
||||
#- { key: PageDown, mods: Shift, mode: ~Alt, action: ScrollPageDown }
|
||||
#- { key: Home, mods: Shift, mode: ~Alt, action: ScrollToTop, }
|
||||
#- { key: End, mods: Shift, mode: ~Alt, action: ScrollToBottom }
|
||||
|
||||
# Vi Mode
|
||||
#- { key: Space, mods: Shift|Control, mode: ~Search, action: ToggleViMode }
|
||||
#- { key: Space, mods: Shift|Control, mode: Vi|~Search, action: ScrollToBottom }
|
||||
#- { key: Escape, mode: Vi|~Search, action: ClearSelection }
|
||||
#- { key: I, mode: Vi|~Search, action: ToggleViMode }
|
||||
#- { key: I, mode: Vi|~Search, action: ScrollToBottom }
|
||||
#- { key: C, mods: Control, mode: Vi|~Search, action: ToggleViMode }
|
||||
#- { key: Y, mods: Control, mode: Vi|~Search, action: ScrollLineUp }
|
||||
#- { key: E, mods: Control, mode: Vi|~Search, action: ScrollLineDown }
|
||||
#- { key: G, mode: Vi|~Search, action: ScrollToTop }
|
||||
#- { key: G, mods: Shift, mode: Vi|~Search, action: ScrollToBottom }
|
||||
#- { key: B, mods: Control, mode: Vi|~Search, action: ScrollPageUp }
|
||||
#- { key: F, mods: Control, mode: Vi|~Search, action: ScrollPageDown }
|
||||
#- { key: U, mods: Control, mode: Vi|~Search, action: ScrollHalfPageUp }
|
||||
#- { key: D, mods: Control, mode: Vi|~Search, action: ScrollHalfPageDown }
|
||||
#- { key: Y, mode: Vi|~Search, action: Copy }
|
||||
#- { key: Y, mode: Vi|~Search, action: ClearSelection }
|
||||
#- { key: Copy, mode: Vi|~Search, action: ClearSelection }
|
||||
#- { key: V, mode: Vi|~Search, action: ToggleNormalSelection }
|
||||
#- { key: V, mods: Shift, mode: Vi|~Search, action: ToggleLineSelection }
|
||||
#- { key: V, mods: Control, mode: Vi|~Search, action: ToggleBlockSelection }
|
||||
#- { key: V, mods: Alt, mode: Vi|~Search, action: ToggleSemanticSelection }
|
||||
#- { key: Return, mode: Vi|~Search, action: Open }
|
||||
#- { key: K, mode: Vi|~Search, action: Up }
|
||||
#- { key: J, mode: Vi|~Search, action: Down }
|
||||
#- { key: H, mode: Vi|~Search, action: Left }
|
||||
#- { key: L, mode: Vi|~Search, action: Right }
|
||||
#- { key: Up, mode: Vi|~Search, action: Up }
|
||||
#- { key: Down, mode: Vi|~Search, action: Down }
|
||||
#- { key: Left, mode: Vi|~Search, action: Left }
|
||||
#- { key: Right, mode: Vi|~Search, action: Right }
|
||||
#- { key: Key0, mode: Vi|~Search, action: First }
|
||||
#- { key: Key4, mods: Shift, mode: Vi|~Search, action: Last }
|
||||
#- { key: Key6, mods: Shift, mode: Vi|~Search, action: FirstOccupied }
|
||||
#- { key: H, mods: Shift, mode: Vi|~Search, action: High }
|
||||
#- { key: M, mods: Shift, mode: Vi|~Search, action: Middle }
|
||||
#- { key: L, mods: Shift, mode: Vi|~Search, action: Low }
|
||||
#- { key: B, mode: Vi|~Search, action: SemanticLeft }
|
||||
#- { key: W, mode: Vi|~Search, action: SemanticRight }
|
||||
#- { key: E, mode: Vi|~Search, action: SemanticRightEnd }
|
||||
#- { key: B, mods: Shift, mode: Vi|~Search, action: WordLeft }
|
||||
#- { key: W, mods: Shift, mode: Vi|~Search, action: WordRight }
|
||||
#- { key: E, mods: Shift, mode: Vi|~Search, action: WordRightEnd }
|
||||
#- { key: Key5, mods: Shift, mode: Vi|~Search, action: Bracket }
|
||||
#- { key: Slash, mode: Vi|~Search, action: SearchForward }
|
||||
#- { key: Slash, mods: Shift, mode: Vi|~Search, action: SearchBackward }
|
||||
#- { key: N, mode: Vi|~Search, action: SearchNext }
|
||||
#- { key: N, mods: Shift, mode: Vi|~Search, action: SearchPrevious }
|
||||
|
||||
# Search Mode
|
||||
#- { key: Return, mode: Search|Vi, action: SearchConfirm }
|
||||
#- { key: Escape, mode: Search, action: SearchCancel }
|
||||
#- { key: C, mods: Control, mode: Search, action: SearchCancel }
|
||||
#- { key: U, mods: Control, mode: Search, action: SearchClear }
|
||||
#- { key: W, mods: Control, mode: Search, action: SearchDeleteWord }
|
||||
#- { key: P, mods: Control, mode: Search, action: SearchHistoryPrevious }
|
||||
#- { key: N, mods: Control, mode: Search, action: SearchHistoryNext }
|
||||
#- { key: Up, mode: Search, action: SearchHistoryPrevious }
|
||||
#- { key: Down, mode: Search, action: SearchHistoryNext }
|
||||
#- { key: Return, mode: Search|~Vi, action: SearchFocusNext }
|
||||
#- { key: Return, mods: Shift, mode: Search|~Vi, action: SearchFocusPrevious }
|
||||
|
||||
# (Windows, Linux, and BSD only)
|
||||
#- { key: V, mods: Control|Shift, mode: ~Vi, action: Paste }
|
||||
#- { key: C, mods: Control|Shift, action: Copy }
|
||||
#- { key: F, mods: Control|Shift, mode: ~Search, action: SearchForward }
|
||||
#- { key: B, mods: Control|Shift, mode: ~Search, action: SearchBackward }
|
||||
#- { key: C, mods: Control|Shift, mode: Vi|~Search, action: ClearSelection }
|
||||
#- { key: Insert, mods: Shift, action: PasteSelection }
|
||||
#- { key: Key0, mods: Control, action: ResetFontSize }
|
||||
#- { key: Equals, mods: Control, action: IncreaseFontSize }
|
||||
#- { key: Plus, mods: Control, action: IncreaseFontSize }
|
||||
#- { key: NumpadAdd, mods: Control, action: IncreaseFontSize }
|
||||
#- { key: Minus, mods: Control, action: DecreaseFontSize }
|
||||
#- { key: NumpadSubtract, mods: Control, action: DecreaseFontSize }
|
||||
|
||||
# (Windows only)
|
||||
#- { key: Return, mods: Alt, action: ToggleFullscreen }
|
||||
|
||||
# (macOS only)
|
||||
#- { key: K, mods: Command, mode: ~Vi|~Search, chars: "\x0c" }
|
||||
#- { key: K, mods: Command, mode: ~Vi|~Search, action: ClearHistory }
|
||||
#- { key: Key0, mods: Command, action: ResetFontSize }
|
||||
#- { key: Equals, mods: Command, action: IncreaseFontSize }
|
||||
#- { key: Plus, mods: Command, action: IncreaseFontSize }
|
||||
#- { key: NumpadAdd, mods: Command, action: IncreaseFontSize }
|
||||
#- { key: Minus, mods: Command, action: DecreaseFontSize }
|
||||
#- { key: NumpadSubtract, mods: Command, action: DecreaseFontSize }
|
||||
#- { key: V, mods: Command, action: Paste }
|
||||
#- { key: C, mods: Command, action: Copy }
|
||||
#- { key: C, mods: Command, mode: Vi|~Search, action: ClearSelection }
|
||||
#- { key: H, mods: Command, action: Hide }
|
||||
#- { key: H, mods: Command|Alt, action: HideOtherApplications }
|
||||
#- { key: M, mods: Command, action: Minimize }
|
||||
#- { key: Q, mods: Command, action: Quit }
|
||||
#- { key: W, mods: Command, action: Quit }
|
||||
#- { key: N, mods: Command, action: SpawnNewInstance }
|
||||
#- { key: F, mods: Command|Control, action: ToggleFullscreen }
|
||||
#- { key: F, mods: Command, mode: ~Search, action: SearchForward }
|
||||
#- { key: B, mods: Command, mode: ~Search, action: SearchBackward }
|
||||
|
||||
#debug:
|
||||
# Display the time it takes to redraw each frame.
|
||||
#render_timer: false
|
||||
|
||||
# Keep the log file after quitting Alacritty.
|
||||
#persistent_logging: false
|
||||
|
||||
# Log level
|
||||
#
|
||||
# Values for `log_level`:
|
||||
# - Off
|
||||
# - Error
|
||||
# - Warn
|
||||
# - Info
|
||||
# - Debug
|
||||
# - Trace
|
||||
#log_level: Warn
|
||||
|
||||
# Print all received window events.
|
||||
#print_events: false
|
||||
21
chezmoi/dot_config/alacritty/themes/catppuccin/LICENSE
Normal file
21
chezmoi/dot_config/alacritty/themes/catppuccin/LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2021 Catppuccin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
97
chezmoi/dot_config/alacritty/themes/catppuccin/README.md
Normal file
97
chezmoi/dot_config/alacritty/themes/catppuccin/README.md
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
<h3 align="center">
|
||||
<img src="https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/logos/exports/1544x1544_circle.png" width="100" alt="Logo"/><br/>
|
||||
<img src="https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/misc/transparent.png" height="30" width="0px"/>
|
||||
Catppuccin for <a href="https://github.com/alacritty/alacritty">Alacritty</a>
|
||||
<img src="https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/misc/transparent.png" height="30" width="0px"/>
|
||||
</h3>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/catppuccin/alacritty/stargazers"><img src="https://img.shields.io/github/stars/catppuccin/alacritty?colorA=363a4f&colorB=b7bdf8&style=for-the-badge"></a>
|
||||
<a href="https://github.com/catppuccin/alacritty/issues"><img src="https://img.shields.io/github/issues/catppuccin/alacritty?colorA=363a4f&colorB=f5a97f&style=for-the-badge"></a>
|
||||
<a href="https://github.com/catppuccin/alacritty/contributors"><img src="https://img.shields.io/github/contributors/catppuccin/alacritty?colorA=363a4f&colorB=a6da95&style=for-the-badge"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="assets/preview.webp"/>
|
||||
</p>
|
||||
|
||||
## Previews
|
||||
|
||||
<details>
|
||||
<summary>🌻 Latte</summary>
|
||||
<img src="assets/latte.webp"/>
|
||||
</details>
|
||||
<details>
|
||||
<summary>🪴 Frappé</summary>
|
||||
<img src="assets/frappe.webp"/>
|
||||
</details>
|
||||
<details>
|
||||
<summary>🌺 Macchiato</summary>
|
||||
<img src="assets/macchiato.webp"/>
|
||||
</details>
|
||||
<details>
|
||||
<summary>🌿 Mocha</summary>
|
||||
<img src="assets/mocha.webp"/>
|
||||
</details>
|
||||
|
||||
## Usage
|
||||
|
||||
> [!NOTE]
|
||||
> Please see the [`yaml`](https://github.com/catppuccin/alacritty/tree/yaml) tag if you need the config in YAML format.
|
||||
|
||||
1. Copy the theme files next to your `alacritty.toml` configuration file.
|
||||
See [Alacritty's README](https://github.com/alacritty/alacritty#configuration) to see where your config file can be
|
||||
stored, it is usually stored at `~/.config/alacritty/alacritty.toml`
|
||||
|
||||
- Latte
|
||||
```shell
|
||||
curl -LO --output-dir ~/.config/alacritty https://github.com/catppuccin/alacritty/raw/main/catppuccin-latte.toml
|
||||
```
|
||||
|
||||
- Frappé
|
||||
```shell
|
||||
curl -LO --output-dir ~/.config/alacritty https://github.com/catppuccin/alacritty/raw/main/catppuccin-frappe.toml
|
||||
```
|
||||
|
||||
- Macchiato
|
||||
```shell
|
||||
curl -LO --output-dir ~/.config/alacritty https://github.com/catppuccin/alacritty/raw/main/catppuccin-macchiato.toml
|
||||
```
|
||||
|
||||
- Mocha
|
||||
```shell
|
||||
curl -LO --output-dir ~/.config/alacritty https://github.com/catppuccin/alacritty/raw/main/catppuccin-mocha.toml
|
||||
```
|
||||
|
||||
2. Import the desired flavour config in your `alacritty.toml`:
|
||||
|
||||
```toml
|
||||
import = [
|
||||
# uncomment the flavour you want below:
|
||||
"~/.config/alacritty/catppuccin-latte.toml"
|
||||
# "~/.config/alacritty/catppuccin-frappe.toml"
|
||||
# "~/.config/alacritty/catppuccin-macchiato.toml"
|
||||
# "~/.config/alacritty/catppuccin-mocha.toml"
|
||||
]
|
||||
```
|
||||
|
||||
## 🙋 FAQ
|
||||
|
||||
- Q: **_"My colours don't look the same as the previews. What do I do?"_**\
|
||||
A: Make sure you have the following set in `alacritty.toml`:
|
||||
|
||||
```toml
|
||||
[env]
|
||||
TERM = "xterm-256color"
|
||||
```
|
||||
|
||||
## 💝 Thanks to
|
||||
|
||||
- [VictorTennekes](https://github.com/VictorTennekes)
|
||||
- [Andreas Grafen](https://github.com/andreasgrafen)
|
||||
|
||||
|
||||
|
||||
<p align="center"><img src="https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/footers/gray0_ctp_on_line.svg?sanitize=true" /></p>
|
||||
<p align="center">Copyright © 2021-present <a href="https://github.com/catppuccin" target="_blank">Catppuccin Org</a>
|
||||
<p align="center"><a href="https://github.com/catppuccin/catppuccin/blob/main/LICENSE"><img src="https://img.shields.io/static/v1.svg?style=for-the-badge&label=License&message=MIT&logoColor=d9e0ee&colorA=363a4f&colorB=b7bdf8"/></a></p>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
BIN
chezmoi/dot_config/alacritty/themes/catppuccin/assets/latte.webp
Normal file
BIN
chezmoi/dot_config/alacritty/themes/catppuccin/assets/latte.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
BIN
chezmoi/dot_config/alacritty/themes/catppuccin/assets/mocha.webp
Normal file
BIN
chezmoi/dot_config/alacritty/themes/catppuccin/assets/mocha.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 140 KiB |
|
|
@ -0,0 +1,75 @@
|
|||
[colors.primary]
|
||||
background = "#303446"
|
||||
foreground = "#C6D0F5"
|
||||
dim_foreground = "#C6D0F5"
|
||||
bright_foreground = "#C6D0F5"
|
||||
|
||||
[colors.cursor]
|
||||
text = "#303446"
|
||||
cursor = "#F2D5CF"
|
||||
|
||||
[colors.vi_mode_cursor]
|
||||
text = "#303446"
|
||||
cursor = "#BABBF1"
|
||||
|
||||
[colors.search.matches]
|
||||
foreground = "#303446"
|
||||
background = "#A5ADCE"
|
||||
|
||||
[colors.search.focused_match]
|
||||
foreground = "#303446"
|
||||
background = "#A6D189"
|
||||
|
||||
[colors.footer_bar]
|
||||
foreground = "#303446"
|
||||
background = "#A5ADCE"
|
||||
|
||||
[colors.hints.start]
|
||||
foreground = "#303446"
|
||||
background = "#E5C890"
|
||||
|
||||
[colors.hints.end]
|
||||
foreground = "#303446"
|
||||
background = "#A5ADCE"
|
||||
|
||||
[colors.selection]
|
||||
text = "#303446"
|
||||
background = "#F2D5CF"
|
||||
|
||||
[colors.normal]
|
||||
black = "#51576D"
|
||||
red = "#E78284"
|
||||
green = "#A6D189"
|
||||
yellow = "#E5C890"
|
||||
blue = "#8CAAEE"
|
||||
magenta = "#F4B8E4"
|
||||
cyan = "#81C8BE"
|
||||
white = "#B5BFE2"
|
||||
|
||||
[colors.bright]
|
||||
black = "#626880"
|
||||
red = "#E78284"
|
||||
green = "#A6D189"
|
||||
yellow = "#E5C890"
|
||||
blue = "#8CAAEE"
|
||||
magenta = "#F4B8E4"
|
||||
cyan = "#81C8BE"
|
||||
white = "#A5ADCE"
|
||||
|
||||
[colors.dim]
|
||||
black = "#51576D"
|
||||
red = "#E78284"
|
||||
green = "#A6D189"
|
||||
yellow = "#E5C890"
|
||||
blue = "#8CAAEE"
|
||||
magenta = "#F4B8E4"
|
||||
cyan = "#81C8BE"
|
||||
white = "#B5BFE2"
|
||||
|
||||
[[colors.indexed_colors]]
|
||||
index = 16
|
||||
color = "#EF9F76"
|
||||
|
||||
[[colors.indexed_colors]]
|
||||
index = 17
|
||||
color = "#F2D5CF"
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
[colors.primary]
|
||||
background = "#EFF1F5"
|
||||
foreground = "#4C4F69"
|
||||
dim_foreground = "#4C4F69"
|
||||
bright_foreground = "#4C4F69"
|
||||
|
||||
[colors.cursor]
|
||||
text = "#EFF1F5"
|
||||
cursor = "#DC8A78"
|
||||
|
||||
[colors.vi_mode_cursor]
|
||||
text = "#EFF1F5"
|
||||
cursor = "#7287FD"
|
||||
|
||||
[colors.search.matches]
|
||||
foreground = "#EFF1F5"
|
||||
background = "#6C6F85"
|
||||
|
||||
[colors.search.focused_match]
|
||||
foreground = "#EFF1F5"
|
||||
background = "#40A02B"
|
||||
|
||||
[colors.footer_bar]
|
||||
foreground = "#EFF1F5"
|
||||
background = "#6C6F85"
|
||||
|
||||
[colors.hints.start]
|
||||
foreground = "#EFF1F5"
|
||||
background = "#DF8E1D"
|
||||
|
||||
[colors.hints.end]
|
||||
foreground = "#EFF1F5"
|
||||
background = "#6C6F85"
|
||||
|
||||
[colors.selection]
|
||||
text = "#EFF1F5"
|
||||
background = "#DC8A78"
|
||||
|
||||
[colors.normal]
|
||||
black = "#5C5F77"
|
||||
red = "#D20F39"
|
||||
green = "#40A02B"
|
||||
yellow = "#DF8E1D"
|
||||
blue = "#1E66F5"
|
||||
magenta = "#EA76CB"
|
||||
cyan = "#179299"
|
||||
white = "#ACB0BE"
|
||||
|
||||
[colors.bright]
|
||||
black = "#6C6F85"
|
||||
red = "#D20F39"
|
||||
green = "#40A02B"
|
||||
yellow = "#DF8E1D"
|
||||
blue = "#1E66F5"
|
||||
magenta = "#EA76CB"
|
||||
cyan = "#179299"
|
||||
white = "#BCC0CC"
|
||||
|
||||
[colors.dim]
|
||||
black = "#5C5F77"
|
||||
red = "#D20F39"
|
||||
green = "#40A02B"
|
||||
yellow = "#DF8E1D"
|
||||
blue = "#1E66F5"
|
||||
magenta = "#EA76CB"
|
||||
cyan = "#179299"
|
||||
white = "#ACB0BE"
|
||||
|
||||
[[colors.indexed_colors]]
|
||||
index = 16
|
||||
color = "#FE640B"
|
||||
|
||||
[[colors.indexed_colors]]
|
||||
index = 17
|
||||
color = "#DC8A78"
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
[colors.primary]
|
||||
background = "#24273A"
|
||||
foreground = "#CAD3F5"
|
||||
dim_foreground = "#CAD3F5"
|
||||
bright_foreground = "#CAD3F5"
|
||||
|
||||
[colors.cursor]
|
||||
text = "#24273A"
|
||||
cursor = "#F4DBD6"
|
||||
|
||||
[colors.vi_mode_cursor]
|
||||
text = "#24273A"
|
||||
cursor = "#B7BDF8"
|
||||
|
||||
[colors.search.matches]
|
||||
foreground = "#24273A"
|
||||
background = "#A5ADCB"
|
||||
|
||||
[colors.search.focused_match]
|
||||
foreground = "#24273A"
|
||||
background = "#A6DA95"
|
||||
|
||||
[colors.footer_bar]
|
||||
foreground = "#24273A"
|
||||
background = "#A5ADCB"
|
||||
|
||||
[colors.hints.start]
|
||||
foreground = "#24273A"
|
||||
background = "#EED49F"
|
||||
|
||||
[colors.hints.end]
|
||||
foreground = "#24273A"
|
||||
background = "#A5ADCB"
|
||||
|
||||
[colors.selection]
|
||||
text = "#24273A"
|
||||
background = "#F4DBD6"
|
||||
|
||||
[colors.normal]
|
||||
black = "#494D64"
|
||||
red = "#ED8796"
|
||||
green = "#A6DA95"
|
||||
yellow = "#EED49F"
|
||||
blue = "#8AADF4"
|
||||
magenta = "#F5BDE6"
|
||||
cyan = "#8BD5CA"
|
||||
white = "#B8C0E0"
|
||||
|
||||
[colors.bright]
|
||||
black = "#5B6078"
|
||||
red = "#ED8796"
|
||||
green = "#A6DA95"
|
||||
yellow = "#EED49F"
|
||||
blue = "#8AADF4"
|
||||
magenta = "#F5BDE6"
|
||||
cyan = "#8BD5CA"
|
||||
white = "#A5ADCB"
|
||||
|
||||
[colors.dim]
|
||||
black = "#494D64"
|
||||
red = "#ED8796"
|
||||
green = "#A6DA95"
|
||||
yellow = "#EED49F"
|
||||
blue = "#8AADF4"
|
||||
magenta = "#F5BDE6"
|
||||
cyan = "#8BD5CA"
|
||||
white = "#B8C0E0"
|
||||
|
||||
[[colors.indexed_colors]]
|
||||
index = 16
|
||||
color = "#F5A97F"
|
||||
|
||||
[[colors.indexed_colors]]
|
||||
index = 17
|
||||
color = "#F4DBD6"
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
[colors.primary]
|
||||
background = "#1E1E2E"
|
||||
foreground = "#CDD6F4"
|
||||
dim_foreground = "#CDD6F4"
|
||||
bright_foreground = "#CDD6F4"
|
||||
|
||||
[colors.cursor]
|
||||
text = "#1E1E2E"
|
||||
cursor = "#F5E0DC"
|
||||
|
||||
[colors.vi_mode_cursor]
|
||||
text = "#1E1E2E"
|
||||
cursor = "#B4BEFE"
|
||||
|
||||
[colors.search.matches]
|
||||
foreground = "#1E1E2E"
|
||||
background = "#A6ADC8"
|
||||
|
||||
[colors.search.focused_match]
|
||||
foreground = "#1E1E2E"
|
||||
background = "#A6E3A1"
|
||||
|
||||
[colors.footer_bar]
|
||||
foreground = "#1E1E2E"
|
||||
background = "#A6ADC8"
|
||||
|
||||
[colors.hints.start]
|
||||
foreground = "#1E1E2E"
|
||||
background = "#F9E2AF"
|
||||
|
||||
[colors.hints.end]
|
||||
foreground = "#1E1E2E"
|
||||
background = "#A6ADC8"
|
||||
|
||||
[colors.selection]
|
||||
text = "#1E1E2E"
|
||||
background = "#F5E0DC"
|
||||
|
||||
[colors.normal]
|
||||
black = "#45475A"
|
||||
red = "#F38BA8"
|
||||
green = "#A6E3A1"
|
||||
yellow = "#F9E2AF"
|
||||
blue = "#89B4FA"
|
||||
magenta = "#F5C2E7"
|
||||
cyan = "#94E2D5"
|
||||
white = "#BAC2DE"
|
||||
|
||||
[colors.bright]
|
||||
black = "#585B70"
|
||||
red = "#F38BA8"
|
||||
green = "#A6E3A1"
|
||||
yellow = "#F9E2AF"
|
||||
blue = "#89B4FA"
|
||||
magenta = "#F5C2E7"
|
||||
cyan = "#94E2D5"
|
||||
white = "#A6ADC8"
|
||||
|
||||
[colors.dim]
|
||||
black = "#45475A"
|
||||
red = "#F38BA8"
|
||||
green = "#A6E3A1"
|
||||
yellow = "#F9E2AF"
|
||||
blue = "#89B4FA"
|
||||
magenta = "#F5C2E7"
|
||||
cyan = "#94E2D5"
|
||||
white = "#BAC2DE"
|
||||
|
||||
[[colors.indexed_colors]]
|
||||
index = 16
|
||||
color = "#FAB387"
|
||||
|
||||
[[colors.indexed_colors]]
|
||||
index = 17
|
||||
color = "#F5E0DC"
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_size = 2
|
||||
indent_style = space
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
# go
|
||||
[*.go]
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
# python
|
||||
[*.{ini,py,py.tpl,rst}]
|
||||
indent_size = 4
|
||||
|
||||
# rust
|
||||
[*.rs]
|
||||
indent_size = 4
|
||||
|
||||
# documentation, utils
|
||||
[*.{md,mdx,diff}]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
# windows shell scripts
|
||||
[*.{cmd,bat,ps1}]
|
||||
end_of_line = crlf
|
||||
1
chezmoi/dot_config/alacritty/themes/catppuccin/dot_git
Normal file
1
chezmoi/dot_config/alacritty/themes/catppuccin/dot_git
Normal file
|
|
@ -0,0 +1 @@
|
|||
gitdir: ../../../../.git/modules/config/alacritty/themes/catppuccin
|
||||
41
chezmoi/dot_config/alacritty/themes/rose-pine/dist/rose-pine-dawn.yml
vendored
Normal file
41
chezmoi/dot_config/alacritty/themes/rose-pine/dist/rose-pine-dawn.yml
vendored
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
colors:
|
||||
primary:
|
||||
background: "0xfaf4ed"
|
||||
foreground: "0x575279"
|
||||
cursor:
|
||||
text: "0x575279"
|
||||
cursor: "0xcecacd"
|
||||
vi_mode_cursor:
|
||||
text: "0x575279"
|
||||
cursor: "0xcecacd"
|
||||
line_indicator:
|
||||
foreground: None
|
||||
background: None
|
||||
selection:
|
||||
text: "0x575279"
|
||||
background: "0xdfdad9"
|
||||
normal:
|
||||
black: "0xf2e9e1"
|
||||
red: "0xb4637a"
|
||||
green: "0x286983"
|
||||
yellow: "0xea9d34"
|
||||
blue: "0x56949f"
|
||||
magenta: "0x907aa9"
|
||||
cyan: "0xd7827e"
|
||||
white: "0x575279"
|
||||
bright:
|
||||
black: "0x9893a5"
|
||||
red: "0xb4637a"
|
||||
green: "0x286983"
|
||||
yellow: "0xea9d34"
|
||||
blue: "0x56949f"
|
||||
magenta: "0x907aa9"
|
||||
cyan: "0xd7827e"
|
||||
white: "0x575279"
|
||||
hints:
|
||||
start:
|
||||
foreground: "#797593"
|
||||
background: "#fffaf3"
|
||||
end:
|
||||
foreground: "#9893a5"
|
||||
background: "#fffaf3"
|
||||
41
chezmoi/dot_config/alacritty/themes/rose-pine/dist/rose-pine-moon.yml
vendored
Normal file
41
chezmoi/dot_config/alacritty/themes/rose-pine/dist/rose-pine-moon.yml
vendored
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
colors:
|
||||
primary:
|
||||
background: "0x232136"
|
||||
foreground: "0xe0def4"
|
||||
cursor:
|
||||
text: "0xe0def4"
|
||||
cursor: "0x56526e"
|
||||
vi_mode_cursor:
|
||||
text: "0xe0def4"
|
||||
cursor: "0x56526e"
|
||||
line_indicator:
|
||||
foreground: None
|
||||
background: None
|
||||
selection:
|
||||
text: "0xe0def4"
|
||||
background: "0x44415a"
|
||||
normal:
|
||||
black: "0x393552"
|
||||
red: "0xeb6f92"
|
||||
green: "0x3e8fb0"
|
||||
yellow: "0xf6c177"
|
||||
blue: "0x9ccfd8"
|
||||
magenta: "0xc4a7e7"
|
||||
cyan: "0xea9a97"
|
||||
white: "0xe0def4"
|
||||
bright:
|
||||
black: "0x6e6a86"
|
||||
red: "0xeb6f92"
|
||||
green: "0x3e8fb0"
|
||||
yellow: "0xf6c177"
|
||||
blue: "0x9ccfd8"
|
||||
magenta: "0xc4a7e7"
|
||||
cyan: "0xea9a97"
|
||||
white: "0xe0def4"
|
||||
hints:
|
||||
start:
|
||||
foreground: "#908caa"
|
||||
background: "#2a273f"
|
||||
end:
|
||||
foreground: "#6e6a86"
|
||||
background: "#2a273f"
|
||||
41
chezmoi/dot_config/alacritty/themes/rose-pine/dist/rose-pine.yml
vendored
Normal file
41
chezmoi/dot_config/alacritty/themes/rose-pine/dist/rose-pine.yml
vendored
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
colors:
|
||||
primary:
|
||||
background: "0x191724"
|
||||
foreground: "0xe0def4"
|
||||
cursor:
|
||||
text: "0xe0def4"
|
||||
cursor: "0x524f67"
|
||||
vi_mode_cursor:
|
||||
text: "0xe0def4"
|
||||
cursor: "0x524f67"
|
||||
line_indicator:
|
||||
foreground: None
|
||||
background: None
|
||||
selection:
|
||||
text: "0xe0def4"
|
||||
background: "0x403d52"
|
||||
normal:
|
||||
black: "0x26233a"
|
||||
red: "0xeb6f92"
|
||||
green: "0x31748f"
|
||||
yellow: "0xf6c177"
|
||||
blue: "0x9ccfd8"
|
||||
magenta: "0xc4a7e7"
|
||||
cyan: "0xebbcba"
|
||||
white: "0xe0def4"
|
||||
bright:
|
||||
black: "0x6e6a86"
|
||||
red: "0xeb6f92"
|
||||
green: "0x31748f"
|
||||
yellow: "0xf6c177"
|
||||
blue: "0x9ccfd8"
|
||||
magenta: "0xc4a7e7"
|
||||
cyan: "0xebbcba"
|
||||
white: "0xe0def4"
|
||||
hints:
|
||||
start:
|
||||
foreground: "#908caa"
|
||||
background: "#1f1d2e"
|
||||
end:
|
||||
foreground: "#6e6a86"
|
||||
background: "#1f1d2e"
|
||||
1
chezmoi/dot_config/alacritty/themes/rose-pine/dot_git
Normal file
1
chezmoi/dot_config/alacritty/themes/rose-pine/dot_git
Normal file
|
|
@ -0,0 +1 @@
|
|||
gitdir: ../../../../.git/modules/config/alacritty/themes/rose-pine
|
||||
55
chezmoi/dot_config/alacritty/themes/rose-pine/readme.md
Normal file
55
chezmoi/dot_config/alacritty/themes/rose-pine/readme.md
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
<p align="center">
|
||||
<img src="https://github.com/rose-pine/rose-pine-theme/raw/main/assets/icon.png" width="80" />
|
||||
<h2 align="center">Rosé Pine for Alacritty</h2>
|
||||
</p>
|
||||
|
||||
<p align="center">All natural pine, faux fur and a bit of soho vibes for the classy minimalist</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/rose-pine/rose-pine-theme">
|
||||
<img src="https://img.shields.io/badge/community-rosé%20pine-26233a?labelColor=191724&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjUwIiBoZWlnaHQ9IjIzNyIgdmlld0JveD0iMCAwIDI1MCAyMzciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xNjEuMjI3IDE2MS4yNTFDMTMyLjE1NCAxNjkuMDQxIDExNC45MDEgMTk4LjkyNCAxMjIuNjkxIDIyNy45OTdDMTIzLjkyNSAyMzIuNjAzIDEyOC42NTkgMjM1LjMzNiAxMzMuMjY0IDIzNC4xMDJMMTg1LjkwNyAyMTkuOTk2QzIxOS41ODUgMjEwLjk3MiAyMzkuNTcgMTc2LjM1NCAyMzAuNTQ2IDE0Mi42NzdMMTYxLjIyNyAxNjEuMjUxWiIgZmlsbD0iIzI0NjI3QiIvPgo8cGF0aCBkPSJNODguMTgzNiAxNTkuOTg4QzExNy4yNTcgMTY3Ljc3OCAxMzQuNTEgMTk3LjY2MiAxMjYuNzIgMjI2LjczNUMxMjUuNDg2IDIzMS4zNCAxMjAuNzUyIDIzNC4wNzMgMTE2LjE0NyAyMzIuODM5TDYzLjUwNDEgMjE4LjczM0MyOS44MjY0IDIwOS43MSA5Ljg0MDk0IDE3NS4wOTIgMTguODY0OSAxNDEuNDE0TDg4LjE4MzYgMTU5Ljk4OFoiIGZpbGw9IiMyNDYyN0IiLz4KPHBhdGggZD0iTTE4Ni44NjcgMTcyLjk4QzE1Mi4wMDIgMTcyLjk4IDEyMy43MzcgMjAxLjI0NSAxMjMuNzM3IDIzNi4xMTFIMTg2Ljg3QzIyMS43MzYgMjM2LjExMSAyNTAgMjA3Ljg0NiAyNTAgMTcyLjk4TDE4Ni44NjcgMTcyLjk4WiIgZmlsbD0iIzMxNzQ4RiIvPgo8cGF0aCBkPSJNNjMuMTMyNyAxNzIuOThDOTcuOTk4NCAxNzIuOTggMTI2LjI2MyAyMDEuMjQ1IDEyNi4yNjMgMjM2LjExMUg2My4xM0MyOC4yNjQyIDIzNi4xMTEgLTEuNTI0MDNlLTA2IDIwNy44NDYgMCAxNzIuOThMNjMuMTMyNyAxNzIuOThaIiBmaWxsPSIjMzE3NDhGIi8+CjxwYXRoIGQ9Ik0xNzEuNzE3IDc1LjEyNjNDMTcxLjcxNyAxMDEuMjc2IDE1MC41MTggMTIyLjQ3NSAxMjQuMzY5IDEyMi40NzVDOTguMjE4OCAxMjIuNDc1IDc3LjAyMDIgMTAxLjI3NiA3Ny4wMjAyIDc1LjEyNjNDNzcuMDIwMiA0OC45NzY0IDk4LjIxODggMjcuNzc3OCAxMjQuMzY5IDI3Ljc3NzhDMTUwLjUxOCAyNy43Nzc4IDE3MS43MTcgNDguOTc2NCAxNzEuNzE3IDc1LjEyNjNaIiBmaWxsPSIjRUJCQ0JBIi8+CjxwYXRoIGQ9Ik0xNDQuMjE3IDg2LjIzNzlDMTYxLjY0OSA1Ni4wNDMyIDE1MS4zMDMgMTcuNDMyOSAxMjEuMTA4IDBMMTA2LjA2IDI2LjA2NDRDODguNjI3IDU2LjI1OSA5OC45NzM2IDk0Ljg2OTQgMTI5LjE2OCAxMTIuMzAyTDE0NC4yMTcgODYuMjM3OVoiIGZpbGw9IiNFQkJDQkEiLz4KPHBhdGggZD0iTTEyNS4yOTkgNjAuOTc4OUMxMTYuMjc1IDI3LjMwMTIgODEuNjU3NSA3LjMxNTY3IDQ3Ljk3OTcgMTYuMzM5Nkw2NC4zMTk3IDc3LjMyMTFDNzMuMzQzNiAxMTAuOTk5IDEwNy45NjEgMTMwLjk4NCAxNDEuNjM5IDEyMS45NkwxMjUuMjk5IDYwLjk3ODlaIiBmaWxsPSIjRUJCQ0JBIi8+CjxwYXRoIGQ9Ik0xMjQuOTI2IDYwLjk3ODlDMTMzLjk1IDI3LjMwMTIgMTY4LjU2NyA3LjMxNTY3IDIwMi4yNDUgMTYuMzM5NkwxODUuOTA1IDc3LjMyMTFDMTc2Ljg4MSAxMTAuOTk5IDE0Mi4yNjMgMTMwLjk4NCAxMDguNTg2IDEyMS45NkwxMjQuOTI2IDYwLjk3ODlaIiBmaWxsPSIjRUJCQ0JBIi8+Cjwvc3ZnPgo=&style=for-the-badge" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
## Usage
|
||||
|
||||
Import the desired theme into Alacritty's config:
|
||||
|
||||
- `~/.config/alacritty/alacritty.yml` on Linux/macOS
|
||||
- `%appdata%\alacritty\alacritty.yml` on Windows
|
||||
|
||||
```yaml
|
||||
import:
|
||||
- /path/to/rose-pine.yml
|
||||
```
|
||||
|
||||
## Gallery
|
||||
|
||||
Fetch featured below is [NerdFetch](https://github.com/thatonecalculator/nerdfetch)
|
||||
|
||||
**Rosé Pine**
|
||||
|
||||

|
||||
|
||||
**Rosé Pine Moon**
|
||||
|
||||

|
||||
|
||||
**Rosé Pine Dawn**
|
||||
|
||||

|
||||
|
||||
## Thanks to
|
||||
|
||||
- [ThatOneCalculator](https://github.com/thatonecalculator)
|
||||
- [Dolichomps](https://github.com/Dolichomps)
|
||||
|
||||
## Contributing
|
||||
|
||||
Modify `template.yml` using Rosé Pine variables, then build variants:
|
||||
|
||||
```sh
|
||||
npx @rose-pine/build@latest -f hex-ns -t template.yml
|
||||
```
|
||||
|
||||
_Generated by @rose-pine/build@0.3.0_
|
||||
41
chezmoi/dot_config/alacritty/themes/rose-pine/template.yml
Normal file
41
chezmoi/dot_config/alacritty/themes/rose-pine/template.yml
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
colors:
|
||||
primary:
|
||||
background: "0x$base"
|
||||
foreground: "0x$text"
|
||||
cursor:
|
||||
text: "0x$text"
|
||||
cursor: "0x$highlightHigh"
|
||||
vi_mode_cursor:
|
||||
text: "0x$text"
|
||||
cursor: "0x$highlightHigh"
|
||||
line_indicator:
|
||||
foreground: None
|
||||
background: None
|
||||
selection:
|
||||
text: "0x$text"
|
||||
background: "0x$highlightMed"
|
||||
normal:
|
||||
black: "0x$overlay"
|
||||
red: "0x$love"
|
||||
green: "0x$pine"
|
||||
yellow: "0x$gold"
|
||||
blue: "0x$foam"
|
||||
magenta: "0x$iris"
|
||||
cyan: "0x$rose"
|
||||
white: "0x$text"
|
||||
bright:
|
||||
black: "0x$muted"
|
||||
red: "0x$love"
|
||||
green: "0x$pine"
|
||||
yellow: "0x$gold"
|
||||
blue: "0x$foam"
|
||||
magenta: "0x$iris"
|
||||
cyan: "0x$rose"
|
||||
white: "0x$text"
|
||||
hints:
|
||||
start:
|
||||
foreground: "#$subtle"
|
||||
background: "#$surface"
|
||||
end:
|
||||
foreground: "#$muted"
|
||||
background: "#$surface"
|
||||
27
chezmoi/dot_config/bat/config
Normal file
27
chezmoi/dot_config/bat/config
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
# This is `bat`s configuration file. Each line either contains a comment or
|
||||
# a command-line option that you want to pass to `bat` by default. You can
|
||||
# run `bat --help` to get a list of all possible configuration options.
|
||||
|
||||
# Specify desired highlighting theme (e.g. "TwoDark"). Run `bat --list-themes`
|
||||
# for a list of all available themes
|
||||
--theme="Catppuccin-mocha"
|
||||
|
||||
--style="changes,numbers"
|
||||
|
||||
# Enable this to use italic text on the terminal. This is not supported on all
|
||||
# terminal emulators (like tmux, by default):
|
||||
#--italic-text=always
|
||||
|
||||
# Uncomment the following line to disable automatic paging:
|
||||
#--paging=never
|
||||
|
||||
# Uncomment the following line if you are using less version >= 551 and want to
|
||||
# enable mouse scrolling support in `bat` when running inside tmux. This might
|
||||
# disable text selection, unless you press shift.
|
||||
#--pager="less --RAW-CONTROL-CHARS --quit-if-one-screen --mouse"
|
||||
|
||||
# Syntax mappings: map a certain filename pattern to a language.
|
||||
# Example 1: use the C++ syntax for Arduino .ino files
|
||||
# Example 2: Use ".gitignore"-style highlighting for ".ignore" files
|
||||
#--map-syntax "*.ino:C++"
|
||||
#--map-syntax ".ignore:Git Ignore"
|
||||
959
chezmoi/dot_config/bat/themes/Catppuccin-frappe.tmTheme
Normal file
959
chezmoi/dot_config/bat/themes/Catppuccin-frappe.tmTheme
Normal file
|
|
@ -0,0 +1,959 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Catppuccin</string>
|
||||
<key>settings</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#c6d0f5</string>
|
||||
<key>background</key>
|
||||
<string>#303446</string>
|
||||
<key>caret</key>
|
||||
<string>#b5bfe2</string>
|
||||
<key>invisibles</key>
|
||||
<string>#a5adce</string>
|
||||
<key>gutterForeground</key>
|
||||
<string>#949cbb</string>
|
||||
<key>gutterForegroundHighlight</key>
|
||||
<string>#a6d189</string>
|
||||
<key>lineHighlight</key>
|
||||
<string>#626880</string>
|
||||
<key>selection</key>
|
||||
<string>#737994</string>
|
||||
<key>selectionBorder</key>
|
||||
<string>#303446</string>
|
||||
<key>activeGuide</key>
|
||||
<string>#ef9f76</string>
|
||||
<key>findHighlightForeground</key>
|
||||
<string>#292c3c</string>
|
||||
<key>findHighlight</key>
|
||||
<string>#e5c890</string>
|
||||
<key>bracketsForeground</key>
|
||||
<string>#949cbb</string>
|
||||
<key>bracketContentsForeground</key>
|
||||
<string>#949cbb</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Comment</string>
|
||||
<key>scope</key>
|
||||
<string>comment</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#737994</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>String</string>
|
||||
<key>scope</key>
|
||||
<string>string</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#a6d189</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>String regex</string>
|
||||
<key>scope</key>
|
||||
<string>string.regexp</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ef9f76</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Number</string>
|
||||
<key>scope</key>
|
||||
<string>constant.numeric</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ef9f76</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Boolean</string>
|
||||
<key>scope</key>
|
||||
<string>constant.language.boolean</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ef9f76</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Built-in constant</string>
|
||||
<key>scope</key>
|
||||
<string>constant.language</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#babbf1</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Built-in function</string>
|
||||
<key>scope</key>
|
||||
<string>support.function.builtin</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ef9f76</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>User-defined constant</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.constant</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ef9f76</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable</string>
|
||||
<key>scope</key>
|
||||
<string>variable</string>
|
||||
<key>settings</key>
|
||||
<dict></dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Keyword</string>
|
||||
<key>scope</key>
|
||||
<string>keyword</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e78284</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Conditional/loop</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.loop, keyword.control.conditional, keyword.control.c++</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ca9ee6</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Return</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.return, keyword.control.flow.return</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f4b8e4</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Exception</string>
|
||||
<key>scope</key>
|
||||
<string>support.type.exception</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ef9f76</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Operator</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.operator, punctuation.accessor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#99d1db</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation separator</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.separator</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#81c8be</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation terminator</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.terminator</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#81c8be</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation bracket</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.section</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#949cbb</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Include</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.import.include</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#81c8be</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage</string>
|
||||
<key>scope</key>
|
||||
<string>storage</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e78284</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type</string>
|
||||
<key>scope</key>
|
||||
<string>storage.type</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e5c890</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage modifier</string>
|
||||
<key>scope</key>
|
||||
<string>storage.modifier</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e78284</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type namespace</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.namespace, meta.path</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f2d5cf</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type class</string>
|
||||
<key>scope</key>
|
||||
<string>storage.type.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f2d5cf</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Label</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.label</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8caaee</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Keyword class</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.declaration.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e78284</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Class name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.class, meta.toc-list.full-identifier</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#99d1db</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Inherited class</string>
|
||||
<key>scope</key>
|
||||
<string>entity.other.inherited-class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#99d1db</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function, variable.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8caaee</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function macro</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function.preprocessor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e78284</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Macro directive - ifdef</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.import</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e78284</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Constructor</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function.constructor, entity.name.function.destructor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#babbf1</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function argument</string>
|
||||
<key>scope</key>
|
||||
<string>variable.parameter.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f2d5cf</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function declaration</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.declaration.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ea999c</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library function</string>
|
||||
<key>scope</key>
|
||||
<string>support.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#99d1db</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library constant</string>
|
||||
<key>scope</key>
|
||||
<string>support.constant</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8caaee</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library class/type</string>
|
||||
<key>scope</key>
|
||||
<string>support.type, support.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8caaee</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library variable</string>
|
||||
<key>scope</key>
|
||||
<string>support.other.variable</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable function</string>
|
||||
<key>scope</key>
|
||||
<string>variable.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8caaee</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable parameter</string>
|
||||
<key>scope</key>
|
||||
<string>variable.parameter</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f2d5cf</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable other</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#c6d0f5</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable field</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.member</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f2d5cf</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable language</string>
|
||||
<key>scope</key>
|
||||
<string>variable.language</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#81c8be</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.tag</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ef9f76</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag attribute</string>
|
||||
<key>scope</key>
|
||||
<string>entity.other.attribute-name</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ca9ee6</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag delimiter</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.definition.tag</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ea999c</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown URL</string>
|
||||
<key>scope</key>
|
||||
<string>markup.underline.link.markdown</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f2d5cf</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic underline</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown reference</string>
|
||||
<key>scope</key>
|
||||
<string>meta.link.inline.description</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#babbf1</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown literal</string>
|
||||
<key>scope</key>
|
||||
<string>comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#81c8be</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown title</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.definition.heading, entity.name.section</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8caaee</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown emphasis</string>
|
||||
<key>scope</key>
|
||||
<string>markup.italic</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ea999c</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown strong</string>
|
||||
<key>scope</key>
|
||||
<string>markup.bold</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ea999c</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Escape</string>
|
||||
<key>scope</key>
|
||||
<string>constant.character.escape</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f4b8e4</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Bash built-in function</string>
|
||||
<key>scope</key>
|
||||
<string>source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f4b8e4</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Bash parameter</string>
|
||||
<key>scope</key>
|
||||
<string>variable.language.shell</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e78284</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Lua field</string>
|
||||
<key>scope</key>
|
||||
<string>source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#babbf1</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Lua constructor</string>
|
||||
<key>scope</key>
|
||||
<string>source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eebebe</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Java constant</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.constant.java</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#81c8be</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS property</string>
|
||||
<key>scope</key>
|
||||
<string>support.type.property-name.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eebebe</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS constant</string>
|
||||
<key>scope</key>
|
||||
<string>support.constant.property-value.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#c6d0f5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS suffix</string>
|
||||
<key>scope</key>
|
||||
<string>constant.numeric.suffix.css, keyword.other.unit.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#81c8be</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS variable property</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#81c8be</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>SCSS tag</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.tag.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#babbf1</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>SASS variable</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.sass</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#81c8be</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Invalid</string>
|
||||
<key>scope</key>
|
||||
<string>invalid</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#c6d0f5</string>
|
||||
<key>background</key>
|
||||
<string>#e78284</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Invalid deprecated</string>
|
||||
<key>scope</key>
|
||||
<string>invalid.deprecated</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#c6d0f5</string>
|
||||
<key>background</key>
|
||||
<string>#ca9ee6</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff header</string>
|
||||
<key>scope</key>
|
||||
<string>meta.diff, meta.diff.header</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#737994</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff deleted</string>
|
||||
<key>scope</key>
|
||||
<string>markup.deleted</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e78284</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff inserted</string>
|
||||
<key>scope</key>
|
||||
<string>markup.inserted</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#a6d189</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff changed</string>
|
||||
<key>scope</key>
|
||||
<string>markup.changed</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e5c890</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Message error</string>
|
||||
<key>scope</key>
|
||||
<string>message.error</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e78284</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
<key>uuid</key>
|
||||
<string>4d0379b5-ef82-467b-b8b8-365889420646</string>
|
||||
<key>colorSpaceName</key>
|
||||
<string>sRGB</string>
|
||||
<key>semanticClass</key>
|
||||
<string>theme.dark.Catppuccin</string>
|
||||
<key>author</key>
|
||||
<string>BrunDerSchwarzmagier</string>
|
||||
</dict>
|
||||
</plist>
|
||||
959
chezmoi/dot_config/bat/themes/Catppuccin-latte.tmTheme
Normal file
959
chezmoi/dot_config/bat/themes/Catppuccin-latte.tmTheme
Normal file
|
|
@ -0,0 +1,959 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Catppuccin</string>
|
||||
<key>settings</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#4c4f69</string>
|
||||
<key>background</key>
|
||||
<string>#eff1f5</string>
|
||||
<key>caret</key>
|
||||
<string>#5c5f77</string>
|
||||
<key>invisibles</key>
|
||||
<string>#6c6f85</string>
|
||||
<key>gutterForeground</key>
|
||||
<string>#7c7f93</string>
|
||||
<key>gutterForegroundHighlight</key>
|
||||
<string>#40a02b</string>
|
||||
<key>lineHighlight</key>
|
||||
<string>#acb0be</string>
|
||||
<key>selection</key>
|
||||
<string>#9ca0b0</string>
|
||||
<key>selectionBorder</key>
|
||||
<string>#eff1f5</string>
|
||||
<key>activeGuide</key>
|
||||
<string>#fe640b</string>
|
||||
<key>findHighlightForeground</key>
|
||||
<string>#e6e9ef</string>
|
||||
<key>findHighlight</key>
|
||||
<string>#df8e1d</string>
|
||||
<key>bracketsForeground</key>
|
||||
<string>#7c7f93</string>
|
||||
<key>bracketContentsForeground</key>
|
||||
<string>#7c7f93</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Comment</string>
|
||||
<key>scope</key>
|
||||
<string>comment</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#9ca0b0</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>String</string>
|
||||
<key>scope</key>
|
||||
<string>string</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#40a02b</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>String regex</string>
|
||||
<key>scope</key>
|
||||
<string>string.regexp</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fe640b</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Number</string>
|
||||
<key>scope</key>
|
||||
<string>constant.numeric</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fe640b</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Boolean</string>
|
||||
<key>scope</key>
|
||||
<string>constant.language.boolean</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fe640b</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Built-in constant</string>
|
||||
<key>scope</key>
|
||||
<string>constant.language</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#7287fd</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Built-in function</string>
|
||||
<key>scope</key>
|
||||
<string>support.function.builtin</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fe640b</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>User-defined constant</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.constant</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fe640b</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable</string>
|
||||
<key>scope</key>
|
||||
<string>variable</string>
|
||||
<key>settings</key>
|
||||
<dict></dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Keyword</string>
|
||||
<key>scope</key>
|
||||
<string>keyword</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#d20f39</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Conditional/loop</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.loop, keyword.control.conditional, keyword.control.c++</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8839ef</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Return</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.return, keyword.control.flow.return</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ea76cb</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Exception</string>
|
||||
<key>scope</key>
|
||||
<string>support.type.exception</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fe640b</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Operator</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.operator, punctuation.accessor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#04a5e5</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation separator</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.separator</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#179299</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation terminator</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.terminator</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#179299</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation bracket</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.section</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#7c7f93</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Include</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.import.include</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#179299</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage</string>
|
||||
<key>scope</key>
|
||||
<string>storage</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#d20f39</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type</string>
|
||||
<key>scope</key>
|
||||
<string>storage.type</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#df8e1d</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage modifier</string>
|
||||
<key>scope</key>
|
||||
<string>storage.modifier</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#d20f39</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type namespace</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.namespace, meta.path</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#dc8a78</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type class</string>
|
||||
<key>scope</key>
|
||||
<string>storage.type.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#dc8a78</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Label</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.label</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#1e66f5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Keyword class</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.declaration.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#d20f39</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Class name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.class, meta.toc-list.full-identifier</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#04a5e5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Inherited class</string>
|
||||
<key>scope</key>
|
||||
<string>entity.other.inherited-class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#04a5e5</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function, variable.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#1e66f5</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function macro</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function.preprocessor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#d20f39</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Macro directive - ifdef</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.import</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#d20f39</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Constructor</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function.constructor, entity.name.function.destructor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#7287fd</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function argument</string>
|
||||
<key>scope</key>
|
||||
<string>variable.parameter.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#dc8a78</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function declaration</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.declaration.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e64553</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library function</string>
|
||||
<key>scope</key>
|
||||
<string>support.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#04a5e5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library constant</string>
|
||||
<key>scope</key>
|
||||
<string>support.constant</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#1e66f5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library class/type</string>
|
||||
<key>scope</key>
|
||||
<string>support.type, support.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#1e66f5</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library variable</string>
|
||||
<key>scope</key>
|
||||
<string>support.other.variable</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable function</string>
|
||||
<key>scope</key>
|
||||
<string>variable.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#1e66f5</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable parameter</string>
|
||||
<key>scope</key>
|
||||
<string>variable.parameter</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#dc8a78</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable other</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#4c4f69</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable field</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.member</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#dc8a78</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable language</string>
|
||||
<key>scope</key>
|
||||
<string>variable.language</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#179299</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.tag</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fe640b</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag attribute</string>
|
||||
<key>scope</key>
|
||||
<string>entity.other.attribute-name</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8839ef</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag delimiter</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.definition.tag</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e64553</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown URL</string>
|
||||
<key>scope</key>
|
||||
<string>markup.underline.link.markdown</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#dc8a78</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic underline</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown reference</string>
|
||||
<key>scope</key>
|
||||
<string>meta.link.inline.description</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#7287fd</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown literal</string>
|
||||
<key>scope</key>
|
||||
<string>comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#179299</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown title</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.definition.heading, entity.name.section</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#1e66f5</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown emphasis</string>
|
||||
<key>scope</key>
|
||||
<string>markup.italic</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e64553</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown strong</string>
|
||||
<key>scope</key>
|
||||
<string>markup.bold</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#e64553</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Escape</string>
|
||||
<key>scope</key>
|
||||
<string>constant.character.escape</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ea76cb</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Bash built-in function</string>
|
||||
<key>scope</key>
|
||||
<string>source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ea76cb</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Bash parameter</string>
|
||||
<key>scope</key>
|
||||
<string>variable.language.shell</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#d20f39</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Lua field</string>
|
||||
<key>scope</key>
|
||||
<string>source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#7287fd</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Lua constructor</string>
|
||||
<key>scope</key>
|
||||
<string>source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#dd7878</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Java constant</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.constant.java</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#179299</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS property</string>
|
||||
<key>scope</key>
|
||||
<string>support.type.property-name.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#dd7878</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS constant</string>
|
||||
<key>scope</key>
|
||||
<string>support.constant.property-value.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#4c4f69</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS suffix</string>
|
||||
<key>scope</key>
|
||||
<string>constant.numeric.suffix.css, keyword.other.unit.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#179299</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS variable property</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#179299</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>SCSS tag</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.tag.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#7287fd</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>SASS variable</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.sass</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#179299</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Invalid</string>
|
||||
<key>scope</key>
|
||||
<string>invalid</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#4c4f69</string>
|
||||
<key>background</key>
|
||||
<string>#d20f39</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Invalid deprecated</string>
|
||||
<key>scope</key>
|
||||
<string>invalid.deprecated</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#4c4f69</string>
|
||||
<key>background</key>
|
||||
<string>#8839ef</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff header</string>
|
||||
<key>scope</key>
|
||||
<string>meta.diff, meta.diff.header</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#9ca0b0</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff deleted</string>
|
||||
<key>scope</key>
|
||||
<string>markup.deleted</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#d20f39</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff inserted</string>
|
||||
<key>scope</key>
|
||||
<string>markup.inserted</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#40a02b</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff changed</string>
|
||||
<key>scope</key>
|
||||
<string>markup.changed</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#df8e1d</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Message error</string>
|
||||
<key>scope</key>
|
||||
<string>message.error</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#d20f39</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
<key>uuid</key>
|
||||
<string>4d0379b5-ef82-467b-b8b8-365889420646</string>
|
||||
<key>colorSpaceName</key>
|
||||
<string>sRGB</string>
|
||||
<key>semanticClass</key>
|
||||
<string>theme.dark.Catppuccin</string>
|
||||
<key>author</key>
|
||||
<string>BrunDerSchwarzmagier</string>
|
||||
</dict>
|
||||
</plist>
|
||||
959
chezmoi/dot_config/bat/themes/Catppuccin-macchiato.tmTheme
Normal file
959
chezmoi/dot_config/bat/themes/Catppuccin-macchiato.tmTheme
Normal file
|
|
@ -0,0 +1,959 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Catppuccin</string>
|
||||
<key>settings</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cad3f5</string>
|
||||
<key>background</key>
|
||||
<string>#24273a</string>
|
||||
<key>caret</key>
|
||||
<string>#b8c0e0</string>
|
||||
<key>invisibles</key>
|
||||
<string>#a5adcb</string>
|
||||
<key>gutterForeground</key>
|
||||
<string>#939ab7</string>
|
||||
<key>gutterForegroundHighlight</key>
|
||||
<string>#a6da95</string>
|
||||
<key>lineHighlight</key>
|
||||
<string>#5b6078</string>
|
||||
<key>selection</key>
|
||||
<string>#6e738d</string>
|
||||
<key>selectionBorder</key>
|
||||
<string>#24273a</string>
|
||||
<key>activeGuide</key>
|
||||
<string>#f5a97f</string>
|
||||
<key>findHighlightForeground</key>
|
||||
<string>#1e2030</string>
|
||||
<key>findHighlight</key>
|
||||
<string>#eed49f</string>
|
||||
<key>bracketsForeground</key>
|
||||
<string>#939ab7</string>
|
||||
<key>bracketContentsForeground</key>
|
||||
<string>#939ab7</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Comment</string>
|
||||
<key>scope</key>
|
||||
<string>comment</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#6e738d</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>String</string>
|
||||
<key>scope</key>
|
||||
<string>string</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#a6da95</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>String regex</string>
|
||||
<key>scope</key>
|
||||
<string>string.regexp</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5a97f</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Number</string>
|
||||
<key>scope</key>
|
||||
<string>constant.numeric</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5a97f</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Boolean</string>
|
||||
<key>scope</key>
|
||||
<string>constant.language.boolean</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5a97f</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Built-in constant</string>
|
||||
<key>scope</key>
|
||||
<string>constant.language</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#b7bdf8</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Built-in function</string>
|
||||
<key>scope</key>
|
||||
<string>support.function.builtin</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5a97f</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>User-defined constant</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.constant</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5a97f</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable</string>
|
||||
<key>scope</key>
|
||||
<string>variable</string>
|
||||
<key>settings</key>
|
||||
<dict></dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Keyword</string>
|
||||
<key>scope</key>
|
||||
<string>keyword</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ed8796</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Conditional/loop</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.loop, keyword.control.conditional, keyword.control.c++</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#c6a0f6</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Return</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.return, keyword.control.flow.return</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5bde6</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Exception</string>
|
||||
<key>scope</key>
|
||||
<string>support.type.exception</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5a97f</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Operator</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.operator, punctuation.accessor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#91d7e3</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation separator</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.separator</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8bd5ca</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation terminator</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.terminator</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8bd5ca</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation bracket</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.section</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#939ab7</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Include</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.import.include</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8bd5ca</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage</string>
|
||||
<key>scope</key>
|
||||
<string>storage</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ed8796</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type</string>
|
||||
<key>scope</key>
|
||||
<string>storage.type</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eed49f</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage modifier</string>
|
||||
<key>scope</key>
|
||||
<string>storage.modifier</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ed8796</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type namespace</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.namespace, meta.path</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f4dbd6</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type class</string>
|
||||
<key>scope</key>
|
||||
<string>storage.type.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f4dbd6</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Label</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.label</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8aadf4</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Keyword class</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.declaration.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ed8796</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Class name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.class, meta.toc-list.full-identifier</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#91d7e3</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Inherited class</string>
|
||||
<key>scope</key>
|
||||
<string>entity.other.inherited-class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#91d7e3</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function, variable.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8aadf4</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function macro</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function.preprocessor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ed8796</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Macro directive - ifdef</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.import</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ed8796</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Constructor</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function.constructor, entity.name.function.destructor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#b7bdf8</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function argument</string>
|
||||
<key>scope</key>
|
||||
<string>variable.parameter.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f4dbd6</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function declaration</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.declaration.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ee99a0</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library function</string>
|
||||
<key>scope</key>
|
||||
<string>support.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#91d7e3</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library constant</string>
|
||||
<key>scope</key>
|
||||
<string>support.constant</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8aadf4</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library class/type</string>
|
||||
<key>scope</key>
|
||||
<string>support.type, support.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8aadf4</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library variable</string>
|
||||
<key>scope</key>
|
||||
<string>support.other.variable</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable function</string>
|
||||
<key>scope</key>
|
||||
<string>variable.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8aadf4</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable parameter</string>
|
||||
<key>scope</key>
|
||||
<string>variable.parameter</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f4dbd6</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable other</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cad3f5</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable field</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.member</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f4dbd6</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable language</string>
|
||||
<key>scope</key>
|
||||
<string>variable.language</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8bd5ca</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.tag</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5a97f</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag attribute</string>
|
||||
<key>scope</key>
|
||||
<string>entity.other.attribute-name</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#c6a0f6</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag delimiter</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.definition.tag</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ee99a0</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown URL</string>
|
||||
<key>scope</key>
|
||||
<string>markup.underline.link.markdown</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f4dbd6</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic underline</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown reference</string>
|
||||
<key>scope</key>
|
||||
<string>meta.link.inline.description</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#b7bdf8</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown literal</string>
|
||||
<key>scope</key>
|
||||
<string>comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8bd5ca</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown title</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.definition.heading, entity.name.section</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8aadf4</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown emphasis</string>
|
||||
<key>scope</key>
|
||||
<string>markup.italic</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ee99a0</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown strong</string>
|
||||
<key>scope</key>
|
||||
<string>markup.bold</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ee99a0</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Escape</string>
|
||||
<key>scope</key>
|
||||
<string>constant.character.escape</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5bde6</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Bash built-in function</string>
|
||||
<key>scope</key>
|
||||
<string>source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5bde6</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Bash parameter</string>
|
||||
<key>scope</key>
|
||||
<string>variable.language.shell</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ed8796</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Lua field</string>
|
||||
<key>scope</key>
|
||||
<string>source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#b7bdf8</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Lua constructor</string>
|
||||
<key>scope</key>
|
||||
<string>source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f0c6c6</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Java constant</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.constant.java</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8bd5ca</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS property</string>
|
||||
<key>scope</key>
|
||||
<string>support.type.property-name.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f0c6c6</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS constant</string>
|
||||
<key>scope</key>
|
||||
<string>support.constant.property-value.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cad3f5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS suffix</string>
|
||||
<key>scope</key>
|
||||
<string>constant.numeric.suffix.css, keyword.other.unit.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8bd5ca</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS variable property</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8bd5ca</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>SCSS tag</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.tag.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#b7bdf8</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>SASS variable</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.sass</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#8bd5ca</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Invalid</string>
|
||||
<key>scope</key>
|
||||
<string>invalid</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cad3f5</string>
|
||||
<key>background</key>
|
||||
<string>#ed8796</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Invalid deprecated</string>
|
||||
<key>scope</key>
|
||||
<string>invalid.deprecated</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cad3f5</string>
|
||||
<key>background</key>
|
||||
<string>#c6a0f6</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff header</string>
|
||||
<key>scope</key>
|
||||
<string>meta.diff, meta.diff.header</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#6e738d</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff deleted</string>
|
||||
<key>scope</key>
|
||||
<string>markup.deleted</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ed8796</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff inserted</string>
|
||||
<key>scope</key>
|
||||
<string>markup.inserted</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#a6da95</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff changed</string>
|
||||
<key>scope</key>
|
||||
<string>markup.changed</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eed49f</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Message error</string>
|
||||
<key>scope</key>
|
||||
<string>message.error</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ed8796</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
<key>uuid</key>
|
||||
<string>4d0379b5-ef82-467b-b8b8-365889420646</string>
|
||||
<key>colorSpaceName</key>
|
||||
<string>sRGB</string>
|
||||
<key>semanticClass</key>
|
||||
<string>theme.dark.Catppuccin</string>
|
||||
<key>author</key>
|
||||
<string>BrunDerSchwarzmagier</string>
|
||||
</dict>
|
||||
</plist>
|
||||
959
chezmoi/dot_config/bat/themes/Catppuccin-mocha.tmTheme
Normal file
959
chezmoi/dot_config/bat/themes/Catppuccin-mocha.tmTheme
Normal file
|
|
@ -0,0 +1,959 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Catppuccin</string>
|
||||
<key>settings</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cdd6f4</string>
|
||||
<key>background</key>
|
||||
<string>#1e1e2e</string>
|
||||
<key>caret</key>
|
||||
<string>#bac2de</string>
|
||||
<key>invisibles</key>
|
||||
<string>#a6adc8</string>
|
||||
<key>gutterForeground</key>
|
||||
<string>#9399b2</string>
|
||||
<key>gutterForegroundHighlight</key>
|
||||
<string>#a6e3a1</string>
|
||||
<key>lineHighlight</key>
|
||||
<string>#585b70</string>
|
||||
<key>selection</key>
|
||||
<string>#6c7086</string>
|
||||
<key>selectionBorder</key>
|
||||
<string>#1e1e2e</string>
|
||||
<key>activeGuide</key>
|
||||
<string>#fab387</string>
|
||||
<key>findHighlightForeground</key>
|
||||
<string>#181825</string>
|
||||
<key>findHighlight</key>
|
||||
<string>#f9e2af</string>
|
||||
<key>bracketsForeground</key>
|
||||
<string>#9399b2</string>
|
||||
<key>bracketContentsForeground</key>
|
||||
<string>#9399b2</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Comment</string>
|
||||
<key>scope</key>
|
||||
<string>comment</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#6c7086</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>String</string>
|
||||
<key>scope</key>
|
||||
<string>string</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#a6e3a1</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>String regex</string>
|
||||
<key>scope</key>
|
||||
<string>string.regexp</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fab387</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Number</string>
|
||||
<key>scope</key>
|
||||
<string>constant.numeric</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fab387</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Boolean</string>
|
||||
<key>scope</key>
|
||||
<string>constant.language.boolean</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fab387</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Built-in constant</string>
|
||||
<key>scope</key>
|
||||
<string>constant.language</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#b4befe</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Built-in function</string>
|
||||
<key>scope</key>
|
||||
<string>support.function.builtin</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fab387</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>User-defined constant</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.constant</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fab387</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable</string>
|
||||
<key>scope</key>
|
||||
<string>variable</string>
|
||||
<key>settings</key>
|
||||
<dict></dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Keyword</string>
|
||||
<key>scope</key>
|
||||
<string>keyword</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f38ba8</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Conditional/loop</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.loop, keyword.control.conditional, keyword.control.c++</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cba6f7</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Return</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.return, keyword.control.flow.return</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5c2e7</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Exception</string>
|
||||
<key>scope</key>
|
||||
<string>support.type.exception</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fab387</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Operator</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.operator, punctuation.accessor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#89dceb</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation separator</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.separator</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#94e2d5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation terminator</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.terminator</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#94e2d5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Punctuation bracket</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.section</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#9399b2</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Include</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.import.include</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#94e2d5</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage</string>
|
||||
<key>scope</key>
|
||||
<string>storage</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f38ba8</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type</string>
|
||||
<key>scope</key>
|
||||
<string>storage.type</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f9e2af</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage modifier</string>
|
||||
<key>scope</key>
|
||||
<string>storage.modifier</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f38ba8</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type namespace</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.namespace, meta.path</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5e0dc</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage type class</string>
|
||||
<key>scope</key>
|
||||
<string>storage.type.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5e0dc</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Label</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.label</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#89b4fa</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Keyword class</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.declaration.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f38ba8</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Class name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.class, meta.toc-list.full-identifier</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#89dceb</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Inherited class</string>
|
||||
<key>scope</key>
|
||||
<string>entity.other.inherited-class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#89dceb</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function, variable.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#89b4fa</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function macro</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function.preprocessor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f38ba8</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Macro directive - ifdef</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.control.import</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f38ba8</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Constructor</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function.constructor, entity.name.function.destructor</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#b4befe</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function argument</string>
|
||||
<key>scope</key>
|
||||
<string>variable.parameter.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5e0dc</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Function declaration</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.declaration.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eba0ac</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library function</string>
|
||||
<key>scope</key>
|
||||
<string>support.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#89dceb</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library constant</string>
|
||||
<key>scope</key>
|
||||
<string>support.constant</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#89b4fa</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library class/type</string>
|
||||
<key>scope</key>
|
||||
<string>support.type, support.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#89b4fa</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Library variable</string>
|
||||
<key>scope</key>
|
||||
<string>support.other.variable</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable function</string>
|
||||
<key>scope</key>
|
||||
<string>variable.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#89b4fa</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable parameter</string>
|
||||
<key>scope</key>
|
||||
<string>variable.parameter</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5e0dc</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable other</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cdd6f4</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable field</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.member</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5e0dc</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variable language</string>
|
||||
<key>scope</key>
|
||||
<string>variable.language</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#94e2d5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag name</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.tag</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#fab387</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag attribute</string>
|
||||
<key>scope</key>
|
||||
<string>entity.other.attribute-name</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cba6f7</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tag delimiter</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.definition.tag</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eba0ac</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown URL</string>
|
||||
<key>scope</key>
|
||||
<string>markup.underline.link.markdown</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5e0dc</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic underline</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown reference</string>
|
||||
<key>scope</key>
|
||||
<string>meta.link.inline.description</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#b4befe</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown literal</string>
|
||||
<key>scope</key>
|
||||
<string>comment.block.markdown, meta.code-fence, markup.raw.code-fence, markup.raw.inline</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#94e2d5</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown title</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.definition.heading, entity.name.section</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#89b4fa</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown emphasis</string>
|
||||
<key>scope</key>
|
||||
<string>markup.italic</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eba0ac</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Markdown strong</string>
|
||||
<key>scope</key>
|
||||
<string>markup.bold</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eba0ac</string>
|
||||
<key>fontStyle</key>
|
||||
<string>bold</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Escape</string>
|
||||
<key>scope</key>
|
||||
<string>constant.character.escape</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5c2e7</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Bash built-in function</string>
|
||||
<key>scope</key>
|
||||
<string>source.shell.bash meta.function.shell meta.compound.shell meta.function-call.identifier.shell</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f5c2e7</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Bash parameter</string>
|
||||
<key>scope</key>
|
||||
<string>variable.language.shell</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f38ba8</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Lua field</string>
|
||||
<key>scope</key>
|
||||
<string>source.lua meta.function.lua meta.block.lua meta.mapping.value.lua meta.mapping.key.lua string.unquoted.key.lua</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#b4befe</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Lua constructor</string>
|
||||
<key>scope</key>
|
||||
<string>source.lua meta.function.lua meta.block.lua meta.mapping.key.lua string.unquoted.key.lua</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f2cdcd</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Java constant</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.constant.java</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#94e2d5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS property</string>
|
||||
<key>scope</key>
|
||||
<string>support.type.property-name.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f2cdcd</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS constant</string>
|
||||
<key>scope</key>
|
||||
<string>support.constant.property-value.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cdd6f4</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS suffix</string>
|
||||
<key>scope</key>
|
||||
<string>constant.numeric.suffix.css, keyword.other.unit.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#94e2d5</string>
|
||||
<key>fontStyle</key>
|
||||
<string>italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>CSS variable property</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.custom-property.name.css, support.type.custom-property.name.css, punctuation.definition.custom-property.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#94e2d5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>SCSS tag</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.tag.css</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#b4befe</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>SASS variable</string>
|
||||
<key>scope</key>
|
||||
<string>variable.other.sass</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#94e2d5</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Invalid</string>
|
||||
<key>scope</key>
|
||||
<string>invalid</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cdd6f4</string>
|
||||
<key>background</key>
|
||||
<string>#f38ba8</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Invalid deprecated</string>
|
||||
<key>scope</key>
|
||||
<string>invalid.deprecated</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cdd6f4</string>
|
||||
<key>background</key>
|
||||
<string>#cba6f7</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff header</string>
|
||||
<key>scope</key>
|
||||
<string>meta.diff, meta.diff.header</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#6c7086</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff deleted</string>
|
||||
<key>scope</key>
|
||||
<string>markup.deleted</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f38ba8</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff inserted</string>
|
||||
<key>scope</key>
|
||||
<string>markup.inserted</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#a6e3a1</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Diff changed</string>
|
||||
<key>scope</key>
|
||||
<string>markup.changed</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f9e2af</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Message error</string>
|
||||
<key>scope</key>
|
||||
<string>message.error</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f38ba8</string>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
<key>uuid</key>
|
||||
<string>4d0379b5-ef82-467b-b8b8-365889420646</string>
|
||||
<key>colorSpaceName</key>
|
||||
<string>sRGB</string>
|
||||
<key>semanticClass</key>
|
||||
<string>theme.dark.Catppuccin</string>
|
||||
<key>author</key>
|
||||
<string>BrunDerSchwarzmagier</string>
|
||||
</dict>
|
||||
</plist>
|
||||
23
chezmoi/dot_config/executable_create-links
Normal file
23
chezmoi/dot_config/executable_create-links
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
|
||||
[[ ! -e "$HOME/.config" ]] && mkdir -p "$HOME/.config/"
|
||||
|
||||
echo "Creating symlinks..."
|
||||
for var in $SCRIPT_DIR/*; do
|
||||
pkg=$(basename "$var")
|
||||
|
||||
# if exist and is not a symlink
|
||||
if [[ -e "$HOME/.config/$pkg" && ! -h "$HOME/.config/$pkg" ]]; then
|
||||
echo "Config for $pkg exist, creating backup ${pkg}.old"
|
||||
mv "$HOME/.config/$pkg" "$HOME/.config/${pkg}.old"
|
||||
|
||||
elif [[ -e "$HOME/.config/$pkg" && -h "$HOME/.config/$pkg" ]]; then
|
||||
unlink "$HOME/.config/$pkg"
|
||||
fi
|
||||
|
||||
ln -sf "$var" "$HOME/.config/"
|
||||
done
|
||||
197
chezmoi/dot_config/foot/foot.ini
Normal file
197
chezmoi/dot_config/foot/foot.ini
Normal file
|
|
@ -0,0 +1,197 @@
|
|||
# -*- conf -*-
|
||||
|
||||
# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd)
|
||||
# term=foot (or xterm-256color if built with -Dterminfo=disabled)
|
||||
# login-shell=no
|
||||
|
||||
include=~/.config/foot/themes/catppuccin/catppuccin-macchiato.conf
|
||||
|
||||
# app-id=foot
|
||||
# title=foot
|
||||
# locked-title=no
|
||||
|
||||
font=JetBrainsMono NF:style=Regular:size=11
|
||||
font-bold=JetBrainsMono NF:style=Bold:size=11
|
||||
font-italic=JetBrainsMono NF:style=Italic:size=11
|
||||
font-bold-italic=JetBrainsMono NF:style=Bold Italic:size=11
|
||||
# line-height=<font metrics>
|
||||
# letter-spacing=0
|
||||
# horizontal-letter-offset=0
|
||||
# vertical-letter-offset=0
|
||||
# underline-offset=<font metrics>
|
||||
# box-drawings-uses-font-glyphs=no
|
||||
# dpi-aware=auto
|
||||
|
||||
# initial-window-size-pixels=700x500 # Or,
|
||||
# initial-window-size-chars=<COLSxROWS>
|
||||
# initial-window-mode=windowed
|
||||
pad=10x10
|
||||
# resize-delay-ms=100
|
||||
|
||||
# notify=notify-send -a ${app-id} -i ${app-id} ${title} ${body}
|
||||
|
||||
# bold-text-in-bright=no
|
||||
# word-delimiters=,│`|:"'()[]{}<>
|
||||
# selection-target=primary
|
||||
# workers=<number of logical CPUs>
|
||||
|
||||
[environment]
|
||||
# name=value
|
||||
|
||||
[bell]
|
||||
# urgent=no
|
||||
# notify=no
|
||||
# command=
|
||||
# command-focused=no
|
||||
|
||||
[scrollback]
|
||||
# lines=1000
|
||||
# multiplier=3.0
|
||||
# indicator-position=relative
|
||||
# indicator-format=
|
||||
|
||||
[url]
|
||||
# launch=xdg-open ${url}
|
||||
# label-letters=sadfjklewcmpgh
|
||||
# osc8-underline=url-mode
|
||||
# protocols=http, https, ftp, ftps, file, gemini, gopher
|
||||
# uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[]
|
||||
|
||||
[cursor]
|
||||
# style=block
|
||||
# color=<inverse foreground/background>
|
||||
# blink=no
|
||||
# beam-thickness=1.5
|
||||
# underline-thickness=<font underline thickness>
|
||||
|
||||
[mouse]
|
||||
# hide-when-typing=no
|
||||
# alternate-scroll-mode=yes
|
||||
|
||||
[colors]
|
||||
alpha=0.9
|
||||
# foreground=dcdccc
|
||||
# background=111111
|
||||
|
||||
## Normal/regular colors (color palette 0-7)
|
||||
# regular0=222222 # black
|
||||
# regular1=cc9393 # red
|
||||
# regular2=7f9f7f # green
|
||||
# regular3=d0bf8f # yellow
|
||||
# regular4=6ca0a3 # blue
|
||||
# regular5=dc8cc3 # magenta
|
||||
# regular6=93e0e3 # cyan
|
||||
# regular7=dcdccc # white
|
||||
|
||||
## Bright colors (color palette 8-15)
|
||||
# bright0=666666 # bright black
|
||||
# bright1=dca3a3 # bright red
|
||||
# bright2=bfebbf # bright green
|
||||
# bright3=f0dfaf # bright yellow
|
||||
# bright4=8cd0d3 # bright blue
|
||||
# bright5=fcace3 # bright magenta
|
||||
# bright6=b3ffff # bright cyan
|
||||
# bright7=ffffff # bright white
|
||||
|
||||
## dimmed colors (see foot.ini(5) man page)
|
||||
# dim0=<not set>
|
||||
# ...
|
||||
# dim7=<not-set>
|
||||
|
||||
## The remaining 256-color palette
|
||||
# 16 = <256-color palette #16>
|
||||
# ...
|
||||
# 255 = <256-color palette #255>
|
||||
|
||||
## Misc colors
|
||||
# selection-foreground=<inverse foreground/background>
|
||||
# selection-background=<inverse foreground/background>
|
||||
# jump-labels=<regular0> <regular3> # black-on-yellow
|
||||
# scrollback-indicator=<regular0> <bright4> # black-on-bright-blue
|
||||
# search-box-no-match=<regular0> <regular1> # black-on-red
|
||||
# search-box-match=<regular0> <regular3> # black-on-yellow
|
||||
# urls=<regular3>
|
||||
|
||||
[csd]
|
||||
preferred=none
|
||||
# size=26
|
||||
# font=<primary font>
|
||||
# color=<foreground color>
|
||||
# hide-when-typing=no
|
||||
# border-width=0
|
||||
# border-color=<csd.color>
|
||||
# button-width=26
|
||||
# button-color=<background color>
|
||||
# button-minimize-color=<regular4>
|
||||
# button-maximize-color=<regular2>
|
||||
# button-close-color=<regular1>
|
||||
|
||||
[key-bindings]
|
||||
# scrollback-up-page=Shift+Page_Up
|
||||
# scrollback-up-half-page=none
|
||||
# scrollback-up-line=none
|
||||
# scrollback-down-page=Shift+Page_Down
|
||||
# scrollback-down-half-page=none
|
||||
# scrollback-down-line=none
|
||||
# clipboard-copy=Control+Shift+c XF86Copy
|
||||
# clipboard-paste=Control+Shift+v XF86Paste
|
||||
# primary-paste=Shift+Insert
|
||||
# search-start=Control+Shift+r
|
||||
# font-increase=Control+plus Control+equal Control+KP_Add
|
||||
# font-decrease=Control+minus Control+KP_Subtract
|
||||
# font-reset=Control+0 Control+KP_0
|
||||
# spawn-terminal=Control+Shift+n
|
||||
# minimize=none
|
||||
# maximize=none
|
||||
# fullscreen=none
|
||||
# pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none
|
||||
# pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none
|
||||
# pipe-selected=[xargs -r firefox] none
|
||||
# show-urls-launch=Control+Shift+u
|
||||
# show-urls-copy=none
|
||||
# show-urls-persistent=none
|
||||
# prompt-prev=Control+Shift+z
|
||||
# prompt-next=Control+Shift+x
|
||||
# unicode-input=none
|
||||
# noop=none
|
||||
|
||||
[search-bindings]
|
||||
# cancel=Control+g Control+c Escape
|
||||
# commit=Return
|
||||
# find-prev=Control+r
|
||||
# find-next=Control+s
|
||||
# cursor-left=Left Control+b
|
||||
# cursor-left-word=Control+Left Mod1+b
|
||||
# cursor-right=Right Control+f
|
||||
# cursor-right-word=Control+Right Mod1+f
|
||||
# cursor-home=Home Control+a
|
||||
# cursor-end=End Control+e
|
||||
# delete-prev=BackSpace
|
||||
# delete-prev-word=Mod1+BackSpace Control+BackSpace
|
||||
# delete-next=Delete
|
||||
# delete-next-word=Mod1+d Control+Delete
|
||||
# extend-to-word-boundary=Control+w
|
||||
# extend-to-next-whitespace=Control+Shift+w
|
||||
# clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste
|
||||
# primary-paste=Shift+Insert
|
||||
# unicode-input=none
|
||||
|
||||
[url-bindings]
|
||||
# cancel=Control+g Control+c Control+d Escape
|
||||
# toggle-url-visible=t
|
||||
|
||||
[text-bindings]
|
||||
# \x03=Mod4+c # Map Super+c -> Ctrl+c
|
||||
|
||||
[mouse-bindings]
|
||||
# selection-override-modifiers=Shift
|
||||
# primary-paste=BTN_MIDDLE
|
||||
# select-begin=BTN_LEFT
|
||||
# select-begin-block=Control+BTN_LEFT
|
||||
# select-extend=BTN_RIGHT
|
||||
# select-extend-character-wise=Control+BTN_RIGHT
|
||||
# select-word=BTN_LEFT-2
|
||||
# select-word-whitespace=Control+BTN_LEFT-2
|
||||
# select-row=BTN_LEFT-3
|
||||
|
||||
# vim: ft=dosini
|
||||
21
chezmoi/dot_config/foot/themes/catppuccin/LICENSE
Normal file
21
chezmoi/dot_config/foot/themes/catppuccin/LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2021 Catppuccin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
32
chezmoi/dot_config/foot/themes/catppuccin/README.md
Normal file
32
chezmoi/dot_config/foot/themes/catppuccin/README.md
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
<h3 align="center">
|
||||
<img src="https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/logos/exports/1544x1544_circle.png" width="100" alt="Logo"/><br/>
|
||||
<img src="https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/misc/transparent.png" height="30" width="0px"/>
|
||||
Catppuccin for <a href="https://codeberg.org/dnkl/foot">Foot</a>
|
||||
<img src="https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/misc/transparent.png" height="30" width="0px"/>
|
||||
</h3>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/catppuccin/foot/stargazers"><img src="https://img.shields.io/github/stars/catppuccin/foot?colorA=363a4f&colorB=b7bdf8&style=for-the-badge"></a>
|
||||
<a href="https://github.com/catppuccin/foot/issues"><img src="https://img.shields.io/github/issues/catppuccin/foot?colorA=363a4f&colorB=f5a97f&style=for-the-badge"></a>
|
||||
<a href="https://github.com/catppuccin/foot/contributors"><img src="https://img.shields.io/github/contributors/catppuccin/foot?colorA=363a4f&colorB=a6da95&style=for-the-badge"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="https://raw.githubusercontent.com/catppuccin/foot-catppuccin/main/assets/foot.png"/>
|
||||
</p>
|
||||
|
||||
## Usage
|
||||
|
||||
1. Copy the contents of `catppuccin.conf` colorscheme you want into your Foot config file (usually stored at `~/.config/foot/foot.ini`)
|
||||
|
||||
## 💝 Thanks to
|
||||
|
||||
- [Pocco81](https://github.com/Pocco81)
|
||||
- [crdpa](https://github.com/crdpa)
|
||||
- [Thibault Andreis](https://github.com/ThibaultAndreis)
|
||||
|
||||
|
||||
|
||||
<p align="center"><img src="https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/footers/gray0_ctp_on_line.svg?sanitize=true" /></p>
|
||||
<p align="center">Copyright © 2021-present <a href="https://github.com/catppuccin" target="_blank">Catppuccin Org</a>
|
||||
<p align="center"><a href="https://github.com/catppuccin/catppuccin/blob/main/LICENSE"><img src="https://img.shields.io/static/v1.svg?style=for-the-badge&label=License&message=MIT&logoColor=d9e0ee&colorA=363a4f&colorB=b7bdf8"/></a></p>
|
||||
BIN
chezmoi/dot_config/foot/themes/catppuccin/assets/foot.png
Normal file
BIN
chezmoi/dot_config/foot/themes/catppuccin/assets/foot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 313 KiB |
|
|
@ -0,0 +1,19 @@
|
|||
[colors]
|
||||
foreground=c6d0f5 # Text
|
||||
background=303446 # Base
|
||||
regular0=51576d # Surface 1
|
||||
regular1=e78284 # red
|
||||
regular2=a6d189 # green
|
||||
regular3=e5c890 # yellow
|
||||
regular4=8caaee # blue
|
||||
regular5=f4b8e4 # pink
|
||||
regular6=81c8be # teal
|
||||
regular7=b5bfe2 # Subtext 1
|
||||
bright0=626880 # Surface 2
|
||||
bright1=e78284 # red
|
||||
bright2=a6d189 # green
|
||||
bright3=e5c890 # yellow
|
||||
bright4=8caaee # blue
|
||||
bright5=f4b8e4 # pink
|
||||
bright6=81c8be # teal
|
||||
bright7=a5adce # Subtext 0
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[colors]
|
||||
foreground=4c4f69 # Text
|
||||
background=eff1f5 # Base
|
||||
regular0=5c5f77 # Subtext 1
|
||||
regular1=d20f39 # red
|
||||
regular2=40a02b # green
|
||||
regular3=df8e1d # yellow
|
||||
regular4=1e66f5 # blue
|
||||
regular5=ea76cb # pink
|
||||
regular6=179299 # teal
|
||||
regular7=acb0be # Surface 2
|
||||
bright0=6c6f85 # Subtext 0
|
||||
bright1=d20f39 # red
|
||||
bright2=40a02b # green
|
||||
bright3=df8e1d # yellow
|
||||
bright4=1e66f5 # blue
|
||||
bright5=ea76cb # pink
|
||||
bright6=179299 # teal
|
||||
bright7=bcc0cc # Surface 1
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[colors]
|
||||
foreground=cad3f5 # Text
|
||||
background=24273a # Base
|
||||
regular0=494d64 # Surface 1
|
||||
regular1=ed8796 # red
|
||||
regular2=a6da95 # green
|
||||
regular3=eed49f # yellow
|
||||
regular4=8aadf4 # blue
|
||||
regular5=f5bde6 # pink
|
||||
regular6=8bd5ca # teal
|
||||
regular7=b8c0e0 # Subtext 1
|
||||
bright0=5b6078 # Surface 2
|
||||
bright1=ed8796 # red
|
||||
bright2=a6da95 # green
|
||||
bright3=eed49f # yellow
|
||||
bright4=8aadf4 # blue
|
||||
bright5=f5bde6 # pink
|
||||
bright6=8bd5ca # teal
|
||||
bright7=a5adcb # Subtext 0
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[colors]
|
||||
foreground=cdd6f4 # Text
|
||||
background=1e1e2e # Base
|
||||
regular0=45475a # Surface 1
|
||||
regular1=f38ba8 # red
|
||||
regular2=a6e3a1 # green
|
||||
regular3=f9e2af # yellow
|
||||
regular4=89b4fa # blue
|
||||
regular5=f5c2e7 # pink
|
||||
regular6=94e2d5 # teal
|
||||
regular7=bac2de # Subtext 1
|
||||
bright0=585b70 # Surface 2
|
||||
bright1=f38ba8 # red
|
||||
bright2=a6e3a1 # green
|
||||
bright3=f9e2af # yellow
|
||||
bright4=89b4fa # blue
|
||||
bright5=f5c2e7 # pink
|
||||
bright6=94e2d5 # teal
|
||||
bright7=a6adc8 # Subtext 0
|
||||
34
chezmoi/dot_config/foot/themes/catppuccin/dot_editorconfig
Normal file
34
chezmoi/dot_config/foot/themes/catppuccin/dot_editorconfig
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_size = 2
|
||||
indent_style = space
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
# go
|
||||
[*.go]
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
# python
|
||||
[*.{ini,py,py.tpl,rst}]
|
||||
indent_size = 4
|
||||
|
||||
# rust
|
||||
[*.rs]
|
||||
indent_size = 4
|
||||
|
||||
# documentation, utils
|
||||
[*.{md,mdx,diff}]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
# windows shell scripts
|
||||
[*.{cmd,bat,ps1}]
|
||||
end_of_line = crlf
|
||||
1
chezmoi/dot_config/foot/themes/catppuccin/dot_git
Normal file
1
chezmoi/dot_config/foot/themes/catppuccin/dot_git
Normal file
|
|
@ -0,0 +1 @@
|
|||
gitdir: ../../../../.git/modules/config/foot/themes/catppuccin
|
||||
49
chezmoi/dot_config/fzf/forgitrc
Normal file
49
chezmoi/dot_config/fzf/forgitrc
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
forgit-list-command-widget() {
|
||||
local cmd=$(alias | grep 'forgit' | sed -E 's/::/ /g; s/=/ :- /g; s/for//g' | \
|
||||
awk -v BLD=${BLD} -v RST=${RST} -v BLU=${BLU} -v CYN=${CYN} -F":" '{print BLU BLD $1 RST ":" CYN $2 RST }' | \
|
||||
column -ts":")
|
||||
LBUFFER="$LBUFFER$( \
|
||||
fzf-tmux -p -w 30% -h 53% --preview-window=hidden --prompt=' List > ' \
|
||||
--header=$'Alias\t Description' <<< "$cmd" | awk '{print $1}')"
|
||||
if [[ -n $LBUFFER ]]; then
|
||||
zle accept-line
|
||||
fi
|
||||
zle reset-prompt
|
||||
}
|
||||
|
||||
zle -N forgit-list-command-widget
|
||||
bindkey '^[g^[l' forgit-list-command-widget #<Alt-G+Alt-L>
|
||||
|
||||
export FORGIT_FZF_SHOW_HELP_OPTS="$(
|
||||
cat <<-EOF
|
||||
|
||||
Forgit Commands (Aliases)
|
||||
|
||||
fga add
|
||||
fgbl blame
|
||||
fgbd branch delete
|
||||
fgcb checkout branch
|
||||
fgco checkout commit
|
||||
fgcf checkout file
|
||||
fgct checkout tag
|
||||
fgcp cherry pick
|
||||
fgclean clean
|
||||
fgd diff
|
||||
fgfu fixup
|
||||
fgi ignore
|
||||
fglo log
|
||||
fgrb rebase
|
||||
fgrh reset head
|
||||
fgrev revert commit
|
||||
fgsta stash push
|
||||
fgsts stash show
|
||||
EOF
|
||||
)"
|
||||
|
||||
export FORGIT_FZF_DEFAULT_OPTS="
|
||||
--cycle
|
||||
--reverse
|
||||
--height '80%'
|
||||
--preview-window=nohidden
|
||||
--bind 'alt-?:preview(printf \"${FORGIT_FZF_SHOW_HELP_OPTS}\")'
|
||||
"
|
||||
130
chezmoi/dot_config/fzf/fzfrc
Normal file
130
chezmoi/dot_config/fzf/fzfrc
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
export FZF_SHOW_HELP_OPTS="$(
|
||||
cat <<-EOF
|
||||
|
||||
FZF Keybinds Shortcut
|
||||
|
||||
? Toggle/Hide Preview
|
||||
C-space Change preview layout
|
||||
C-e Open in Editor
|
||||
C-v Open in VsCode
|
||||
C-o Launch Application Chooser
|
||||
M-o Open in Default Appllication
|
||||
C-/ Directory: Navigate on broot
|
||||
C-/ File: Open in Pager (bat)
|
||||
|
||||
M-s Toggle Sort
|
||||
C-y Copy/Yank
|
||||
C-M-y Copy/Yank Working Directory
|
||||
C-a Select all
|
||||
C-M-d Deselect All
|
||||
Del Delete/Remove file
|
||||
|
||||
Alt-? Help (this page)
|
||||
ESC Quit
|
||||
EOF
|
||||
)"
|
||||
|
||||
export FZF_DEFAULT_OPTS=" \
|
||||
--color=bg+:#363a4f,bg:#24273a,spinner:#f4dbd6,hl:#ed8796 \
|
||||
--color=fg:#cad3f5,header:#ed8796,info:#c6a0f6,pointer:#f4dbd6 \
|
||||
--color=marker:#f4dbd6,fg+:#cad3f5,prompt:#c6a0f6,hl+:#ed8796"
|
||||
|
||||
export FZF_PREVIEW_OPTS="--preview
|
||||
'([[ {} =~ ('.jpg'|'.jpeg'|'.png'|'.gif'|'.bmp'|'.svg'|'.mp4'|'.mkv')$ ]] && (chafa --center=on {} && exiftool {})) ||
|
||||
([[ -f {} ]] && (bat --style=header,numbers,changes,plain --color=always --language=sh --line-range :500 {} || cat {})) ||
|
||||
([[ -d {} ]] && (lsd -all --long --tree --depth=5 --group-dirs=first -I=.git {} )) || echo {} 3>/dev/null | head -n 500'
|
||||
"
|
||||
|
||||
#'([[ \$(file -bL --mime-type {} 2> /dev/null = image) ]] && (catimg -w 100 {})) || # throwing an stb error cant silence
|
||||
|
||||
export FZF_PREVIEW_KEYBIND_OPTS="
|
||||
--bind '?:toggle-preview'
|
||||
--bind 'alt-?:preview(printf \"${FZF_SHOW_HELP_OPTS}\")'
|
||||
--bind 'alt-j:preview-down'
|
||||
--bind 'alt-k:preview-up'
|
||||
--bind 'ctrl-d:preview-page-down'
|
||||
--bind 'ctrl-u:preview-page-up'
|
||||
--bind 'ctrl-t:preview-top'
|
||||
--bind 'ctrl-b:preview-bottom'
|
||||
--bind 'ctrl-l:clear-screen+clear-query+first'
|
||||
--bind 'ctrl-space:change-preview-window(right,80%,nohidden|down,80%,border-top,nohidden|down,50%,nohidden|up,80%,border-down,nohidden|up,50%,nohidden|left,80%,nohidden|left,50%,nohidden|down:3:nohidden:wrap|up:3,nohidden:wrap|right,50%,nohidden)'
|
||||
"
|
||||
export FZF_KEYBIND_SHORTCUTS="
|
||||
$FZF_PREVIEW_KEYBIND_OPTS
|
||||
--bind 'alt-o:execute(xdg-open {+})'
|
||||
--bind 'alt-s:toggle-sort'
|
||||
--bind 'ctrl-/:execute(
|
||||
if [[ -d {} ]]; then
|
||||
broot {} < /dev/tty > /dev/tty 2>&1
|
||||
elif [[ {} =~ ('.jpg'|'.jpeg'|'.png'|'.gif'|'.bmp'|'.svg'|'.mp4'|'.mkv')$ ]]; then
|
||||
chafa --center {} | less > /dev/tty
|
||||
else
|
||||
bat --paging=always --style=plain --color=always --language=sh {} > /dev/tty
|
||||
fi)'
|
||||
--bind 'ctrl-a:select-all'
|
||||
--bind 'ctrl-alt-d:deselect-all'
|
||||
--bind 'ctrl-o:execute(flatpak run re.sonny.Junction {+})'
|
||||
--bind 'ctrl-y:execute-silent(wl-copy {+})'
|
||||
--bind 'ctrl-alt-y:execute-silent(readlink -f {+} | wl-copy)'
|
||||
--bind 'ctrl-e:execute(${EDITOR} {} > /dev/tty)'
|
||||
--bind 'ctrl-v:execute(code {+})'
|
||||
--bind 'del:execute(rm -iv {};)+reload($FZF_DEFAULT_COMMAND)+clear-screen'
|
||||
"
|
||||
# --bind 'ctrl-/:execute(if [[ -f {} ]]; then bat --paging=always --style=\"header,numbers,changes\" --language=sh {} < /dev/tty > /dev/tty 2>&1; else broot {} < /dev/tty > /dev/tty 2>&1
|
||||
# ; fi)'
|
||||
|
||||
export FZF_DEFAULT_COMMAND="fd --color=always --hidden --exclude .git"
|
||||
|
||||
export FZF_DEFAULT_OPTS="
|
||||
"$FZF_PREVIEW_OPTS"
|
||||
"$FZF_KEYBIND_SHORTCUTS"
|
||||
"$FZF_THEME_CATPPUCCIN_MOCHA"
|
||||
-i
|
||||
--ansi
|
||||
--multi
|
||||
--height=90%
|
||||
--info=inline
|
||||
--no-separator
|
||||
--layout=reverse
|
||||
--preview-window=:hidden
|
||||
"
|
||||
|
||||
export FZF_ALT_C_COMMAND="fd --type=d --color=always --hidden --exclude .git"
|
||||
|
||||
export FZF_ALT_C_OPTS="
|
||||
--preview 'lsd --all --long --tree --depth=3 {} | head -500'
|
||||
--preview-window 'nohidden,<50(down,75%,border-top)'
|
||||
--bind 'alt-h:reload(fd --type=d --color=always --follow --exclude .git)'
|
||||
--bind 'alt-c:reload(fd -p ~ --color=always --hidden --type=d --follow)'
|
||||
"
|
||||
|
||||
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
|
||||
|
||||
export FZF_CTRL_T_OPTS="
|
||||
--exit-0
|
||||
--select-1
|
||||
--info=default
|
||||
--layout=reverse-list
|
||||
--preview-window '50%,<50(up,75%,border-down)'
|
||||
--header 'Alt-D: Directories | Alt-F: Files | Alt-H: Hide Files'
|
||||
--bind 'alt-d:change-prompt( Directories > )+reload("$FZF_ALT_C_COMMAND")'
|
||||
--bind 'alt-f:change-prompt( Files > )+reload("$FZF_DEFAULT_COMMAND")'
|
||||
--bind 'alt-h:change-prompt( Hide Files > )+reload(fd --type=f --color=always --follow)'
|
||||
--bind 'ctrl-t:change-prompt(Home > )+reload(fd --base-directory ~ --color=always --hidden --exclude .git)'
|
||||
"
|
||||
|
||||
export FZF_CTRL_R_OPTS="
|
||||
--preview 'echo {+} | bat --color=always --wrap never --language=sh --style=plain'
|
||||
--preview-window 'down:3:nohidden:wrap'"
|
||||
|
||||
# export FZF_TMUX_OPTS='-p80% --color=border:blue'
|
||||
# FZF_TMUX_CTRL_R_OPT="fzf-tmux -p $FZF_CTRL_R_OPTS"
|
||||
# --bind 'alt-p:execute($'FZF_TMUX_OPTS'='-p90% --color=border:blue')'
|
||||
|
||||
# fzf completion '**' doesn't preview files (idk if it is a bug)
|
||||
_fzf_compgen_path() {
|
||||
fd --color=always --hidden --follow --exclude ".git" . "$1"
|
||||
}
|
||||
_fzf_compgen_dir() {
|
||||
fd --color=always --type d --hidden --follow --exclude ".git" . "$1"
|
||||
}
|
||||
16
chezmoi/dot_config/fzf/widgets/alias_widget.zsh
Normal file
16
chezmoi/dot_config/fzf/widgets/alias_widget.zsh
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
fzf-aliases-widget() {
|
||||
LBUFFER="$LBUFFER$(FZF_DEFAULT_COMMAND=
|
||||
alias | sed 's/=/ --- /' | \
|
||||
awk -v blu=$(tput setaf 4) -v cyn=$(tput setaf 6) -v bld=$(tput bold) -v rst=$(tput sgr0) -F '---' \
|
||||
'{
|
||||
print bld cyn $1 rst blu "--" $2
|
||||
}' | \
|
||||
tr -d "'" | column -tl2 | \
|
||||
fzf --prompt=" Aliases > " \
|
||||
--preview 'echo {3..} | bat --color=always --plain --language=sh' \
|
||||
--preview-window 'up:4:nohidden:wrap' | cut -d' ' -f 1)"
|
||||
zle reset-prompt
|
||||
}
|
||||
|
||||
zle -N fzf-aliases-widget
|
||||
bindkey '^[a' fzf-aliases-widget #<Alt-A>
|
||||
25
chezmoi/dot_config/fzf/widgets/atuin-history_widget.zsh
Normal file
25
chezmoi/dot_config/fzf/widgets/atuin-history_widget.zsh
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
fzf-atuin-history-widget() {
|
||||
local selected num
|
||||
setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases 2> /dev/null
|
||||
selected=( $(atuin history list --cmd-only | tac | awk '{ cmd=$0; sub(/^[ \t]*[0-9]+\**[ \t]+/, "", cmd); if (!seen[cmd]++) print $0 }' | bat --color=always --wrap never --language=sh --style=plain |
|
||||
FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} ${FZF_DEFAULT_OPTS-} --scheme=history --bind=ctrl-r:toggle-sort,ctrl-z:ignore ${FZF_CTRL_R_OPTS-} --query=${(qqq)LBUFFER} +m" $(__fzfcmd)) )
|
||||
local ret=$?
|
||||
if [ -n "$selected" ]; then
|
||||
cmd=$selected[1,-1]
|
||||
if [ -n "$cmd" ]; then
|
||||
zle vi-fetch-history -n $cmd
|
||||
fi
|
||||
fi
|
||||
zle -U "$cmd"
|
||||
zle kill-buffer
|
||||
zle reset-prompt
|
||||
return $ret
|
||||
}
|
||||
|
||||
if ! command -v atuin > /dev/null; then
|
||||
zle -N fzf-history-widget
|
||||
bindkey '^R' fzf-history-widget
|
||||
else
|
||||
zle -N fzf-atuin-history-widget
|
||||
bindkey '^R' fzf-atuin-history-widget
|
||||
fi
|
||||
15
chezmoi/dot_config/fzf/widgets/cd-recent-dir_widget.zsh
Normal file
15
chezmoi/dot_config/fzf/widgets/cd-recent-dir_widget.zsh
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
fzf-cd-recent-dir-widget () {
|
||||
local dir
|
||||
print -rNC1 -- $dirstack |
|
||||
FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --bind=ctrl-z:ignore ${FZF_DEFAULT_OPTS-} ${FZF_ALT_C_OPTS-}" $(__fzfcmd) +m \
|
||||
--color=fg:bold:blue --query=${LBUFFER} --read0 --print0 |
|
||||
IFS= read -rd '' dir
|
||||
if [[ -n $dir ]]; then
|
||||
BUFFER=" builtin cd -- $dir"
|
||||
zle accept-line
|
||||
fi
|
||||
zle reset-prompt
|
||||
}
|
||||
|
||||
zle -N fzf-cd-recent-dir-widget
|
||||
bindkey '^[C' fzf-cd-recent-dir-widget #<Alt-Shift-C>
|
||||
20
chezmoi/dot_config/fzf/widgets/cd_widget.zsh
Normal file
20
chezmoi/dot_config/fzf/widgets/cd_widget.zsh
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
fzf-cd-widget() {
|
||||
local cmd="${FZF_ALT_C_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \
|
||||
-o -type d -print 2> /dev/null | cut -b3-"}"
|
||||
setopt localoptions pipefail no_aliases 2> /dev/null
|
||||
local dir="$(eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore ${FZF_DEFAULT_OPTS-} ${FZF_ALT_C_OPTS-}" $(__fzfcmd) +m)"
|
||||
if [[ -z "$dir" ]]; then
|
||||
zle redisplay
|
||||
return 0
|
||||
fi
|
||||
zle push-line # Clear buffer. Auto-restored on next prompt.
|
||||
BUFFER=" builtin cd -- ${(q)dir}"
|
||||
zle accept-line
|
||||
local ret=$?
|
||||
unset dir # ensure this doesn't end up appearing in prompt expansion
|
||||
zle reset-prompt
|
||||
return $ret
|
||||
}
|
||||
|
||||
zle -N fzf-cd-widget
|
||||
bindkey '^[c' fzf-cd-widget #<Alt-C>
|
||||
24
chezmoi/dot_config/fzf/widgets/dictionary_widget.zsh
Normal file
24
chezmoi/dot_config/fzf/widgets/dictionary_widget.zsh
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
fzf-dictionary-widget() {
|
||||
local dict wiki wikis gogl
|
||||
dict="dict {}"
|
||||
wiki="wiki {} > /dev/tty"
|
||||
wweb="w3m https://en.wikipedia.org/wiki/{}"
|
||||
gogl="w3m https://google.com/search?q=define\ {}"
|
||||
LBUFFER="$LBUFFER$(FZF_DEFAULT_COMMAND= cat /usr/share/dict/*words | sort | uniq -id | \
|
||||
fzf-tmux \
|
||||
-p60% \
|
||||
--layout=default \
|
||||
--header-first \
|
||||
--header="M-w: Wiki | M-d: Define | M-g: Google" \
|
||||
--color=fg:blue,fg+:blue,border:blue \
|
||||
--bind="alt-d:change-preview($dict)" \
|
||||
--bind="alt-w:execute($wiki)" \
|
||||
--bind="alt-g:execute($gogl)" \
|
||||
--prompt=" > " \
|
||||
--preview "$dict" \
|
||||
--preview-window='up,85%,border-bottom,wrap' | paste -sd" " -)"
|
||||
zle reset-prompt
|
||||
}
|
||||
|
||||
zle -N fzf-dictionary-widget
|
||||
bindkey '^[d' fzf-dictionary-widget #<Alt-D>
|
||||
7
chezmoi/dot_config/fzf/widgets/fzf-rg-launcher.zsh
Normal file
7
chezmoi/dot_config/fzf/widgets/fzf-rg-launcher.zsh
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
function fzf-rg-widget() {
|
||||
bash ${DOOTS:-$HOME/.local}/bin/fzf-rg-launcher "$LBUFFER"
|
||||
zle redisplay
|
||||
}
|
||||
|
||||
zle -N fzf-rg-widget
|
||||
bindkey '^F' fzf-rg-widget
|
||||
13
chezmoi/dot_config/fzf/widgets/locate_widget.zsh
Normal file
13
chezmoi/dot_config/fzf/widgets/locate_widget.zsh
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
fzf-locate-widget() {
|
||||
local selected
|
||||
if selected=$(locate / | fzf --prompt " Locate > " -q "$LBUFFER" \
|
||||
--bind 'alt-u:execute(sudo updatedb)' --header 'M-u: UpdateDB' \
|
||||
--color=fg:bold:blue --preview-window '<50(down,75%,border-top)'
|
||||
); then
|
||||
LBUFFER=$selected
|
||||
fi
|
||||
zle reset-prompt
|
||||
}
|
||||
zle -N fzf-locate-widget
|
||||
bindkey '^[i' fzf-locate-widget #<Alt-I>
|
||||
|
||||
21
chezmoi/dot_config/fzf/widgets/man_widget.zsh
Normal file
21
chezmoi/dot_config/fzf/widgets/man_widget.zsh
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
fzf-man-widget() {
|
||||
batman="man {1} | col -bx | bat --language=man --plain --color always --theme=\"Monokai Extended\""
|
||||
man -k . | sort \
|
||||
| awk -v CYN=${CYN} -v BLU=${BLU} -v RES=${RES} -v BLD=${BLD} '{ $1=CYN BLD $1; $2=RES BLU;} 1' \
|
||||
| fzf \
|
||||
-q "$LBUFFER" \
|
||||
--ansi \
|
||||
--tiebreak=begin \
|
||||
--prompt=' Man > ' \
|
||||
--header="M-u: update mandb | M-t: tl;dr | M-c: cheat.sh | M:m manual " \
|
||||
--preview-window '50%,rounded,<50(down,80%,border-up)' \
|
||||
--preview "${batman}" \
|
||||
--bind "enter:execute(man {1})" \
|
||||
--bind "alt-c:+change-preview(curl -s cht.sh/{1})+change-prompt(ﯽ Cheat > )" \
|
||||
--bind "alt-m:+change-preview(${batman})+change-prompt( Man > )" \
|
||||
--bind "alt-u:execute(sudo mandb && echo -e '\nUpdating tl;dr cache...';tldr --update)" \
|
||||
--bind "alt-t:+change-preview(tldr --color=always {1})+change-prompt(ﳁ TLDR > )"
|
||||
zle reset-prompt
|
||||
}
|
||||
zle -N fzf-man-widget
|
||||
bindkey '^[h' fzf-man-widget
|
||||
5
chezmoi/dot_config/git/gitconfig
Normal file
5
chezmoi/dot_config/git/gitconfig
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[user]
|
||||
email = ale.navarro.parra@gmail.com
|
||||
user = Alexander Navarro
|
||||
[init]
|
||||
defaultBranch = main
|
||||
6
chezmoi/dot_config/git/ignore
Normal file
6
chezmoi/dot_config/git/ignore
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
# Git Worktrees
|
||||
.worktrees/*
|
||||
|
||||
# PHP Stuff
|
||||
vendor
|
||||
.php-cs-fixer.cache
|
||||
14
chezmoi/dot_config/helix/config.toml
Normal file
14
chezmoi/dot_config/helix/config.toml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
theme = "catppuccin_mocha"
|
||||
|
||||
[editor]
|
||||
scrolloff = 15
|
||||
line-number = "relative"
|
||||
color-modes = true
|
||||
|
||||
[editor.cursor-shape]
|
||||
normal = "block"
|
||||
insert = "bar"
|
||||
select = "underline"
|
||||
|
||||
[editor.indent-guides]
|
||||
render = true
|
||||
39
chezmoi/dot_config/hypr/executable_gdm-wrapper.sh
Normal file
39
chezmoi/dot_config/hypr/executable_gdm-wrapper.sh
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
#!/usr/bin/sh
|
||||
|
||||
if [ "x$XDG_SESSION_TYPE" = "xwayland" ] &&
|
||||
[ "x$XDG_SESSION_CLASS" != "xgreeter" ] &&
|
||||
[ -n "$SHELL" ] &&
|
||||
grep -q "$SHELL" /etc/shells &&
|
||||
! (echo "$SHELL" | grep -q "false") &&
|
||||
! (echo "$SHELL" | grep -q "nologin"); then
|
||||
if [ "$1" != '-l' ]; then
|
||||
exec bash -c "exec -l '$SHELL' -c '$0 -l $*'"
|
||||
else
|
||||
shift
|
||||
fi
|
||||
fi
|
||||
|
||||
SETTING=$(G_MESSAGES_DEBUG='' gsettings get org.gnome.system.locale region)
|
||||
REGION=${SETTING#\'}
|
||||
REGION=${REGION%\'}
|
||||
|
||||
if [ -n "$REGION" ]; then
|
||||
unset LC_TIME LC_NUMERIC LC_MONETARY LC_MEASUREMENT LC_PAPER
|
||||
|
||||
if [ "$LANG" != "$REGION" ]; then
|
||||
# LC_CTYPE
|
||||
export LC_NUMERIC=$REGION
|
||||
export LC_TIME=$REGION
|
||||
# LC_COLLATE
|
||||
export LC_MONETARY=$REGION
|
||||
# LC_MESSAGES
|
||||
export LC_PAPER=$REGION
|
||||
# LC_NAME
|
||||
export LC_ADDRESS=$REGION
|
||||
export LC_TELEPHONE=$REGION
|
||||
export LC_MEASUREMENT=$REGION
|
||||
# LC_IDENTIFICATION
|
||||
fi
|
||||
fi
|
||||
|
||||
exec Hyprland
|
||||
158
chezmoi/dot_config/hypr/hyprland.conf
Normal file
158
chezmoi/dot_config/hypr/hyprland.conf
Normal file
|
|
@ -0,0 +1,158 @@
|
|||
#
|
||||
# Please note not all available settings / options are set here.
|
||||
# For a full list, see the wiki
|
||||
#
|
||||
|
||||
# See https://wiki.hyprland.org/Configuring/Monitors/
|
||||
monitor=,highrr,auto,1
|
||||
|
||||
# Execute your favorite apps at launch
|
||||
exec-once = waybar & hyprpaper
|
||||
|
||||
# Source a file (multi-file configs)
|
||||
# source = ~/.config/hypr/myColors.conf
|
||||
|
||||
# Some default env vars.
|
||||
env = XCURSOR_SIZE,24
|
||||
|
||||
# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
|
||||
input {
|
||||
kb_layout = latam
|
||||
kb_variant =
|
||||
kb_model =
|
||||
kb_options = caps:escape
|
||||
kb_rules =
|
||||
|
||||
follow_mouse = 1
|
||||
|
||||
touchpad {
|
||||
natural_scroll = true
|
||||
}
|
||||
|
||||
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
|
||||
}
|
||||
|
||||
general {
|
||||
# See https://wiki.hyprland.org/Configuring/Variables/ for more
|
||||
|
||||
gaps_in = 5
|
||||
gaps_out = 10
|
||||
border_size = 2
|
||||
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
|
||||
col.inactive_border = rgba(595959aa)
|
||||
|
||||
layout = dwindle
|
||||
}
|
||||
|
||||
decoration {
|
||||
# See https://wiki.hyprland.org/Configuring/Variables/ for more
|
||||
rounding = 10
|
||||
drop_shadow = true
|
||||
shadow_range = 4
|
||||
shadow_render_power = 3
|
||||
col.shadow = rgba(1a1a1aee)
|
||||
|
||||
blur {
|
||||
enabled = true
|
||||
size = 3
|
||||
passes = 1
|
||||
new_optimizations = true
|
||||
}
|
||||
}
|
||||
|
||||
animations {
|
||||
enabled = true
|
||||
|
||||
# Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
|
||||
|
||||
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
|
||||
|
||||
animation = windows, 1, 7, myBezier
|
||||
animation = windowsOut, 1, 7, default, popin 80%
|
||||
animation = border, 1, 10, default
|
||||
animation = borderangle, 1, 8, default
|
||||
animation = fade, 1, 7, default
|
||||
animation = workspaces, 1, 6, default
|
||||
}
|
||||
|
||||
dwindle {
|
||||
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
|
||||
pseudotile = true # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
|
||||
preserve_split = true # you probably want this
|
||||
}
|
||||
|
||||
master {
|
||||
# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
|
||||
new_is_master = true
|
||||
}
|
||||
|
||||
gestures {
|
||||
# See https://wiki.hyprland.org/Configuring/Variables/ for more
|
||||
workspace_swipe = true
|
||||
workspace_swipe_invert = false
|
||||
}
|
||||
|
||||
# Example per-device config
|
||||
# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
|
||||
device:epic-mouse-v1 {
|
||||
sensitivity = -0.5
|
||||
}
|
||||
|
||||
# Example windowrule v1
|
||||
# windowrule = float, ^(kitty)$
|
||||
# Example windowrule v2
|
||||
# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
|
||||
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
|
||||
|
||||
|
||||
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
|
||||
$mainMod = SUPER
|
||||
|
||||
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
|
||||
bind = $mainMod, Q, exec, alacritty
|
||||
bind = $mainMod, C, killactive,
|
||||
bind = $mainMod, M, exit,
|
||||
bind = $mainMod, E, exec, dolphin
|
||||
bind = $mainMod, V, togglefloating,
|
||||
bind = $mainMod, D, exec, wofi --show drun
|
||||
bind = $mainMod, P, pseudo, # dwindle
|
||||
bind = $mainMod, J, togglesplit, # dwindle
|
||||
|
||||
# Move focus with mainMod + arrow keys
|
||||
bind = $mainMod, h, movefocus, l
|
||||
bind = $mainMod, j, movefocus, d
|
||||
bind = $mainMod, k, movefocus, u
|
||||
bind = $mainMod, l, movefocus, r
|
||||
|
||||
# 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
|
||||
|
||||
# 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
|
||||
|
||||
4
chezmoi/dot_config/hypr/hyprpaper.conf
Normal file
4
chezmoi/dot_config/hypr/hyprpaper.conf
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
preload = ~/Pictures/wallpaper.jpg
|
||||
|
||||
#set the default wallpaper(s) seen on inital workspace(s) --depending on the number of monitors used
|
||||
wallpaper = ,~/Pictures/wallpaper.jpg
|
||||
80
chezmoi/dot_config/kitty/current-theme.conf
Normal file
80
chezmoi/dot_config/kitty/current-theme.conf
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
# vim:ft=kitty
|
||||
|
||||
## name: Catppuccin-Macchiato
|
||||
## author: Pocco81 (https://github.com/Pocco81)
|
||||
## license: MIT
|
||||
## upstream: https://github.com/catppuccin/kitty/blob/main/macchiato.conf
|
||||
## blurb: Soothing pastel theme for the high-spirited!
|
||||
|
||||
|
||||
|
||||
# The basic colors
|
||||
foreground #CAD3F5
|
||||
background #24273A
|
||||
selection_foreground #24273A
|
||||
selection_background #F4DBD6
|
||||
|
||||
# Cursor colors
|
||||
cursor #F4DBD6
|
||||
cursor_text_color #24273A
|
||||
|
||||
# URL underline color when hovering with mouse
|
||||
url_color #F4DBD6
|
||||
|
||||
# Kitty window border colors
|
||||
active_border_color #B7BDF8
|
||||
inactive_border_color #6E738D
|
||||
bell_border_color #EED49F
|
||||
|
||||
# OS Window titlebar colors
|
||||
wayland_titlebar_color system
|
||||
macos_titlebar_color system
|
||||
|
||||
# Tab bar colors
|
||||
active_tab_foreground #181926
|
||||
active_tab_background #C6A0F6
|
||||
inactive_tab_foreground #CAD3F5
|
||||
inactive_tab_background #1E2030
|
||||
tab_bar_background #181926
|
||||
|
||||
# Colors for marks (marked text in the terminal)
|
||||
mark1_foreground #24273A
|
||||
mark1_background #B7BDF8
|
||||
mark2_foreground #24273A
|
||||
mark2_background #C6A0F6
|
||||
mark3_foreground #24273A
|
||||
mark3_background #7DC4E4
|
||||
|
||||
# The 16 terminal colors
|
||||
|
||||
# black
|
||||
color0 #494D64
|
||||
color8 #5B6078
|
||||
|
||||
# red
|
||||
color1 #ED8796
|
||||
color9 #ED8796
|
||||
|
||||
# green
|
||||
color2 #A6DA95
|
||||
color10 #A6DA95
|
||||
|
||||
# yellow
|
||||
color3 #EED49F
|
||||
color11 #EED49F
|
||||
|
||||
# blue
|
||||
color4 #8AADF4
|
||||
color12 #8AADF4
|
||||
|
||||
# magenta
|
||||
color5 #F5BDE6
|
||||
color13 #F5BDE6
|
||||
|
||||
# cyan
|
||||
color6 #8BD5CA
|
||||
color14 #8BD5CA
|
||||
|
||||
# white
|
||||
color7 #B8C0E0
|
||||
color15 #A5ADCB
|
||||
2458
chezmoi/dot_config/kitty/kitty.conf
Normal file
2458
chezmoi/dot_config/kitty/kitty.conf
Normal file
File diff suppressed because it is too large
Load diff
2453
chezmoi/dot_config/kitty/private_kitty.conf.bak
Normal file
2453
chezmoi/dot_config/kitty/private_kitty.conf.bak
Normal file
File diff suppressed because it is too large
Load diff
19
chezmoi/dot_config/lazygit/config.yml
Normal file
19
chezmoi/dot_config/lazygit/config.yml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
theme:
|
||||
lightTheme: false
|
||||
activeBorderColor:
|
||||
- "#a6da95" # Green
|
||||
- bold
|
||||
inactiveBorderColor:
|
||||
- "#cad3f5" # Text
|
||||
optionsTextColor:
|
||||
- "#8aadf4" # Blue
|
||||
selectedLineBgColor:
|
||||
- "#363a4f" # Surface0
|
||||
selectedRangeBgColor:
|
||||
- "#363a4f" # Surface0
|
||||
cherryPickedCommitBgColor:
|
||||
- "#8bd5ca" # Teal
|
||||
cherryPickedCommitFgColor:
|
||||
- "#8aadf4" # Blue
|
||||
unstagedChangesColor:
|
||||
- red # Red
|
||||
19
chezmoi/dot_config/lazygit/state.yml
Normal file
19
chezmoi/dot_config/lazygit/state.yml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
lastupdatecheck: 0
|
||||
recentrepos:
|
||||
- /home/aleidk/Repos/Private/dots
|
||||
- /home/aleidk/Repos/Projects/personal-page
|
||||
- /home/aleidk/Repos/Private/docs
|
||||
- /home/aleidk/Repos/Projects/blog-content
|
||||
- /home/aleidk/Repos/Private/dots/config/alacritty/themes/catppuccin
|
||||
- /home/aleidk/Repos/Projects/test-main
|
||||
- /home/aleidk/Repos/Projects/juno
|
||||
- /home/aleidk/Repos/Projects/fuuka
|
||||
- /home/aleidk/Repos/Source/gtk
|
||||
- /home/aleidk/Repos/Projects/git-test
|
||||
- /home/aleidk/Repos/Projects/test-module
|
||||
- /home/aleidk/Repos/Projects/test-main/test-module
|
||||
startuppopupversion: 5
|
||||
customcommandshistory:
|
||||
- q
|
||||
- w
|
||||
hidecommandlog: false
|
||||
174
chezmoi/dot_config/lf/colors
Normal file
174
chezmoi/dot_config/lf/colors
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
# vim:ft=dircolors
|
||||
# (This is not a dircolors file but it helps to highlight colors and comments)
|
||||
|
||||
# default values from dircolors
|
||||
# (entries with a leading # are not implemented in lf)
|
||||
# #no 00 # NORMAL
|
||||
# fi 00 # FILE
|
||||
# #rs 0 # RESET
|
||||
# di 01;34 # DIR
|
||||
# ln 01;36 # LINK
|
||||
# #mh 00 # MULTIHARDLINK
|
||||
# pi 40;33 # FIFO
|
||||
# so 01;35 # SOCK
|
||||
# #do 01;35 # DOOR
|
||||
# bd 40;33;01 # BLK
|
||||
# cd 40;33;01 # CHR
|
||||
# or 40;31;01 # ORPHAN
|
||||
# #mi 00 # MISSING
|
||||
# su 37;41 # SETUID
|
||||
# sg 30;43 # SETGID
|
||||
# #ca 30;41 # CAPABILITY
|
||||
# tw 30;42 # STICKY_OTHER_WRITABLE
|
||||
# ow 34;42 # OTHER_WRITABLE
|
||||
# st 37;44 # STICKY
|
||||
# ex 01;32 # EXEC
|
||||
|
||||
# default values from lf (with matching order)
|
||||
# ln 01;36 # LINK
|
||||
# or 31;01 # ORPHAN
|
||||
# tw 01;34 # STICKY_OTHER_WRITABLE
|
||||
# ow 01;34 # OTHER_WRITABLE
|
||||
# st 01;34 # STICKY
|
||||
# di 01;34 # DIR
|
||||
# pi 33 # FIFO
|
||||
# so 01;35 # SOCK
|
||||
# bd 33;01 # BLK
|
||||
# cd 33;01 # CHR
|
||||
# su 01;32 # SETUID
|
||||
# sg 01;32 # SETGID
|
||||
# ex 01;32 # EXEC
|
||||
# fi 00 # FILE
|
||||
|
||||
# file types (with matching order)
|
||||
ln 01;36 # LINK
|
||||
or 31;01 # ORPHAN
|
||||
tw 34 # STICKY_OTHER_WRITABLE
|
||||
ow 34 # OTHER_WRITABLE
|
||||
st 01;34 # STICKY
|
||||
di 01;34 # DIR
|
||||
pi 33 # FIFO
|
||||
so 01;35 # SOCK
|
||||
bd 33;01 # BLK
|
||||
cd 33;01 # CHR
|
||||
su 01;32 # SETUID
|
||||
sg 01;32 # SETGID
|
||||
ex 01;32 # EXEC
|
||||
fi 00 # FILE
|
||||
|
||||
# archives or compressed (dircolors defaults)
|
||||
*.tar 01;31
|
||||
*.tgz 01;31
|
||||
*.arc 01;31
|
||||
*.arj 01;31
|
||||
*.taz 01;31
|
||||
*.lha 01;31
|
||||
*.lz4 01;31
|
||||
*.lzh 01;31
|
||||
*.lzma 01;31
|
||||
*.tlz 01;31
|
||||
*.txz 01;31
|
||||
*.tzo 01;31
|
||||
*.t7z 01;31
|
||||
*.zip 01;31
|
||||
*.z 01;31
|
||||
*.dz 01;31
|
||||
*.gz 01;31
|
||||
*.lrz 01;31
|
||||
*.lz 01;31
|
||||
*.lzo 01;31
|
||||
*.xz 01;31
|
||||
*.zst 01;31
|
||||
*.tzst 01;31
|
||||
*.bz2 01;31
|
||||
*.bz 01;31
|
||||
*.tbz 01;31
|
||||
*.tbz2 01;31
|
||||
*.tz 01;31
|
||||
*.deb 01;31
|
||||
*.rpm 01;31
|
||||
*.jar 01;31
|
||||
*.war 01;31
|
||||
*.ear 01;31
|
||||
*.sar 01;31
|
||||
*.rar 01;31
|
||||
*.alz 01;31
|
||||
*.ace 01;31
|
||||
*.zoo 01;31
|
||||
*.cpio 01;31
|
||||
*.7z 01;31
|
||||
*.rz 01;31
|
||||
*.cab 01;31
|
||||
*.wim 01;31
|
||||
*.swm 01;31
|
||||
*.dwm 01;31
|
||||
*.esd 01;31
|
||||
|
||||
# image formats (dircolors defaults)
|
||||
*.jpg 01;35
|
||||
*.jpeg 01;35
|
||||
*.mjpg 01;35
|
||||
*.mjpeg 01;35
|
||||
*.gif 01;35
|
||||
*.bmp 01;35
|
||||
*.pbm 01;35
|
||||
*.pgm 01;35
|
||||
*.ppm 01;35
|
||||
*.tga 01;35
|
||||
*.xbm 01;35
|
||||
*.xpm 01;35
|
||||
*.tif 01;35
|
||||
*.tiff 01;35
|
||||
*.png 01;35
|
||||
*.svg 01;35
|
||||
*.svgz 01;35
|
||||
*.mng 01;35
|
||||
*.pcx 01;35
|
||||
*.mov 01;35
|
||||
*.mpg 01;35
|
||||
*.mpeg 01;35
|
||||
*.m2v 01;35
|
||||
*.mkv 01;35
|
||||
*.webm 01;35
|
||||
*.ogm 01;35
|
||||
*.mp4 01;35
|
||||
*.m4v 01;35
|
||||
*.mp4v 01;35
|
||||
*.vob 01;35
|
||||
*.qt 01;35
|
||||
*.nuv 01;35
|
||||
*.wmv 01;35
|
||||
*.asf 01;35
|
||||
*.rm 01;35
|
||||
*.rmvb 01;35
|
||||
*.flc 01;35
|
||||
*.avi 01;35
|
||||
*.fli 01;35
|
||||
*.flv 01;35
|
||||
*.gl 01;35
|
||||
*.dl 01;35
|
||||
*.xcf 01;35
|
||||
*.xwd 01;35
|
||||
*.yuv 01;35
|
||||
*.cgm 01;35
|
||||
*.emf 01;35
|
||||
*.ogv 01;35
|
||||
*.ogx 01;35
|
||||
|
||||
# audio formats (dircolors defaults)
|
||||
*.aac 00;36
|
||||
*.au 00;36
|
||||
*.flac 00;36
|
||||
*.m4a 00;36
|
||||
*.mid 00;36
|
||||
*.midi 00;36
|
||||
*.mka 00;36
|
||||
*.mp3 00;36
|
||||
*.mpc 00;36
|
||||
*.ogg 00;36
|
||||
*.ra 00;36
|
||||
*.wav 00;36
|
||||
*.oga 00;36
|
||||
*.opus 00;36
|
||||
*.spx 00;36
|
||||
*.xspf 00;36
|
||||
91
chezmoi/dot_config/lf/executable_preview
Normal file
91
chezmoi/dot_config/lf/executable_preview
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
#!/bin/sh
|
||||
|
||||
image() {
|
||||
geometry="$(($2-2))x$3"
|
||||
chafa "$1" -f sixel -s "$geometry" --animate false | fold -w 65535
|
||||
}
|
||||
|
||||
batorcat() {
|
||||
file="$1"
|
||||
shift
|
||||
if command -v bat > /dev/null 2>&1
|
||||
then
|
||||
bat --color=always --style=plain --pager=never "$file" "$@"
|
||||
else
|
||||
cat "$file"
|
||||
fi
|
||||
}
|
||||
|
||||
glowormdcat() {
|
||||
file="$1"
|
||||
shift
|
||||
if command -v glow > /dev/null 2>&1
|
||||
then
|
||||
glow "$file"
|
||||
else
|
||||
mdcat "$file"
|
||||
fi
|
||||
}
|
||||
|
||||
CACHE="$HOME/.cache/lf/thumbnail.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | awk '{print $1}'))"
|
||||
|
||||
case "$(printf "%s\n" "$(readlink -f "$1")" | awk '{print tolower($0)}')" in
|
||||
*.tgz|*.tar.gz) tar tzf "$1" ;;
|
||||
*.tar.bz2|*.tbz2) tar tjf "$1" ;;
|
||||
*.tar.txz|*.txz) xz --list "$1" ;;
|
||||
*.tar) tar tf "$1" ;;
|
||||
*.zip|*.jar|*.war|*.ear|*.oxt) unzip -l "$1" ;;
|
||||
*.rar) unrar l "$1" ;;
|
||||
*.md)
|
||||
glowormdcat "$1";;
|
||||
*.7z) 7z l "$1" ;;
|
||||
*.[1-8]) man "$1" | col -b ;;
|
||||
*.o) nm "$1";;
|
||||
*.torrent) transmission-show "$1" ;;
|
||||
*.iso) iso-info --no-header -l "$1" ;;
|
||||
*.odt|*.ods|*.odp|*.sxw) odt2txt "$1" ;;
|
||||
*.doc) catdoc "$1" ;;
|
||||
*.docx) docx2txt "$1" ;;
|
||||
*.xml|*.html) w3m -dump "$1";;
|
||||
*.xls|*.xlsx)
|
||||
ssconvert --export-type=Gnumeric_stf:stf_csv "$1" "fd://1" | batorcat --language=csv
|
||||
;;
|
||||
*.wav|*.mp3|*.flac|*.m4a|*.wma|*.ape|*.ac3|*.og[agx]|*.spx|*.opus|*.as[fx]|*.mka)
|
||||
exiftool "$1"
|
||||
;;
|
||||
*.pdf)
|
||||
[ ! -f "${CACHE}.jpg" ] && \
|
||||
pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE"
|
||||
image "${CACHE}.jpg" "$2" "$3" "$4" "$5"
|
||||
;;
|
||||
*.epub)
|
||||
[ ! -f "$CACHE" ] && \
|
||||
epub-thumbnailer "$1" "$CACHE" 1024
|
||||
image "$CACHE" "$2" "$3" "$4" "$5"
|
||||
;;
|
||||
*.cbz|*.cbr|*.cbt)
|
||||
[ ! -f "$CACHE" ] && \
|
||||
comicthumb "$1" "$CACHE" 1024
|
||||
image "$CACHE" "$2" "$3" "$4" "$5"
|
||||
;;
|
||||
*.avi|*.mp4|*.wmv|*.dat|*.3gp|*.ogv|*.mkv|*.mpg|*.mpeg|*.vob|*.fl[icv]|*.m2v|*.mov|*.webm|*.ts|*.mts|*.m4v|*.r[am]|*.qt|*.divx)
|
||||
[ ! -f "${CACHE}.jpg" ] && \
|
||||
ffmpegthumbnailer -i "$1" -o "${CACHE}.jpg" -s 0 -q 5
|
||||
image "${CACHE}.jpg" "$2" "$3" "$4" "$5"
|
||||
;;
|
||||
*.bmp|*.jpg|*.jpeg|*.png|*.xpm|*.webp|*.tiff|*.gif|*.jfif|*.ico)
|
||||
image "$1" "$2" "$3" "$4" "$5"
|
||||
;;
|
||||
*.svg)
|
||||
[ ! -f "${CACHE}.jpg" ] && \
|
||||
convert "$1" "${CACHE}.jpg"
|
||||
image "${CACHE}.jpg" "$2" "$3" "$4" "$5"
|
||||
;;
|
||||
*.ino)
|
||||
batorcat --language=cpp "$1"
|
||||
;;
|
||||
*)
|
||||
batorcat "$1"
|
||||
;;
|
||||
esac
|
||||
exit 0
|
||||
18
chezmoi/dot_config/lf/executable_preview.sh
Normal file
18
chezmoi/dot_config/lf/executable_preview.sh
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Five arguments are passed to the file:
|
||||
# (1) current file name
|
||||
# (2) width
|
||||
# (3) height
|
||||
# (4) horizontal position
|
||||
# (5) vertical position of preview pane
|
||||
|
||||
case "$1" in
|
||||
jpg | jpeg | png) vimiv "$1" ;;
|
||||
*.tar*) tar tf "$1" ;;
|
||||
*.zip) unzip -l "$1" ;;
|
||||
*.rar) unrar l "$1" ;;
|
||||
*.7z) 7z l "$1" ;;
|
||||
*.pdf) pdftotext "$1" - ;;
|
||||
*) bat --force-colorization --line-range ":$3" --pager never --terminal-width "$2" "$1" ;;
|
||||
esac
|
||||
357
chezmoi/dot_config/lf/icons
Normal file
357
chezmoi/dot_config/lf/icons
Normal file
|
|
@ -0,0 +1,357 @@
|
|||
# vim:ft=conf
|
||||
|
||||
# These examples require Nerd Fonts or a compatible font to be used.
|
||||
# See https://www.nerdfonts.com for more information.
|
||||
|
||||
# default values from lf (with matching order)
|
||||
# ln l # LINK
|
||||
# or l # ORPHAN
|
||||
# tw t # STICKY_OTHER_WRITABLE
|
||||
# ow d # OTHER_WRITABLE
|
||||
# st t # STICKY
|
||||
# di d # DIR
|
||||
# pi p # FIFO
|
||||
# so s # SOCK
|
||||
# bd b # BLK
|
||||
# cd c # CHR
|
||||
# su u # SETUID
|
||||
# sg g # SETGID
|
||||
# ex x # EXEC
|
||||
# fi - # FILE
|
||||
|
||||
# file types (with matching order)
|
||||
ln # LINK
|
||||
or # ORPHAN
|
||||
tw t # STICKY_OTHER_WRITABLE
|
||||
ow # OTHER_WRITABLE
|
||||
st t # STICKY
|
||||
di # DIR
|
||||
pi p # FIFO
|
||||
so s # SOCK
|
||||
bd b # BLK
|
||||
cd c # CHR
|
||||
su u # SETUID
|
||||
sg g # SETGID
|
||||
ex # EXEC
|
||||
fi # FILE
|
||||
|
||||
# file extensions (vim-devicons)
|
||||
*.styl
|
||||
*.sass
|
||||
*.scss
|
||||
*.htm
|
||||
*.html
|
||||
*.slim
|
||||
*.haml
|
||||
*.ejs
|
||||
*.css
|
||||
*.less
|
||||
*.md
|
||||
*.mdx
|
||||
*.markdown
|
||||
*.rmd
|
||||
*.json
|
||||
*.webmanifest
|
||||
*.js
|
||||
*.mjs
|
||||
*.jsx
|
||||
*.rb
|
||||
*.gemspec
|
||||
*.rake
|
||||
*.php
|
||||
*.py
|
||||
*.pyc
|
||||
*.pyo
|
||||
*.pyd
|
||||
*.coffee
|
||||
*.mustache
|
||||
*.hbs
|
||||
*.conf
|
||||
*.ini
|
||||
*.yml
|
||||
*.yaml
|
||||
*.toml
|
||||
*.bat
|
||||
*.mk
|
||||
*.jpg
|
||||
*.jpeg
|
||||
*.bmp
|
||||
*.png
|
||||
*.webp
|
||||
*.gif
|
||||
*.ico
|
||||
*.twig
|
||||
*.cpp
|
||||
*.c++
|
||||
*.cxx
|
||||
*.cc
|
||||
*.cp
|
||||
*.c
|
||||
*.cs
|
||||
*.h
|
||||
*.hh
|
||||
*.hpp
|
||||
*.hxx
|
||||
*.hs
|
||||
*.lhs
|
||||
*.nix
|
||||
*.lua
|
||||
*.java
|
||||
*.sh
|
||||
*.fish
|
||||
*.bash
|
||||
*.zsh
|
||||
*.ksh
|
||||
*.csh
|
||||
*.awk
|
||||
*.ps1
|
||||
*.ml λ
|
||||
*.mli λ
|
||||
*.diff
|
||||
*.db
|
||||
*.sql
|
||||
*.dump
|
||||
*.clj
|
||||
*.cljc
|
||||
*.cljs
|
||||
*.edn
|
||||
*.scala
|
||||
*.go
|
||||
*.dart
|
||||
*.xul
|
||||
*.sln
|
||||
*.suo
|
||||
*.pl
|
||||
*.pm
|
||||
*.t
|
||||
*.rss
|
||||
'*.f#'
|
||||
*.fsscript
|
||||
*.fsx
|
||||
*.fs
|
||||
*.fsi
|
||||
*.rs
|
||||
*.rlib
|
||||
*.d
|
||||
*.erl
|
||||
*.hrl
|
||||
*.ex
|
||||
*.exs
|
||||
*.eex
|
||||
*.leex
|
||||
*.heex
|
||||
*.vim
|
||||
*.ai
|
||||
*.psd
|
||||
*.psb
|
||||
*.ts
|
||||
*.tsx
|
||||
*.jl
|
||||
*.pp
|
||||
*.vue
|
||||
*.elm
|
||||
*.swift
|
||||
*.xcplayground
|
||||
*.tex ﭨ
|
||||
*.r ﳒ
|
||||
*.rproj 鉶
|
||||
*.sol ﲹ
|
||||
*.pem
|
||||
|
||||
# file names (vim-devicons) (case-insensitive not supported in lf)
|
||||
*gruntfile.coffee
|
||||
*gruntfile.js
|
||||
*gruntfile.ls
|
||||
*gulpfile.coffee
|
||||
*gulpfile.js
|
||||
*gulpfile.ls
|
||||
*mix.lock
|
||||
*dropbox
|
||||
*.ds_store
|
||||
*.gitconfig
|
||||
*.gitignore
|
||||
*.gitattributes
|
||||
*.gitlab-ci.yml
|
||||
*.bashrc
|
||||
*.zshrc
|
||||
*.zshenv
|
||||
*.zprofile
|
||||
*.vimrc
|
||||
*.gvimrc
|
||||
*_vimrc
|
||||
*_gvimrc
|
||||
*.bashprofile
|
||||
*favicon.ico
|
||||
*license
|
||||
*node_modules
|
||||
*react.jsx
|
||||
*procfile
|
||||
*dockerfile
|
||||
*docker-compose.yml
|
||||
*rakefile
|
||||
*config.ru
|
||||
*gemfile
|
||||
*makefile
|
||||
*cmakelists.txt
|
||||
*robots.txt ﮧ
|
||||
|
||||
# file names (case-sensitive adaptations)
|
||||
*Gruntfile.coffee
|
||||
*Gruntfile.js
|
||||
*Gruntfile.ls
|
||||
*Gulpfile.coffee
|
||||
*Gulpfile.js
|
||||
*Gulpfile.ls
|
||||
*Dropbox
|
||||
*.DS_Store
|
||||
*LICENSE
|
||||
*React.jsx
|
||||
*Procfile
|
||||
*Dockerfile
|
||||
*Docker-compose.yml
|
||||
*Rakefile
|
||||
*Gemfile
|
||||
*Makefile
|
||||
*CMakeLists.txt
|
||||
|
||||
# file patterns (vim-devicons) (patterns not supported in lf)
|
||||
# .*jquery.*\.js$
|
||||
# .*angular.*\.js$
|
||||
# .*backbone.*\.js$
|
||||
# .*require.*\.js$
|
||||
# .*materialize.*\.js$
|
||||
# .*materialize.*\.css$
|
||||
# .*mootools.*\.js$
|
||||
# .*vimrc.*
|
||||
# Vagrantfile$
|
||||
|
||||
# file patterns (file name adaptations)
|
||||
*jquery.min.js
|
||||
*angular.min.js
|
||||
*backbone.min.js
|
||||
*require.min.js
|
||||
*materialize.min.js
|
||||
*materialize.min.css
|
||||
*mootools.min.js
|
||||
*vimrc
|
||||
Vagrantfile
|
||||
|
||||
# archives or compressed (extensions from dircolors defaults)
|
||||
*.tar
|
||||
*.tgz
|
||||
*.arc
|
||||
*.arj
|
||||
*.taz
|
||||
*.lha
|
||||
*.lz4
|
||||
*.lzh
|
||||
*.lzma
|
||||
*.tlz
|
||||
*.txz
|
||||
*.tzo
|
||||
*.t7z
|
||||
*.zip
|
||||
*.z
|
||||
*.dz
|
||||
*.gz
|
||||
*.lrz
|
||||
*.lz
|
||||
*.lzo
|
||||
*.xz
|
||||
*.zst
|
||||
*.tzst
|
||||
*.bz2
|
||||
*.bz
|
||||
*.tbz
|
||||
*.tbz2
|
||||
*.tz
|
||||
*.deb
|
||||
*.rpm
|
||||
*.jar
|
||||
*.war
|
||||
*.ear
|
||||
*.sar
|
||||
*.rar
|
||||
*.alz
|
||||
*.ace
|
||||
*.zoo
|
||||
*.cpio
|
||||
*.7z
|
||||
*.rz
|
||||
*.cab
|
||||
*.wim
|
||||
*.swm
|
||||
*.dwm
|
||||
*.esd
|
||||
|
||||
# image formats (extensions from dircolors defaults)
|
||||
*.jpg
|
||||
*.jpeg
|
||||
*.mjpg
|
||||
*.mjpeg
|
||||
*.gif
|
||||
*.bmp
|
||||
*.pbm
|
||||
*.pgm
|
||||
*.ppm
|
||||
*.tga
|
||||
*.xbm
|
||||
*.xpm
|
||||
*.tif
|
||||
*.tiff
|
||||
*.png
|
||||
*.svg
|
||||
*.svgz
|
||||
*.mng
|
||||
*.pcx
|
||||
*.mov
|
||||
*.mpg
|
||||
*.mpeg
|
||||
*.m2v
|
||||
*.mkv
|
||||
*.webm
|
||||
*.ogm
|
||||
*.mp4
|
||||
*.m4v
|
||||
*.mp4v
|
||||
*.vob
|
||||
*.qt
|
||||
*.nuv
|
||||
*.wmv
|
||||
*.asf
|
||||
*.rm
|
||||
*.rmvb
|
||||
*.flc
|
||||
*.avi
|
||||
*.fli
|
||||
*.flv
|
||||
*.gl
|
||||
*.dl
|
||||
*.xcf
|
||||
*.xwd
|
||||
*.yuv
|
||||
*.cgm
|
||||
*.emf
|
||||
*.ogv
|
||||
*.ogx
|
||||
|
||||
# audio formats (extensions from dircolors defaults)
|
||||
*.aac
|
||||
*.au
|
||||
*.flac
|
||||
*.m4a
|
||||
*.mid
|
||||
*.midi
|
||||
*.mka
|
||||
*.mp3
|
||||
*.mpc
|
||||
*.ogg
|
||||
*.ra
|
||||
*.wav
|
||||
*.oga
|
||||
*.opus
|
||||
*.spx
|
||||
*.xspf
|
||||
|
||||
# other formats
|
||||
*.pdf
|
||||
117
chezmoi/dot_config/lf/lfrc
Normal file
117
chezmoi/dot_config/lf/lfrc
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
# interpreter for shell commands
|
||||
set shell sh
|
||||
|
||||
# set '-eu' options for shell commands
|
||||
# These options are used to have safer shell commands. Option '-e' is used to
|
||||
# exit on error and option '-u' is used to give error for unset variables.
|
||||
# Option '-f' disables pathname expansion which can be useful when $f, $fs, and
|
||||
# $fx variables contain names with '*' or '?' characters. However, this option
|
||||
# is used selectively within individual commands as it can be limiting at
|
||||
# times.
|
||||
set shellopts '-eu'
|
||||
|
||||
# set internal field separator (IFS) to "\n" for shell commands
|
||||
# This is useful to automatically split file names in $fs and $fx properly
|
||||
# since default file separator used in these variables (i.e. 'filesep' option)
|
||||
# is newline. You need to consider the values of these options and create your
|
||||
# commands accordingly.
|
||||
set ifs "\n"
|
||||
|
||||
# leave some space at the top and the bottom of the screen
|
||||
set scrolloff 15
|
||||
|
||||
# Previewer script
|
||||
set previewer ~/.config/lf/preview.sh
|
||||
|
||||
# Use the `dim` attribute instead of underline for the cursor in the preview pane
|
||||
set cursorpreviewfmt "\033[7;2m"
|
||||
|
||||
# Enable icons
|
||||
set icons
|
||||
|
||||
# use enter for shell commands
|
||||
map <enter> shell
|
||||
|
||||
# show the result of execution of previous commands
|
||||
map ` !true
|
||||
|
||||
# execute current file (must be executable)
|
||||
map x $$f
|
||||
map X !$f
|
||||
|
||||
# dedicated keys for file opener actions
|
||||
map o &mimeopen $f
|
||||
map O $mimeopen --ask $f
|
||||
|
||||
# define a custom 'open' command
|
||||
# This command is called when current file is not a directory. You may want to
|
||||
# use either file extensions and/or mime types here. Below uses an editor for
|
||||
# text files and a file opener for the rest.
|
||||
cmd open &{{
|
||||
case $(file --mime-type -Lb $f) in
|
||||
text/*) lf -remote "send $id \$$EDITOR \$fx";;
|
||||
*) for f in $fx; do $OPENER $f > /dev/null 2> /dev/null & done;;
|
||||
esac
|
||||
}}
|
||||
|
||||
# mkdir command. See wiki if you want it to select created dir
|
||||
map a :push %mkdir -p<space>
|
||||
|
||||
# move current file or selected files to trash folder
|
||||
# cmd trash %trash-put $fx
|
||||
|
||||
# move current file or selected files to trash folder, with prompt
|
||||
cmd trash ${{
|
||||
set -f
|
||||
clear
|
||||
printf "$fx\n"
|
||||
printf "move selected files to trash? [y/N]"
|
||||
read ans
|
||||
[ "$ans" = "y" ] && trash-put $fx || printf ""
|
||||
}}
|
||||
|
||||
# use '<delete>' key for either 'trash' or 'delete' command
|
||||
map <delete> trash
|
||||
# map <delete> delete
|
||||
|
||||
# extract the current file with the right command
|
||||
# (xkcd link: https://xkcd.com/1168/)
|
||||
cmd extract ${{
|
||||
set -f
|
||||
case $f in
|
||||
*.tar.bz|*.tar.bz2|*.tbz|*.tbz2) tar xjvf $f;;
|
||||
*.tar.gz|*.tgz) tar xzvf $f;;
|
||||
*.tar.xz|*.txz) tar xJvf $f;;
|
||||
*.zip) unzip $f;;
|
||||
*.rar) unrar x $f;;
|
||||
*.7z) 7z x $f;;
|
||||
esac
|
||||
}}
|
||||
|
||||
# compress current file or selected files with tar and gunzip
|
||||
cmd tar ${{
|
||||
set -f
|
||||
mkdir $1
|
||||
cp -r $fx $1
|
||||
tar czf $1.tar.gz $1
|
||||
rm -rf $1
|
||||
}}
|
||||
|
||||
# compress current file or selected files with zip
|
||||
cmd zip ${{
|
||||
set -f
|
||||
mkdir $1
|
||||
cp -r $fx $1
|
||||
zip -r $1.zip $1
|
||||
rm -rf $1
|
||||
}}
|
||||
|
||||
cmd mega-extract ${{
|
||||
printf " Enter compresion type: "
|
||||
read compression
|
||||
|
||||
printf " Enter link: "
|
||||
read link
|
||||
|
||||
download-mega-extract "$compression" "$PWD" "$link"
|
||||
}}
|
||||
11
chezmoi/dot_config/mako/config
Normal file
11
chezmoi/dot_config/mako/config
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
default-timeout=5000
|
||||
|
||||
# Colors
|
||||
|
||||
background-color=#24273a
|
||||
text-color=#cad3f5
|
||||
border-color=#8aadf4
|
||||
progress-color=over #363a4f
|
||||
|
||||
[urgency=high]
|
||||
border-color=#f5a97f
|
||||
10
chezmoi/dot_config/mise/config.toml
Normal file
10
chezmoi/dot_config/mise/config.toml
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
[tools]
|
||||
node = 'lts'
|
||||
# python = {version='3', virtualenv='.venv'}
|
||||
python = {version='3'} # setting virtualenv adds a virtualenv in every directory
|
||||
php = "8.2"
|
||||
|
||||
[settings]
|
||||
[alias.node]
|
||||
my_custom_node = '20' # makes `rtx install node@my_custom_node` install node-20.x
|
||||
# this can also be specified in a plugin (see below in "Aliases")
|
||||
155
chezmoi/dot_config/mpv/encoding.rst
Normal file
155
chezmoi/dot_config/mpv/encoding.rst
Normal file
|
|
@ -0,0 +1,155 @@
|
|||
General usage
|
||||
=============
|
||||
|
||||
::
|
||||
|
||||
mpv infile -o outfile [-of outfileformat] [-ofopts formatoptions] [-orawts] \
|
||||
[(any other mpv options)] \
|
||||
-ovc outvideocodec [-ovcopts outvideocodecoptions] \
|
||||
-oac outaudiocodec [-oacopts outaudiocodecoptions]
|
||||
|
||||
Help for these options is provided if giving help as parameter, as in::
|
||||
|
||||
mpv -ovc help
|
||||
|
||||
The suboptions of these generally are identical to ffmpeg's (as option parsing
|
||||
is simply delegated to ffmpeg). The option -ocopyts enables copying timestamps
|
||||
from the source as-is, instead of fixing them to match audio playback time
|
||||
(note: this doesn't work with all output container formats); -orawts even turns
|
||||
off discontinuity fixing.
|
||||
|
||||
Note that if neither -ofps nor -oautofps is specified, VFR encoding is assumed
|
||||
and the time base is 24000fps. -oautofps sets -ofps to a guessed fps number
|
||||
from the input video. Note that not all codecs and not all formats support VFR
|
||||
encoding, and some which do have bugs when a target bitrate is specified - use
|
||||
-ofps or -oautofps to force CFR encoding in these cases.
|
||||
|
||||
Of course, the options can be stored in a profile, like this .config/mpv/mpv.conf
|
||||
section::
|
||||
|
||||
[myencprofile]
|
||||
vf-add = scale=480:-2
|
||||
ovc = libx264
|
||||
ovcopts-add = preset=medium
|
||||
ovcopts-add = tune=fastdecode
|
||||
ovcopts-add = crf=23
|
||||
ovcopts-add = maxrate=1500k
|
||||
ovcopts-add = bufsize=1000k
|
||||
ovcopts-add = rc_init_occupancy=900k
|
||||
ovcopts-add = refs=2
|
||||
ovcopts-add = profile=baseline
|
||||
oac = aac
|
||||
oacopts-add = b=96k
|
||||
|
||||
It's also possible to define default encoding options by putting them into
|
||||
the section named ``[encoding]``. (This behavior changed after mpv 0.3.x. In
|
||||
mpv 0.3.x, config options in the default section / no section were applied
|
||||
to encoding. This is not the case anymore.)
|
||||
|
||||
One can then encode using this profile using the command::
|
||||
|
||||
mpv infile -o outfile.mp4 -profile myencprofile
|
||||
|
||||
Some example profiles are provided in a file
|
||||
etc/encoding-profiles.conf; as for this, see below.
|
||||
|
||||
|
||||
Encoding examples
|
||||
=================
|
||||
|
||||
These are some examples of encoding targets this code has been used and tested
|
||||
for.
|
||||
|
||||
Typical MPEG-4 Part 2 ("ASP", "DivX") encoding, AVI container::
|
||||
|
||||
mpv infile -o outfile.avi \
|
||||
--vf=fps=25 \
|
||||
-ovc mpeg4 -ovcopts qscale=4 \
|
||||
-oac libmp3lame -oacopts ab=128k
|
||||
|
||||
Note: AVI does not support variable frame rate, so the fps filter must be used.
|
||||
The frame rate should ideally match the input (25 for PAL, 24000/1001 or
|
||||
30000/1001 for NTSC)
|
||||
|
||||
Typical MPEG-4 Part 10 ("AVC", "H.264") encoding, Matroska (MKV) container::
|
||||
|
||||
mpv infile -o outfile.mkv \
|
||||
-ovc libx264 -ovcopts preset=medium,crf=23,profile=baseline \
|
||||
-oac libvorbis -oacopts qscale=3
|
||||
|
||||
Typical MPEG-4 Part 10 ("AVC", "H.264") encoding, MPEG-4 (MP4) container::
|
||||
|
||||
mpv infile -o outfile.mp4 \
|
||||
-ovc libx264 -ovcopts preset=medium,crf=23,profile=baseline \
|
||||
-oac aac -oacopts ab=128k
|
||||
|
||||
Typical VP8 encoding, WebM (restricted Matroska) container::
|
||||
|
||||
mpv infile -o outfile.mkv \
|
||||
-of webm \
|
||||
-ovc libvpx -ovcopts qmin=6,b=1000000k \
|
||||
-oac libvorbis -oacopts qscale=3
|
||||
|
||||
|
||||
Device targets
|
||||
==============
|
||||
|
||||
As the options for various devices can get complex, profiles can be used.
|
||||
|
||||
An example profile file for encoding is provided in
|
||||
etc/encoding-profiles.conf in the source tree. This file is installed and loaded
|
||||
by default. If you want to modify it, you can replace and it with your own copy
|
||||
by doing::
|
||||
|
||||
mkdir -p ~/.mpv
|
||||
cp /etc/mpv/encoding-profiles.conf ~/.mpv/encoding-profiles.conf
|
||||
|
||||
Keep in mind that the default profile is the playback one. If you want to add
|
||||
options that apply only in encoding mode, put them into a ``[encoding]``
|
||||
section.
|
||||
|
||||
Refer to the top of that file for more comments - in a nutshell, the following
|
||||
options are added by it::
|
||||
|
||||
-profile enc-to-dvdpal DVD-Video PAL, use dvdauthor -v pal+4:3 -a ac3+en
|
||||
-profile enc-to-dvdntsc DVD-Video NTSC, use dvdauthor -v ntsc+4:3 -a ac3+en
|
||||
-profile enc-to-bb-9000 MP4 for Blackberry Bold 9000
|
||||
-profile enc-to-nok-6300 3GP for Nokia 6300
|
||||
-profile enc-to-psp MP4 for PlayStation Portable
|
||||
-profile enc-to-iphone MP4 for iPhone
|
||||
-profile enc-to-iphone-4 MP4 for iPhone 4 (double res)
|
||||
-profile enc-to-iphone-5 MP4 for iPhone 5 (even larger res)
|
||||
|
||||
You can encode using these with a command line like::
|
||||
|
||||
mpv infile -o outfile.mp4 -profile enc-to-bb-9000
|
||||
|
||||
Of course, you are free to override options set by these profiles by specifying
|
||||
them after the -profile option.
|
||||
|
||||
|
||||
What works
|
||||
==========
|
||||
|
||||
* Encoding at variable frame rate (default)
|
||||
* Encoding at constant frame rate using --vf=fps=RATE
|
||||
* 2-pass encoding (specify flags=+pass1 in the first pass's -ovcopts, specify
|
||||
flags=+pass2 in the second pass)
|
||||
* Hardcoding subtitles using vobsub, ass or srt subtitle rendering (just
|
||||
configure mpv for the subtitles as usual)
|
||||
* Hardcoding any other mpv OSD (e.g. time codes, using -osdlevel 3 and -vf
|
||||
expand=::::1)
|
||||
* Encoding directly from a DVD, network stream, webcam, or any other source
|
||||
mpv supports
|
||||
* Using x264 presets/tunings/profiles (by using profile=, tune=, preset= in the
|
||||
-ovcopts)
|
||||
* Deinterlacing/Inverse Telecine with any of mpv's filters for that
|
||||
* Audio file converting: mpv -o outfile.mp3 infile.flac -no-video -oac
|
||||
libmp3lame -oacopts ab=320k
|
||||
|
||||
What does not work yet
|
||||
======================
|
||||
|
||||
* 3-pass encoding (ensuring constant total size and bitrate constraints while
|
||||
having VBR audio; mencoder calls this "frameno")
|
||||
* Direct stream copy
|
||||
191
chezmoi/dot_config/mpv/input.conf
Normal file
191
chezmoi/dot_config/mpv/input.conf
Normal file
|
|
@ -0,0 +1,191 @@
|
|||
# mpv keybindings
|
||||
#
|
||||
# Location of user-defined bindings: ~/.config/mpv/input.conf
|
||||
#
|
||||
# Lines starting with # are comments. Use SHARP to assign the # key.
|
||||
# Copy this file and uncomment and edit the bindings you want to change.
|
||||
#
|
||||
# List of commands and further details: DOCS/man/input.rst
|
||||
# List of special keys: --input-keylist
|
||||
# Keybindings testing mode: mpv --input-test --force-window --idle
|
||||
#
|
||||
# Use 'ignore' to unbind a key fully (e.g. 'ctrl+a ignore').
|
||||
#
|
||||
# Strings need to be quoted and escaped:
|
||||
# KEY show-text "This is a single backslash: \\ and a quote: \" !"
|
||||
#
|
||||
# You can use modifier-key combinations like Shift+Left or Ctrl+Alt+x with
|
||||
# the modifiers Shift, Ctrl, Alt and Meta (may not work on the terminal).
|
||||
#
|
||||
# The default keybindings are hardcoded into the mpv binary.
|
||||
# You can disable them completely with: --no-input-default-bindings
|
||||
|
||||
# Developer note:
|
||||
# On compilation, this file is baked into the mpv binary, and all lines are
|
||||
# uncommented (unless '#' is followed by a space) - thus this file defines the
|
||||
# default key bindings.
|
||||
|
||||
# If this is enabled, treat all the following bindings as default.
|
||||
#default-bindings start
|
||||
|
||||
#MBTN_LEFT ignore # don't do anything
|
||||
#MBTN_LEFT_DBL cycle fullscreen # toggle fullscreen
|
||||
#MBTN_RIGHT cycle pause # toggle pause/playback mode
|
||||
#MBTN_BACK playlist-prev # skip to the previous file
|
||||
#MBTN_FORWARD playlist-next # skip to the next file
|
||||
|
||||
# Mouse wheels, touchpad or other input devices that have axes
|
||||
# if the input devices supports precise scrolling it will also scale the
|
||||
# numeric value accordingly
|
||||
#WHEEL_UP seek 10 # seek 10 seconds forward
|
||||
#WHEEL_DOWN seek -10 # seek 10 seconds backward
|
||||
#WHEEL_LEFT add volume -2
|
||||
#WHEEL_RIGHT add volume 2
|
||||
|
||||
## Seek units are in seconds, but note that these are limited by keyframes
|
||||
#RIGHT seek 5 # seek 5 seconds forward
|
||||
#LEFT seek -5 # seek 5 seconds backward
|
||||
#UP seek 60 # seek 1 minute forward
|
||||
#DOWN seek -60 # seek 1 minute backward
|
||||
# Do smaller, always exact (non-keyframe-limited), seeks with shift.
|
||||
# Don't show them on the OSD (no-osd).
|
||||
#Shift+RIGHT no-osd seek 1 exact # seek exactly 1 second forward
|
||||
#Shift+LEFT no-osd seek -1 exact # seek exactly 1 second backward
|
||||
#Shift+UP no-osd seek 5 exact # seek exactly 5 seconds forward
|
||||
#Shift+DOWN no-osd seek -5 exact # seek exactly 5 seconds backward
|
||||
#Ctrl+LEFT no-osd sub-seek -1 # seek to the previous subtitle
|
||||
#Ctrl+RIGHT no-osd sub-seek 1 # seek to the next subtitle
|
||||
#Ctrl+Shift+LEFT sub-step -1 # change subtitle timing such that the previous subtitle is displayed
|
||||
#Ctrl+Shift+RIGHT sub-step 1 # change subtitle timing such that the next subtitle is displayed
|
||||
#Alt+left add video-pan-x 0.1 # move the video right
|
||||
#Alt+right add video-pan-x -0.1 # move the video left
|
||||
#Alt+up add video-pan-y 0.1 # move the video down
|
||||
#Alt+down add video-pan-y -0.1 # move the video up
|
||||
#Alt++ add video-zoom 0.1 # zoom in
|
||||
#Alt+- add video-zoom -0.1 # zoom out
|
||||
#Alt+BS set video-zoom 0 ; set video-pan-x 0 ; set video-pan-y 0 # reset zoom and pan settings
|
||||
#PGUP add chapter 1 # seek to the next chapter
|
||||
#PGDWN add chapter -1 # seek to the previous chapter
|
||||
#Shift+PGUP seek 600 # seek 10 minutes forward
|
||||
#Shift+PGDWN seek -600 # seek 10 minutes backward
|
||||
#[ multiply speed 1/1.1 # decrease the playback speed
|
||||
#] multiply speed 1.1 # increase the playback speed
|
||||
#{ multiply speed 0.5 # halve the playback speed
|
||||
#} multiply speed 2.0 # double the playback speed
|
||||
#BS set speed 1.0 # reset the speed to normal
|
||||
#Shift+BS revert-seek # undo the previous (or marked) seek
|
||||
#Shift+Ctrl+BS revert-seek mark # mark the position for revert-seek
|
||||
#q quit
|
||||
#Q quit-watch-later # exit and remember the playback position
|
||||
#q {encode} quit 4
|
||||
#ESC set fullscreen no # leave fullscreen
|
||||
#ESC {encode} quit 4
|
||||
#p cycle pause # toggle pause/playback mode
|
||||
#. frame-step # advance one frame and pause
|
||||
#, frame-back-step # go back by one frame and pause
|
||||
#SPACE cycle pause # toggle pause/playback mode
|
||||
#> playlist-next # skip to the next file
|
||||
#ENTER playlist-next # skip to the next file
|
||||
#< playlist-prev # skip to the previous file
|
||||
#O no-osd cycle-values osd-level 3 1 # toggle displaying the OSD on user interaction or always
|
||||
#o show-progress # show playback progress
|
||||
#P show-progress # show playback progress
|
||||
#i script-binding stats/display-stats # display information and statistics
|
||||
#I script-binding stats/display-stats-toggle # toggle displaying information and statistics
|
||||
#` script-binding console/enable # open the console
|
||||
#z add sub-delay -0.1 # shift subtitles 100 ms earlier
|
||||
#Z add sub-delay +0.1 # delay subtitles by 100 ms
|
||||
#x add sub-delay +0.1 # delay subtitles by 100 ms
|
||||
#ctrl++ add audio-delay 0.100 # change audio/video sync by delaying the audio
|
||||
#ctrl+- add audio-delay -0.100 # change audio/video sync by shifting the audio earlier
|
||||
#Shift+g add sub-scale +0.1 # increase the subtitle font size
|
||||
#Shift+f add sub-scale -0.1 # decrease the subtitle font size
|
||||
#9 add volume -2
|
||||
#/ add volume -2
|
||||
#0 add volume 2
|
||||
#* add volume 2
|
||||
#m cycle mute # toggle mute
|
||||
#1 add contrast -1
|
||||
#2 add contrast 1
|
||||
#3 add brightness -1
|
||||
#4 add brightness 1
|
||||
#5 add gamma -1
|
||||
#6 add gamma 1
|
||||
#7 add saturation -1
|
||||
#8 add saturation 1
|
||||
#Alt+0 set current-window-scale 0.5 # halve the window size
|
||||
#Alt+1 set current-window-scale 1.0 # reset the window size
|
||||
#Alt+2 set current-window-scale 2.0 # double the window size
|
||||
#d cycle deinterlace # toggle the deinterlacing filter
|
||||
#r add sub-pos -1 # move subtitles up
|
||||
#R add sub-pos +1 # move subtitles down
|
||||
#t add sub-pos +1 # move subtitles down
|
||||
#v cycle sub-visibility # hide or show the subtitles
|
||||
#Alt+v cycle secondary-sub-visibility # hide or show the secondary subtitles
|
||||
#V cycle sub-ass-vsfilter-aspect-compat # toggle stretching SSA/ASS subtitles with anamorphic videos to match the historical renderer
|
||||
#u cycle-values sub-ass-override "force" "no" # toggle overriding SSA/ASS subtitle styles with the normal styles
|
||||
#j cycle sub # switch subtitle track
|
||||
#J cycle sub down # switch subtitle track backwards
|
||||
#SHARP cycle audio # switch audio track
|
||||
#_ cycle video # switch video track
|
||||
#T cycle ontop # toggle placing the video on top of other windows
|
||||
#f cycle fullscreen # toggle fullscreen
|
||||
#s screenshot # take a screenshot of the video in its original resolution with subtitles
|
||||
#S screenshot video # take a screenshot of the video in its original resolution without subtitles
|
||||
#Ctrl+s screenshot window # take a screenshot of the window with OSD and subtitles
|
||||
#Alt+s screenshot each-frame # automatically screenshot every frame; issue this command again to stop taking screenshots
|
||||
#w add panscan -0.1 # decrease panscan
|
||||
#W add panscan +0.1 # shrink black bars by cropping the video
|
||||
#e add panscan +0.1 # shrink black bars by cropping the video
|
||||
#A cycle-values video-aspect-override "16:9" "4:3" "2.35:1" "-1" # cycle the video aspect ratio ("-1" is the container aspect)
|
||||
#POWER quit
|
||||
#PLAY cycle pause # toggle pause/playback mode
|
||||
#PAUSE cycle pause # toggle pause/playback mode
|
||||
#PLAYPAUSE cycle pause # toggle pause/playback mode
|
||||
#PLAYONLY set pause no # unpause
|
||||
#PAUSEONLY set pause yes # pause
|
||||
#STOP quit
|
||||
#FORWARD seek 60 # seek 1 minute forward
|
||||
#REWIND seek -60 # seek 1 minute backward
|
||||
#NEXT playlist-next # skip to the next file
|
||||
#PREV playlist-prev # skip to the previous file
|
||||
#VOLUME_UP add volume 2
|
||||
#VOLUME_DOWN add volume -2
|
||||
#MUTE cycle mute # toggle mute
|
||||
#CLOSE_WIN quit
|
||||
#CLOSE_WIN {encode} quit 4
|
||||
#ctrl+w quit
|
||||
#E cycle edition # switch edition
|
||||
#l ab-loop # set/clear A-B loop points
|
||||
#L cycle-values loop-file "inf" "no" # toggle infinite looping
|
||||
#ctrl+c quit 4
|
||||
#DEL script-binding osc/visibility # cycle OSC visibility between never, auto (mouse-move) and always
|
||||
#ctrl+h cycle-values hwdec "auto" "no" # toggle hardware decoding
|
||||
#F8 show-text ${playlist} # show the playlist
|
||||
#F9 show-text ${track-list} # show the list of video, audio and sub tracks
|
||||
|
||||
#
|
||||
# Legacy bindings (may or may not be removed in the future)
|
||||
#
|
||||
#! add chapter -1 # seek to the previous chapter
|
||||
#@ add chapter 1 # seek to the next chapter
|
||||
|
||||
#
|
||||
# Not assigned by default
|
||||
# (not an exhaustive list of unbound commands)
|
||||
#
|
||||
|
||||
# ? cycle sub-forced-only # toggle DVD forced subs
|
||||
# ? stop # stop playback (quit or enter idle mode)
|
||||
|
||||
|
||||
### Shaders ###
|
||||
|
||||
CTRL+1 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl"; show-text "Anime4K: Mode A (HQ)"
|
||||
CTRL+2 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_Soft_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl"; show-text "Anime4K: Mode B (HQ)"
|
||||
CTRL+3 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl"; show-text "Anime4K: Mode C (HQ)"
|
||||
CTRL+4 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_Restore_CNN_M.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl"; show-text "Anime4K: Mode A+A (HQ)"
|
||||
CTRL+5 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_Soft_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Restore_CNN_Soft_M.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl"; show-text "Anime4K: Mode B+B (HQ)"
|
||||
CTRL+6 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Restore_CNN_M.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl"; show-text "Anime4K: Mode C+A (HQ)"
|
||||
|
||||
CTRL+0 no-osd change-list glsl-shaders clr ""; show-text "GLSL shaders cleared"
|
||||
93
chezmoi/dot_config/mpv/mplayer-input.conf
Normal file
93
chezmoi/dot_config/mpv/mplayer-input.conf
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
##
|
||||
## MPlayer-style key bindings
|
||||
##
|
||||
## Save it as ~/.config/mpv/input.conf to use it.
|
||||
##
|
||||
## Generally, it's recommended to use this as reference-only.
|
||||
##
|
||||
|
||||
RIGHT seek +10
|
||||
LEFT seek -10
|
||||
DOWN seek -60
|
||||
UP seek +60
|
||||
PGUP seek 600
|
||||
PGDWN seek -600
|
||||
m cycle mute
|
||||
SHARP cycle audio # switch audio streams
|
||||
+ add audio-delay 0.100
|
||||
= add audio-delay 0.100
|
||||
- add audio-delay -0.100
|
||||
[ multiply speed 0.9091 # scale playback speed
|
||||
] multiply speed 1.1
|
||||
{ multiply speed 0.5
|
||||
} multiply speed 2.0
|
||||
BS set speed 1.0 # reset speed to normal
|
||||
q quit
|
||||
ESC quit
|
||||
ENTER playlist-next force # skip to next file
|
||||
p cycle pause
|
||||
. frame-step # advance one frame and pause
|
||||
SPACE cycle pause
|
||||
HOME set playlist-pos 0 # not the same as MPlayer
|
||||
#END pt_up_step -1
|
||||
> playlist-next # skip to next file
|
||||
< playlist-prev # previous
|
||||
#INS alt_src_step 1
|
||||
#DEL alt_src_step -1
|
||||
o osd
|
||||
I show-text "${filename}" # display filename in osd
|
||||
P show-progress
|
||||
z add sub-delay -0.1 # subtract 100 ms delay from subs
|
||||
x add sub-delay +0.1 # add
|
||||
9 add volume -1
|
||||
/ add volume -1
|
||||
0 add volume 1
|
||||
* add volume 1
|
||||
1 add contrast -1
|
||||
2 add contrast 1
|
||||
3 add brightness -1
|
||||
4 add brightness 1
|
||||
5 add hue -1
|
||||
6 add hue 1
|
||||
7 add saturation -1
|
||||
8 add saturation 1
|
||||
( add balance -0.1 # adjust audio balance in favor of left
|
||||
) add balance +0.1 # right
|
||||
d cycle framedrop
|
||||
D cycle deinterlace # toggle deinterlacer (auto-inserted filter)
|
||||
r add sub-pos -1 # move subtitles up
|
||||
t add sub-pos +1 # down
|
||||
#? sub-step +1 # immediately display next subtitle
|
||||
#? sub-step -1 # previous
|
||||
#? add sub-scale +0.1 # increase subtitle font size
|
||||
#? add sub-scale -0.1 # decrease subtitle font size
|
||||
f cycle fullscreen
|
||||
T cycle ontop # toggle video window ontop of other windows
|
||||
w add panscan -0.1 # zoom out with -panscan 0 -fs
|
||||
e add panscan +0.1 # in
|
||||
c cycle stream-capture # save (and append) file/stream to stream.dump with -capture
|
||||
s screenshot # take a screenshot (if you want PNG, use "--screenshot-format=png")
|
||||
S screenshot - each-frame # S will take a png screenshot of every frame
|
||||
|
||||
h cycle tv-channel 1
|
||||
l cycle tv-channel -1
|
||||
n cycle tv-norm
|
||||
#b tv_step_chanlist
|
||||
|
||||
#? add chapter -1 # skip to previous dvd chapter
|
||||
#? add chapter +1 # next
|
||||
|
||||
##
|
||||
## Advanced seek
|
||||
## Uncomment the following lines to be able to seek to n% of the media with
|
||||
## the Fx keys.
|
||||
##
|
||||
#F1 seek 10 absolute-percent
|
||||
#F2 seek 20 absolute-percent
|
||||
#F3 seek 30 absolute-percent
|
||||
#F4 seek 40 absolute-percent
|
||||
#F5 seek 50 absolute-percent
|
||||
#F6 seek 60 absolute-percent
|
||||
#F7 seek 70 absolute-percent
|
||||
#F8 seek 80 absolute-percent
|
||||
#F9 seek 90 absolute-percent
|
||||
155
chezmoi/dot_config/mpv/mpv.conf
Normal file
155
chezmoi/dot_config/mpv/mpv.conf
Normal file
|
|
@ -0,0 +1,155 @@
|
|||
#
|
||||
# Example mpv configuration file
|
||||
#
|
||||
# Warning:
|
||||
#
|
||||
# The commented example options usually do _not_ set the default values. Call
|
||||
# mpv with --list-options to see the default values for most options. There is
|
||||
# no builtin or example mpv.conf with all the defaults.
|
||||
#
|
||||
#
|
||||
# Configuration files are read system-wide from /usr/local/etc/mpv.conf
|
||||
# and per-user from ~/.config/mpv/mpv.conf, where per-user settings override
|
||||
# system-wide settings, all of which are overridden by the command line.
|
||||
#
|
||||
# Configuration file settings and the command line options use the same
|
||||
# underlying mechanisms. Most options can be put into the configuration file
|
||||
# by dropping the preceding '--'. See the man page for a complete list of
|
||||
# options.
|
||||
#
|
||||
# Lines starting with '#' are comments and are ignored.
|
||||
#
|
||||
# See the CONFIGURATION FILES section in the man page
|
||||
# for a detailed description of the syntax.
|
||||
#
|
||||
# Profiles should be placed at the bottom of the configuration file to ensure
|
||||
# that settings wanted as defaults are not restricted to specific profiles.
|
||||
|
||||
##################
|
||||
# video settings #
|
||||
##################
|
||||
|
||||
# Start in fullscreen mode by default.
|
||||
#fs=yes
|
||||
|
||||
# force starting with centered window
|
||||
#geometry=50%:50%
|
||||
|
||||
# don't allow a new window to have a size larger than 90% of the screen size
|
||||
#autofit-larger=90%x90%
|
||||
|
||||
# Do not close the window on exit.
|
||||
#keep-open=yes
|
||||
|
||||
# Do not wait with showing the video window until it has loaded. (This will
|
||||
# resize the window once video is loaded. Also always shows a window with
|
||||
# audio.)
|
||||
#force-window=immediate
|
||||
|
||||
# Disable the On Screen Controller (OSC).
|
||||
osc=no
|
||||
|
||||
# Keep the player window on top of all other windows.
|
||||
#ontop=yes
|
||||
|
||||
# Specify high quality video rendering preset (for --vo=gpu only)
|
||||
# Can cause performance problems with some drivers and GPUs.
|
||||
profile=gpu-hq
|
||||
# scale=ewa_lanczossharp
|
||||
# cscale=ewa_lanczossharp
|
||||
|
||||
|
||||
# Force video to lock on the display's refresh rate, and change video and audio
|
||||
# speed to some degree to ensure synchronous playback - can cause problems
|
||||
# with some drivers and desktop environments.
|
||||
# video-sync=display-resample
|
||||
# interpolation
|
||||
# tscale=oversample
|
||||
|
||||
# Enable hardware decoding if available. Often, this does not work with all
|
||||
# video outputs, but should work well with default settings on most systems.
|
||||
# If performance or energy usage is an issue, forcing the vdpau or vaapi VOs
|
||||
# may or may not help.
|
||||
#hwdec=auto
|
||||
|
||||
##################
|
||||
# audio settings #
|
||||
##################
|
||||
|
||||
# Specify default audio device. You can list devices with: --audio-device=help
|
||||
# The option takes the device string (the stuff between the '...').
|
||||
#audio-device=alsa/default
|
||||
|
||||
# Do not filter audio to keep pitch when changing playback speed.
|
||||
#audio-pitch-correction=no
|
||||
|
||||
# Output 5.1 audio natively, and upmix/downmix audio with a different format.
|
||||
#audio-channels=5.1
|
||||
# Disable any automatic remix, _if_ the audio output accepts the audio format.
|
||||
# of the currently played file. See caveats mentioned in the manpage.
|
||||
# (The default is "auto-safe", see manpage.)
|
||||
#audio-channels=auto
|
||||
|
||||
##################
|
||||
# other settings #
|
||||
##################
|
||||
|
||||
# Pretend to be a web browser. Might fix playback with some streaming sites,
|
||||
# but also will break with shoutcast streams.
|
||||
#user-agent="Mozilla/5.0"
|
||||
|
||||
# cache settings
|
||||
#
|
||||
# Use a large seekable RAM cache even for local input.
|
||||
#cache=yes
|
||||
#
|
||||
# Use extra large RAM cache (needs cache=yes to make it useful).
|
||||
#demuxer-max-bytes=500M
|
||||
#demuxer-max-back-bytes=100M
|
||||
#
|
||||
# Disable the behavior that the player will pause if the cache goes below a
|
||||
# certain fill size.
|
||||
#cache-pause=no
|
||||
#
|
||||
# Store cache payload on the hard disk instead of in RAM. (This may negatively
|
||||
# impact performance unless used for slow input such as network.)
|
||||
#cache-dir=~/.cache/
|
||||
#cache-on-disk=yes
|
||||
|
||||
# Display English subtitles if available.
|
||||
#slang=en
|
||||
|
||||
# Play Finnish audio if available, fall back to English otherwise.
|
||||
#alang=fi,en
|
||||
|
||||
# Change subtitle encoding. For Arabic subtitles use 'cp1256'.
|
||||
# If the file seems to be valid UTF-8, prefer UTF-8.
|
||||
# (You can add '+' in front of the codepage to force it.)
|
||||
#sub-codepage=cp1256
|
||||
|
||||
# You can also include other configuration files.
|
||||
#include=/path/to/the/file/you/want/to/include
|
||||
|
||||
############
|
||||
# Profiles #
|
||||
############
|
||||
|
||||
# The options declared as part of profiles override global default settings,
|
||||
# but only take effect when the profile is active.
|
||||
|
||||
# The following profile can be enabled on the command line with: --profile=eye-cancer
|
||||
|
||||
#[eye-cancer]
|
||||
#sharpen=5
|
||||
|
||||
[twitch]
|
||||
profile-cond=get("path", ""):find("^https://www.twitch.tv/") ~= nil
|
||||
profile-restore=copy-equal
|
||||
sub-font-size=30
|
||||
sub-align-x=right
|
||||
sub-align-y=top
|
||||
|
||||
[music-stream]
|
||||
force-window=yes
|
||||
ytdl-format=bestvideo[height<=?720][fps<=?30][vcodec!=?vp9]+bestaudio/best
|
||||
window-maximized=yes
|
||||
61
chezmoi/dot_config/mpv/restore-old-bindings.conf
Normal file
61
chezmoi/dot_config/mpv/restore-old-bindings.conf
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
|
||||
# This file contains all bindings that were removed after a certain release.
|
||||
# If you want MPlayer bindings, use mplayer-input.conf
|
||||
|
||||
# Pick the bindings you want back and add them to your own input.conf. Append
|
||||
# this file to your input.conf if you want them all back:
|
||||
#
|
||||
# cat restore-old-bindings.conf >> ~/.config/mpv/input.conf
|
||||
#
|
||||
# Older installations use ~/.mpv/input.conf instead.
|
||||
|
||||
# changed in mpv 0.27.0 (macOS and Wayland only)
|
||||
|
||||
# WHEEL_UP seek 10
|
||||
# WHEEL_DOWN seek -10
|
||||
# WHEEL_LEFT seek 5
|
||||
# WHEEL_RIGHT seek -5
|
||||
|
||||
# changed in mpv 0.26.0
|
||||
|
||||
h cycle tv-channel -1 # previous channel
|
||||
k cycle tv-channel +1 # next channel
|
||||
H cycle dvb-channel-name -1 # previous channel
|
||||
K cycle dvb-channel-name +1 # next channel
|
||||
|
||||
I show-text "${filename}" # display filename in osd
|
||||
|
||||
# changed in mpv 0.24.0
|
||||
|
||||
L cycle-values loop "inf" "no"
|
||||
|
||||
# changed in mpv 0.10.0
|
||||
|
||||
O osd
|
||||
D cycle deinterlace
|
||||
d cycle framedrop
|
||||
|
||||
# changed in mpv 0.7.0
|
||||
|
||||
ENTER playlist-next force
|
||||
|
||||
# changed in mpv 0.6.0
|
||||
|
||||
ESC quit
|
||||
|
||||
# changed in mpv 0.5.0
|
||||
|
||||
PGUP seek 600
|
||||
PGDWN seek -600
|
||||
RIGHT seek 10
|
||||
LEFT seek -10
|
||||
+ add audio-delay 0.100
|
||||
- add audio-delay -0.100
|
||||
( add balance -0.1
|
||||
) add balance 0.1
|
||||
F cycle sub-forced-only
|
||||
TAB cycle program
|
||||
A cycle angle
|
||||
U stop
|
||||
o osd
|
||||
I show-text "${filename}"
|
||||
70
chezmoi/dot_config/mpv/script-opts/mpv_thumbnail_script.conf
Normal file
70
chezmoi/dot_config/mpv/script-opts/mpv_thumbnail_script.conf
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
# The thumbnail cache directory.
|
||||
# On Windows this defaults to %TEMP%\mpv_thumbs_cache,
|
||||
# and on other platforms to /tmp/mpv_thumbs_cache.
|
||||
# The directory will be created automatically, but must be writeable!
|
||||
# Use absolute paths, and take note that environment variables like %TEMP% are unsupported (despite the default)!
|
||||
cache_directory=/tmp/my_mpv_thumbnails
|
||||
# THIS IS NOT A WINDOWS PATH. COMMENT IT OUT OR ADJUST IT YOURSELF.
|
||||
|
||||
# Whether to generate thumbnails automatically on video load, without a keypress
|
||||
# Defaults to yes
|
||||
autogenerate=yes
|
||||
|
||||
# Only automatically thumbnail videos shorter than this (in seconds)
|
||||
# You will have to press T (or your own keybind) to enable the thumbnail previews
|
||||
# Set to 0 to disable the check, ie. thumbnail videos no matter how long they are
|
||||
# Defaults to 3600 (one hour)
|
||||
# autogenerate_max_duration=3600
|
||||
|
||||
# Use mpv to generate thumbnail even if ffmpeg is found in PATH
|
||||
# ffmpeg is slightly faster than mpv but lacks support for ordered chapters in MKVs,
|
||||
# which can break the resulting thumbnails. You have been warned.
|
||||
# Defaults to yes (don't use ffmpeg)
|
||||
# prefer_mpv=[yes/no]
|
||||
|
||||
# Explicitly disable subtitles on the mpv sub-calls
|
||||
# mpv can and will by default render subtitles into the thumbnails.
|
||||
# If this is not what you wish, set mpv_no_sub to yes
|
||||
# Defaults to no
|
||||
# mpv_no_sub=[yes/no]
|
||||
|
||||
# Enable to disable the built-in keybind ("T") to add your own, see after the block
|
||||
# disable_keybinds=[yes/no]
|
||||
|
||||
# The maximum dimensions of the thumbnails, in pixels
|
||||
# Defaults to 200 and 200
|
||||
# thumbnail_width=200
|
||||
# thumbnail_height=200
|
||||
|
||||
# The thumbnail count target
|
||||
# (This will result in a thumbnail every ~10 seconds for a 25 minute video)
|
||||
# thumbnail_count=150
|
||||
|
||||
# The above target count will be adjusted by the minimum and
|
||||
# maximum time difference between thumbnails.
|
||||
# The thumbnail_count will be used to calculate a target separation,
|
||||
# and min/max_delta will be used to constrict it.
|
||||
|
||||
# In other words, thumbnails will be:
|
||||
# - at least min_delta seconds apart (limiting the amount)
|
||||
# - at most max_delta seconds apart (raising the amount if needed)
|
||||
# Defaults to 5 and 90, values are seconds
|
||||
# min_delta=5
|
||||
# max_delta=90
|
||||
# 120 seconds aka 2 minutes will add more thumbnails only when the video is over 5 hours long!
|
||||
|
||||
# Below are overrides for remote urls (you generally want less thumbnails, because it's slow!)
|
||||
# Thumbnailing network paths will be done with mpv (leveraging youtube-dl)
|
||||
|
||||
# Allow thumbnailing network paths (naive check for "://")
|
||||
# Defaults to no
|
||||
# thumbnail_network=[yes/no]
|
||||
# Override thumbnail count, min/max delta, as above
|
||||
# remote_thumbnail_count=60
|
||||
# remote_min_delta=15
|
||||
# remote_max_delta=120
|
||||
|
||||
# Try to grab the raw stream and disable ytdl for the mpv subcalls
|
||||
# Much faster than passing the url to ytdl again, but may cause problems with some sites
|
||||
# Defaults to yes
|
||||
# remote_direct_stream=[yes/no]
|
||||
19
chezmoi/dot_config/mpv/scripts/mpv-i3-floating-centered.lua
Normal file
19
chezmoi/dot_config/mpv/scripts/mpv-i3-floating-centered.lua
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
local utils = require 'mp.utils'
|
||||
|
||||
local pid = utils.getpid()
|
||||
|
||||
local function center_floating_mpv()
|
||||
mpv_window_id = io.popen("xdotool search --pid " .. pid):read()
|
||||
|
||||
-- mpv can have a slight delay in launching a window, or be called without one at all
|
||||
if mpv_window_id == nil then return end
|
||||
|
||||
floating = io.popen("xprop -id " .. mpv_window_id):read("*a")
|
||||
if string.match(floating, "FLOATING") then
|
||||
os.execute("i3-msg -q '[id=" .. mpv_window_id .. "]' move position center")
|
||||
end
|
||||
end
|
||||
|
||||
mp.register_event("playback-restart", center_floating_mpv)
|
||||
-- mpv should still be centered when fullscreen is toggled
|
||||
mp.observe_property("fullscreen", "bool", center_floating_mpv)
|
||||
4336
chezmoi/dot_config/mpv/scripts/mpv_thumbnail_script_client_osc.lua
Normal file
4336
chezmoi/dot_config/mpv/scripts/mpv_thumbnail_script_client_osc.lua
Normal file
File diff suppressed because it is too large
Load diff
736
chezmoi/dot_config/mpv/scripts/mpv_thumbnail_script_server-1.lua
Normal file
736
chezmoi/dot_config/mpv/scripts/mpv_thumbnail_script_server-1.lua
Normal file
|
|
@ -0,0 +1,736 @@
|
|||
--[[
|
||||
Copyright (C) 2017 AMM
|
||||
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
--[[
|
||||
mpv_thumbnail_script.lua 0.4.7 - commit 6282073 (branch master)
|
||||
https://github.com/TheAMM/mpv_thumbnail_script
|
||||
Built on 2022-02-05 16:00:24
|
||||
]]--
|
||||
local assdraw = require 'mp.assdraw'
|
||||
local msg = require 'mp.msg'
|
||||
local opt = require 'mp.options'
|
||||
local utils = require 'mp.utils'
|
||||
|
||||
-- Determine platform --
|
||||
ON_WINDOWS = (package.config:sub(1,1) ~= '/')
|
||||
|
||||
-- Some helper functions needed to parse the options --
|
||||
function isempty(v) return (v == false) or (v == nil) or (v == "") or (v == 0) or (type(v) == "table" and next(v) == nil) end
|
||||
|
||||
function divmod (a, b)
|
||||
return math.floor(a / b), a % b
|
||||
end
|
||||
|
||||
-- Better modulo
|
||||
function bmod( i, N )
|
||||
return (i % N + N) % N
|
||||
end
|
||||
|
||||
function join_paths(...)
|
||||
local sep = ON_WINDOWS and "\\" or "/"
|
||||
local result = "";
|
||||
for i, p in pairs({...}) do
|
||||
if p ~= "" then
|
||||
if is_absolute_path(p) then
|
||||
result = p
|
||||
else
|
||||
result = (result ~= "") and (result:gsub("[\\"..sep.."]*$", "") .. sep .. p) or p
|
||||
end
|
||||
end
|
||||
end
|
||||
return result:gsub("[\\"..sep.."]*$", "")
|
||||
end
|
||||
|
||||
-- /some/path/file.ext -> /some/path, file.ext
|
||||
function split_path( path )
|
||||
local sep = ON_WINDOWS and "\\" or "/"
|
||||
local first_index, last_index = path:find('^.*' .. sep)
|
||||
|
||||
if last_index == nil then
|
||||
return "", path
|
||||
else
|
||||
local dir = path:sub(0, last_index-1)
|
||||
local file = path:sub(last_index+1, -1)
|
||||
|
||||
return dir, file
|
||||
end
|
||||
end
|
||||
|
||||
function is_absolute_path( path )
|
||||
local tmp, is_win = path:gsub("^[A-Z]:\\", "")
|
||||
local tmp, is_unix = path:gsub("^/", "")
|
||||
return (is_win > 0) or (is_unix > 0)
|
||||
end
|
||||
|
||||
function Set(source)
|
||||
local set = {}
|
||||
for _, l in ipairs(source) do set[l] = true end
|
||||
return set
|
||||
end
|
||||
|
||||
---------------------------
|
||||
-- More helper functions --
|
||||
---------------------------
|
||||
|
||||
-- Removes all keys from a table, without destroying the reference to it
|
||||
function clear_table(target)
|
||||
for key, value in pairs(target) do
|
||||
target[key] = nil
|
||||
end
|
||||
end
|
||||
function shallow_copy(target)
|
||||
local copy = {}
|
||||
for k, v in pairs(target) do
|
||||
copy[k] = v
|
||||
end
|
||||
return copy
|
||||
end
|
||||
|
||||
-- Rounds to given decimals. eg. round_dec(3.145, 0) => 3
|
||||
function round_dec(num, idp)
|
||||
local mult = 10^(idp or 0)
|
||||
return math.floor(num * mult + 0.5) / mult
|
||||
end
|
||||
|
||||
function file_exists(name)
|
||||
local f = io.open(name, "rb")
|
||||
if f ~= nil then
|
||||
local ok, err, code = f:read(1)
|
||||
io.close(f)
|
||||
return code == nil
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function path_exists(name)
|
||||
local f = io.open(name, "rb")
|
||||
if f ~= nil then
|
||||
io.close(f)
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function create_directories(path)
|
||||
local cmd
|
||||
if ON_WINDOWS then
|
||||
cmd = { args = {"cmd", "/c", "mkdir", path} }
|
||||
else
|
||||
cmd = { args = {"mkdir", "-p", path} }
|
||||
end
|
||||
utils.subprocess(cmd)
|
||||
end
|
||||
|
||||
-- Find an executable in PATH or CWD with the given name
|
||||
function find_executable(name)
|
||||
local delim = ON_WINDOWS and ";" or ":"
|
||||
|
||||
local pwd = os.getenv("PWD") or utils.getcwd()
|
||||
local path = os.getenv("PATH")
|
||||
|
||||
local env_path = pwd .. delim .. path -- Check CWD first
|
||||
|
||||
local result, filename
|
||||
for path_dir in env_path:gmatch("[^"..delim.."]+") do
|
||||
filename = join_paths(path_dir, name)
|
||||
if file_exists(filename) then
|
||||
result = filename
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
local ExecutableFinder = { path_cache = {} }
|
||||
-- Searches for an executable and caches the result if any
|
||||
function ExecutableFinder:get_executable_path( name, raw_name )
|
||||
name = ON_WINDOWS and not raw_name and (name .. ".exe") or name
|
||||
|
||||
if self.path_cache[name] == nil then
|
||||
self.path_cache[name] = find_executable(name) or false
|
||||
end
|
||||
return self.path_cache[name]
|
||||
end
|
||||
|
||||
-- Format seconds to HH.MM.SS.sss
|
||||
function format_time(seconds, sep, decimals)
|
||||
decimals = decimals == nil and 3 or decimals
|
||||
sep = sep and sep or "."
|
||||
local s = seconds
|
||||
local h, s = divmod(s, 60*60)
|
||||
local m, s = divmod(s, 60)
|
||||
|
||||
local second_format = string.format("%%0%d.%df", 2+(decimals > 0 and decimals+1 or 0), decimals)
|
||||
|
||||
return string.format("%02d"..sep.."%02d"..sep..second_format, h, m, s)
|
||||
end
|
||||
|
||||
-- Format seconds to 1h 2m 3.4s
|
||||
function format_time_hms(seconds, sep, decimals, force_full)
|
||||
decimals = decimals == nil and 1 or decimals
|
||||
sep = sep ~= nil and sep or " "
|
||||
|
||||
local s = seconds
|
||||
local h, s = divmod(s, 60*60)
|
||||
local m, s = divmod(s, 60)
|
||||
|
||||
if force_full or h > 0 then
|
||||
return string.format("%dh"..sep.."%dm"..sep.."%." .. tostring(decimals) .. "fs", h, m, s)
|
||||
elseif m > 0 then
|
||||
return string.format("%dm"..sep.."%." .. tostring(decimals) .. "fs", m, s)
|
||||
else
|
||||
return string.format("%." .. tostring(decimals) .. "fs", s)
|
||||
end
|
||||
end
|
||||
|
||||
-- Writes text on OSD and console
|
||||
function log_info(txt, timeout)
|
||||
timeout = timeout or 1.5
|
||||
msg.info(txt)
|
||||
mp.osd_message(txt, timeout)
|
||||
end
|
||||
|
||||
-- Join table items, ala ({"a", "b", "c"}, "=", "-", ", ") => "=a-, =b-, =c-"
|
||||
function join_table(source, before, after, sep)
|
||||
before = before or ""
|
||||
after = after or ""
|
||||
sep = sep or ", "
|
||||
local result = ""
|
||||
for i, v in pairs(source) do
|
||||
if not isempty(v) then
|
||||
local part = before .. v .. after
|
||||
if i == 1 then
|
||||
result = part
|
||||
else
|
||||
result = result .. sep .. part
|
||||
end
|
||||
end
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
function wrap(s, char)
|
||||
char = char or "'"
|
||||
return char .. s .. char
|
||||
end
|
||||
-- Wraps given string into 'string' and escapes any 's in it
|
||||
function escape_and_wrap(s, char, replacement)
|
||||
char = char or "'"
|
||||
replacement = replacement or "\\" .. char
|
||||
return wrap(string.gsub(s, char, replacement), char)
|
||||
end
|
||||
-- Escapes single quotes in a string and wraps the input in single quotes
|
||||
function escape_single_bash(s)
|
||||
return escape_and_wrap(s, "'", "'\\''")
|
||||
end
|
||||
|
||||
-- Returns (a .. b) if b is not empty or nil
|
||||
function joined_or_nil(a, b)
|
||||
return not isempty(b) and (a .. b) or nil
|
||||
end
|
||||
|
||||
-- Put items from one table into another
|
||||
function extend_table(target, source)
|
||||
for i, v in pairs(source) do
|
||||
table.insert(target, v)
|
||||
end
|
||||
end
|
||||
|
||||
-- Creates a handle and filename for a temporary random file (in current directory)
|
||||
function create_temporary_file(base, mode, suffix)
|
||||
local handle, filename
|
||||
suffix = suffix or ""
|
||||
while true do
|
||||
filename = base .. tostring(math.random(1, 5000)) .. suffix
|
||||
handle = io.open(filename, "r")
|
||||
if not handle then
|
||||
handle = io.open(filename, mode)
|
||||
break
|
||||
end
|
||||
io.close(handle)
|
||||
end
|
||||
return handle, filename
|
||||
end
|
||||
|
||||
|
||||
function get_processor_count()
|
||||
local proc_count
|
||||
|
||||
if ON_WINDOWS then
|
||||
proc_count = tonumber(os.getenv("NUMBER_OF_PROCESSORS"))
|
||||
else
|
||||
local cpuinfo_handle = io.open("/proc/cpuinfo")
|
||||
if cpuinfo_handle ~= nil then
|
||||
local cpuinfo_contents = cpuinfo_handle:read("*a")
|
||||
local _, replace_count = cpuinfo_contents:gsub('processor', '')
|
||||
proc_count = replace_count
|
||||
end
|
||||
end
|
||||
|
||||
if proc_count and proc_count > 0 then
|
||||
return proc_count
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
function substitute_values(string, values)
|
||||
local substitutor = function(match)
|
||||
if match == "%" then
|
||||
return "%"
|
||||
else
|
||||
-- nil is discarded by gsub
|
||||
return values[match]
|
||||
end
|
||||
end
|
||||
|
||||
local substituted = string:gsub('%%(.)', substitutor)
|
||||
return substituted
|
||||
end
|
||||
|
||||
-- ASS HELPERS --
|
||||
function round_rect_top( ass, x0, y0, x1, y1, r )
|
||||
local c = 0.551915024494 * r -- circle approximation
|
||||
ass:move_to(x0 + r, y0)
|
||||
ass:line_to(x1 - r, y0) -- top line
|
||||
if r > 0 then
|
||||
ass:bezier_curve(x1 - r + c, y0, x1, y0 + r - c, x1, y0 + r) -- top right corner
|
||||
end
|
||||
ass:line_to(x1, y1) -- right line
|
||||
ass:line_to(x0, y1) -- bottom line
|
||||
ass:line_to(x0, y0 + r) -- left line
|
||||
if r > 0 then
|
||||
ass:bezier_curve(x0, y0 + r - c, x0 + r - c, y0, x0 + r, y0) -- top left corner
|
||||
end
|
||||
end
|
||||
|
||||
function round_rect(ass, x0, y0, x1, y1, rtl, rtr, rbr, rbl)
|
||||
local c = 0.551915024494
|
||||
ass:move_to(x0 + rtl, y0)
|
||||
ass:line_to(x1 - rtr, y0) -- top line
|
||||
if rtr > 0 then
|
||||
ass:bezier_curve(x1 - rtr + rtr*c, y0, x1, y0 + rtr - rtr*c, x1, y0 + rtr) -- top right corner
|
||||
end
|
||||
ass:line_to(x1, y1 - rbr) -- right line
|
||||
if rbr > 0 then
|
||||
ass:bezier_curve(x1, y1 - rbr + rbr*c, x1 - rbr + rbr*c, y1, x1 - rbr, y1) -- bottom right corner
|
||||
end
|
||||
ass:line_to(x0 + rbl, y1) -- bottom line
|
||||
if rbl > 0 then
|
||||
ass:bezier_curve(x0 + rbl - rbl*c, y1, x0, y1 - rbl + rbl*c, x0, y1 - rbl) -- bottom left corner
|
||||
end
|
||||
ass:line_to(x0, y0 + rtl) -- left line
|
||||
if rtl > 0 then
|
||||
ass:bezier_curve(x0, y0 + rtl - rtl*c, x0 + rtl - rtl*c, y0, x0 + rtl, y0) -- top left corner
|
||||
end
|
||||
end
|
||||
local SCRIPT_NAME = "mpv_thumbnail_script"
|
||||
|
||||
local default_cache_base = ON_WINDOWS and os.getenv("TEMP") or "/tmp/"
|
||||
|
||||
local thumbnailer_options = {
|
||||
-- The thumbnail directory
|
||||
cache_directory = join_paths(default_cache_base, "mpv_thumbs_cache"),
|
||||
|
||||
------------------------
|
||||
-- Generation options --
|
||||
------------------------
|
||||
|
||||
-- Automatically generate the thumbnails on video load, without a keypress
|
||||
autogenerate = true,
|
||||
|
||||
-- Only automatically thumbnail videos shorter than this (seconds)
|
||||
autogenerate_max_duration = 3600, -- 1 hour
|
||||
|
||||
-- SHA1-sum filenames over this length
|
||||
-- It's nice to know what files the thumbnails are (hence directory names)
|
||||
-- but long URLs may approach filesystem limits.
|
||||
hash_filename_length = 128,
|
||||
|
||||
-- Use mpv to generate thumbnail even if ffmpeg is found in PATH
|
||||
-- ffmpeg does not handle ordered chapters (MKVs which rely on other MKVs)!
|
||||
-- mpv is a bit slower, but has better support overall (eg. subtitles in the previews)
|
||||
prefer_mpv = true,
|
||||
|
||||
-- Explicitly disable subtitles on the mpv sub-calls
|
||||
mpv_no_sub = false,
|
||||
-- Add a "--no-config" to the mpv sub-call arguments
|
||||
mpv_no_config = false,
|
||||
-- Add a "--profile=<mpv_profile>" to the mpv sub-call arguments
|
||||
-- Use "" to disable
|
||||
mpv_profile = "",
|
||||
-- Output debug logs to <thumbnail_path>.log, ala <cache_directory>/<video_filename>/000000.bgra.log
|
||||
-- The logs are removed after successful encodes, unless you set mpv_keep_logs below
|
||||
mpv_logs = true,
|
||||
-- Keep all mpv logs, even the succesfull ones
|
||||
mpv_keep_logs = false,
|
||||
|
||||
-- Disable the built-in keybind ("T") to add your own
|
||||
disable_keybinds = false,
|
||||
|
||||
---------------------
|
||||
-- Display options --
|
||||
---------------------
|
||||
|
||||
-- Move the thumbnail up or down
|
||||
-- For example:
|
||||
-- topbar/bottombar: 24
|
||||
-- rest: 0
|
||||
vertical_offset = 24,
|
||||
|
||||
-- Adjust background padding
|
||||
-- Examples:
|
||||
-- topbar: 0, 10, 10, 10
|
||||
-- bottombar: 10, 0, 10, 10
|
||||
-- slimbox/box: 10, 10, 10, 10
|
||||
pad_top = 10,
|
||||
pad_bot = 0,
|
||||
pad_left = 10,
|
||||
pad_right = 10,
|
||||
|
||||
-- If true, pad values are screen-pixels. If false, video-pixels.
|
||||
pad_in_screenspace = true,
|
||||
-- Calculate pad into the offset
|
||||
offset_by_pad = true,
|
||||
|
||||
-- Background color in BBGGRR
|
||||
background_color = "000000",
|
||||
-- Alpha: 0 - fully opaque, 255 - transparent
|
||||
background_alpha = 80,
|
||||
|
||||
-- Keep thumbnail on the screen near left or right side
|
||||
constrain_to_screen = true,
|
||||
|
||||
-- Do not display the thumbnailing progress
|
||||
hide_progress = false,
|
||||
|
||||
-----------------------
|
||||
-- Thumbnail options --
|
||||
-----------------------
|
||||
|
||||
-- The maximum dimensions of the thumbnails (pixels)
|
||||
thumbnail_width = 200,
|
||||
thumbnail_height = 200,
|
||||
|
||||
-- The thumbnail count target
|
||||
-- (This will result in a thumbnail every ~10 seconds for a 25 minute video)
|
||||
thumbnail_count = 150,
|
||||
|
||||
-- The above target count will be adjusted by the minimum and
|
||||
-- maximum time difference between thumbnails.
|
||||
-- The thumbnail_count will be used to calculate a target separation,
|
||||
-- and min/max_delta will be used to constrict it.
|
||||
|
||||
-- In other words, thumbnails will be:
|
||||
-- at least min_delta seconds apart (limiting the amount)
|
||||
-- at most max_delta seconds apart (raising the amount if needed)
|
||||
min_delta = 5,
|
||||
-- 120 seconds aka 2 minutes will add more thumbnails when the video is over 5 hours!
|
||||
max_delta = 90,
|
||||
|
||||
|
||||
-- Overrides for remote urls (you generally want less thumbnails!)
|
||||
-- Thumbnailing network paths will be done with mpv
|
||||
|
||||
-- Allow thumbnailing network paths (naive check for "://")
|
||||
thumbnail_network = false,
|
||||
-- Override thumbnail count, min/max delta
|
||||
remote_thumbnail_count = 60,
|
||||
remote_min_delta = 15,
|
||||
remote_max_delta = 120,
|
||||
|
||||
-- Try to grab the raw stream and disable ytdl for the mpv subcalls
|
||||
-- Much faster than passing the url to ytdl again, but may cause problems with some sites
|
||||
remote_direct_stream = true,
|
||||
}
|
||||
|
||||
read_options(thumbnailer_options, SCRIPT_NAME)
|
||||
function skip_nil(tbl)
|
||||
local n = {}
|
||||
for k, v in pairs(tbl) do
|
||||
table.insert(n, v)
|
||||
end
|
||||
return n
|
||||
end
|
||||
|
||||
function create_thumbnail_mpv(file_path, timestamp, size, output_path, options)
|
||||
options = options or {}
|
||||
|
||||
local ytdl_disabled = not options.enable_ytdl and (mp.get_property_native("ytdl") == false
|
||||
or thumbnailer_options.remote_direct_stream)
|
||||
|
||||
local header_fields_arg = nil
|
||||
local header_fields = mp.get_property_native("http-header-fields")
|
||||
if #header_fields > 0 then
|
||||
-- We can't escape the headers, mpv won't parse "--http-header-fields='Name: value'" properly
|
||||
header_fields_arg = "--http-header-fields=" .. table.concat(header_fields, ",")
|
||||
end
|
||||
|
||||
local profile_arg = nil
|
||||
if thumbnailer_options.mpv_profile ~= "" then
|
||||
profile_arg = "--profile=" .. thumbnailer_options.mpv_profile
|
||||
end
|
||||
|
||||
local log_arg = "--log-file=" .. output_path .. ".log"
|
||||
|
||||
local mpv_command = skip_nil({
|
||||
"mpv",
|
||||
-- Hide console output
|
||||
"--msg-level=all=no",
|
||||
|
||||
-- Disable ytdl
|
||||
(ytdl_disabled and "--no-ytdl" or nil),
|
||||
-- Pass HTTP headers from current instance
|
||||
header_fields_arg,
|
||||
-- Pass User-Agent and Referer - should do no harm even with ytdl active
|
||||
"--user-agent=" .. mp.get_property_native("user-agent"),
|
||||
"--referrer=" .. mp.get_property_native("referrer"),
|
||||
-- Disable hardware decoding
|
||||
"--hwdec=no",
|
||||
|
||||
-- Insert --no-config, --profile=... and --log-file if enabled
|
||||
(thumbnailer_options.mpv_no_config and "--no-config" or nil),
|
||||
profile_arg,
|
||||
(thumbnailer_options.mpv_logs and log_arg or nil),
|
||||
|
||||
file_path,
|
||||
|
||||
"--start=" .. tostring(timestamp),
|
||||
"--frames=1",
|
||||
"--hr-seek=yes",
|
||||
"--no-audio",
|
||||
-- Optionally disable subtitles
|
||||
(thumbnailer_options.mpv_no_sub and "--no-sub" or nil),
|
||||
|
||||
("--vf=scale=%d:%d"):format(size.w, size.h),
|
||||
"--vf-add=format=bgra",
|
||||
"--of=rawvideo",
|
||||
"--ovc=rawvideo",
|
||||
("--o=%s"):format(output_path)
|
||||
})
|
||||
return utils.subprocess({args=mpv_command})
|
||||
end
|
||||
|
||||
|
||||
function create_thumbnail_ffmpeg(file_path, timestamp, size, output_path)
|
||||
local ffmpeg_command = {
|
||||
"ffmpeg",
|
||||
"-loglevel", "quiet",
|
||||
"-noaccurate_seek",
|
||||
"-ss", format_time(timestamp, ":"),
|
||||
"-i", file_path,
|
||||
|
||||
"-frames:v", "1",
|
||||
"-an",
|
||||
|
||||
"-vf", ("scale=%d:%d"):format(size.w, size.h),
|
||||
"-c:v", "rawvideo",
|
||||
"-pix_fmt", "bgra",
|
||||
"-f", "rawvideo",
|
||||
|
||||
"-y", output_path
|
||||
}
|
||||
return utils.subprocess({args=ffmpeg_command})
|
||||
end
|
||||
|
||||
|
||||
function check_output(ret, output_path, is_mpv)
|
||||
local log_path = output_path .. ".log"
|
||||
local success = true
|
||||
|
||||
if ret.killed_by_us then
|
||||
return nil
|
||||
else
|
||||
if ret.error or ret.status ~= 0 then
|
||||
msg.error("Thumbnailing command failed!")
|
||||
msg.error("mpv process error:", ret.error)
|
||||
msg.error("Process stdout:", ret.stdout)
|
||||
if is_mpv then
|
||||
msg.error("Debug log:", log_path)
|
||||
end
|
||||
|
||||
success = false
|
||||
end
|
||||
|
||||
if not file_exists(output_path) then
|
||||
msg.error("Output file missing!", output_path)
|
||||
success = false
|
||||
end
|
||||
end
|
||||
|
||||
if is_mpv and not thumbnailer_options.mpv_keep_logs then
|
||||
-- Remove successful debug logs
|
||||
if success and file_exists(log_path) then
|
||||
os.remove(log_path)
|
||||
end
|
||||
end
|
||||
|
||||
return success
|
||||
end
|
||||
|
||||
|
||||
function do_worker_job(state_json_string, frames_json_string)
|
||||
msg.debug("Handling given job")
|
||||
local thumb_state, err = utils.parse_json(state_json_string)
|
||||
if err then
|
||||
msg.error("Failed to parse state JSON")
|
||||
return
|
||||
end
|
||||
|
||||
local thumbnail_indexes, err = utils.parse_json(frames_json_string)
|
||||
if err then
|
||||
msg.error("Failed to parse thumbnail frame indexes")
|
||||
return
|
||||
end
|
||||
|
||||
local thumbnail_func = create_thumbnail_mpv
|
||||
if not thumbnailer_options.prefer_mpv then
|
||||
if ExecutableFinder:get_executable_path("ffmpeg") then
|
||||
thumbnail_func = create_thumbnail_ffmpeg
|
||||
else
|
||||
msg.warn("Could not find ffmpeg in PATH! Falling back on mpv.")
|
||||
end
|
||||
end
|
||||
|
||||
local file_duration = mp.get_property_native("duration")
|
||||
local file_path = thumb_state.worker_input_path
|
||||
|
||||
if thumb_state.is_remote then
|
||||
if (thumbnail_func == create_thumbnail_ffmpeg) then
|
||||
msg.warn("Thumbnailing remote path, falling back on mpv.")
|
||||
end
|
||||
thumbnail_func = create_thumbnail_mpv
|
||||
end
|
||||
|
||||
local generate_thumbnail_for_index = function(thumbnail_index)
|
||||
-- Given a 1-based thumbnail index, generate a thumbnail for it based on the thumbnailer state
|
||||
local thumb_idx = thumbnail_index - 1
|
||||
msg.debug("Starting work on thumbnail", thumb_idx)
|
||||
|
||||
local thumbnail_path = thumb_state.thumbnail_template:format(thumb_idx)
|
||||
-- Grab the "middle" of the thumbnail duration instead of the very start, and leave some margin in the end
|
||||
local timestamp = math.min(file_duration - 0.25, (thumb_idx + 0.5) * thumb_state.thumbnail_delta)
|
||||
|
||||
mp.commandv("script-message", "mpv_thumbnail_script-progress", tostring(thumbnail_index))
|
||||
|
||||
-- The expected size (raw BGRA image)
|
||||
local thumbnail_raw_size = (thumb_state.thumbnail_size.w * thumb_state.thumbnail_size.h * 4)
|
||||
|
||||
local need_thumbnail_generation = false
|
||||
|
||||
-- Check if the thumbnail already exists and is the correct size
|
||||
local thumbnail_file = io.open(thumbnail_path, "rb")
|
||||
if thumbnail_file == nil then
|
||||
need_thumbnail_generation = true
|
||||
else
|
||||
local existing_thumbnail_filesize = thumbnail_file:seek("end")
|
||||
if existing_thumbnail_filesize ~= thumbnail_raw_size then
|
||||
-- Size doesn't match, so (re)generate
|
||||
msg.warn("Thumbnail", thumb_idx, "did not match expected size, regenerating")
|
||||
need_thumbnail_generation = true
|
||||
end
|
||||
thumbnail_file:close()
|
||||
end
|
||||
|
||||
if need_thumbnail_generation then
|
||||
local ret = thumbnail_func(file_path, timestamp, thumb_state.thumbnail_size, thumbnail_path, thumb_state.worker_extra)
|
||||
local success = check_output(ret, thumbnail_path, thumbnail_func == create_thumbnail_mpv)
|
||||
|
||||
if success == nil then
|
||||
-- Killed by us, changing files, ignore
|
||||
msg.debug("Changing files, subprocess killed")
|
||||
return true
|
||||
elseif not success then
|
||||
-- Real failure
|
||||
mp.osd_message("Thumbnailing failed, check console for details", 3.5)
|
||||
return true
|
||||
end
|
||||
else
|
||||
msg.debug("Thumbnail", thumb_idx, "already done!")
|
||||
end
|
||||
|
||||
-- Verify thumbnail size
|
||||
-- Sometimes ffmpeg will output an empty file when seeking to a "bad" section (usually the end)
|
||||
thumbnail_file = io.open(thumbnail_path, "rb")
|
||||
|
||||
-- Bail if we can't read the file (it should really exist by now, we checked this in check_output!)
|
||||
if thumbnail_file == nil then
|
||||
msg.error("Thumbnail suddenly disappeared!")
|
||||
return true
|
||||
end
|
||||
|
||||
-- Check the size of the generated file
|
||||
local thumbnail_file_size = thumbnail_file:seek("end")
|
||||
thumbnail_file:close()
|
||||
|
||||
-- Check if the file is big enough
|
||||
local missing_bytes = math.max(0, thumbnail_raw_size - thumbnail_file_size)
|
||||
if missing_bytes > 0 then
|
||||
msg.warn(("Thumbnail missing %d bytes (expected %d, had %d), padding %s"):format(
|
||||
missing_bytes, thumbnail_raw_size, thumbnail_file_size, thumbnail_path
|
||||
))
|
||||
-- Pad the file if it's missing content (eg. ffmpeg seek to file end)
|
||||
thumbnail_file = io.open(thumbnail_path, "ab")
|
||||
thumbnail_file:write(string.rep(string.char(0), missing_bytes))
|
||||
thumbnail_file:close()
|
||||
end
|
||||
|
||||
msg.debug("Finished work on thumbnail", thumb_idx)
|
||||
mp.commandv("script-message", "mpv_thumbnail_script-ready", tostring(thumbnail_index), thumbnail_path)
|
||||
end
|
||||
|
||||
msg.debug(("Generating %d thumbnails @ %dx%d for %q"):format(
|
||||
#thumbnail_indexes,
|
||||
thumb_state.thumbnail_size.w,
|
||||
thumb_state.thumbnail_size.h,
|
||||
file_path))
|
||||
|
||||
for i, thumbnail_index in ipairs(thumbnail_indexes) do
|
||||
local bail = generate_thumbnail_for_index(thumbnail_index)
|
||||
if bail then return end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- Set up listeners and keybinds
|
||||
|
||||
-- Job listener
|
||||
mp.register_script_message("mpv_thumbnail_script-job", do_worker_job)
|
||||
|
||||
|
||||
-- Register this worker with the master script
|
||||
local register_timer = nil
|
||||
local register_timeout = mp.get_time() + 1.5
|
||||
|
||||
local register_function = function()
|
||||
if mp.get_time() > register_timeout and register_timer then
|
||||
msg.error("Thumbnail worker registering timed out")
|
||||
register_timer:stop()
|
||||
else
|
||||
msg.debug("Announcing self to master...")
|
||||
mp.commandv("script-message", "mpv_thumbnail_script-worker", mp.get_script_name())
|
||||
end
|
||||
end
|
||||
|
||||
register_timer = mp.add_periodic_timer(0.1, register_function)
|
||||
|
||||
mp.register_script_message("mpv_thumbnail_script-slaved", function()
|
||||
msg.debug("Successfully registered with master")
|
||||
register_timer:stop()
|
||||
end)
|
||||
736
chezmoi/dot_config/mpv/scripts/mpv_thumbnail_script_server-2.lua
Normal file
736
chezmoi/dot_config/mpv/scripts/mpv_thumbnail_script_server-2.lua
Normal file
|
|
@ -0,0 +1,736 @@
|
|||
--[[
|
||||
Copyright (C) 2017 AMM
|
||||
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
--[[
|
||||
mpv_thumbnail_script.lua 0.4.7 - commit 6282073 (branch master)
|
||||
https://github.com/TheAMM/mpv_thumbnail_script
|
||||
Built on 2022-02-05 16:00:24
|
||||
]]--
|
||||
local assdraw = require 'mp.assdraw'
|
||||
local msg = require 'mp.msg'
|
||||
local opt = require 'mp.options'
|
||||
local utils = require 'mp.utils'
|
||||
|
||||
-- Determine platform --
|
||||
ON_WINDOWS = (package.config:sub(1,1) ~= '/')
|
||||
|
||||
-- Some helper functions needed to parse the options --
|
||||
function isempty(v) return (v == false) or (v == nil) or (v == "") or (v == 0) or (type(v) == "table" and next(v) == nil) end
|
||||
|
||||
function divmod (a, b)
|
||||
return math.floor(a / b), a % b
|
||||
end
|
||||
|
||||
-- Better modulo
|
||||
function bmod( i, N )
|
||||
return (i % N + N) % N
|
||||
end
|
||||
|
||||
function join_paths(...)
|
||||
local sep = ON_WINDOWS and "\\" or "/"
|
||||
local result = "";
|
||||
for i, p in pairs({...}) do
|
||||
if p ~= "" then
|
||||
if is_absolute_path(p) then
|
||||
result = p
|
||||
else
|
||||
result = (result ~= "") and (result:gsub("[\\"..sep.."]*$", "") .. sep .. p) or p
|
||||
end
|
||||
end
|
||||
end
|
||||
return result:gsub("[\\"..sep.."]*$", "")
|
||||
end
|
||||
|
||||
-- /some/path/file.ext -> /some/path, file.ext
|
||||
function split_path( path )
|
||||
local sep = ON_WINDOWS and "\\" or "/"
|
||||
local first_index, last_index = path:find('^.*' .. sep)
|
||||
|
||||
if last_index == nil then
|
||||
return "", path
|
||||
else
|
||||
local dir = path:sub(0, last_index-1)
|
||||
local file = path:sub(last_index+1, -1)
|
||||
|
||||
return dir, file
|
||||
end
|
||||
end
|
||||
|
||||
function is_absolute_path( path )
|
||||
local tmp, is_win = path:gsub("^[A-Z]:\\", "")
|
||||
local tmp, is_unix = path:gsub("^/", "")
|
||||
return (is_win > 0) or (is_unix > 0)
|
||||
end
|
||||
|
||||
function Set(source)
|
||||
local set = {}
|
||||
for _, l in ipairs(source) do set[l] = true end
|
||||
return set
|
||||
end
|
||||
|
||||
---------------------------
|
||||
-- More helper functions --
|
||||
---------------------------
|
||||
|
||||
-- Removes all keys from a table, without destroying the reference to it
|
||||
function clear_table(target)
|
||||
for key, value in pairs(target) do
|
||||
target[key] = nil
|
||||
end
|
||||
end
|
||||
function shallow_copy(target)
|
||||
local copy = {}
|
||||
for k, v in pairs(target) do
|
||||
copy[k] = v
|
||||
end
|
||||
return copy
|
||||
end
|
||||
|
||||
-- Rounds to given decimals. eg. round_dec(3.145, 0) => 3
|
||||
function round_dec(num, idp)
|
||||
local mult = 10^(idp or 0)
|
||||
return math.floor(num * mult + 0.5) / mult
|
||||
end
|
||||
|
||||
function file_exists(name)
|
||||
local f = io.open(name, "rb")
|
||||
if f ~= nil then
|
||||
local ok, err, code = f:read(1)
|
||||
io.close(f)
|
||||
return code == nil
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function path_exists(name)
|
||||
local f = io.open(name, "rb")
|
||||
if f ~= nil then
|
||||
io.close(f)
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function create_directories(path)
|
||||
local cmd
|
||||
if ON_WINDOWS then
|
||||
cmd = { args = {"cmd", "/c", "mkdir", path} }
|
||||
else
|
||||
cmd = { args = {"mkdir", "-p", path} }
|
||||
end
|
||||
utils.subprocess(cmd)
|
||||
end
|
||||
|
||||
-- Find an executable in PATH or CWD with the given name
|
||||
function find_executable(name)
|
||||
local delim = ON_WINDOWS and ";" or ":"
|
||||
|
||||
local pwd = os.getenv("PWD") or utils.getcwd()
|
||||
local path = os.getenv("PATH")
|
||||
|
||||
local env_path = pwd .. delim .. path -- Check CWD first
|
||||
|
||||
local result, filename
|
||||
for path_dir in env_path:gmatch("[^"..delim.."]+") do
|
||||
filename = join_paths(path_dir, name)
|
||||
if file_exists(filename) then
|
||||
result = filename
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
local ExecutableFinder = { path_cache = {} }
|
||||
-- Searches for an executable and caches the result if any
|
||||
function ExecutableFinder:get_executable_path( name, raw_name )
|
||||
name = ON_WINDOWS and not raw_name and (name .. ".exe") or name
|
||||
|
||||
if self.path_cache[name] == nil then
|
||||
self.path_cache[name] = find_executable(name) or false
|
||||
end
|
||||
return self.path_cache[name]
|
||||
end
|
||||
|
||||
-- Format seconds to HH.MM.SS.sss
|
||||
function format_time(seconds, sep, decimals)
|
||||
decimals = decimals == nil and 3 or decimals
|
||||
sep = sep and sep or "."
|
||||
local s = seconds
|
||||
local h, s = divmod(s, 60*60)
|
||||
local m, s = divmod(s, 60)
|
||||
|
||||
local second_format = string.format("%%0%d.%df", 2+(decimals > 0 and decimals+1 or 0), decimals)
|
||||
|
||||
return string.format("%02d"..sep.."%02d"..sep..second_format, h, m, s)
|
||||
end
|
||||
|
||||
-- Format seconds to 1h 2m 3.4s
|
||||
function format_time_hms(seconds, sep, decimals, force_full)
|
||||
decimals = decimals == nil and 1 or decimals
|
||||
sep = sep ~= nil and sep or " "
|
||||
|
||||
local s = seconds
|
||||
local h, s = divmod(s, 60*60)
|
||||
local m, s = divmod(s, 60)
|
||||
|
||||
if force_full or h > 0 then
|
||||
return string.format("%dh"..sep.."%dm"..sep.."%." .. tostring(decimals) .. "fs", h, m, s)
|
||||
elseif m > 0 then
|
||||
return string.format("%dm"..sep.."%." .. tostring(decimals) .. "fs", m, s)
|
||||
else
|
||||
return string.format("%." .. tostring(decimals) .. "fs", s)
|
||||
end
|
||||
end
|
||||
|
||||
-- Writes text on OSD and console
|
||||
function log_info(txt, timeout)
|
||||
timeout = timeout or 1.5
|
||||
msg.info(txt)
|
||||
mp.osd_message(txt, timeout)
|
||||
end
|
||||
|
||||
-- Join table items, ala ({"a", "b", "c"}, "=", "-", ", ") => "=a-, =b-, =c-"
|
||||
function join_table(source, before, after, sep)
|
||||
before = before or ""
|
||||
after = after or ""
|
||||
sep = sep or ", "
|
||||
local result = ""
|
||||
for i, v in pairs(source) do
|
||||
if not isempty(v) then
|
||||
local part = before .. v .. after
|
||||
if i == 1 then
|
||||
result = part
|
||||
else
|
||||
result = result .. sep .. part
|
||||
end
|
||||
end
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
function wrap(s, char)
|
||||
char = char or "'"
|
||||
return char .. s .. char
|
||||
end
|
||||
-- Wraps given string into 'string' and escapes any 's in it
|
||||
function escape_and_wrap(s, char, replacement)
|
||||
char = char or "'"
|
||||
replacement = replacement or "\\" .. char
|
||||
return wrap(string.gsub(s, char, replacement), char)
|
||||
end
|
||||
-- Escapes single quotes in a string and wraps the input in single quotes
|
||||
function escape_single_bash(s)
|
||||
return escape_and_wrap(s, "'", "'\\''")
|
||||
end
|
||||
|
||||
-- Returns (a .. b) if b is not empty or nil
|
||||
function joined_or_nil(a, b)
|
||||
return not isempty(b) and (a .. b) or nil
|
||||
end
|
||||
|
||||
-- Put items from one table into another
|
||||
function extend_table(target, source)
|
||||
for i, v in pairs(source) do
|
||||
table.insert(target, v)
|
||||
end
|
||||
end
|
||||
|
||||
-- Creates a handle and filename for a temporary random file (in current directory)
|
||||
function create_temporary_file(base, mode, suffix)
|
||||
local handle, filename
|
||||
suffix = suffix or ""
|
||||
while true do
|
||||
filename = base .. tostring(math.random(1, 5000)) .. suffix
|
||||
handle = io.open(filename, "r")
|
||||
if not handle then
|
||||
handle = io.open(filename, mode)
|
||||
break
|
||||
end
|
||||
io.close(handle)
|
||||
end
|
||||
return handle, filename
|
||||
end
|
||||
|
||||
|
||||
function get_processor_count()
|
||||
local proc_count
|
||||
|
||||
if ON_WINDOWS then
|
||||
proc_count = tonumber(os.getenv("NUMBER_OF_PROCESSORS"))
|
||||
else
|
||||
local cpuinfo_handle = io.open("/proc/cpuinfo")
|
||||
if cpuinfo_handle ~= nil then
|
||||
local cpuinfo_contents = cpuinfo_handle:read("*a")
|
||||
local _, replace_count = cpuinfo_contents:gsub('processor', '')
|
||||
proc_count = replace_count
|
||||
end
|
||||
end
|
||||
|
||||
if proc_count and proc_count > 0 then
|
||||
return proc_count
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
function substitute_values(string, values)
|
||||
local substitutor = function(match)
|
||||
if match == "%" then
|
||||
return "%"
|
||||
else
|
||||
-- nil is discarded by gsub
|
||||
return values[match]
|
||||
end
|
||||
end
|
||||
|
||||
local substituted = string:gsub('%%(.)', substitutor)
|
||||
return substituted
|
||||
end
|
||||
|
||||
-- ASS HELPERS --
|
||||
function round_rect_top( ass, x0, y0, x1, y1, r )
|
||||
local c = 0.551915024494 * r -- circle approximation
|
||||
ass:move_to(x0 + r, y0)
|
||||
ass:line_to(x1 - r, y0) -- top line
|
||||
if r > 0 then
|
||||
ass:bezier_curve(x1 - r + c, y0, x1, y0 + r - c, x1, y0 + r) -- top right corner
|
||||
end
|
||||
ass:line_to(x1, y1) -- right line
|
||||
ass:line_to(x0, y1) -- bottom line
|
||||
ass:line_to(x0, y0 + r) -- left line
|
||||
if r > 0 then
|
||||
ass:bezier_curve(x0, y0 + r - c, x0 + r - c, y0, x0 + r, y0) -- top left corner
|
||||
end
|
||||
end
|
||||
|
||||
function round_rect(ass, x0, y0, x1, y1, rtl, rtr, rbr, rbl)
|
||||
local c = 0.551915024494
|
||||
ass:move_to(x0 + rtl, y0)
|
||||
ass:line_to(x1 - rtr, y0) -- top line
|
||||
if rtr > 0 then
|
||||
ass:bezier_curve(x1 - rtr + rtr*c, y0, x1, y0 + rtr - rtr*c, x1, y0 + rtr) -- top right corner
|
||||
end
|
||||
ass:line_to(x1, y1 - rbr) -- right line
|
||||
if rbr > 0 then
|
||||
ass:bezier_curve(x1, y1 - rbr + rbr*c, x1 - rbr + rbr*c, y1, x1 - rbr, y1) -- bottom right corner
|
||||
end
|
||||
ass:line_to(x0 + rbl, y1) -- bottom line
|
||||
if rbl > 0 then
|
||||
ass:bezier_curve(x0 + rbl - rbl*c, y1, x0, y1 - rbl + rbl*c, x0, y1 - rbl) -- bottom left corner
|
||||
end
|
||||
ass:line_to(x0, y0 + rtl) -- left line
|
||||
if rtl > 0 then
|
||||
ass:bezier_curve(x0, y0 + rtl - rtl*c, x0 + rtl - rtl*c, y0, x0 + rtl, y0) -- top left corner
|
||||
end
|
||||
end
|
||||
local SCRIPT_NAME = "mpv_thumbnail_script"
|
||||
|
||||
local default_cache_base = ON_WINDOWS and os.getenv("TEMP") or "/tmp/"
|
||||
|
||||
local thumbnailer_options = {
|
||||
-- The thumbnail directory
|
||||
cache_directory = join_paths(default_cache_base, "mpv_thumbs_cache"),
|
||||
|
||||
------------------------
|
||||
-- Generation options --
|
||||
------------------------
|
||||
|
||||
-- Automatically generate the thumbnails on video load, without a keypress
|
||||
autogenerate = true,
|
||||
|
||||
-- Only automatically thumbnail videos shorter than this (seconds)
|
||||
autogenerate_max_duration = 3600, -- 1 hour
|
||||
|
||||
-- SHA1-sum filenames over this length
|
||||
-- It's nice to know what files the thumbnails are (hence directory names)
|
||||
-- but long URLs may approach filesystem limits.
|
||||
hash_filename_length = 128,
|
||||
|
||||
-- Use mpv to generate thumbnail even if ffmpeg is found in PATH
|
||||
-- ffmpeg does not handle ordered chapters (MKVs which rely on other MKVs)!
|
||||
-- mpv is a bit slower, but has better support overall (eg. subtitles in the previews)
|
||||
prefer_mpv = true,
|
||||
|
||||
-- Explicitly disable subtitles on the mpv sub-calls
|
||||
mpv_no_sub = false,
|
||||
-- Add a "--no-config" to the mpv sub-call arguments
|
||||
mpv_no_config = false,
|
||||
-- Add a "--profile=<mpv_profile>" to the mpv sub-call arguments
|
||||
-- Use "" to disable
|
||||
mpv_profile = "",
|
||||
-- Output debug logs to <thumbnail_path>.log, ala <cache_directory>/<video_filename>/000000.bgra.log
|
||||
-- The logs are removed after successful encodes, unless you set mpv_keep_logs below
|
||||
mpv_logs = true,
|
||||
-- Keep all mpv logs, even the succesfull ones
|
||||
mpv_keep_logs = false,
|
||||
|
||||
-- Disable the built-in keybind ("T") to add your own
|
||||
disable_keybinds = false,
|
||||
|
||||
---------------------
|
||||
-- Display options --
|
||||
---------------------
|
||||
|
||||
-- Move the thumbnail up or down
|
||||
-- For example:
|
||||
-- topbar/bottombar: 24
|
||||
-- rest: 0
|
||||
vertical_offset = 24,
|
||||
|
||||
-- Adjust background padding
|
||||
-- Examples:
|
||||
-- topbar: 0, 10, 10, 10
|
||||
-- bottombar: 10, 0, 10, 10
|
||||
-- slimbox/box: 10, 10, 10, 10
|
||||
pad_top = 10,
|
||||
pad_bot = 0,
|
||||
pad_left = 10,
|
||||
pad_right = 10,
|
||||
|
||||
-- If true, pad values are screen-pixels. If false, video-pixels.
|
||||
pad_in_screenspace = true,
|
||||
-- Calculate pad into the offset
|
||||
offset_by_pad = true,
|
||||
|
||||
-- Background color in BBGGRR
|
||||
background_color = "000000",
|
||||
-- Alpha: 0 - fully opaque, 255 - transparent
|
||||
background_alpha = 80,
|
||||
|
||||
-- Keep thumbnail on the screen near left or right side
|
||||
constrain_to_screen = true,
|
||||
|
||||
-- Do not display the thumbnailing progress
|
||||
hide_progress = false,
|
||||
|
||||
-----------------------
|
||||
-- Thumbnail options --
|
||||
-----------------------
|
||||
|
||||
-- The maximum dimensions of the thumbnails (pixels)
|
||||
thumbnail_width = 200,
|
||||
thumbnail_height = 200,
|
||||
|
||||
-- The thumbnail count target
|
||||
-- (This will result in a thumbnail every ~10 seconds for a 25 minute video)
|
||||
thumbnail_count = 150,
|
||||
|
||||
-- The above target count will be adjusted by the minimum and
|
||||
-- maximum time difference between thumbnails.
|
||||
-- The thumbnail_count will be used to calculate a target separation,
|
||||
-- and min/max_delta will be used to constrict it.
|
||||
|
||||
-- In other words, thumbnails will be:
|
||||
-- at least min_delta seconds apart (limiting the amount)
|
||||
-- at most max_delta seconds apart (raising the amount if needed)
|
||||
min_delta = 5,
|
||||
-- 120 seconds aka 2 minutes will add more thumbnails when the video is over 5 hours!
|
||||
max_delta = 90,
|
||||
|
||||
|
||||
-- Overrides for remote urls (you generally want less thumbnails!)
|
||||
-- Thumbnailing network paths will be done with mpv
|
||||
|
||||
-- Allow thumbnailing network paths (naive check for "://")
|
||||
thumbnail_network = false,
|
||||
-- Override thumbnail count, min/max delta
|
||||
remote_thumbnail_count = 60,
|
||||
remote_min_delta = 15,
|
||||
remote_max_delta = 120,
|
||||
|
||||
-- Try to grab the raw stream and disable ytdl for the mpv subcalls
|
||||
-- Much faster than passing the url to ytdl again, but may cause problems with some sites
|
||||
remote_direct_stream = true,
|
||||
}
|
||||
|
||||
read_options(thumbnailer_options, SCRIPT_NAME)
|
||||
function skip_nil(tbl)
|
||||
local n = {}
|
||||
for k, v in pairs(tbl) do
|
||||
table.insert(n, v)
|
||||
end
|
||||
return n
|
||||
end
|
||||
|
||||
function create_thumbnail_mpv(file_path, timestamp, size, output_path, options)
|
||||
options = options or {}
|
||||
|
||||
local ytdl_disabled = not options.enable_ytdl and (mp.get_property_native("ytdl") == false
|
||||
or thumbnailer_options.remote_direct_stream)
|
||||
|
||||
local header_fields_arg = nil
|
||||
local header_fields = mp.get_property_native("http-header-fields")
|
||||
if #header_fields > 0 then
|
||||
-- We can't escape the headers, mpv won't parse "--http-header-fields='Name: value'" properly
|
||||
header_fields_arg = "--http-header-fields=" .. table.concat(header_fields, ",")
|
||||
end
|
||||
|
||||
local profile_arg = nil
|
||||
if thumbnailer_options.mpv_profile ~= "" then
|
||||
profile_arg = "--profile=" .. thumbnailer_options.mpv_profile
|
||||
end
|
||||
|
||||
local log_arg = "--log-file=" .. output_path .. ".log"
|
||||
|
||||
local mpv_command = skip_nil({
|
||||
"mpv",
|
||||
-- Hide console output
|
||||
"--msg-level=all=no",
|
||||
|
||||
-- Disable ytdl
|
||||
(ytdl_disabled and "--no-ytdl" or nil),
|
||||
-- Pass HTTP headers from current instance
|
||||
header_fields_arg,
|
||||
-- Pass User-Agent and Referer - should do no harm even with ytdl active
|
||||
"--user-agent=" .. mp.get_property_native("user-agent"),
|
||||
"--referrer=" .. mp.get_property_native("referrer"),
|
||||
-- Disable hardware decoding
|
||||
"--hwdec=no",
|
||||
|
||||
-- Insert --no-config, --profile=... and --log-file if enabled
|
||||
(thumbnailer_options.mpv_no_config and "--no-config" or nil),
|
||||
profile_arg,
|
||||
(thumbnailer_options.mpv_logs and log_arg or nil),
|
||||
|
||||
file_path,
|
||||
|
||||
"--start=" .. tostring(timestamp),
|
||||
"--frames=1",
|
||||
"--hr-seek=yes",
|
||||
"--no-audio",
|
||||
-- Optionally disable subtitles
|
||||
(thumbnailer_options.mpv_no_sub and "--no-sub" or nil),
|
||||
|
||||
("--vf=scale=%d:%d"):format(size.w, size.h),
|
||||
"--vf-add=format=bgra",
|
||||
"--of=rawvideo",
|
||||
"--ovc=rawvideo",
|
||||
("--o=%s"):format(output_path)
|
||||
})
|
||||
return utils.subprocess({args=mpv_command})
|
||||
end
|
||||
|
||||
|
||||
function create_thumbnail_ffmpeg(file_path, timestamp, size, output_path)
|
||||
local ffmpeg_command = {
|
||||
"ffmpeg",
|
||||
"-loglevel", "quiet",
|
||||
"-noaccurate_seek",
|
||||
"-ss", format_time(timestamp, ":"),
|
||||
"-i", file_path,
|
||||
|
||||
"-frames:v", "1",
|
||||
"-an",
|
||||
|
||||
"-vf", ("scale=%d:%d"):format(size.w, size.h),
|
||||
"-c:v", "rawvideo",
|
||||
"-pix_fmt", "bgra",
|
||||
"-f", "rawvideo",
|
||||
|
||||
"-y", output_path
|
||||
}
|
||||
return utils.subprocess({args=ffmpeg_command})
|
||||
end
|
||||
|
||||
|
||||
function check_output(ret, output_path, is_mpv)
|
||||
local log_path = output_path .. ".log"
|
||||
local success = true
|
||||
|
||||
if ret.killed_by_us then
|
||||
return nil
|
||||
else
|
||||
if ret.error or ret.status ~= 0 then
|
||||
msg.error("Thumbnailing command failed!")
|
||||
msg.error("mpv process error:", ret.error)
|
||||
msg.error("Process stdout:", ret.stdout)
|
||||
if is_mpv then
|
||||
msg.error("Debug log:", log_path)
|
||||
end
|
||||
|
||||
success = false
|
||||
end
|
||||
|
||||
if not file_exists(output_path) then
|
||||
msg.error("Output file missing!", output_path)
|
||||
success = false
|
||||
end
|
||||
end
|
||||
|
||||
if is_mpv and not thumbnailer_options.mpv_keep_logs then
|
||||
-- Remove successful debug logs
|
||||
if success and file_exists(log_path) then
|
||||
os.remove(log_path)
|
||||
end
|
||||
end
|
||||
|
||||
return success
|
||||
end
|
||||
|
||||
|
||||
function do_worker_job(state_json_string, frames_json_string)
|
||||
msg.debug("Handling given job")
|
||||
local thumb_state, err = utils.parse_json(state_json_string)
|
||||
if err then
|
||||
msg.error("Failed to parse state JSON")
|
||||
return
|
||||
end
|
||||
|
||||
local thumbnail_indexes, err = utils.parse_json(frames_json_string)
|
||||
if err then
|
||||
msg.error("Failed to parse thumbnail frame indexes")
|
||||
return
|
||||
end
|
||||
|
||||
local thumbnail_func = create_thumbnail_mpv
|
||||
if not thumbnailer_options.prefer_mpv then
|
||||
if ExecutableFinder:get_executable_path("ffmpeg") then
|
||||
thumbnail_func = create_thumbnail_ffmpeg
|
||||
else
|
||||
msg.warn("Could not find ffmpeg in PATH! Falling back on mpv.")
|
||||
end
|
||||
end
|
||||
|
||||
local file_duration = mp.get_property_native("duration")
|
||||
local file_path = thumb_state.worker_input_path
|
||||
|
||||
if thumb_state.is_remote then
|
||||
if (thumbnail_func == create_thumbnail_ffmpeg) then
|
||||
msg.warn("Thumbnailing remote path, falling back on mpv.")
|
||||
end
|
||||
thumbnail_func = create_thumbnail_mpv
|
||||
end
|
||||
|
||||
local generate_thumbnail_for_index = function(thumbnail_index)
|
||||
-- Given a 1-based thumbnail index, generate a thumbnail for it based on the thumbnailer state
|
||||
local thumb_idx = thumbnail_index - 1
|
||||
msg.debug("Starting work on thumbnail", thumb_idx)
|
||||
|
||||
local thumbnail_path = thumb_state.thumbnail_template:format(thumb_idx)
|
||||
-- Grab the "middle" of the thumbnail duration instead of the very start, and leave some margin in the end
|
||||
local timestamp = math.min(file_duration - 0.25, (thumb_idx + 0.5) * thumb_state.thumbnail_delta)
|
||||
|
||||
mp.commandv("script-message", "mpv_thumbnail_script-progress", tostring(thumbnail_index))
|
||||
|
||||
-- The expected size (raw BGRA image)
|
||||
local thumbnail_raw_size = (thumb_state.thumbnail_size.w * thumb_state.thumbnail_size.h * 4)
|
||||
|
||||
local need_thumbnail_generation = false
|
||||
|
||||
-- Check if the thumbnail already exists and is the correct size
|
||||
local thumbnail_file = io.open(thumbnail_path, "rb")
|
||||
if thumbnail_file == nil then
|
||||
need_thumbnail_generation = true
|
||||
else
|
||||
local existing_thumbnail_filesize = thumbnail_file:seek("end")
|
||||
if existing_thumbnail_filesize ~= thumbnail_raw_size then
|
||||
-- Size doesn't match, so (re)generate
|
||||
msg.warn("Thumbnail", thumb_idx, "did not match expected size, regenerating")
|
||||
need_thumbnail_generation = true
|
||||
end
|
||||
thumbnail_file:close()
|
||||
end
|
||||
|
||||
if need_thumbnail_generation then
|
||||
local ret = thumbnail_func(file_path, timestamp, thumb_state.thumbnail_size, thumbnail_path, thumb_state.worker_extra)
|
||||
local success = check_output(ret, thumbnail_path, thumbnail_func == create_thumbnail_mpv)
|
||||
|
||||
if success == nil then
|
||||
-- Killed by us, changing files, ignore
|
||||
msg.debug("Changing files, subprocess killed")
|
||||
return true
|
||||
elseif not success then
|
||||
-- Real failure
|
||||
mp.osd_message("Thumbnailing failed, check console for details", 3.5)
|
||||
return true
|
||||
end
|
||||
else
|
||||
msg.debug("Thumbnail", thumb_idx, "already done!")
|
||||
end
|
||||
|
||||
-- Verify thumbnail size
|
||||
-- Sometimes ffmpeg will output an empty file when seeking to a "bad" section (usually the end)
|
||||
thumbnail_file = io.open(thumbnail_path, "rb")
|
||||
|
||||
-- Bail if we can't read the file (it should really exist by now, we checked this in check_output!)
|
||||
if thumbnail_file == nil then
|
||||
msg.error("Thumbnail suddenly disappeared!")
|
||||
return true
|
||||
end
|
||||
|
||||
-- Check the size of the generated file
|
||||
local thumbnail_file_size = thumbnail_file:seek("end")
|
||||
thumbnail_file:close()
|
||||
|
||||
-- Check if the file is big enough
|
||||
local missing_bytes = math.max(0, thumbnail_raw_size - thumbnail_file_size)
|
||||
if missing_bytes > 0 then
|
||||
msg.warn(("Thumbnail missing %d bytes (expected %d, had %d), padding %s"):format(
|
||||
missing_bytes, thumbnail_raw_size, thumbnail_file_size, thumbnail_path
|
||||
))
|
||||
-- Pad the file if it's missing content (eg. ffmpeg seek to file end)
|
||||
thumbnail_file = io.open(thumbnail_path, "ab")
|
||||
thumbnail_file:write(string.rep(string.char(0), missing_bytes))
|
||||
thumbnail_file:close()
|
||||
end
|
||||
|
||||
msg.debug("Finished work on thumbnail", thumb_idx)
|
||||
mp.commandv("script-message", "mpv_thumbnail_script-ready", tostring(thumbnail_index), thumbnail_path)
|
||||
end
|
||||
|
||||
msg.debug(("Generating %d thumbnails @ %dx%d for %q"):format(
|
||||
#thumbnail_indexes,
|
||||
thumb_state.thumbnail_size.w,
|
||||
thumb_state.thumbnail_size.h,
|
||||
file_path))
|
||||
|
||||
for i, thumbnail_index in ipairs(thumbnail_indexes) do
|
||||
local bail = generate_thumbnail_for_index(thumbnail_index)
|
||||
if bail then return end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- Set up listeners and keybinds
|
||||
|
||||
-- Job listener
|
||||
mp.register_script_message("mpv_thumbnail_script-job", do_worker_job)
|
||||
|
||||
|
||||
-- Register this worker with the master script
|
||||
local register_timer = nil
|
||||
local register_timeout = mp.get_time() + 1.5
|
||||
|
||||
local register_function = function()
|
||||
if mp.get_time() > register_timeout and register_timer then
|
||||
msg.error("Thumbnail worker registering timed out")
|
||||
register_timer:stop()
|
||||
else
|
||||
msg.debug("Announcing self to master...")
|
||||
mp.commandv("script-message", "mpv_thumbnail_script-worker", mp.get_script_name())
|
||||
end
|
||||
end
|
||||
|
||||
register_timer = mp.add_periodic_timer(0.1, register_function)
|
||||
|
||||
mp.register_script_message("mpv_thumbnail_script-slaved", function()
|
||||
msg.debug("Successfully registered with master")
|
||||
register_timer:stop()
|
||||
end)
|
||||
736
chezmoi/dot_config/mpv/scripts/mpv_thumbnail_script_server.lua
Normal file
736
chezmoi/dot_config/mpv/scripts/mpv_thumbnail_script_server.lua
Normal file
|
|
@ -0,0 +1,736 @@
|
|||
--[[
|
||||
Copyright (C) 2017 AMM
|
||||
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
--[[
|
||||
mpv_thumbnail_script.lua 0.4.7 - commit 6282073 (branch master)
|
||||
https://github.com/TheAMM/mpv_thumbnail_script
|
||||
Built on 2022-02-05 16:00:24
|
||||
]]--
|
||||
local assdraw = require 'mp.assdraw'
|
||||
local msg = require 'mp.msg'
|
||||
local opt = require 'mp.options'
|
||||
local utils = require 'mp.utils'
|
||||
|
||||
-- Determine platform --
|
||||
ON_WINDOWS = (package.config:sub(1,1) ~= '/')
|
||||
|
||||
-- Some helper functions needed to parse the options --
|
||||
function isempty(v) return (v == false) or (v == nil) or (v == "") or (v == 0) or (type(v) == "table" and next(v) == nil) end
|
||||
|
||||
function divmod (a, b)
|
||||
return math.floor(a / b), a % b
|
||||
end
|
||||
|
||||
-- Better modulo
|
||||
function bmod( i, N )
|
||||
return (i % N + N) % N
|
||||
end
|
||||
|
||||
function join_paths(...)
|
||||
local sep = ON_WINDOWS and "\\" or "/"
|
||||
local result = "";
|
||||
for i, p in pairs({...}) do
|
||||
if p ~= "" then
|
||||
if is_absolute_path(p) then
|
||||
result = p
|
||||
else
|
||||
result = (result ~= "") and (result:gsub("[\\"..sep.."]*$", "") .. sep .. p) or p
|
||||
end
|
||||
end
|
||||
end
|
||||
return result:gsub("[\\"..sep.."]*$", "")
|
||||
end
|
||||
|
||||
-- /some/path/file.ext -> /some/path, file.ext
|
||||
function split_path( path )
|
||||
local sep = ON_WINDOWS and "\\" or "/"
|
||||
local first_index, last_index = path:find('^.*' .. sep)
|
||||
|
||||
if last_index == nil then
|
||||
return "", path
|
||||
else
|
||||
local dir = path:sub(0, last_index-1)
|
||||
local file = path:sub(last_index+1, -1)
|
||||
|
||||
return dir, file
|
||||
end
|
||||
end
|
||||
|
||||
function is_absolute_path( path )
|
||||
local tmp, is_win = path:gsub("^[A-Z]:\\", "")
|
||||
local tmp, is_unix = path:gsub("^/", "")
|
||||
return (is_win > 0) or (is_unix > 0)
|
||||
end
|
||||
|
||||
function Set(source)
|
||||
local set = {}
|
||||
for _, l in ipairs(source) do set[l] = true end
|
||||
return set
|
||||
end
|
||||
|
||||
---------------------------
|
||||
-- More helper functions --
|
||||
---------------------------
|
||||
|
||||
-- Removes all keys from a table, without destroying the reference to it
|
||||
function clear_table(target)
|
||||
for key, value in pairs(target) do
|
||||
target[key] = nil
|
||||
end
|
||||
end
|
||||
function shallow_copy(target)
|
||||
local copy = {}
|
||||
for k, v in pairs(target) do
|
||||
copy[k] = v
|
||||
end
|
||||
return copy
|
||||
end
|
||||
|
||||
-- Rounds to given decimals. eg. round_dec(3.145, 0) => 3
|
||||
function round_dec(num, idp)
|
||||
local mult = 10^(idp or 0)
|
||||
return math.floor(num * mult + 0.5) / mult
|
||||
end
|
||||
|
||||
function file_exists(name)
|
||||
local f = io.open(name, "rb")
|
||||
if f ~= nil then
|
||||
local ok, err, code = f:read(1)
|
||||
io.close(f)
|
||||
return code == nil
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function path_exists(name)
|
||||
local f = io.open(name, "rb")
|
||||
if f ~= nil then
|
||||
io.close(f)
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function create_directories(path)
|
||||
local cmd
|
||||
if ON_WINDOWS then
|
||||
cmd = { args = {"cmd", "/c", "mkdir", path} }
|
||||
else
|
||||
cmd = { args = {"mkdir", "-p", path} }
|
||||
end
|
||||
utils.subprocess(cmd)
|
||||
end
|
||||
|
||||
-- Find an executable in PATH or CWD with the given name
|
||||
function find_executable(name)
|
||||
local delim = ON_WINDOWS and ";" or ":"
|
||||
|
||||
local pwd = os.getenv("PWD") or utils.getcwd()
|
||||
local path = os.getenv("PATH")
|
||||
|
||||
local env_path = pwd .. delim .. path -- Check CWD first
|
||||
|
||||
local result, filename
|
||||
for path_dir in env_path:gmatch("[^"..delim.."]+") do
|
||||
filename = join_paths(path_dir, name)
|
||||
if file_exists(filename) then
|
||||
result = filename
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
local ExecutableFinder = { path_cache = {} }
|
||||
-- Searches for an executable and caches the result if any
|
||||
function ExecutableFinder:get_executable_path( name, raw_name )
|
||||
name = ON_WINDOWS and not raw_name and (name .. ".exe") or name
|
||||
|
||||
if self.path_cache[name] == nil then
|
||||
self.path_cache[name] = find_executable(name) or false
|
||||
end
|
||||
return self.path_cache[name]
|
||||
end
|
||||
|
||||
-- Format seconds to HH.MM.SS.sss
|
||||
function format_time(seconds, sep, decimals)
|
||||
decimals = decimals == nil and 3 or decimals
|
||||
sep = sep and sep or "."
|
||||
local s = seconds
|
||||
local h, s = divmod(s, 60*60)
|
||||
local m, s = divmod(s, 60)
|
||||
|
||||
local second_format = string.format("%%0%d.%df", 2+(decimals > 0 and decimals+1 or 0), decimals)
|
||||
|
||||
return string.format("%02d"..sep.."%02d"..sep..second_format, h, m, s)
|
||||
end
|
||||
|
||||
-- Format seconds to 1h 2m 3.4s
|
||||
function format_time_hms(seconds, sep, decimals, force_full)
|
||||
decimals = decimals == nil and 1 or decimals
|
||||
sep = sep ~= nil and sep or " "
|
||||
|
||||
local s = seconds
|
||||
local h, s = divmod(s, 60*60)
|
||||
local m, s = divmod(s, 60)
|
||||
|
||||
if force_full or h > 0 then
|
||||
return string.format("%dh"..sep.."%dm"..sep.."%." .. tostring(decimals) .. "fs", h, m, s)
|
||||
elseif m > 0 then
|
||||
return string.format("%dm"..sep.."%." .. tostring(decimals) .. "fs", m, s)
|
||||
else
|
||||
return string.format("%." .. tostring(decimals) .. "fs", s)
|
||||
end
|
||||
end
|
||||
|
||||
-- Writes text on OSD and console
|
||||
function log_info(txt, timeout)
|
||||
timeout = timeout or 1.5
|
||||
msg.info(txt)
|
||||
mp.osd_message(txt, timeout)
|
||||
end
|
||||
|
||||
-- Join table items, ala ({"a", "b", "c"}, "=", "-", ", ") => "=a-, =b-, =c-"
|
||||
function join_table(source, before, after, sep)
|
||||
before = before or ""
|
||||
after = after or ""
|
||||
sep = sep or ", "
|
||||
local result = ""
|
||||
for i, v in pairs(source) do
|
||||
if not isempty(v) then
|
||||
local part = before .. v .. after
|
||||
if i == 1 then
|
||||
result = part
|
||||
else
|
||||
result = result .. sep .. part
|
||||
end
|
||||
end
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
function wrap(s, char)
|
||||
char = char or "'"
|
||||
return char .. s .. char
|
||||
end
|
||||
-- Wraps given string into 'string' and escapes any 's in it
|
||||
function escape_and_wrap(s, char, replacement)
|
||||
char = char or "'"
|
||||
replacement = replacement or "\\" .. char
|
||||
return wrap(string.gsub(s, char, replacement), char)
|
||||
end
|
||||
-- Escapes single quotes in a string and wraps the input in single quotes
|
||||
function escape_single_bash(s)
|
||||
return escape_and_wrap(s, "'", "'\\''")
|
||||
end
|
||||
|
||||
-- Returns (a .. b) if b is not empty or nil
|
||||
function joined_or_nil(a, b)
|
||||
return not isempty(b) and (a .. b) or nil
|
||||
end
|
||||
|
||||
-- Put items from one table into another
|
||||
function extend_table(target, source)
|
||||
for i, v in pairs(source) do
|
||||
table.insert(target, v)
|
||||
end
|
||||
end
|
||||
|
||||
-- Creates a handle and filename for a temporary random file (in current directory)
|
||||
function create_temporary_file(base, mode, suffix)
|
||||
local handle, filename
|
||||
suffix = suffix or ""
|
||||
while true do
|
||||
filename = base .. tostring(math.random(1, 5000)) .. suffix
|
||||
handle = io.open(filename, "r")
|
||||
if not handle then
|
||||
handle = io.open(filename, mode)
|
||||
break
|
||||
end
|
||||
io.close(handle)
|
||||
end
|
||||
return handle, filename
|
||||
end
|
||||
|
||||
|
||||
function get_processor_count()
|
||||
local proc_count
|
||||
|
||||
if ON_WINDOWS then
|
||||
proc_count = tonumber(os.getenv("NUMBER_OF_PROCESSORS"))
|
||||
else
|
||||
local cpuinfo_handle = io.open("/proc/cpuinfo")
|
||||
if cpuinfo_handle ~= nil then
|
||||
local cpuinfo_contents = cpuinfo_handle:read("*a")
|
||||
local _, replace_count = cpuinfo_contents:gsub('processor', '')
|
||||
proc_count = replace_count
|
||||
end
|
||||
end
|
||||
|
||||
if proc_count and proc_count > 0 then
|
||||
return proc_count
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
function substitute_values(string, values)
|
||||
local substitutor = function(match)
|
||||
if match == "%" then
|
||||
return "%"
|
||||
else
|
||||
-- nil is discarded by gsub
|
||||
return values[match]
|
||||
end
|
||||
end
|
||||
|
||||
local substituted = string:gsub('%%(.)', substitutor)
|
||||
return substituted
|
||||
end
|
||||
|
||||
-- ASS HELPERS --
|
||||
function round_rect_top( ass, x0, y0, x1, y1, r )
|
||||
local c = 0.551915024494 * r -- circle approximation
|
||||
ass:move_to(x0 + r, y0)
|
||||
ass:line_to(x1 - r, y0) -- top line
|
||||
if r > 0 then
|
||||
ass:bezier_curve(x1 - r + c, y0, x1, y0 + r - c, x1, y0 + r) -- top right corner
|
||||
end
|
||||
ass:line_to(x1, y1) -- right line
|
||||
ass:line_to(x0, y1) -- bottom line
|
||||
ass:line_to(x0, y0 + r) -- left line
|
||||
if r > 0 then
|
||||
ass:bezier_curve(x0, y0 + r - c, x0 + r - c, y0, x0 + r, y0) -- top left corner
|
||||
end
|
||||
end
|
||||
|
||||
function round_rect(ass, x0, y0, x1, y1, rtl, rtr, rbr, rbl)
|
||||
local c = 0.551915024494
|
||||
ass:move_to(x0 + rtl, y0)
|
||||
ass:line_to(x1 - rtr, y0) -- top line
|
||||
if rtr > 0 then
|
||||
ass:bezier_curve(x1 - rtr + rtr*c, y0, x1, y0 + rtr - rtr*c, x1, y0 + rtr) -- top right corner
|
||||
end
|
||||
ass:line_to(x1, y1 - rbr) -- right line
|
||||
if rbr > 0 then
|
||||
ass:bezier_curve(x1, y1 - rbr + rbr*c, x1 - rbr + rbr*c, y1, x1 - rbr, y1) -- bottom right corner
|
||||
end
|
||||
ass:line_to(x0 + rbl, y1) -- bottom line
|
||||
if rbl > 0 then
|
||||
ass:bezier_curve(x0 + rbl - rbl*c, y1, x0, y1 - rbl + rbl*c, x0, y1 - rbl) -- bottom left corner
|
||||
end
|
||||
ass:line_to(x0, y0 + rtl) -- left line
|
||||
if rtl > 0 then
|
||||
ass:bezier_curve(x0, y0 + rtl - rtl*c, x0 + rtl - rtl*c, y0, x0 + rtl, y0) -- top left corner
|
||||
end
|
||||
end
|
||||
local SCRIPT_NAME = "mpv_thumbnail_script"
|
||||
|
||||
local default_cache_base = ON_WINDOWS and os.getenv("TEMP") or "/tmp/"
|
||||
|
||||
local thumbnailer_options = {
|
||||
-- The thumbnail directory
|
||||
cache_directory = join_paths(default_cache_base, "mpv_thumbs_cache"),
|
||||
|
||||
------------------------
|
||||
-- Generation options --
|
||||
------------------------
|
||||
|
||||
-- Automatically generate the thumbnails on video load, without a keypress
|
||||
autogenerate = true,
|
||||
|
||||
-- Only automatically thumbnail videos shorter than this (seconds)
|
||||
autogenerate_max_duration = 3600, -- 1 hour
|
||||
|
||||
-- SHA1-sum filenames over this length
|
||||
-- It's nice to know what files the thumbnails are (hence directory names)
|
||||
-- but long URLs may approach filesystem limits.
|
||||
hash_filename_length = 128,
|
||||
|
||||
-- Use mpv to generate thumbnail even if ffmpeg is found in PATH
|
||||
-- ffmpeg does not handle ordered chapters (MKVs which rely on other MKVs)!
|
||||
-- mpv is a bit slower, but has better support overall (eg. subtitles in the previews)
|
||||
prefer_mpv = true,
|
||||
|
||||
-- Explicitly disable subtitles on the mpv sub-calls
|
||||
mpv_no_sub = false,
|
||||
-- Add a "--no-config" to the mpv sub-call arguments
|
||||
mpv_no_config = false,
|
||||
-- Add a "--profile=<mpv_profile>" to the mpv sub-call arguments
|
||||
-- Use "" to disable
|
||||
mpv_profile = "",
|
||||
-- Output debug logs to <thumbnail_path>.log, ala <cache_directory>/<video_filename>/000000.bgra.log
|
||||
-- The logs are removed after successful encodes, unless you set mpv_keep_logs below
|
||||
mpv_logs = true,
|
||||
-- Keep all mpv logs, even the succesfull ones
|
||||
mpv_keep_logs = false,
|
||||
|
||||
-- Disable the built-in keybind ("T") to add your own
|
||||
disable_keybinds = false,
|
||||
|
||||
---------------------
|
||||
-- Display options --
|
||||
---------------------
|
||||
|
||||
-- Move the thumbnail up or down
|
||||
-- For example:
|
||||
-- topbar/bottombar: 24
|
||||
-- rest: 0
|
||||
vertical_offset = 24,
|
||||
|
||||
-- Adjust background padding
|
||||
-- Examples:
|
||||
-- topbar: 0, 10, 10, 10
|
||||
-- bottombar: 10, 0, 10, 10
|
||||
-- slimbox/box: 10, 10, 10, 10
|
||||
pad_top = 10,
|
||||
pad_bot = 0,
|
||||
pad_left = 10,
|
||||
pad_right = 10,
|
||||
|
||||
-- If true, pad values are screen-pixels. If false, video-pixels.
|
||||
pad_in_screenspace = true,
|
||||
-- Calculate pad into the offset
|
||||
offset_by_pad = true,
|
||||
|
||||
-- Background color in BBGGRR
|
||||
background_color = "000000",
|
||||
-- Alpha: 0 - fully opaque, 255 - transparent
|
||||
background_alpha = 80,
|
||||
|
||||
-- Keep thumbnail on the screen near left or right side
|
||||
constrain_to_screen = true,
|
||||
|
||||
-- Do not display the thumbnailing progress
|
||||
hide_progress = false,
|
||||
|
||||
-----------------------
|
||||
-- Thumbnail options --
|
||||
-----------------------
|
||||
|
||||
-- The maximum dimensions of the thumbnails (pixels)
|
||||
thumbnail_width = 200,
|
||||
thumbnail_height = 200,
|
||||
|
||||
-- The thumbnail count target
|
||||
-- (This will result in a thumbnail every ~10 seconds for a 25 minute video)
|
||||
thumbnail_count = 150,
|
||||
|
||||
-- The above target count will be adjusted by the minimum and
|
||||
-- maximum time difference between thumbnails.
|
||||
-- The thumbnail_count will be used to calculate a target separation,
|
||||
-- and min/max_delta will be used to constrict it.
|
||||
|
||||
-- In other words, thumbnails will be:
|
||||
-- at least min_delta seconds apart (limiting the amount)
|
||||
-- at most max_delta seconds apart (raising the amount if needed)
|
||||
min_delta = 5,
|
||||
-- 120 seconds aka 2 minutes will add more thumbnails when the video is over 5 hours!
|
||||
max_delta = 90,
|
||||
|
||||
|
||||
-- Overrides for remote urls (you generally want less thumbnails!)
|
||||
-- Thumbnailing network paths will be done with mpv
|
||||
|
||||
-- Allow thumbnailing network paths (naive check for "://")
|
||||
thumbnail_network = false,
|
||||
-- Override thumbnail count, min/max delta
|
||||
remote_thumbnail_count = 60,
|
||||
remote_min_delta = 15,
|
||||
remote_max_delta = 120,
|
||||
|
||||
-- Try to grab the raw stream and disable ytdl for the mpv subcalls
|
||||
-- Much faster than passing the url to ytdl again, but may cause problems with some sites
|
||||
remote_direct_stream = true,
|
||||
}
|
||||
|
||||
read_options(thumbnailer_options, SCRIPT_NAME)
|
||||
function skip_nil(tbl)
|
||||
local n = {}
|
||||
for k, v in pairs(tbl) do
|
||||
table.insert(n, v)
|
||||
end
|
||||
return n
|
||||
end
|
||||
|
||||
function create_thumbnail_mpv(file_path, timestamp, size, output_path, options)
|
||||
options = options or {}
|
||||
|
||||
local ytdl_disabled = not options.enable_ytdl and (mp.get_property_native("ytdl") == false
|
||||
or thumbnailer_options.remote_direct_stream)
|
||||
|
||||
local header_fields_arg = nil
|
||||
local header_fields = mp.get_property_native("http-header-fields")
|
||||
if #header_fields > 0 then
|
||||
-- We can't escape the headers, mpv won't parse "--http-header-fields='Name: value'" properly
|
||||
header_fields_arg = "--http-header-fields=" .. table.concat(header_fields, ",")
|
||||
end
|
||||
|
||||
local profile_arg = nil
|
||||
if thumbnailer_options.mpv_profile ~= "" then
|
||||
profile_arg = "--profile=" .. thumbnailer_options.mpv_profile
|
||||
end
|
||||
|
||||
local log_arg = "--log-file=" .. output_path .. ".log"
|
||||
|
||||
local mpv_command = skip_nil({
|
||||
"mpv",
|
||||
-- Hide console output
|
||||
"--msg-level=all=no",
|
||||
|
||||
-- Disable ytdl
|
||||
(ytdl_disabled and "--no-ytdl" or nil),
|
||||
-- Pass HTTP headers from current instance
|
||||
header_fields_arg,
|
||||
-- Pass User-Agent and Referer - should do no harm even with ytdl active
|
||||
"--user-agent=" .. mp.get_property_native("user-agent"),
|
||||
"--referrer=" .. mp.get_property_native("referrer"),
|
||||
-- Disable hardware decoding
|
||||
"--hwdec=no",
|
||||
|
||||
-- Insert --no-config, --profile=... and --log-file if enabled
|
||||
(thumbnailer_options.mpv_no_config and "--no-config" or nil),
|
||||
profile_arg,
|
||||
(thumbnailer_options.mpv_logs and log_arg or nil),
|
||||
|
||||
file_path,
|
||||
|
||||
"--start=" .. tostring(timestamp),
|
||||
"--frames=1",
|
||||
"--hr-seek=yes",
|
||||
"--no-audio",
|
||||
-- Optionally disable subtitles
|
||||
(thumbnailer_options.mpv_no_sub and "--no-sub" or nil),
|
||||
|
||||
("--vf=scale=%d:%d"):format(size.w, size.h),
|
||||
"--vf-add=format=bgra",
|
||||
"--of=rawvideo",
|
||||
"--ovc=rawvideo",
|
||||
("--o=%s"):format(output_path)
|
||||
})
|
||||
return utils.subprocess({args=mpv_command})
|
||||
end
|
||||
|
||||
|
||||
function create_thumbnail_ffmpeg(file_path, timestamp, size, output_path)
|
||||
local ffmpeg_command = {
|
||||
"ffmpeg",
|
||||
"-loglevel", "quiet",
|
||||
"-noaccurate_seek",
|
||||
"-ss", format_time(timestamp, ":"),
|
||||
"-i", file_path,
|
||||
|
||||
"-frames:v", "1",
|
||||
"-an",
|
||||
|
||||
"-vf", ("scale=%d:%d"):format(size.w, size.h),
|
||||
"-c:v", "rawvideo",
|
||||
"-pix_fmt", "bgra",
|
||||
"-f", "rawvideo",
|
||||
|
||||
"-y", output_path
|
||||
}
|
||||
return utils.subprocess({args=ffmpeg_command})
|
||||
end
|
||||
|
||||
|
||||
function check_output(ret, output_path, is_mpv)
|
||||
local log_path = output_path .. ".log"
|
||||
local success = true
|
||||
|
||||
if ret.killed_by_us then
|
||||
return nil
|
||||
else
|
||||
if ret.error or ret.status ~= 0 then
|
||||
msg.error("Thumbnailing command failed!")
|
||||
msg.error("mpv process error:", ret.error)
|
||||
msg.error("Process stdout:", ret.stdout)
|
||||
if is_mpv then
|
||||
msg.error("Debug log:", log_path)
|
||||
end
|
||||
|
||||
success = false
|
||||
end
|
||||
|
||||
if not file_exists(output_path) then
|
||||
msg.error("Output file missing!", output_path)
|
||||
success = false
|
||||
end
|
||||
end
|
||||
|
||||
if is_mpv and not thumbnailer_options.mpv_keep_logs then
|
||||
-- Remove successful debug logs
|
||||
if success and file_exists(log_path) then
|
||||
os.remove(log_path)
|
||||
end
|
||||
end
|
||||
|
||||
return success
|
||||
end
|
||||
|
||||
|
||||
function do_worker_job(state_json_string, frames_json_string)
|
||||
msg.debug("Handling given job")
|
||||
local thumb_state, err = utils.parse_json(state_json_string)
|
||||
if err then
|
||||
msg.error("Failed to parse state JSON")
|
||||
return
|
||||
end
|
||||
|
||||
local thumbnail_indexes, err = utils.parse_json(frames_json_string)
|
||||
if err then
|
||||
msg.error("Failed to parse thumbnail frame indexes")
|
||||
return
|
||||
end
|
||||
|
||||
local thumbnail_func = create_thumbnail_mpv
|
||||
if not thumbnailer_options.prefer_mpv then
|
||||
if ExecutableFinder:get_executable_path("ffmpeg") then
|
||||
thumbnail_func = create_thumbnail_ffmpeg
|
||||
else
|
||||
msg.warn("Could not find ffmpeg in PATH! Falling back on mpv.")
|
||||
end
|
||||
end
|
||||
|
||||
local file_duration = mp.get_property_native("duration")
|
||||
local file_path = thumb_state.worker_input_path
|
||||
|
||||
if thumb_state.is_remote then
|
||||
if (thumbnail_func == create_thumbnail_ffmpeg) then
|
||||
msg.warn("Thumbnailing remote path, falling back on mpv.")
|
||||
end
|
||||
thumbnail_func = create_thumbnail_mpv
|
||||
end
|
||||
|
||||
local generate_thumbnail_for_index = function(thumbnail_index)
|
||||
-- Given a 1-based thumbnail index, generate a thumbnail for it based on the thumbnailer state
|
||||
local thumb_idx = thumbnail_index - 1
|
||||
msg.debug("Starting work on thumbnail", thumb_idx)
|
||||
|
||||
local thumbnail_path = thumb_state.thumbnail_template:format(thumb_idx)
|
||||
-- Grab the "middle" of the thumbnail duration instead of the very start, and leave some margin in the end
|
||||
local timestamp = math.min(file_duration - 0.25, (thumb_idx + 0.5) * thumb_state.thumbnail_delta)
|
||||
|
||||
mp.commandv("script-message", "mpv_thumbnail_script-progress", tostring(thumbnail_index))
|
||||
|
||||
-- The expected size (raw BGRA image)
|
||||
local thumbnail_raw_size = (thumb_state.thumbnail_size.w * thumb_state.thumbnail_size.h * 4)
|
||||
|
||||
local need_thumbnail_generation = false
|
||||
|
||||
-- Check if the thumbnail already exists and is the correct size
|
||||
local thumbnail_file = io.open(thumbnail_path, "rb")
|
||||
if thumbnail_file == nil then
|
||||
need_thumbnail_generation = true
|
||||
else
|
||||
local existing_thumbnail_filesize = thumbnail_file:seek("end")
|
||||
if existing_thumbnail_filesize ~= thumbnail_raw_size then
|
||||
-- Size doesn't match, so (re)generate
|
||||
msg.warn("Thumbnail", thumb_idx, "did not match expected size, regenerating")
|
||||
need_thumbnail_generation = true
|
||||
end
|
||||
thumbnail_file:close()
|
||||
end
|
||||
|
||||
if need_thumbnail_generation then
|
||||
local ret = thumbnail_func(file_path, timestamp, thumb_state.thumbnail_size, thumbnail_path, thumb_state.worker_extra)
|
||||
local success = check_output(ret, thumbnail_path, thumbnail_func == create_thumbnail_mpv)
|
||||
|
||||
if success == nil then
|
||||
-- Killed by us, changing files, ignore
|
||||
msg.debug("Changing files, subprocess killed")
|
||||
return true
|
||||
elseif not success then
|
||||
-- Real failure
|
||||
mp.osd_message("Thumbnailing failed, check console for details", 3.5)
|
||||
return true
|
||||
end
|
||||
else
|
||||
msg.debug("Thumbnail", thumb_idx, "already done!")
|
||||
end
|
||||
|
||||
-- Verify thumbnail size
|
||||
-- Sometimes ffmpeg will output an empty file when seeking to a "bad" section (usually the end)
|
||||
thumbnail_file = io.open(thumbnail_path, "rb")
|
||||
|
||||
-- Bail if we can't read the file (it should really exist by now, we checked this in check_output!)
|
||||
if thumbnail_file == nil then
|
||||
msg.error("Thumbnail suddenly disappeared!")
|
||||
return true
|
||||
end
|
||||
|
||||
-- Check the size of the generated file
|
||||
local thumbnail_file_size = thumbnail_file:seek("end")
|
||||
thumbnail_file:close()
|
||||
|
||||
-- Check if the file is big enough
|
||||
local missing_bytes = math.max(0, thumbnail_raw_size - thumbnail_file_size)
|
||||
if missing_bytes > 0 then
|
||||
msg.warn(("Thumbnail missing %d bytes (expected %d, had %d), padding %s"):format(
|
||||
missing_bytes, thumbnail_raw_size, thumbnail_file_size, thumbnail_path
|
||||
))
|
||||
-- Pad the file if it's missing content (eg. ffmpeg seek to file end)
|
||||
thumbnail_file = io.open(thumbnail_path, "ab")
|
||||
thumbnail_file:write(string.rep(string.char(0), missing_bytes))
|
||||
thumbnail_file:close()
|
||||
end
|
||||
|
||||
msg.debug("Finished work on thumbnail", thumb_idx)
|
||||
mp.commandv("script-message", "mpv_thumbnail_script-ready", tostring(thumbnail_index), thumbnail_path)
|
||||
end
|
||||
|
||||
msg.debug(("Generating %d thumbnails @ %dx%d for %q"):format(
|
||||
#thumbnail_indexes,
|
||||
thumb_state.thumbnail_size.w,
|
||||
thumb_state.thumbnail_size.h,
|
||||
file_path))
|
||||
|
||||
for i, thumbnail_index in ipairs(thumbnail_indexes) do
|
||||
local bail = generate_thumbnail_for_index(thumbnail_index)
|
||||
if bail then return end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- Set up listeners and keybinds
|
||||
|
||||
-- Job listener
|
||||
mp.register_script_message("mpv_thumbnail_script-job", do_worker_job)
|
||||
|
||||
|
||||
-- Register this worker with the master script
|
||||
local register_timer = nil
|
||||
local register_timeout = mp.get_time() + 1.5
|
||||
|
||||
local register_function = function()
|
||||
if mp.get_time() > register_timeout and register_timer then
|
||||
msg.error("Thumbnail worker registering timed out")
|
||||
register_timer:stop()
|
||||
else
|
||||
msg.debug("Announcing self to master...")
|
||||
mp.commandv("script-message", "mpv_thumbnail_script-worker", mp.get_script_name())
|
||||
end
|
||||
end
|
||||
|
||||
register_timer = mp.add_periodic_timer(0.1, register_function)
|
||||
|
||||
mp.register_script_message("mpv_thumbnail_script-slaved", function()
|
||||
msg.debug("Successfully registered with master")
|
||||
register_timer:stop()
|
||||
end)
|
||||
11
chezmoi/dot_config/mpv/scripts/pause-indicator.lua
Normal file
11
chezmoi/dot_config/mpv/scripts/pause-indicator.lua
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
local ov = mp.create_osd_overlay('ass-events')
|
||||
ov.data = [[{\an5\p1\alpha&H79\1c&Hffffff&\3a&Hff\pos(760,440)}]] ..
|
||||
[[m-125 -75 l 2 2 l -125 75]]
|
||||
|
||||
mp.observe_property('pause', 'bool', function(_, paused)
|
||||
mp.add_timeout(0.1, function()
|
||||
if paused then ov:update()
|
||||
else ov:remove() end
|
||||
end)
|
||||
end)
|
||||
657
chezmoi/dot_config/mpv/tech-overview.txt
Normal file
657
chezmoi/dot_config/mpv/tech-overview.txt
Normal file
|
|
@ -0,0 +1,657 @@
|
|||
This file intends to give a big picture overview of how mpv is structured.
|
||||
|
||||
player/*.c:
|
||||
Essentially makes up the player applications, including the main() function
|
||||
and the playback loop.
|
||||
|
||||
Generally, it accesses all other subsystems, initializes them, and pushes
|
||||
data between them during playback.
|
||||
|
||||
The structure is as follows (as of commit e13c05366557cb):
|
||||
* main():
|
||||
* basic initializations (e.g. init_libav() and more)
|
||||
* pre-parse command line (verbosity level, config file locations)
|
||||
* load config files (parse_cfgfiles())
|
||||
* parse command line, add files from the command line to playlist
|
||||
(m_config_parse_mp_command_line())
|
||||
* check help options etc. (call handle_help_options()), possibly exit
|
||||
* call mp_play_files() function that works down the playlist:
|
||||
* run idle loop (idle_loop()), until there are files in the
|
||||
playlist or an exit command was given (only if --idle it set)
|
||||
* actually load and play a file in play_current_file():
|
||||
* run all the dozens of functions to load the file and
|
||||
initialize playback
|
||||
* run a small loop that does normal playback, until the file is
|
||||
done or a command terminates playback
|
||||
(on each iteration, run_playloop() is called, which is rather
|
||||
big and complicated - it decodes some audio and video on
|
||||
each frame, waits for input, etc.)
|
||||
* uninitialize playback
|
||||
* determine next entry on the playlist to play
|
||||
* loop, or exit if no next file or quit is requested
|
||||
(see enum stop_play_reason)
|
||||
* call mp_destroy()
|
||||
* run_playloop():
|
||||
* calls fill_audio_out_buffers()
|
||||
This checks whether new audio needs to be decoded, and pushes it
|
||||
to the AO.
|
||||
* calls write_video()
|
||||
Decode new video, and push it to the VO.
|
||||
* determines whether playback of the current file has ended
|
||||
* determines when to start playback after seeks
|
||||
* and calls a whole lot of other stuff
|
||||
(Really, this function does everything.)
|
||||
|
||||
Things worth saying about the playback core:
|
||||
- most state is in MPContext (core.h), which is not available to the
|
||||
subsystems (and should not be made available)
|
||||
- the currently played tracks are in mpctx->current_tracks, and decoder
|
||||
state in track.dec/d_sub
|
||||
- the other subsystems rarely call back into the frontend, and the frontend
|
||||
polls them instead (probably a good thing)
|
||||
- one exceptions are wakeup callbacks, which notify a "higher" component
|
||||
of a changed situation in a subsystem
|
||||
|
||||
I like to call the player/*.c files the "frontend".
|
||||
|
||||
ta.h & ta.c:
|
||||
Hierarchical memory manager inspired by talloc from Samba. It's like a
|
||||
malloc() with more features. Most importantly, each talloc allocation can
|
||||
have a parent, and if the parent is free'd, all children will be free'd as
|
||||
well. The parent is an arbitrary talloc allocation. It's either set by the
|
||||
allocation call by passing a talloc parent, usually as first argument to the
|
||||
allocation function. It can also be set or reset later by other calls (at
|
||||
least talloc_steal()). A talloc allocation that is used as parent is often
|
||||
called a talloc context.
|
||||
|
||||
One very useful feature of talloc is fast tracking of memory leaks. ("Fast"
|
||||
as in it doesn't require valgrind.) You can enable it by setting the
|
||||
MPV_LEAK_REPORT environment variable to "1":
|
||||
export MPV_LEAK_REPORT=1
|
||||
Or permanently by building with --enable-ta-leak-report.
|
||||
This will list all unfree'd allocations on exit.
|
||||
|
||||
Documentation can be found here:
|
||||
http://git.samba.org/?p=samba.git;a=blob;f=lib/talloc/talloc.h;hb=HEAD
|
||||
|
||||
For some reason, we're still using API-compatible wrappers instead of TA
|
||||
directly. The talloc wrapper has only a subset of the functionality, and
|
||||
in particular the wrappers abort() on memory allocation failure.
|
||||
|
||||
Note: unlike tcmalloc, jemalloc, etc., talloc() is not actually a malloc
|
||||
replacement. It works on top of system malloc and provides additional
|
||||
features that are supposed to make memory management easier.
|
||||
|
||||
player/command.c:
|
||||
This contains the implementation for client API commands and properties.
|
||||
Properties are essentially dynamic variables changed by certain commands.
|
||||
This is basically responsible for all user commands, like initiating
|
||||
seeking, switching tracks, etc. It calls into other player/*.c files,
|
||||
where most of the work is done, but also calls other parts of mpv.
|
||||
|
||||
player/core.h:
|
||||
Data structures and function prototypes for most of player/*.c. They are
|
||||
usually not accessed by other parts of mpv for the sake of modularization.
|
||||
|
||||
player/client.c:
|
||||
This implements the client API (libmpv/client.h). For the most part, this
|
||||
just calls into other parts of the player. This also manages a ringbuffer
|
||||
of events from player to clients.
|
||||
|
||||
options/options.h, options/options.c
|
||||
options.h contains the global option struct MPOpts. The option declarations
|
||||
(option names, types, and MPOpts offsets for the option parser) are in
|
||||
options.c. Most default values for options and MPOpts are in
|
||||
mp_default_opts at the end of options.c.
|
||||
|
||||
MPOpts is unfortunately quite monolithic, but is being incrementally broken
|
||||
up into sub-structs. Many components have their own sub-option structs
|
||||
separate from MPOpts. New options should be bound to the component that uses
|
||||
them. Add a new option table/struct if needed.
|
||||
|
||||
The global MPOpts still contains the sub-structs as fields, which serves to
|
||||
link them to the option parser. For example, an entry like this may be
|
||||
typical:
|
||||
|
||||
{"", OPT_SUBSTRUCT(demux_opts, demux_conf)},
|
||||
|
||||
This directs the option access code to include all options in demux_conf
|
||||
into the global option list, with no prefix (""), and as part of the
|
||||
MPOpts.demux_opts field. The MPOpts.demux_opts field is actually not
|
||||
accessed anywhere, and instead demux.c does this:
|
||||
|
||||
struct m_config_cache *opts_cache =
|
||||
m_config_cache_alloc(demuxer, global, &demux_conf);
|
||||
struct demux_opts *opts = opts_cache->opts;
|
||||
|
||||
... to get a copy of its options.
|
||||
|
||||
See m_config.h (below) how to access options.
|
||||
|
||||
The actual option parser is spread over m_option.c, m_config.c, and
|
||||
parse_commandline.c, and uses the option table in options.c.
|
||||
|
||||
options/m_config.h & m_config.c:
|
||||
Code for querying and managing options. This (unfortunately) contains both
|
||||
declarations for the "legacy-ish" global m_config struct, and ways to access
|
||||
options in a threads-safe way anywhere, like m_config_cache_alloc().
|
||||
|
||||
m_config_cache_alloc() lets anyone read, observe, and write options in any
|
||||
thread. The only state it needs is struct mpv_global, which is an opaque
|
||||
type that can be passed "down" the component hierarchy. For safety reasons,
|
||||
you should not pass down any pointers to option structs (like MPOpts), but
|
||||
instead pass down mpv_global, and use m_config_cache_alloc() (or similar)
|
||||
to get a synchronized copy of the options.
|
||||
|
||||
input/input.c:
|
||||
This translates keyboard input coming from VOs and other sources (such
|
||||
as remote control devices like Apple IR or client API commands) to the
|
||||
key bindings listed in the user's (or the builtin) input.conf and turns
|
||||
them into items of type struct mp_cmd. These commands are queued, and read
|
||||
by playloop.c. They get pushed with run_command() to command.c.
|
||||
|
||||
Note that keyboard input and commands used by the client API are the same.
|
||||
The client API only uses the command parser though, and has its own queue
|
||||
of input commands somewhere else.
|
||||
|
||||
common/msg.h:
|
||||
All terminal output must go through mp_msg().
|
||||
|
||||
stream/*:
|
||||
File input is implemented here. stream.h/.c provides a simple stream based
|
||||
interface (like reading a number of bytes at a given offset). mpv can
|
||||
also play from http streams and such, which is implemented here.
|
||||
|
||||
E.g. if mpv sees "http://something" on the command line, it will pick
|
||||
stream_lavf.c based on the prefix, and pass the rest of the filename to it.
|
||||
|
||||
Some stream inputs are quite special: stream_dvd.c turns DVDs into mpeg
|
||||
streams (DVDs are actually a bunch of vob files etc. on a filesystem),
|
||||
stream_tv.c provides TV input including channel switching.
|
||||
|
||||
Some stream inputs are just there to invoke special demuxers, like
|
||||
stream_mf.c. (Basically to make the prefix "mf://" do something special.)
|
||||
|
||||
demux/:
|
||||
Demuxers split data streams into audio/video/sub streams, which in turn
|
||||
are split in packets. Packets (see demux_packet.h) are mostly byte chunks
|
||||
tagged with a playback time (PTS). These packets are passed to the decoders.
|
||||
|
||||
Most demuxers have been removed from this fork, and the only important and
|
||||
"actual" demuxers left are demux_mkv.c and demux_lavf.c (uses libavformat).
|
||||
There are some pseudo demuxers like demux_cue.c.
|
||||
|
||||
The main interface is in demux.h. The stream headers are in stheader.h.
|
||||
There is a stream header for each audio/video/sub stream, and each of them
|
||||
holds codec information about the stream and other information.
|
||||
|
||||
demux.c is a bit big, the main reason being that it contains the demuxer
|
||||
cache, which is implemented as a list of packets. The cache is complex
|
||||
because it support seeking, multiple ranges, prefetching, and so on.
|
||||
|
||||
video/:
|
||||
This contains several things related to audio/video decoding, as well as
|
||||
video filters.
|
||||
|
||||
mp_image.h and img_format.h define how mpv stores decoded video frames
|
||||
internally.
|
||||
|
||||
video/decode/:
|
||||
vd_*.c are video decoders. (There's only vd_lavc.c left.) dec_video.c
|
||||
handles most of connecting the frontend with the actual decoder.
|
||||
|
||||
video/filter/:
|
||||
vf_*.c and vf.c form the video filter chain. They are fed by the video
|
||||
decoder, and output the filtered images to the VOs though vf_vo.c. By
|
||||
default, no video filters (except vf_vo) are used. vf_scale is automatically
|
||||
inserted if the video output can't handle the video format used by the
|
||||
decoder.
|
||||
|
||||
video/out/:
|
||||
Video output. They also create GUI windows and handle user input. In most
|
||||
cases, the windowing code is shared among VOs, like x11_common.c for X11 and
|
||||
w32_common.c for Windows. The VOs stand between frontend and windowing code.
|
||||
vo_gpu can pick a windowing system at runtime, e.g. the same binary can
|
||||
provide both X11 and Cocoa support on OSX.
|
||||
|
||||
VOs can be reconfigured at runtime. A vo_reconfig() call can change the video
|
||||
resolution and format, without destroying the window.
|
||||
|
||||
vo_gpu should be taken as reference.
|
||||
|
||||
audio/:
|
||||
format.h/format.c define the uncompressed audio formats. (As well as some
|
||||
compressed formats used for spdif.)
|
||||
|
||||
audio/decode/:
|
||||
ad_*.c and dec_audio.c handle audio decoding. ad_lavc.c is the
|
||||
decoder using ffmpeg. ad_spdif.c is not really a decoder, but is used for
|
||||
compressed audio passthrough.
|
||||
|
||||
audio/filter/:
|
||||
Audio filter chain. af_lavrresample is inserted if any form of conversion
|
||||
between audio formats is needed.
|
||||
|
||||
audio/out/:
|
||||
Audio outputs.
|
||||
|
||||
Unlike VOs, AOs can't be reconfigured on a format change. On audio format
|
||||
changes, the AO will simply be closed and re-opened.
|
||||
|
||||
There are wrappers to support for two types of audio APIs: push.c and
|
||||
pull.c. ao.c calls into one of these. They contain generic code to deal
|
||||
with the data flow these APIs impose.
|
||||
|
||||
Note that mpv synchronizes the video to the audio. That's the reason
|
||||
why buggy audio drivers can have a bad influence on playback quality.
|
||||
|
||||
sub/:
|
||||
Contains subtitle and OSD rendering.
|
||||
|
||||
osd.c/.h is actually the OSD code. It queries dec_sub.c to retrieve
|
||||
decoded/rendered subtitles. osd_libass.c is the actual implementation of
|
||||
the OSD text renderer (which uses libass, and takes care of all the tricky
|
||||
fontconfig/freetype API usage and text layouting).
|
||||
|
||||
The VOs call osd.c to render OSD and subtitle (via e.g. osd_draw()). osd.c
|
||||
in turn asks dec_sub.c for subtitle overlay bitmaps, which relays the
|
||||
request to one of the sd_*.c subtitle decoders/renderers.
|
||||
|
||||
Subtitle loading is in demux/. The MPlayer subreader.c is mostly gone - parts
|
||||
of it survive in demux_subreader.c. It's used as last fallback, or to handle
|
||||
some text subtitle types on Libav. It should go away eventually. Normally,
|
||||
subtitles are loaded via demux_lavf.c.
|
||||
|
||||
The subtitles are passed to dec_sub.c and the subtitle decoders in sd_*.c
|
||||
as they are demuxed. All text subtitles are rendered by sd_ass.c. If text
|
||||
subtitles are not in the ASS format, the libavcodec subtitle converters are
|
||||
used (lavc_conv.c).
|
||||
|
||||
Text subtitles can be preloaded, in which case they are read fully as soon
|
||||
as the subtitle is selected. In this case, they are effectively stored in
|
||||
sd_ass.c's internal state.
|
||||
|
||||
etc/:
|
||||
The file input.conf is actually integrated into the mpv binary by the
|
||||
build system. It contains the default keybindings.
|
||||
|
||||
Best practices and Concepts within mpv
|
||||
======================================
|
||||
|
||||
General contribution etc.
|
||||
-------------------------
|
||||
|
||||
See: DOCS/contribute.md
|
||||
|
||||
Error checking
|
||||
--------------
|
||||
|
||||
If an error is relevant, it should be handled. If it's interesting, log the
|
||||
error. However, mpv often keeps errors silent and reports failures somewhat
|
||||
coarsely by propagating them upwards the caller chain. This is OK, as long as
|
||||
the errors are not very interesting, or would require a developer to debug it
|
||||
anyway (in which case using a debugger would be more convenient, and the
|
||||
developer would need to add temporary debug printfs to get extremely detailed
|
||||
information which would not be appropriate during normal operation).
|
||||
|
||||
Basically, keep a balance on error reporting. But always check them, unless you
|
||||
have a good argument not to.
|
||||
|
||||
Memory allocation errors (OOM) are a special class of errors. Normally such
|
||||
allocation failures are not handled "properly". Instead, abort() is called.
|
||||
(New code should use MP_HANDLE_OOM() for this.) This is done out of laziness and
|
||||
for convenience, and due to the fact that MPlayer/mplayer2 never handled it
|
||||
correctly. (MPlayer varied between handling it correctly, trying to do so but
|
||||
failing, and just not caring, while mplayer2 started using abort() for it.)
|
||||
|
||||
This is justifiable in a number of ways. Error handling paths are notoriously
|
||||
untested and buggy, so merely having them won't make your program more reliable.
|
||||
Having these error handling paths also complicates non-error code, due to the
|
||||
need to roll back state at any point after a memory allocation.
|
||||
|
||||
Take any larger body of code, that is supposed to handle OOM, and test whether
|
||||
the error paths actually work, for example by overriding malloc with a version
|
||||
that randomly fails. You will find bugs quickly, and often they will be very
|
||||
annoying to fix (if you can even reproduce them).
|
||||
|
||||
In addition, a clear indication that something went wrong may be missing. On
|
||||
error your program may exhibit "degraded" behavior by design. Consider a video
|
||||
encoder dropping frames somewhere in the middle of a video due to temporary
|
||||
allocation failures, instead of just exiting with an errors. In other cases, it
|
||||
may open conceptual security holes. Failing fast may be better.
|
||||
|
||||
mpv uses GPU APIs, which may be break on allocation errors (because driver
|
||||
authors will have the same issues as described here), or don't even have a real
|
||||
concept for dealing with OOM (OpenGL).
|
||||
|
||||
libmpv is often used by GUIs, which I predict always break if OOM happens.
|
||||
|
||||
Last but not least, OSes like Linux use "overcommit", which basically means that
|
||||
your program may crash any time OOM happens, even if it doesn't use malloc() at
|
||||
all!
|
||||
|
||||
But still, don't just assume malloc() always succeeds. Use MP_HANDLE_OOM(). The
|
||||
ta* APIs do this for you. The reason for this is that dereferencing a NULL
|
||||
pointer can have security relevant consequences if large offsets are involved.
|
||||
Also, a clear error message is better than a random segfault.
|
||||
|
||||
Some big memory allocations are checked anyway. For example, all code must
|
||||
assume that allocating video frames or packets can fail. (The above example
|
||||
of dropping video frames during encoding is entirely possible in mpv.)
|
||||
|
||||
Undefined behavior
|
||||
------------------
|
||||
|
||||
Undefined behavior (UB) is a concept in the C language. C is famous for being a
|
||||
language that makes it almost impossible to write working code, because
|
||||
undefined behavior is so easily triggered, compilers will happily abuse it to
|
||||
generate "faster" code, debugging tools will shout at you, and sometimes it
|
||||
even means your code doesn't work.
|
||||
|
||||
There is a lot of literature on this topic. Read it.
|
||||
|
||||
(In C's defense, UB exists in other languages too, but since they're not used
|
||||
for low level infrastructure, and/or these languages are at times not rigorously
|
||||
defined, simply nobody cares. However, the C standard committee is still guilty
|
||||
for not addressing this. I'll admit that I can't even tell from the standard's
|
||||
gibberish whether some specific behavior is UB or not. It's written like tax
|
||||
law.)
|
||||
|
||||
In mpv, we generally try to avoid undefined behavior. For one, we want portable
|
||||
and reliable operation. But more importantly, we want clean output from
|
||||
debugging tools, in order to find real bugs more quickly and effectively.
|
||||
|
||||
Avoid the "works in practice" argument. Once debugging tools come into play, or
|
||||
simply when "in practice" stops being true, this will all get back to you in a
|
||||
bad way.
|
||||
|
||||
Global state, library safety
|
||||
----------------------------
|
||||
|
||||
Mutable global state is when code uses global variables that are not read-only.
|
||||
This must be avoided in mpv. Always use context structs that the caller of
|
||||
your code needs to allocate, and whose pointers are passed to your functions.
|
||||
|
||||
Library safety means that your code (or library) can be used by a library
|
||||
without causing conflicts with other library users in the same process. To any
|
||||
piece of code, a "safe" library's API can simply be used, without having to
|
||||
worry about other API users that may be around somewhere.
|
||||
|
||||
Libraries are often not library safe, because they they use global mutable state
|
||||
or other "global" resources. Typical examples include use of signals, simple
|
||||
global variables (like hsearch() in libc), or internal caches not protected by
|
||||
locks.
|
||||
|
||||
A surprisingly high number of libraries are not library safe because they need
|
||||
global initialization. Typically they provide an API function, which
|
||||
"initializes" the library, and which must be called before calling any other
|
||||
API functions. Often, you are to provide global configuration parameters, which
|
||||
can change the behavior of the library. If two libraries A and B use library C,
|
||||
but A and B initialize C with different parameters, something "bad" may happen.
|
||||
In addition, these global initialization functions are often not thread-safe. So
|
||||
if A and B try to initialize C at the same time (from different threads and
|
||||
without knowing about each other), it may cause undefined behavior. (libcurl is
|
||||
a good example of both of these issues. FFmpeg and some TLS libraries used to be
|
||||
affected, but improved.)
|
||||
|
||||
This is so bad because library A and B from the previous example most likely
|
||||
have no way to cooperate, because they're from different authors and have no
|
||||
business knowing each others. They'd need a library D, which wraps library C
|
||||
in a safe way. Unfortunately, typically something worse happens: libraries get
|
||||
"infected" by the unsafeness of its sub-libraries, and export a global init API
|
||||
just to initialize the sub-libraries. In the previous example, libraries A and B
|
||||
would export global init APIs just to init library C, even though the rest of
|
||||
A/B are clean and library safe. (Again, libcurl is an example of this, if you
|
||||
subtract other historic anti-features.)
|
||||
|
||||
The main problem with library safety is that its lack propagates to all
|
||||
libraries using the library.
|
||||
|
||||
We require libmpv to be library safe. This is not really possible, because some
|
||||
libraries are not library safe (FFmpeg, Xlib, partially ALSA). However, for
|
||||
ideological reasons, there is no global init API, and best effort is made to try
|
||||
to avoid problems.
|
||||
|
||||
libmpv has some features that are not library safe, but which are disabled by
|
||||
default (such as terminal usage aka stdout, or JSON IPC blocking SIGPIPE for
|
||||
internal convenience).
|
||||
|
||||
A notable, very disgustingly library unsafe behavior of libmpv is calling
|
||||
abort() on some memory allocation failure. See error checking section.
|
||||
|
||||
Logging
|
||||
-------
|
||||
|
||||
All logging and terminal output in mpv goes through the functions and macros
|
||||
provided in common/msg.h. This is in part for library safety, and in part to
|
||||
make sure users can silence all output, or to redirect the output elsewhere,
|
||||
like a log file or the internal console.lua script.
|
||||
|
||||
Locking
|
||||
-------
|
||||
|
||||
See generally available literature. In mpv, we use pthread for this.
|
||||
|
||||
Always keep locking clean. Don't skip locking just because it will work "in
|
||||
practice". (See undefined behavior section.) If your use case is simple, you may
|
||||
use C11 atomics (osdep/atomic.h for partial C99 support), but most likely you
|
||||
will only hurt yourself and others.
|
||||
|
||||
Always make clear which fields in a struct are protected by which lock. If a
|
||||
field is immutable, or simply not thread-safe (e.g. state for a single worker
|
||||
thread), document it as well.
|
||||
|
||||
Internal mpv APIs are assumed to be not thread-safe by default. If they have
|
||||
special guarantees (such as being usable by more than one thread at a time),
|
||||
these should be explicitly documented.
|
||||
|
||||
All internal mpv APIs must be free of global state. Even if a component is not
|
||||
thread-safe, multiple threads can use _different_ instances of it without any
|
||||
locking.
|
||||
|
||||
On a side note, recursive locks may seem convenient at first, but introduce
|
||||
additional problems with condition variables and locking hierarchies. They
|
||||
should be avoided.
|
||||
|
||||
Locking hierarchy
|
||||
-----------------
|
||||
|
||||
A simple way to avoid deadlocks with classic locking is to define a locking
|
||||
hierarchy or lock order. If all threads acquire locks in the same order, no
|
||||
deadlocks will happen.
|
||||
|
||||
For example, a "leaf" lock is a lock that is below all other locks in the
|
||||
hierarchy. You can acquire it any time, as long as you don't acquire other
|
||||
locks while holding it.
|
||||
|
||||
Unfortunately, C has no way to declare or check the lock order, so you should at
|
||||
least document it.
|
||||
|
||||
In addition, try to avoid exposing locks to the outside. Making the declaration
|
||||
of a lock private to a specific .c file (and _not_ exporting accessors or
|
||||
lock/unlock functions that manipulate the lock) is a good idea. Your component's
|
||||
API may acquire internal locks, but should release them when returning. Keeping
|
||||
the entire locking in a single file makes it easy to check it.
|
||||
|
||||
Avoiding callback hell
|
||||
----------------------
|
||||
|
||||
mpv code is separated in components, like the "frontend" (i.e. MPContext mpctx),
|
||||
VOs, AOs, demuxers, and more. The frontend usually calls "down" the usage
|
||||
hierarchy: mpctx almost on top, then things like vo/ao, and utility code on the
|
||||
very bottom.
|
||||
|
||||
"Callback hell" is when when components call both up and down the hierarchy,
|
||||
which for example leads to accidentally recursion, reentrancy problems, or
|
||||
locking nightmares. This is avoided by (mostly) calling only down the hierarchy.
|
||||
Basically the call graph forms a DAG. The other direction is handled by event
|
||||
queues, wakeup callbacks, and similar mechanisms.
|
||||
|
||||
Typically, a component provides an API, and does not know anything about its
|
||||
user. The API user (component higher in the hierarchy) polls the state of the
|
||||
lower component when needed.
|
||||
|
||||
This also enforces some level of modularization, and with some luck the locking
|
||||
hierarchy. (Basically, locks of lower components automatically become leaf
|
||||
locks.) Another positive effect is simpler memory management.
|
||||
|
||||
(Also see e.g.: http://250bpm.com/blog:24)
|
||||
|
||||
Wakeup callbacks
|
||||
----------------
|
||||
|
||||
This is a common concept in mpv. Even the public API uses it. It's used when an
|
||||
API has internal threads (or otherwise triggers asynchronous events), but the
|
||||
component call hierarchy needs to be kept. The wakeup callback is the only
|
||||
exception to the call hierarchy, and always calls up.
|
||||
|
||||
For example, vo spawns a thread that the API user (the mpv frontend) does not
|
||||
need to know about. vo simply provides a single-threaded API (or that looks like
|
||||
one). This API needs a way to notify the API user of new events. But the vo
|
||||
event producer is on the vo thread - it can't simply invoke a callback back into
|
||||
the API user, because then the API user has to deal with locking, despite not
|
||||
using threads. In addition, this will probably cause problems like mentioned in
|
||||
the "callback hell" section, especially lock order issues.
|
||||
|
||||
The solution is the wakeup callback. It merely unblocks the API user from
|
||||
waiting, and the API user then uses the normal vo API to examine whether or
|
||||
which state changed. As a concept, it documents what a wakeup callback is
|
||||
allowed to do and what not, to avoid the aforementioned problems.
|
||||
|
||||
Generally, you are not allowed to call any API from the wakeup callback. You
|
||||
just do whatever is needed to unblock your thread. For example, if it's waiting
|
||||
on a mutex/condition variable, acquire the mutex, set a change flag, signal
|
||||
the condition variable, unlock, return. (This mutex must not be held when
|
||||
calling the API. It must be a leaf lock.)
|
||||
|
||||
Restricting the wakeup callback like this sidesteps any reentrancy issues and
|
||||
other complexities. The API implementation can simply hold internal (and
|
||||
non-recursive) locks while invoking the wakeup callback.
|
||||
|
||||
The API user still needs to deal with locking (probably), but there's only the
|
||||
need to implement a single "receiver", that can handle the entire API of the
|
||||
used component. (Or multiple APIs - MPContext for example has only 1 wakeup
|
||||
callback that handles all AOs, VOs, input, demuxers, and more. It simple re-runs
|
||||
the playloop.)
|
||||
|
||||
You could get something more advanced by turning this into a message queue. The
|
||||
API would append a message to the queue, and the API user can read it. But then
|
||||
you still need a way to "wakeup" the API user (unless you force the API user
|
||||
to block on your API, which will make things inconvenient for the API user). You
|
||||
also need to worry about what happens if the message queue overruns (you either
|
||||
lose messages or have unbounded memory usage). In the mpv public API, the
|
||||
distinction between message queue and wakeup callback is sort of blurry, because
|
||||
it does provide a message queue, but an additional wakeup callback, so API
|
||||
users are not required to call mpv_wait_event() with a high timeout.
|
||||
|
||||
mpv itself prefers using wakeup callbacks over a generic event queue, because
|
||||
most times an event queue is not needed (or complicates things), and it is
|
||||
better to do it manually.
|
||||
|
||||
(You could still abstract the API user side of wakeup callback handling, and
|
||||
avoid reimplementing it all the time. Although mp_dispatch_queue already
|
||||
provides mechanisms for this.)
|
||||
|
||||
Condition variables
|
||||
-------------------
|
||||
|
||||
They're used whenever a thread needs to wait for something, without nonsense
|
||||
like sleep calls or busy waiting. mpv uses the standard pthread API for this.
|
||||
There's a lot of literature on it. Read it.
|
||||
|
||||
For initial understanding, it may be helpful to know that condition variables
|
||||
are not variables that signal a condition. pthread_cond_t does not have any
|
||||
state per-se. Maybe pthread_cond_t would better be named pthread_interrupt_t,
|
||||
because its sole purpose is to interrupt a thread waiting via pthread_cond_wait()
|
||||
(or similar). The "something" in "waiting for something" can be called
|
||||
predicate (to avoid confusing it with "condition"). Consult literature for the
|
||||
proper terms.
|
||||
|
||||
The very short version is...
|
||||
|
||||
Shared declarations:
|
||||
|
||||
pthread_mutex_t lock;
|
||||
pthread_cond_t cond_var;
|
||||
struct something state_var; // protected by lock, changes signaled by cond_var
|
||||
|
||||
Waiter thread:
|
||||
|
||||
pthread_mutex_lock(&lock);
|
||||
|
||||
// Wait for a change in state_var. We want to wait until predicate_fulfilled()
|
||||
// returns true.
|
||||
// Must be a loop for 2 reasons:
|
||||
// 1. cond_var may be associated with other conditions too
|
||||
// 2. pthread_cond_wait() can have sporadic wakeups
|
||||
while (!predicate_fulfilled(&state_var)) {
|
||||
// This unlocks, waits for cond_var to be signaled, and then locks again.
|
||||
// The _whole_ point of cond_var is that unlocking and waiting for the
|
||||
// signal happens atomically.
|
||||
pthread_cond_wait(&cond_var, &lock);
|
||||
}
|
||||
|
||||
// Here you may react to the state change. The state cannot change
|
||||
// asynchronously as long as you still hold the lock (and didn't release
|
||||
// and reacquire it).
|
||||
// ...
|
||||
|
||||
pthread_mutex_unlock(&lock);
|
||||
|
||||
Signaler thread:
|
||||
|
||||
pthread_mutex_lock(&lock);
|
||||
|
||||
// Something changed. Update the shared variable with the new state.
|
||||
update_state(&state_var);
|
||||
|
||||
// Notify that something changed. This will wake up the waiter thread if
|
||||
// it's blocked in pthread_cond_wait(). If not, nothing happens.
|
||||
pthread_cond_broadcast(&cond_var);
|
||||
|
||||
// Fun fact: good implementations wake up the waiter only when the lock is
|
||||
// released, to reduce kernel scheduling overhead.
|
||||
pthread_mutex_unlock(&lock);
|
||||
|
||||
Some basic rules:
|
||||
1. Always access your state under proper locking
|
||||
2. Always check your predicate before every call to pthread_cond_wait()
|
||||
(And don't call pthread_cond_wait() if the predicate is fulfilled.)
|
||||
3. Always call pthread_cond_wait() in a loop
|
||||
(And only if your predicate failed without releasing the lock..)
|
||||
4. Always call pthread_cond_broadcast()/_signal() inside of its associated
|
||||
lock
|
||||
|
||||
mpv sometimes violates rule 3, and leaves "retrying" (i.e. looping) to the
|
||||
caller.
|
||||
|
||||
Common pitfalls:
|
||||
- Thinking that pthread_cond_t is some kind of semaphore, or holds any
|
||||
application state or the user predicate (it _only_ wakes up threads
|
||||
that are at the same time blocking on pthread_cond_wait() and friends,
|
||||
nothing else)
|
||||
- Changing the predicate, but not updating all pthread_cond_broadcast()/
|
||||
_signal() calls correctly
|
||||
- Forgetting that pthread_cond_wait() unlocks the lock (other threads can
|
||||
and must acquire the lock)
|
||||
- Holding multiple nested locks while trying to wait (=> deadlock, violates
|
||||
the lock order anyway)
|
||||
- Waiting for a predicate correctly, but unlocking/relocking before acting
|
||||
on it (unlocking allows arbitrary state changes)
|
||||
- Confusing which lock/condition var. is used to manage a bit of state
|
||||
|
||||
Generally available literature probably has better examples and explanations.
|
||||
|
||||
Using condition variables the proper way is generally preferred over using more
|
||||
messy variants of them. (Just saying because on win32, "SetEvent" exists, and
|
||||
it's inferior to condition variables. Try to avoid the win32 primitives, even if
|
||||
you're dealing with Windows-only code.)
|
||||
|
||||
Threads
|
||||
-------
|
||||
|
||||
Threading should be conservatively used. Normally, mpv code pretends to be
|
||||
single-threaded, and provides thread-unsafe APIs. Threads are used coarsely,
|
||||
and if you can avoid messing with threads, you should. For example, VOs and AOs
|
||||
do not need to deal with threads normally, even though they run on separate
|
||||
threads. The glue code "isolates" them from any threading issues.
|
||||
29
chezmoi/dot_config/ncspot/config.toml
Normal file
29
chezmoi/dot_config/ncspot/config.toml
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
use_nerdfont = true
|
||||
volnorm = true
|
||||
notify = true
|
||||
shuffle = true
|
||||
library_tabs = ["tracks", "playlists", "artists", "browse"]
|
||||
|
||||
[credentials]
|
||||
username_cmd = "echo 'ale.navarro.parra@gmail.com'"
|
||||
password_cmd = "curl https://pastebin.panconpalta.win/raw/otter-mole-turtle"
|
||||
|
||||
# Catppuchine
|
||||
[theme]
|
||||
background = "default"
|
||||
primary = "#cdd6f4"
|
||||
secondary = "bac2de"
|
||||
title = "#cba6f7"
|
||||
playing = "#cba6f7"
|
||||
playing_selected = "#000000"
|
||||
playing_bg = "default"
|
||||
highlight = "#000000"
|
||||
highlight_bg = "#a6e3a1"
|
||||
error = "black"
|
||||
error_bg = "#f38ba8"
|
||||
statusbar = "#191414"
|
||||
statusbar_progress = "#cba6f7"
|
||||
statusbar_bg = "#cba6f7"
|
||||
cmdline = "#cdd6f4"
|
||||
cmdline_bg = "#191414"
|
||||
search_match = "#f38ba8"
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
(directive) @function
|
||||
(directive_start) @function
|
||||
(directive_end) @function
|
||||
(comment) @comment
|
||||
((parameter) @include (#set! "priority" 110))
|
||||
((php_only) @include (#set! "priority" 110))
|
||||
((bracket_start) @function (#set! "priority" 120))
|
||||
((bracket_end) @function (#set! "priority" 120))
|
||||
(keyword) @function
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
((php) @injection.content
|
||||
(#set! injection.combined)
|
||||
(#set! injection.language php))
|
||||
26
chezmoi/dot_config/nvim/init.lua
Normal file
26
chezmoi/dot_config/nvim/init.lua
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
-- Loadnoptions before anything
|
||||
require("aleidk.options")
|
||||
|
||||
-- Init PLugins
|
||||
|
||||
-- Install package manager https://github.com/folke/lazy.nvim
|
||||
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", -- latest stable release
|
||||
lazypath,
|
||||
})
|
||||
end
|
||||
vim.opt.rtp:prepend(lazypath)
|
||||
|
||||
-- Load plugins
|
||||
require("lazy").setup("aleidk.plugins")
|
||||
|
||||
-- Rest of configuratin
|
||||
|
||||
require("aleidk.keymaps")
|
||||
require("aleidk.autocmds")
|
||||
70
chezmoi/dot_config/nvim/lazy-lock.json
Normal file
70
chezmoi/dot_config/nvim/lazy-lock.json
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
{
|
||||
"ChatGPT.nvim": { "branch": "main", "commit": "aadb607038d53d97be4da368b07355f65ad3f047" },
|
||||
"LuaSnip": { "branch": "master", "commit": "80a8528f084a97b624ae443a6f50ff8074ba486b" },
|
||||
"alpha-nvim": { "branch": "main", "commit": "234822140b265ec4ba3203e3e0be0e0bb826dff5" },
|
||||
"auto-session": { "branch": "main", "commit": "3eb26b949e1b90798e84926848551046e2eb0721" },
|
||||
"bufferline.nvim": { "branch": "main", "commit": "357cc8f8eeb64702e6fcf2995e3b9becee99a5d3" },
|
||||
"ccc.nvim": { "branch": "main", "commit": "ec6e23fd2c0bf4ffcf71c1271acdcee6e2c6f49c" },
|
||||
"chezmoi.nvim": { "branch": "main", "commit": "7c7746adced0e4ba5b1be4dd766a786ffddc65c1" },
|
||||
"chezmoi.vim": { "branch": "main", "commit": "a35b426db9d83f8fcf43981f299ad3145d001af2" },
|
||||
"cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" },
|
||||
"cmp-cmdline": { "branch": "main", "commit": "8ee981b4a91f536f52add291594e89fb6645e451" },
|
||||
"cmp-git": { "branch": "main", "commit": "f900a4cf117300fdc3ba31d26f8b6223ccd9c574" },
|
||||
"cmp-nvim-lsp": { "branch": "main", "commit": "44b16d11215dce86f253ce0c30949813c0a90765" },
|
||||
"cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" },
|
||||
"cmp_luasnip": { "branch": "master", "commit": "05a9ab28b53f71d1aece421ef32fee2cb857a843" },
|
||||
"comment-box.nvim": { "branch": "main", "commit": "dd1a48f8d06102e9b87ae1e0069bc365c006979b" },
|
||||
"conform.nvim": { "branch": "master", "commit": "e4ecb6e8ed3163c86d7e647f1dc3d94de77ca687" },
|
||||
"diffview.nvim": { "branch": "main", "commit": "d38c1b5266850f77f75e006bcc26213684e1e141" },
|
||||
"dressing.nvim": { "branch": "master", "commit": "1f2d1206a03bd3add8aedf6251e4534611de577f" },
|
||||
"friendly-snippets": { "branch": "main", "commit": "43727c2ff84240e55d4069ec3e6158d74cb534b6" },
|
||||
"fzf": { "branch": "master", "commit": "ec208af474fa3eadad5779c3d30db6d2db300932" },
|
||||
"fzf-lua": { "branch": "main", "commit": "6589bdd872385d120a1eb3cb85e5d15d37621c1d" },
|
||||
"gitsigns.nvim": { "branch": "main", "commit": "5a9a6ac29a7805c4783cda21b80a1e361964b3f2" },
|
||||
"harpoon": { "branch": "master", "commit": "c1aebbad9e3d13f20bedb8f2ce8b3a94e39e424a" },
|
||||
"indent-blankline.nvim": { "branch": "master", "commit": "046e2cf04e08ece927bacbfb87c5b35c0b636546" },
|
||||
"lazy.nvim": { "branch": "main", "commit": "16603c6917435d8446f7357cb61095138a417085" },
|
||||
"lazygit.nvim": { "branch": "main", "commit": "de35012036d43bca03628d40d083f7c02a4cda3f" },
|
||||
"lualine.nvim": { "branch": "master", "commit": "2248ef254d0a1488a72041cfb45ca9caada6d994" },
|
||||
"mason-lspconfig.nvim": { "branch": "main", "commit": "9453e3d6cd2ca45d96e20f343e8f1b927364b630" },
|
||||
"mason.nvim": { "branch": "main", "commit": "cd7835b15f5a4204fc37e0aa739347472121a54c" },
|
||||
"mini.bufremove": { "branch": "main", "commit": "f53c7f27e36009fe61563c11cde154b94a0e5b94" },
|
||||
"mini.clue": { "branch": "main", "commit": "3162debaedf981e96e6db16263fdbcf754f0733b" },
|
||||
"mini.comment": { "branch": "main", "commit": "877acea5b2a32ff55f808fc0ebe9aa898648318c" },
|
||||
"mini.surround": { "branch": "main", "commit": "af8129efcabe95fc08a233e9f91569829bed031f" },
|
||||
"neodev.nvim": { "branch": "main", "commit": "d617d9eb27e73e701e446874c6ea2cb528719260" },
|
||||
"neogen": { "branch": "main", "commit": "cb1f384df804c1bf729332c4f728253fe17962d4" },
|
||||
"neogit": { "branch": "master", "commit": "01dc0a7e237a4d6d053cea2503f5dd1a81c1e310" },
|
||||
"noice.nvim": { "branch": "main", "commit": "92433164e2f7118d4122c7674c3834d9511722ba" },
|
||||
"nui.nvim": { "branch": "main", "commit": "c0c8e347ceac53030f5c1ece1c5a5b6a17a25b32" },
|
||||
"nvim": { "branch": "main", "commit": "ea52fe8a0b1e4a820df0d0cf9a6a5a0e18c3eaa0" },
|
||||
"nvim-autopairs": { "branch": "master", "commit": "096d0baecc34f6c5d8a6dd25851e9d5ad338209b" },
|
||||
"nvim-bqf": { "branch": "main", "commit": "8784eebf34371049b641646d00232c2603215297" },
|
||||
"nvim-cmp": { "branch": "main", "commit": "51260c02a8ffded8e16162dcf41a23ec90cfba62" },
|
||||
"nvim-lint": { "branch": "master", "commit": "962a76877a4479a535b935bd7ef35ad41ba308b2" },
|
||||
"nvim-lspconfig": { "branch": "master", "commit": "6c797ff9324094e333e2ace9526ca4a62ad9d1ca" },
|
||||
"nvim-treesitter": { "branch": "master", "commit": "107e61afb7129d637ea6c3c68b97a22194b0bf16" },
|
||||
"nvim-treesitter-context": { "branch": "master", "commit": "8aa32aa6b84dda357849dbc0f775e69f2e04c041" },
|
||||
"nvim-treesitter-textobjects": { "branch": "master", "commit": "eb208bfdfcf76efea0424747e23e44641e13aaa6" },
|
||||
"nvim-ts-autotag": { "branch": "main", "commit": "6be1192965df35f94b8ea6d323354f7dc7a557e4" },
|
||||
"nvim-ts-context-commentstring": { "branch": "main", "commit": "92e688f013c69f90c9bbd596019ec10235bc51de" },
|
||||
"nvim-web-devicons": { "branch": "master", "commit": "5de460ca7595806044eced31e3c36c159a493857" },
|
||||
"obsidian.nvim": { "branch": "main", "commit": "b101ad8988eb1452dabb6138763877a1794a1966" },
|
||||
"plenary.nvim": { "branch": "master", "commit": "50012918b2fc8357b87cff2a7f7f0446e47da174" },
|
||||
"pretty-fold.nvim": { "branch": "master", "commit": "a7d8b424abe0eedf50116c460fbe6dfd5783b1d5" },
|
||||
"smart-splits.nvim": { "branch": "master", "commit": "c8a9173d70cbbd1f6e4a414e49e31df2b32a1362" },
|
||||
"telescope-file-browser.nvim": { "branch": "master", "commit": "6e51d0cd6447cf2525412220ff0a2885eef9039c" },
|
||||
"telescope-fzf-native.nvim": { "branch": "main", "commit": "6c921ca12321edaa773e324ef64ea301a1d0da62" },
|
||||
"telescope.nvim": { "branch": "master", "commit": "7011eaae0ac1afe036e30c95cf80200b8dc3f21a" },
|
||||
"tfm.nvim": { "branch": "main", "commit": "0fd23be8d4adebcc65a30b3870c2090b97dc1bc2" },
|
||||
"todo-comments.nvim": { "branch": "main", "commit": "4a6737a8d70fe1ac55c64dfa47fcb189ca431872" },
|
||||
"treesj": { "branch": "main", "commit": "070e6761d0b11a55446d988a69908f7a0928dbab" },
|
||||
"trouble.nvim": { "branch": "main", "commit": "f1168feada93c0154ede4d1fe9183bf69bac54ea" },
|
||||
"ts-node-action": { "branch": "master", "commit": "f266409809555d7604b1ba894ffad8958670d04f" },
|
||||
"vim-dadbod": { "branch": "master", "commit": "fecf5a3ecfb1869f34252c7c27351de99f01ab0e" },
|
||||
"vim-dadbod-completion": { "branch": "master", "commit": "bcdf3ff768cc7e544a0f78b0383d8719c2116569" },
|
||||
"vim-dadbod-ui": { "branch": "master", "commit": "95fd22469507e86b78aa55d868c14108adee2881" },
|
||||
"vim-fugitive": { "branch": "master", "commit": "cbe9dfa162c178946afa689dd3f42d4ea8bf89c1" },
|
||||
"vim-illuminate": { "branch": "master", "commit": "3bd2ab64b5d63b29e05691e624927e5ebbf0fb86" },
|
||||
"vim-sleuth": { "branch": "master", "commit": "1cc4557420f215d02c4d2645a748a816c220e99b" }
|
||||
}
|
||||
10
chezmoi/dot_config/nvim/lua/aleidk/autocmds.lua
Normal file
10
chezmoi/dot_config/nvim/lua/aleidk/autocmds.lua
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
-- Highlight on yank
|
||||
-- See `:help vim.highlight.on_yank()`
|
||||
local highlight_group = vim.api.nvim_create_augroup("YankHighlight", { clear = true })
|
||||
vim.api.nvim_create_autocmd("TextYankPost", {
|
||||
callback = function()
|
||||
vim.highlight.on_yank()
|
||||
end,
|
||||
group = highlight_group,
|
||||
pattern = "*",
|
||||
})
|
||||
63
chezmoi/dot_config/nvim/lua/aleidk/constants.lua
Normal file
63
chezmoi/dot_config/nvim/lua/aleidk/constants.lua
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
return {
|
||||
icons = {
|
||||
misc = {
|
||||
pint = " ",
|
||||
},
|
||||
dap = {
|
||||
Stopped = { " ", "DiagnosticWarn", "DapStoppedLine" },
|
||||
Breakpoint = " ",
|
||||
BreakpointCondition = " ",
|
||||
BreakpointRejected = { " ", "DiagnosticError" },
|
||||
LogPoint = ".>",
|
||||
},
|
||||
diagnostics = {
|
||||
Error = " ",
|
||||
Warn = " ",
|
||||
Hint = " ",
|
||||
Info = " ",
|
||||
},
|
||||
git = {
|
||||
added = " ",
|
||||
modified = " ",
|
||||
removed = " ",
|
||||
branch = "",
|
||||
},
|
||||
kinds = {
|
||||
Array = " ",
|
||||
Boolean = " ",
|
||||
Class = " ",
|
||||
Color = " ",
|
||||
Constant = " ",
|
||||
Constructor = " ",
|
||||
Copilot = " ",
|
||||
Enum = " ",
|
||||
EnumMember = " ",
|
||||
Event = " ",
|
||||
Field = " ",
|
||||
File = " ",
|
||||
Folder = " ",
|
||||
Function = " ",
|
||||
Interface = " ",
|
||||
Key = " ",
|
||||
Keyword = " ",
|
||||
Method = " ",
|
||||
Module = " ",
|
||||
Namespace = " ",
|
||||
Null = " ",
|
||||
Number = " ",
|
||||
Object = " ",
|
||||
Operator = " ",
|
||||
Package = " ",
|
||||
Property = " ",
|
||||
Reference = " ",
|
||||
Snippet = " ",
|
||||
String = " ",
|
||||
Struct = " ",
|
||||
Text = " ",
|
||||
TypeParameter = " ",
|
||||
Unit = " ",
|
||||
Value = " ",
|
||||
Variable = " ",
|
||||
},
|
||||
},
|
||||
}
|
||||
63
chezmoi/dot_config/nvim/lua/aleidk/keymaps.lua
Normal file
63
chezmoi/dot_config/nvim/lua/aleidk/keymaps.lua
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
-- [[ Basic Keymaps ]]
|
||||
|
||||
function MAP(mode, l, r, desc)
|
||||
vim.keymap.set(mode, l, r, { desc = desc, silent = true })
|
||||
end
|
||||
|
||||
local function default(desc)
|
||||
return {
|
||||
silent = true,
|
||||
desc = desc,
|
||||
}
|
||||
end
|
||||
|
||||
local function fixIdentation()
|
||||
local indent = 2
|
||||
vim.opt.tabstop = indent
|
||||
vim.opt.shiftwidth = indent
|
||||
vim.opt.softtabstop = indent
|
||||
|
||||
vim.cmd("retab")
|
||||
end
|
||||
|
||||
-- Keymaps for better default experience
|
||||
-- See `:help vim.keymap.set()`
|
||||
vim.keymap.set({ "n", "v" }, "<Space>", "<Nop>", { silent = true })
|
||||
|
||||
vim.keymap.set("n", "<C-s>", "<CMD>w<CR>", default("Keep cursor centered while junping"))
|
||||
|
||||
-- Remap for dealing with word wrap
|
||||
vim.keymap.set("n", "k", "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true })
|
||||
vim.keymap.set("n", "j", "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true })
|
||||
|
||||
vim.keymap.set("n", "J", "mzJ`z", default("Keep cursor in column while joining lines"))
|
||||
|
||||
vim.keymap.set("n", "|", ":vs<CR>", default("Open vsplit"))
|
||||
vim.keymap.set("n", "°", ":sp<CR>", default("Open split"))
|
||||
|
||||
vim.keymap.set("n", "<C-d>", "<C-d>zz", default("Keep cursor centered while junping"))
|
||||
vim.keymap.set("n", "<C-u>", "<C-u>zz", default("Keep cursor centered while junping"))
|
||||
|
||||
vim.keymap.set("n", "n", "nzzzv", default("Keep cursor centered while searching"))
|
||||
vim.keymap.set("n", "N", "Nzzzv", default("Keep cursor centered while searching"))
|
||||
|
||||
vim.keymap.set("n", "Q", "<nop>", {})
|
||||
|
||||
vim.keymap.set(
|
||||
"n",
|
||||
"<leader>rw",
|
||||
[[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]],
|
||||
default("Search and replace current word")
|
||||
)
|
||||
|
||||
vim.keymap.set("n", "<leader>rR", ":s/", default("Search and replace inline"))
|
||||
vim.keymap.set("n", "<leader>rr", ":%s/", default("Search and replace globally"))
|
||||
vim.keymap.set("v", "<leader>r", ":s/", default("Search and replace in selection"))
|
||||
|
||||
vim.keymap.set("v", "p", [["_dP]], default("Paste whitout lossing yanked text"))
|
||||
|
||||
vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv", default("Move selection down"))
|
||||
vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv", default("Move selection up"))
|
||||
vim.keymap.set("n", "<Leader>uI", fixIdentation, default("Fix identation"))
|
||||
|
||||
vim.keymap.set("n", "<Leader>uh", ":nohl<CR>", default("Remove search highlight"))
|
||||
75
chezmoi/dot_config/nvim/lua/aleidk/options.lua
Normal file
75
chezmoi/dot_config/nvim/lua/aleidk/options.lua
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
-- [[ Setting options ]]
|
||||
-- See `:help vim.o`
|
||||
|
||||
-- Set <space> as the leader key
|
||||
vim.g.mapleader = " "
|
||||
vim.g.maplocalleader = " "
|
||||
|
||||
local opt = vim.opt
|
||||
|
||||
-- stylua: ignore
|
||||
opt.autowrite = true -- Enable auto write
|
||||
opt.clipboard = "unnamedplus" -- Sync with system clipboard
|
||||
opt.completeopt = "menu,menuone,noselect"
|
||||
opt.conceallevel = 3 -- Hide * markup for bold and italic
|
||||
opt.confirm = true -- Confirm to save changes before exiting modified buffer
|
||||
opt.cursorline = true -- Enable highlighting of the current line
|
||||
opt.expandtab = true -- Use spaces instead of tabs
|
||||
opt.formatoptions = "jcroqlnt" -- tcqj
|
||||
opt.grepformat = "%f:%l:%c:%m"
|
||||
opt.grepprg = "rg --vimgrep"
|
||||
opt.ignorecase = true -- Ignore case
|
||||
opt.inccommand = "nosplit" -- preview incremental substitute
|
||||
opt.laststatus = 0
|
||||
opt.list = true -- Show some invisible characters (tabs...
|
||||
opt.mouse = "a" -- Enable mouse mode
|
||||
opt.number = true -- Print line number
|
||||
opt.pumblend = 10 -- Popup blend
|
||||
opt.pumheight = 10 -- Maximum number of entries in a popup
|
||||
opt.relativenumber = true -- Relative line numbers
|
||||
opt.scrolloff = 8 -- Lines of context
|
||||
opt.sessionoptions = { "buffers", "curdir", "tabpages", "winsize" }
|
||||
opt.shiftround = true -- Round indent
|
||||
opt.shiftwidth = 2 -- Size of an indent
|
||||
opt.shortmess:append({ W = true, I = true, c = true })
|
||||
opt.showmode = false -- Dont show mode since we have a statusline
|
||||
opt.sidescrolloff = 8 -- Columns of context
|
||||
opt.signcolumn = "yes" -- Always show the signcolumn, otherwise it would shift the text each time
|
||||
opt.smartcase = true -- Don't ignore case with capitals
|
||||
opt.smartindent = true -- Insert indents automatically
|
||||
opt.spelllang = { "en" }
|
||||
opt.splitbelow = true -- Put new windows below current
|
||||
opt.splitright = true -- Put new windows right of current
|
||||
opt.tabstop = 2 -- Number of spaces tabs count for
|
||||
opt.termguicolors = true -- True color support
|
||||
opt.timeoutlen = 300
|
||||
opt.undofile = true
|
||||
opt.undolevels = 10000
|
||||
opt.updatetime = 200 -- Save swap file and trigger CursorHold
|
||||
opt.wildmode = "longest,list:full" -- Command-line completion mode
|
||||
opt.winminwidth = 5 -- Minimum window width
|
||||
opt.wrap = false -- Disable line wrap
|
||||
|
||||
vim.o.sessionoptions = "blank,buffers,curdir,folds,help,tabpages,winsize,winpos,terminal,localoptions"
|
||||
|
||||
vim.filetype.add({
|
||||
-- Detect and assign filetype based on the extension of the filename
|
||||
extension = {
|
||||
mdx = "mdx",
|
||||
log = "log",
|
||||
conf = "conf",
|
||||
env = "dotenv",
|
||||
},
|
||||
-- Detect and apply filetypes based on the entire filename
|
||||
filename = {
|
||||
[".env"] = "dotenv",
|
||||
["env"] = "dotenv",
|
||||
["tsconfig.json"] = "jsonc",
|
||||
},
|
||||
-- Detect and apply filetypes based on certain patterns of the filenames
|
||||
pattern = {
|
||||
-- INFO: Match filenames like - ".env.example", ".env.local" and so on
|
||||
["%.env%.[%w_.-]+"] = "dotenv",
|
||||
[".*%.blade%.php"] = "blade",
|
||||
},
|
||||
})
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue