diff options
| -rw-r--r-- | config/karabiner/karabiner.json | 36 | ||||
| -rw-r--r-- | config/ncmpcpp/config | 4 | ||||
| -rw-r--r-- | config/nvim/colors/tranquil-light.vim | 160 | ||||
| -rw-r--r-- | config/nvim/init.lua | 6 | ||||
| -rw-r--r-- | config/nvim/lazy-lock.json | 18 | ||||
| -rw-r--r-- | config/nvim/lua/lsp.lua | 118 | ||||
| -rw-r--r-- | config/nvim/lua/plugins.lua | 6 | ||||
| -rw-r--r-- | config/nvim/lua/treesitter_config.lua | 1 | ||||
| -rw-r--r-- | runcoms/zshrc | 3 | ||||
| -rw-r--r-- | scripts/colors.py | 59 |
10 files changed, 319 insertions, 92 deletions
diff --git a/config/karabiner/karabiner.json b/config/karabiner/karabiner.json index 8a77fbc..71b622c 100644 --- a/config/karabiner/karabiner.json +++ b/config/karabiner/karabiner.json @@ -61,7 +61,17 @@ "product_id": 25903, "vendor_id": 3141 }, - "manipulate_caps_lock_led": false + "manipulate_caps_lock_led": false, + "simple_modifications": [ + { + "from": { "key_code": "left_command" }, + "to": [{ "key_code": "left_option" }] + }, + { + "from": { "key_code": "left_option" }, + "to": [{ "key_code": "left_command" }] + } + ] }, { "identifiers": { @@ -79,6 +89,30 @@ "to": [{ "key_code": "grave_accent_and_tilde" }] } ] + }, + { + "identifiers": { + "is_keyboard": true, + "product_id": 41617, + "vendor_id": 1241 + }, + "manipulate_caps_lock_led": false + }, + { + "identifiers": { + "is_consumer": true, + "product_id": 41617, + "vendor_id": 1241 + }, + "ignore": false + }, + { + "identifiers": { + "is_keyboard": true, + "product_id": 32777, + "vendor_id": 44064 + }, + "ignore": true } ], "fn_function_keys": [ diff --git a/config/ncmpcpp/config b/config/ncmpcpp/config index f9627a8..56fd775 100644 --- a/config/ncmpcpp/config +++ b/config/ncmpcpp/config @@ -1,4 +1,6 @@ -mpd_music_dir "~/.config/mpd/music" +mpd_host = music.bdr.place +mpd_port = 6600 +mpd_music_dir "/mnt/hogganfield/archive/music/Music" visualizer_output_name = Visualizer feed visualizer_data_source = /tmp/mpd.fifo diff --git a/config/nvim/colors/tranquil-light.vim b/config/nvim/colors/tranquil-light.vim new file mode 100644 index 0000000..54f374d --- /dev/null +++ b/config/nvim/colors/tranquil-light.vim @@ -0,0 +1,160 @@ +" Vim color scheme +" +" Name: tranquil-light.vim +" Maintainer: Rubén Beltrán del Río <ben@nsovocal.com> +" Last Change: 05 Mar 2025 +" License: public domain +" Version: 1.1.0 +" +" 256 color scheme using tranquil systems palette in light mode + +set background=light +hi clear +if exists("syntax_on") + syntax reset +endif + +let g:colors_name = "tranquil-light" + +" Variables & Constants +hi @variable guifg=#0F261F +hi link @lsp.type.unresolvedReference.rust DiagnosticUnderlineError +hi Constant guifg=#0000F1 + +" Types & Structs +hi Structure guifg=#0000F1 +hi Type guifg=#0000F1 gui=bold cterm=bold +hi Typedef guifg=#80FFCC +hi Function guifg=#FF616B + +" Functions and Macros +hi link @lsp.type.macro.rust Macro +hi link @function.macro.rust Macro +hi Macro guifg=#23C17C gui=bold cterm=bold +hi Include guifg=#23C17C gui=none cterm=none +hi Define guifg=#23C17C gui=italic cterm=italic +hi PreProc guifg=#23C17C +hi PreCondit guifg=#23C17C gui=bold cterm=bold + +" Language +hi Comment guifg=#0F261F guibg=#FFB4F0 +hi SpecialComment guifg=#0F261F gui=bold cterm=bold +hi Todo guifg=#0F261F guibg=bg gui=bold cterm=bold +hi Delimiter guifg=#90A6A2 +hi Identifier guifg=#4F8FE6 +hi Statement guifg=#6F807C gui=bold cterm=bold +hi Keyword guifg=#6F807C gui=bold,italic cterm=bold,italic +hi Repeat guifg=#6F807C gui=bold cterm=bold +hi Exception guifg=#6F807C gui=bold cterm=bold +hi Operator guifg=#FA2B00 +hi Special guifg=#FA2B00 gui=italic cterm=italic +hi SpecialChar guifg=#FA2B00 gui=bold cterm=bold +hi Label guifg=#6F807C gui=none cterm=none +hi StorageClass guifg=#6F807C gui=italic cterm=italic + +" Text +hi Normal guifg=#0F261F guibg=NONE ctermbg=NONE +hi Underlined guifg=#B5D1CC gui=underline cterm=underline +hi Ignore guifg=#B5D1CC guibg=bg +hi Error guifg=#FFFFFF guibg=#FA2B00 +hi Debug guifg=#FFB4F0 gui=bold cterm=bold + +" Specific Types +hi Boolean guifg=#19a6b0 +hi Number guifg=#19a6b0 +hi Float guifg=#19A6B0 +hi Character guifg=#23C17C guibg=#FEFEFE +hi String guifg=#23C17C guibg=#FEFEFE +hi Conditional guifg=#FA2B00 gui=bold cterm=bold + +" File Browser +hi Directory guifg=#23C17C gui=bold + +" Editor +hi Cursor guifg=#FFFFFF guibg=#0000F1 +hi CursorLine guibg=#F1F1F1 +hi CursorColumn guibg=#F1F1F1 +hi LineNr guifg=#0000F1 guibg=#FEFEFE +hi CursorLineNr guifg=#FFFFFF guibg=#0000F1 +hi NonText guifg=#90A6A2 guibg=none +hi SpecialKey guifg=#0000F1 +hi ColorColumn guifg=#FFFFFF guibg=#FA4B00 +hi WinSep guifg=#0f261F +hi SignColumn guifg=#23C17C guibg=#DAE6E3 +hi StatusLine guifg=#FFFFFF guibg=#0F261F +hi StatusLineNC guifg=#DAE6E3 guibg=#90A6A2 +hi TabLineFill guifg=#FFFFFF guibg=#0F261F +hi TabLine guifg=#FFFFFF guibg=#0F261F +hi TabLineSel guifg=#FFFFFF guibg=#23C17C +hi Tag guifg=#0F261F gui=underline cterm=underline guisp=#0000F1 +hi Title guifg=#4F8FE6 +hi VertSplit guifg=#0F261F guibg=#FFFFFF gui=bold cterm=bold + +" Editor / Search & Matching +hi IncSearch guifg=#0F261F guibg=#FFAB00 +hi CurSearch guifg=#FFFFFF guibg=#23C17C +hi Search guifg=#0F261F guibg=#FFBF6E +hi Substitute guifg=#0F261F guibg=#29BDAD +hi MatchParen guifg=#0F261F guibg=#FFAB00 gui=bold cterm=bold +hi VisualNOS guibg=#0024CC +hi Visual guibg=#0024CC guifg=#FFFFFF + +" Editor / Text Folding +hi FoldColumn guifg=#FFFFFF guibg=#0F261F +hi Folded guifg=#FFFFFF guibg=#90A6A2 + +" Diffing +hi DiffAdd guifg=#23C17C guibg=#F1F1F1 +hi DiffChange guifg=#FFFFFF guibg=#0000F1 +hi DiffDelete guifg=#FA2B00 guibg=#90A6A2 +hi DiffText gui=bold cterm=bold +hi DiffTextAdd gui=bold cterm=bold +hi link @text.diff.add DiffAdd +hi link @text.diff.delete DiffDelete + +" Editor / Messages +hi MsgArea guibg=#FFFFFF +hi OkMsg guifg=#FFFFFF guibg=#23C17C gui=bold cterm=bold +hi ErrorMsg guifg=#FFFFFF guibg=#FA2B00 gui=bold cterm=bold +hi WarningMsg guifg=#0F261F guibg=#FFAB00 gui=bold cterm=bold +hi StderrMsg guifg=#FA2B00 +hi StdoutMsg guifg=#0F261F +hi ModeMsg guifg=#FFFFFF guibg=#0000F1 +hi MoreMsg guifg=#FFFFFF guibg=#23C17C +hi Question guifg=#0F261F guibg=#80FFCC + +" Complete Menu +hi Pmenu guifg=#0F261F guibg=#80FFCC +hi PmenuSel guifg=#FFFFFF guibg=#0F261F +hi PmenuSbar guibg=#0F261F +hi PmenuThumb guifg=#80FFCC +hi WildMenu guifg=#80FFCC guibg=#0F261F + +" WhichKey +hi WhichKeyNormal guibg=#0F261F +hi WhichKeyBorder guibg=#23C17C guifg=#FFFFFF +hi WhichKeyDesc guifg=#90A6A2 +hi WhichKeyGroup guifg=#23C17C +hi WhichKeyIcon guibg=#0F261F guifg=#FA2B00 +hi WhichKeyIconAzure guibg=#0F261F guifg=#FFB4F0 +hi WhichKeyIconBlue guibg=#0F261F guifg=#4F8FE6 +hi WhichKeyIconCyan guibg=#0F261F guifg=#80FFCC +hi WhichKeyIconGreen guibg=#0F261F guifg=#23C17C +hi WhichKeyIconGrey guibg=#0F261F guifg=#90A6A2 +hi WhichKeyIconOrange guibg=#0F261F guifg=#FFCFC4 +hi WhichKeyIconPurple guibg=#0F261F guifg=#FF616B +hi WhichKeyIconRed guibg=#0F261F guifg=#FA2B00 +hi WhichKeyIconYellow guibg=#0F261F guifg=#FAED8F +hi WhichKeySeparator guifg=#B5D1CC +hi WhichKeyTitle guifg=#23C17C + +" LSP Related +hi LspInlayHint guifg=#90A6A2 +hi DiagnosticError guifg=#FFFFFF guibg=#FA2B00 +hi DiagnosticWarn guifg=#0F261F guibg=#FAED8F +hi DiagnosticInfo guifg=#FFFFFF guibg=#4F8FE6 +hi DiagnosticHint guifg=#0F261F guibg=#FFB4F0 +hi DiagnosticUnderlineError guifg=#0F261F guisp=#FA2B00 gui=undercurl,italic cterm=undercurl,italic + +" FZF +hi @fzf.hlplus guifg=#FFFFFF diff --git a/config/nvim/init.lua b/config/nvim/init.lua index f614402..8bf4824 100644 --- a/config/nvim/init.lua +++ b/config/nvim/init.lua @@ -10,7 +10,7 @@ vim.opt.colorcolumn='80,150' -- Show color columns -- Color vim.opt.termguicolors = true -vim.cmd.color('tranquil') +vim.cmd.color('tranquil-light') -- Tab Style (Always override with editorconfig) vim.opt.tabstop = 2 -- 2 Spaces per tab @@ -29,9 +29,11 @@ vim.opt.smartcase = true -- Unless we use both cases in searc vim.opt.wildmode = 'list:longest,list:full' -- Autocomplete common matching string -- Folding Behavior -vim.opt.foldmethod = 'syntax' -- Use syntax highlight to define folds +vim.opt.foldmethod = 'expr' -- Use treesitter for folds +vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()" vim.opt.foldnestmax = 10 -- Max 10 folds vim.opt.foldlevelstart = 99 -- Start with all folds open +vim.opt.foldcolumn = "auto" -- Relative Number Behavior vim.api.nvim_create_autocmd({'FocusLost', 'InsertEnter'}, { diff --git a/config/nvim/lazy-lock.json b/config/nvim/lazy-lock.json index 3164297..9d6f765 100644 --- a/config/nvim/lazy-lock.json +++ b/config/nvim/lazy-lock.json @@ -1,21 +1,21 @@ { "LargeFile": { "branch": "master", "commit": "3941a37b2b0288524300348a39521a46539bf9f6" }, - "coq_nvim": { "branch": "coq", "commit": "d2aeb3221cb46bfd1c51afd1b247d092c52ec0d6" }, - "fzf-lua": { "branch": "main", "commit": "7c21f30f6182ca2463681c0f287d032b48882d4f" }, + "coq_nvim": { "branch": "coq", "commit": "a63d28a9aa59c20a503ce38608fb6bc7cb3842f4" }, + "fzf-lua": { "branch": "main", "commit": "c102a4eeb10a04ed7e69ce80918923c4175c19d8" }, "gemini.vim": { "branch": "master", "commit": "c9efb59c97b71c28d4678c79fd21fbdd3a69d196" }, - "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, - "lazydev.nvim": { "branch": "main", "commit": "258d2a5ef4a3e3d6d9ba9da72c9725c53e9afcbd" }, + "lazy.nvim": { "branch": "main", "commit": "1ea3c4085785f460fb0e46d2fe1ee895f5f9e7c1" }, + "lazydev.nvim": { "branch": "main", "commit": "e28ce52fc7ff79fcb76f0e79ee6fb6182fca90b9" }, "neogen": { "branch": "main", "commit": "d7f9461727751fb07f82011051338a9aba07581d" }, "nota.nvim": { "branch": "main", "commit": "503bfaa93968986a9df5376c4543207c70dd2a07" }, - "nvim-autopairs": { "branch": "master", "commit": "23320e75953ac82e559c610bec5a90d9c6dfa743" }, - "nvim-dap": { "branch": "master", "commit": "7367cec8e8f7a0b1e4566af9a7ef5959d11206a7" }, + "nvim-autopairs": { "branch": "master", "commit": "7a2c97cccd60abc559344042fefb1d5a85b3e33b" }, + "nvim-dap": { "branch": "master", "commit": "6782b097af2417a4c3e33849b0a26ae2188bd7ea" }, "nvim-dap-ui": { "branch": "master", "commit": "cf91d5e2d07c72903d052f5207511bf7ecdb7122" }, "nvim-dap-vscode-js": { "branch": "main", "commit": "03bd29672d7fab5e515fc8469b7d07cc5994bbf6" }, - "nvim-lspconfig": { "branch": "master", "commit": "db8fef885009fdec0daeff3e5dda92e1f539611e" }, + "nvim-lspconfig": { "branch": "master", "commit": "ac98db2f9f06a56498ec890a96928774eae412c3" }, "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, "nvim-treesitter-endwise": { "branch": "master", "commit": "a61a9de7965324d4019fb1637b66bfacdcb01f51" }, - "oil.nvim": { "branch": "master", "commit": "919e155fdf38e9148cdb5304faaaf53c20d703ea" }, + "oil.nvim": { "branch": "master", "commit": "7e1cd7703ff2924d7038476dcbc04b950203b902" }, "oleoboard.nvim": { "branch": "main", "commit": "3652b39db3a8faca3fb767ace799479124bc79f3" }, "snes-syntax-vim": { "branch": "master", "commit": "a6a699c8905f7b6119bf91e44f960667d9f03d59" }, "tree-sitter-api-notation": { "branch": "main", "commit": "3113c6077d9ed1e662a891714ac00e1ee3bb7657" }, @@ -23,5 +23,5 @@ "vim-fugitive": { "branch": "master", "commit": "61b51c09b7c9ce04e821f6cf76ea4f6f903e3cf4" }, "vim-indent-object": { "branch": "master", "commit": "8ab36d5ec2a3a60468437a95e142ce994df598c6" }, "vim-togglelist": { "branch": "master", "commit": "48f0d30292efdf20edc883e61b121e6123e03df7" }, - "which-key.nvim": { "branch": "main", "commit": "904308e6885bbb7b60714c80ab3daf0c071c1492" } + "which-key.nvim": { "branch": "main", "commit": "b4177e3eaf15fe5eb8357ebac2286d488be1ed00" } } diff --git a/config/nvim/lua/lsp.lua b/config/nvim/lua/lsp.lua index 7434504..6c69119 100644 --- a/config/nvim/lua/lsp.lua +++ b/config/nvim/lua/lsp.lua @@ -1,45 +1,37 @@ local coq = require('coq') --- Prepare capabilities with COQ support -local capabilities = vim.lsp.protocol.make_client_capabilities() -capabilities.textDocument.completion.completionItem.snippetSupport = true -capabilities = coq.lsp_ensure_capabilities(capabilities) - --- Configure each LSP server -vim.lsp.config('ts_ls', { +vim.lsp.config('ts_ls', coq.lsp_ensure_capabilities({ cmd = { 'typescript-language-server', '--stdio' }, - root_markers = { 'package.json', 'tsconfig.json', 'jsconfig.json' }, - capabilities = capabilities, -}) + filetypes = { 'javascript', 'javascriptreact', 'typescript', 'typescriptreact' }, + root_markers = { 'package.json', 'tsconfig.json', 'jsconfig.json' } +})) +vim.lsp.enable('ts_ls') -vim.lsp.config('eslint', { +vim.lsp.config('eslint', coq.lsp_ensure_capabilities({ cmd = { 'vscode-eslint-language-server', '--stdio' }, - root_markers = { '.eslintrc', '.eslintrc.js', '.eslintrc.json', 'package.json' }, - capabilities = capabilities, -}) + filetypes = { 'javascript', 'javascriptreact', 'typescript', 'typescriptreact' }, + root_markers = { '.eslintrc', '.eslintrc.js', '.eslintrc.json', 'package.json' } +})) +vim.lsp.enable('eslint') -vim.lsp.config('svelte', { +vim.lsp.config('svelte', coq.lsp_ensure_capabilities({ cmd = { 'svelteserver', '--stdio' }, - root_markers = { 'package.json', 'svelte.config.js' }, - capabilities = capabilities, -}) + filetypes = { 'svelte' }, + root_markers = { 'package.json', 'svelte.config.js' } +})) +vim.lsp.enable('svelte') -vim.lsp.config('pyright', { +vim.lsp.config('pyright', coq.lsp_ensure_capabilities({ cmd = { 'pyright-langserver', '--stdio' }, - root_markers = { 'pyproject.toml', 'setup.py', 'requirements.txt' }, - capabilities = capabilities, -}) - -vim.lsp.config('dartls', { - cmd = { 'dart', 'language-server', '--protocol=lsp' }, - root_markers = { 'pubspec.yaml' }, - capabilities = capabilities, -}) + filetypes = { 'python' }, + root_markers = { 'pyproject.toml', 'setup.py', 'requirements.txt' } +})) +vim.lsp.enable('pyright') -vim.lsp.config('rust_analyzer', { +vim.lsp.config('rust_analyzer', coq.lsp_ensure_capabilities({ cmd = { 'rust-analyzer' }, + filetypes = { 'rust' }, root_markers = { 'Cargo.toml', 'rust-project.json' }, - capabilities = capabilities, settings = { ['rust-analyzer'] = { imports = { @@ -57,61 +49,35 @@ vim.lsp.config('rust_analyzer', { enable = true }, checkOnSave = { + enable = true, command = "clippy" } }, }, -}) +})) +vim.lsp.enable('rust_analyzer') -vim.lsp.config('lua_ls', { +vim.lsp.config('lua_ls', coq.lsp_ensure_capabilities({ cmd = { 'lua-language-server' }, + filetypes = { 'lua' }, root_markers = { '.luarc.json', '.luarc.jsonc', '.luacheckrc', 'stylua.toml', 'selene.toml' }, - capabilities = capabilities, -}) - --- Auto-enable LSP servers based on filetype -vim.api.nvim_create_autocmd('FileType', { - pattern = { 'javascript', 'javascriptreact', 'typescript', 'typescriptreact' }, - callback = function() - vim.lsp.enable('ts_ls') - vim.lsp.enable('eslint') - end, -}) +})) +vim.lsp.enable('lua_ls') -vim.api.nvim_create_autocmd('FileType', { - pattern = 'svelte', - callback = function() - vim.lsp.enable('svelte') - end, -}) - -vim.api.nvim_create_autocmd('FileType', { - pattern = 'python', - callback = function() - vim.lsp.enable('pyright') - end, -}) - -vim.api.nvim_create_autocmd('FileType', { - pattern = 'dart', - callback = function() - vim.lsp.enable('dartls') - end, -}) - -vim.api.nvim_create_autocmd('FileType', { - pattern = 'rust', - callback = function() - vim.lsp.enable('rust_analyzer') - -- Enable inlay hints for Rust - vim.lsp.inlay_hint.enable(true, { bufnr = 0 }) - end, -}) +vim.lsp.config('gleam', coq.lsp_ensure_capabilities({ + cmd = { 'gleam', 'lsp' }, + filetypes = { 'gleam' }, + root_markers = { 'gleam.toml' }, +})) +vim.lsp.enable('gleam') -vim.api.nvim_create_autocmd('FileType', { - pattern = 'lua', - callback = function() - vim.lsp.enable('lua_ls') +-- Enable inlay hints for Rust when LSP attaches +vim.api.nvim_create_autocmd('LspAttach', { + callback = function(args) + local client = vim.lsp.get_client_by_id(args.data.client_id) + if client and client.name == 'rust_analyzer' then + vim.lsp.inlay_hint.enable(true, { bufnr = args.buf }) + end end, }) diff --git a/config/nvim/lua/plugins.lua b/config/nvim/lua/plugins.lua index 882c76d..ce637e9 100644 --- a/config/nvim/lua/plugins.lua +++ b/config/nvim/lua/plugins.lua @@ -28,9 +28,9 @@ require('lazy').setup({ ['fg'] = {'fg', 'Normal'}, ['bg'] = {'bg', 'Normal'}, ['hl'] = {'fg', 'Comment'}, - ['fg+'] = {'fg', 'CursorLine'}, - ['bg+'] = {'bg', 'CursorLine'}, - ['hl+'] = {'fg', 'Statement'}, + ['fg+'] = {'fg', 'Type'}, + ['bg+'] = {'bg', 'Comment'}, + ['hl+'] = {'fg', '@fzf.hlplus'}, ['info'] = {'fg', 'PreProc'}, ['prompt'] = {'fg', 'Conditional'}, ['pointer'] = {'fg', 'Exception'}, diff --git a/config/nvim/lua/treesitter_config.lua b/config/nvim/lua/treesitter_config.lua index ded65ac..16986d6 100644 --- a/config/nvim/lua/treesitter_config.lua +++ b/config/nvim/lua/treesitter_config.lua @@ -8,6 +8,7 @@ require'nvim-treesitter.configs'.setup { 'diff', 'dockerfile', 'gitcommit', + 'gleam', 'graphql', 'html', 'htmldjango', diff --git a/runcoms/zshrc b/runcoms/zshrc index 550bb09..041d4ba 100644 --- a/runcoms/zshrc +++ b/runcoms/zshrc @@ -93,3 +93,6 @@ fi if [[ -s "~/.asdf/plugins/java/set-java-home.zsh" ]]; then . ~/.asdf/plugins/java/set-java-home.zsh fi + +# Difftastic +export DFT_BACKGROUND=light diff --git a/scripts/colors.py b/scripts/colors.py new file mode 100644 index 0000000..ccc6d51 --- /dev/null +++ b/scripts/colors.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 + +# ANSI color codes +colors = { + 'black': 30, + 'red': 31, + 'green': 32, + 'yellow': 33, + 'blue': 34, + 'magenta': 35, + 'cyan': 36, + 'white': 37, + 'bright_black': 90, + 'bright_red': 91, + 'bright_green': 92, + 'bright_yellow': 93, + 'bright_blue': 94, + 'bright_magenta': 95, + 'bright_cyan': 96, + 'bright_white': 97 +} + +backgrounds = { + 'black': 40, + 'red': 41, + 'green': 42, + 'yellow': 43, + 'blue': 44, + 'magenta': 45, + 'cyan': 46, + 'white': 47, + 'bright_black': 100, + 'bright_red': 101, + 'bright_green': 102, + 'bright_yellow': 103, + 'bright_blue': 104, + 'bright_magenta': 105, + 'bright_cyan': 106, + 'bright_white': 107 +} + +pangram = "Sphinx of black quartz, judge my vow" + +print("=" * 60) +print("QUARTZ SPHINX PANGRAM - ALL COLOR COMBINATIONS") +print("=" * 60) +print() + +for bg_name, bg_code in backgrounds.items(): + print(f"\n--- Background: {bg_name.upper().replace('_', ' ')} ---") + for fg_name, fg_code in colors.items(): + # Create the ANSI escape sequence + colored_text = f"\033[{fg_code};{bg_code}m{pangram}\033[0m" + print(f"{fg_name:20} | {colored_text}") + print() + +print("=" * 60) +print("Total combinations:", len(colors) * len(backgrounds)) +print("=" * 60) |