Move nvim related things to separate repo

This commit is contained in:
Evie Litherland-Smith 2023-05-16 09:58:47 +01:00
parent 25c5382905
commit 38c18601b7
52 changed files with 15 additions and 3397 deletions

2
.gitignore vendored
View file

@ -1,6 +1,4 @@
.netrwhist
*.swp
.python-version
.DS_Store
__pycache__
.luarc.json

View file

@ -1,32 +1,33 @@
$(eval HOSTNAME=$(shell hostname))
CONFIG_REPO := git@gitlab.com:elitherl/nixos.git
HOMEMANAGER_CONFIG := $(PWD)/home/$(HOSTNAME)-$(USER).nix
NIXOS_REPO := git@git.xenia.me.uk:xenia/nixos.git
NVIM_REPO := git@git.xenia.me.uk:xenia/nvim.git
HOMEMANAGER_CONFIG := $(PWD)/home/$(HOSTNAME)/$(USER).nix
CONFIG_DIR := $(if $(XDG_CONFIG_HOME), $(XDG_CONFIG_HOME), $(HOME)/.config)
BIN_DIR := $(HOME)/.local/bin
HOMEMANAGER_CONFIG_DIR := $(CONFIG_DIR)/home-manager
.PHONY: default all clean nixos home legacy lclean
.PHONY: default all clean nixos home nvim
default:
[ -e /etc/nixos/ ] && make nixos || make home
all: install nixos home
all: default nvim
clean:
rm -rf $(HOME)/.local/share/nvim
rm -rf $(HOME)/.local/state/nvim
[ -e $(HOMEMANAGER_CONFIG_DIR) ] && rm -rf $(HOMEMANAGER_CONFIG_DIR)
/nix:
command -v nix > /dev/null && echo "Nix already installed" || ./scripts/installers/nix.sh --daemon
/etc/nixos/config:
sudo git clone $(CONFIG_REPO) /etc/nixos/config
nixos: /etc/nixos/config
home: $(HOMEMANAGER_CONFIG_DIR)/home.nix
nvim: $(CONFIG_DIR)/nvim
/nix:
command -v nix > /dev/null || echo "Install nix package manager before continuing"; exit 1
/etc/nixos/config:
sudo git clone $(NIXOS_REPO) $@
$(HOMEMANAGER_CONFIG_DIR)/home.nix: $(HOMEMANAGER_CONFIG_DIR) /nix
[ -f $(HOMEMANAGER_CONFIG) ] || touch $(HOMEMANAGER_CONFIG)
ln -s $(HOMEMANAGER_CONFIG) $@
@ -34,18 +35,5 @@ $(HOMEMANAGER_CONFIG_DIR)/home.nix: $(HOMEMANAGER_CONFIG_DIR) /nix
$(CONFIG_DIR) $(HOMEMANAGER_CONFIG_DIR) $(BIN_DIR):
mkdir -p $@
legacy: $(CONFIG_DIR) $(BIN_DIR)
fc-list | grep -iE "(fira.*code)*(nerd.*font)" > /dev/null || ./scripts/installers/firacode.sh && fc-cache
command -v nvim > /dev/null || ./scripts/installers/nvim.sh
[ -e $(CONFIG_DIR)/nvim ] || ln -s $(PWD)/home/tui/config/nvim $(CONFIG_DIR)/
command -v starship > /dev/null || ./scripts/installers/starship.sh --yes --bin-dir $(BIN_DIR)
[ -e $(CONFIG_DIR)/starship.toml ] || ln -s $(PWD)/home/env/config/starship.toml $(CONFIG_DIR)/
command -v direnv > /dev/null || bin_path="$(BIN_DIR)" ./scripts/installers/direnv.sh
lclean: clean
[ -e $(HOME)/.fonts/FiraCode ] && rm -rf $(HOME)/.fonts/FiraCode
[ -e $(BIN_DIR)/nvim ] && rm $(BIN_DIR)/nvim
[ -e $(CONFIG_DIR)/nvim ] && rm $(CONFIG_DIR)/nvim
[ -e $(BIN_DIR)/starship ] && rm $(BIN_DIR)/starship
[ -e $(CONFIG_DIR)/starship.toml ] && rm $(CONFIG_DIR)/starship.toml
[ -e $(BIN_DIR)/direnv ] && rm $(BIN_DIR)/direnv
$(CONFIG_DIR)/nvim: $(CONFIG_DIR)
git clone $(NVIM_REPO) $@

View file

@ -1,78 +0,0 @@
vim.g.mapleader = " "
-- bootstrap 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)
require("lazy").setup {
root = vim.fn.stdpath "data" .. "/lazy",
spec = "plugins",
lockfile = vim.fn.stdpath "data" .. "/lazy-lock.json",
dev = { path = "~/Projects/lua/nvim" },
install = { colorscheme = { "catppuccin" } },
ui = {
border = "rounded",
icons = { lazy = " " },
},
diff = { cmd = "diffview.nvim" },
checker = { enabled = true, frequency = 3600 },
performance = {
rtp = {
disabled_plugins = {
"gzip",
"matchit",
"matchparen",
"netrwPlugin",
"tarPlugin",
"tohtml",
"tutor",
"zipPlugin",
},
},
},
}
-- Set vim options
vim.opt.laststatus = 3
vim.opt.showtabline = 1
vim.opt.shiftwidth = 4
vim.opt.expandtab = true
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.listchars = { lead = ".", trail = ".", tab = ">-" }
vim.opt.list = true
vim.opt.splitbelow = true
vim.opt.splitright = true
-- Global
vim.g.loaded_perl_provider = 0
-- Common keymaps
vim.keymap.set("i", "jk", "<esc>")
vim.keymap.set("n", "<leader>l", "<cmd>Lazy<CR>")
vim.opt.winblend = 15
vim.opt.pumblend = 15
-- neovide
if vim.g.neovide then
vim.g.neovide_padding_top = 5
vim.g.neovide_padding_bottom = 5
vim.g.neovide_padding_left = 5
vim.g.neovide_padding_right = 5
vim.g.neovide_floating_blur_amount_x = 2.0
vim.g.neovide_floating_blur_amount_y = 2.0
vim.g.neovide_hide_mouse_when_typing = false
vim.g.neovide_remember_window_size = false
end

View file

@ -1,27 +0,0 @@
-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
local on_attach = function(client, bufnr)
-- Mappings.
-- See `:help vim.lsp.*` for documentation on any of the below functions
local bufopts = { noremap = true, silent = true, buffer = bufnr }
vim.keymap.set("n", "gD", vim.lsp.buf.definition, bufopts)
vim.keymap.set("n", "gd", "<cmd>Trouble lsp_definitions<cr>", bufopts)
vim.keymap.set("n", "gR", vim.lsp.buf.references, bufopts)
vim.keymap.set("n", "gr", "<cmd>Trouble lsp_references<cr>", bufopts)
vim.keymap.set("n", "gI", vim.lsp.buf.implementation, bufopts)
vim.keymap.set("n", "gi", "<cmd>Trouble lsp_implementations<cr>", bufopts)
vim.keymap.set("n", "K", vim.lsp.buf.hover, bufopts)
vim.keymap.set("n", "<C-k>", vim.lsp.buf.signature_help, bufopts)
vim.keymap.set("n", "<leader>wa", vim.lsp.buf.add_workspace_folder, bufopts)
vim.keymap.set("n", "<leader>wr", vim.lsp.buf.remove_workspace_folder, bufopts)
vim.keymap.set("n", "<leader>wl", function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, bufopts)
vim.keymap.set("n", "<leader>D", vim.lsp.buf.type_definition, bufopts)
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, bufopts)
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, bufopts)
vim.keymap.set("n", "<leader>i", require "lsp.formatting", bufopts)
if client.server_capabilities.documentSymbolProvider then
require("nvim-navic").attach(client, bufnr)
require("nvim-navbuddy").attach(client, bufnr)
end
end
return on_attach

View file

@ -1,98 +0,0 @@
local cmp = require "cmp"
local luasnip = require "luasnip"
local cmp_autopairs = require "nvim-autopairs.completion.cmp"
require("luasnip.loaders.from_vscode").lazy_load()
cmp.setup {
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body) -- For `luasnip` users.
end,
},
mapping = cmp.mapping.preset.insert {
["<C-u>"] = cmp.mapping.scroll_docs(-4), -- Up
["<C-d>"] = cmp.mapping.scroll_docs(4), -- Down
["<C-Space>"] = cmp.mapping.complete(),
["<CR>"] = cmp.mapping.confirm {
behavior = cmp.ConfirmBehavior.Replace,
select = true,
},
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
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" }),
},
sources = {
{ name = "nvim_lsp" },
{ name = "luasnip" },
},
}
-- Set configuration for specific filetype.
cmp.setup.filetype("python", {
sources = {
{ name = "nvim_lsp" },
},
})
cmp.setup.filetype("nix", {
sources = {
{ name = "nvim_lsp" },
},
})
cmp.setup.filetype("gitcommit", {
sources = {
{ name = "nvim_lsp" },
{ name = "git" },
{ name = "spell" },
{ name = "commit" },
{ name = "buffer" },
{ name = "luasnip" },
{ name = "latex_symbols" },
},
})
cmp.setup.filetype("markdown", {
sources = {
{ name = "nvim_lsp" },
{ name = "spell" },
{ name = "buffer" },
{ name = "luasnip" },
{ name = "latex_symbols" },
},
})
cmp.setup.cmdline("/", {
mapping = cmp.mapping.preset.cmdline(),
sources = {
{ name = "nvim_lsp" },
{ name = "buffer" },
},
})
cmp.setup.cmdline(":", {
mapping = cmp.mapping.preset.cmdline(),
sources = {
{ name = "nvim_lsp" },
{ name = "path" },
{ name = "cmdline" },
},
})
cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done())

View file

@ -1,39 +0,0 @@
local M = {}
-- Mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
local opts = { noremap = true, silent = true }
vim.keymap.set("n", "<leader>e", vim.diagnostic.open_float, opts)
vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts)
vim.keymap.set("n", "]d", vim.diagnostic.goto_next, opts)
vim.keymap.set("n", "<leader>q", vim.diagnostic.setloclist, opts)
local signs = { Error = "", Warn = "", Hint = "", Info = "" }
for type, icon in pairs(signs) do
local hl = "DiagnosticSign" .. type
vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = hl })
end
require("neodev").setup()
M.on_attach = require "lsp.attach"
M.lsp_flags = require "lsp.flags"
M.capabilities = require("cmp_nvim_lsp").default_capabilities()
local servers = { "jedi_language_server", "lua_ls", "rnix", "nil_ls", "fortls" }
for _, name in ipairs(servers) do
require("lspconfig")[name].setup {
on_attach = M.on_attach,
flags = M.lsp_flags,
capabilities = M.capabilities,
}
end
require("null-ls").setup {
sources = require "lsp.null_ls_sources",
on_attach = M.on_attach,
flags = M.lsp_flags,
capabilities = M.capabilities,
}
return M

View file

@ -1,5 +0,0 @@
local lsp_flags = {
-- This is the default in Nvim 0.7+
debounce_text_changes = 150,
}
return lsp_flags

View file

@ -1,11 +0,0 @@
local lsp_formatting = function(bufnr)
vim.lsp.buf.format {
bufnr = bufnr,
timeout_ms = 2000,
async = true,
filter = function(client)
return client.name ~= "jedi_language_server" and client.name ~= "lua_ls"
end,
}
end
return lsp_formatting

View file

@ -1,13 +0,0 @@
local null_ls = require "null-ls"
return {
null_ls.builtins.code_actions.gitsigns,
null_ls.builtins.diagnostics.zsh,
null_ls.builtins.diagnostics.mypy,
null_ls.builtins.diagnostics.ruff,
null_ls.builtins.formatting.black,
null_ls.builtins.formatting.isort,
null_ls.builtins.formatting.stylua,
null_ls.builtins.formatting.prettier,
null_ls.builtins.formatting.trim_whitespace,
null_ls.builtins.hover.dictionary,
}

View file

@ -1,58 +0,0 @@
return {
"goolord/alpha-nvim",
event = "VimEnter",
opts = function()
local dashboard = require "alpha.themes.dashboard"
local logo = [[
Z
Z
z
z
]]
dashboard.section.header.val = vim.split(logo, "\n")
dashboard.section.buttons.val = {
dashboard.button("f", "" .. " Find file", ":Telescope find_files <CR>"),
dashboard.button("e", "" .. " Edit new file", ":ene <BAR> startinsert <CR>"),
dashboard.button("r", "" .. " Recent files", ":Telescope oldfiles <CR>"),
dashboard.button("n", "󱏒 " .. " Neotree", ":Neotree left <CR>"),
dashboard.button("g", "󰊢 " .. " Git status", ":Neogit <CR>"),
dashboard.button("c", "" .. " Config", ":e $MYVIMRC <CR>"),
dashboard.button("l", "󰒲 " .. " Lazy", ":Lazy<CR>"),
dashboard.button("q", "" .. " Quit", ":qa<CR>"),
}
for _, button in ipairs(dashboard.section.buttons.val) do
button.opts.hl = "AlphaButtons"
button.opts.hl_shortcut = "AlphaShortcut"
end
dashboard.section.header.opts.hl = "AlphaHeader"
dashboard.section.buttons.opts.hl = "AlphaButtons"
dashboard.section.footer.opts.hl = "AlphaFooter"
dashboard.opts.layout[1].val = 8
return dashboard
end,
config = function(_, dashboard)
-- close Lazy and re-open when the dashboard is ready
if vim.o.filetype == "lazy" then
vim.cmd.close()
vim.api.nvim_create_autocmd("User", {
pattern = "AlphaReady",
callback = function() require("lazy").show() end,
})
end
require("alpha").setup(dashboard.opts)
vim.api.nvim_create_autocmd("User", {
pattern = "LazyVimStarted",
callback = function()
local stats = require("lazy").stats()
local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100)
dashboard.section.footer.val = "⚡ Neovim loaded " .. stats.count .. " plugins in " .. ms .. "ms"
pcall(vim.cmd.AlphaRedraw)
end,
})
end,
}

View file

@ -1,48 +0,0 @@
local config = {
flavour = "macchiato",
term_colors = true,
transparent_background = true,
integrations = {
alpha = true,
gitsigns = true,
hop = true,
indent_blankline = {
enabled = true,
colored_indent_levels = true,
},
cmp = true,
markdown = true,
mini = true,
native_lsp = {
enabled = true,
},
neogit = true,
neotree = true,
noice = true,
notify = true,
navic = {
enabled = true,
custom_bg = "NONE",
},
treesitter = true,
treesitter_context = true,
telescope = true,
lsp_trouble = true,
which_key = true,
},
}
return {
"catppuccin/nvim",
name = "catppuccin",
lazy = false,
priority = 1000,
init = function()
vim.opt.termguicolors = true
require "ui.fillchars"
end,
config = function()
require("catppuccin").setup(config)
vim.cmd.colorscheme "catppuccin"
end,
}

View file

@ -1,7 +0,0 @@
return {
"numToStr/Comment.nvim",
keys = { "gcc", "gcb" },
event = { "BufReadPre" },
config = true,
opts = { ignore = "^$" },
}

View file

@ -1,15 +0,0 @@
return {
"sindrets/diffview.nvim",
dependencies = { "nvim-lua/plenary.nvim", "nvim-tree/nvim-web-devicons" },
cmd = {
"DiffviewFileHistory",
"DiffviewOpen",
},
config = true,
opts = {
enhanced_diff_hl = true,
file_panel = {
listing_style = "list",
},
},
}

View file

@ -1,9 +0,0 @@
return {
"https://github.com/direnv/direnv.vim.git",
name = "direnv.vim",
lazy = false,
config = function()
vim.g.direnv_auto = 1
vim.g.direnv_silent_load = 1
end,
}

View file

@ -1 +0,0 @@
return { "stevearc/dressing.nvim", event = "VeryLazy" }

View file

@ -1,50 +0,0 @@
return {
"lewis6991/gitsigns.nvim",
event = { "BufReadPre", "BufNewFile" },
config = true,
opts = {
signcolumn = true,
numhl = true,
linehl = false,
current_line_blame = true,
word_diff = false,
on_attach = function(bufnr)
local gs = package.loaded.gitsigns
local function map(mode, l, r, opts)
opts = opts or {}
opts.buffer = bufnr
vim.keymap.set(mode, l, r, opts)
end
-- Navigation
map("n", "]c", function()
if vim.wo.diff then return "]c" end
vim.schedule(function() gs.next_hunk() end)
return "<Ignore>"
end, { expr = true })
map("n", "[c", function()
if vim.wo.diff then return "[c" end
vim.schedule(function() gs.prev_hunk() end)
return "<Ignore>"
end, { expr = true })
-- Actions
map({ "n", "v" }, "<leader>hs", ":Gitsigns stage_hunk<CR>")
map({ "n", "v" }, "<leader>hr", ":Gitsigns reset_hunk<CR>")
map("n", "<leader>hS", gs.stage_buffer)
map("n", "<leader>hu", gs.undo_stage_hunk)
map("n", "<leader>hR", gs.reset_buffer)
map("n", "<leader>hp", gs.preview_hunk)
map("n", "<leader>hb", function() gs.blame_line { full = true } end)
map("n", "<leader>tb", gs.toggle_current_line_blame)
map("n", "<leader>hd", gs.diffthis)
map("n", "<leader>hD", function() gs.diffthis "~" end)
map("n", "<leader>td", gs.toggle_deleted)
-- Text object
map({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>")
end,
},
}

View file

@ -1,9 +0,0 @@
return {
"phaazon/hop.nvim",
cmd = { "HopWord", "HopLine" },
init = function()
vim.keymap.set("n", "<leader>hw", "<cmd>HopWord<cr>")
vim.keymap.set("n", "<leader>hl", "<cmd>HopLine<cr>")
end,
config = true,
}

View file

@ -1,9 +0,0 @@
return {
"lukas-reineke/indent-blankline.nvim",
event = { "BufReadPre", "BufNewFile" },
config = true,
opts = {
show_current_context = true,
show_current_context_start = false,
},
}

View file

@ -1,3 +0,0 @@
return {
{ "folke/lazy.nvim", cmd = "Lazy" },
}

View file

@ -1,25 +0,0 @@
return {
"neovim/nvim-lspconfig",
event = { "BufReadPre", "BufNewFile", "BufEnter" },
cmd = {
"LspLog",
"LspStop",
"LspStart",
"LspRestart",
"LspInfo",
},
dependencies = {
{ "hrsh7th/nvim-cmp" },
{ "rafamadriz/friendly-snippets" },
{ "windwp/nvim-autopairs" },
{ "jose-elias-alvarez/null-ls.nvim", lazy = true },
{ "mfussenegger/nvim-dap", lazy = true },
{ "folke/neodev.nvim", dependencies = { "hrsh7th/nvim-cmp" }, lazy = true },
{ "SmiteshP/nvim-navic" },
{ "SmiteshP/nvim-navbuddy" },
},
config = function()
require "lsp.config"
require "lsp.cmp"
end,
}

View file

@ -1,32 +0,0 @@
return {
"nvim-lualine/lualine.nvim",
dependencies = { "nvim-tree/nvim-web-devicons", "SmiteshP/nvim-navic", "folke/noice.nvim" },
event = { "BufEnter" },
config = true,
opts = {
options = {
theme = "catppuccin",
component_separators = "|",
section_separators = { left = "", right = "" },
globalstatus = true,
},
sections = {
lualine_a = { "mode" },
lualine_b = { "filename", { "branch", icon = "󰊢" }, "diff" },
lualine_c = { "diagnostics", "require('noice').api.status.lsp.get_hl()" },
lualine_x = { "filetype", "fileformat", "encoding" },
lualine_y = { "progress" },
lualine_z = { "selectioncount", "location" },
},
tabline = {
lualine_a = {},
lualine_b = {},
lualine_c = { "require('nvim-navic').get_location()" },
lualine_x = { "windows" },
lualine_y = {},
lualine_z = {},
},
winbar = {},
extensions = { "aerial", "fzf", "lazy", "neo-tree", "toggleterm", "trouble" },
},
}

View file

@ -1,18 +0,0 @@
return {
"numToStr/Navigator.nvim",
cmd = {
"NavigatorUp",
"NavigatorDown",
"NavigatorLeft",
"NavigatorRight",
"NavigatorPrevious",
},
init = function()
vim.keymap.set({ "n", "t" }, "<A-h>", "<CMD>NavigatorLeft<CR>")
vim.keymap.set({ "n", "t" }, "<A-l>", "<CMD>NavigatorRight<CR>")
vim.keymap.set({ "n", "t" }, "<A-k>", "<CMD>NavigatorUp<CR>")
vim.keymap.set({ "n", "t" }, "<A-j>", "<CMD>NavigatorDown<CR>")
vim.keymap.set({ "n", "t" }, "<A-p>", "<CMD>NavigatorPrevious<CR>")
end,
config = true,
}

View file

@ -1,24 +0,0 @@
return {
"TimUntersberger/neogit",
dependencies = {
"nvim-lua/plenary.nvim",
"sindrets/diffview.nvim",
},
cmd = "Neogit",
init = function()
vim.keymap.set("n", "<leader>gg", "<cmd>Neogit<CR>")
vim.keymap.set("n", "<leader>cc", "<cmd>Neogit commit<CR>")
vim.keymap.set("n", "<leader>gp", "<cmd>Neogit pull<CR>")
vim.keymap.set("n", "<leader>gP", "<cmd>Neogit push<CR>")
end,
config = true,
opts = {
disable_commit_confirmation = true,
disable_builtin_notifications = true,
-- kind = "floating",
-- commit_popup = { kind = "floating" },
-- preview_buffer = { kind = "floating" },
-- popup = { kind = "floating" },
integrations = { diffview = true },
},
}

View file

@ -1,48 +0,0 @@
return {
"nvim-neo-tree/neo-tree.nvim",
branch = "v2.x",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-tree/nvim-web-devicons", -- not strictly required, but recommended
"MunifTanjim/nui.nvim",
},
cmd = "NeoTree",
event = { "BufEnter" },
init = function()
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
vim.g.neo_tree_remove_legacy_commands = 1
vim.keymap.set("n", "<leader>nn", "<cmd>Neotree left reveal reveal_force_cwd<cr>")
vim.keymap.set("n", "<leader>nb", "<cmd>Neotree toggle show buffers right<cr>")
end,
config = true,
opts = {
close_if_last_window = true,
use_popups_for_input = false,
filesystem = {
window = {
mappings = {
["Z"] = "expand_all_nodes",
["<tab>"] = "toggle_node",
},
},
filtered_items = {
hide_dotfiles = false,
},
group_empty_dirs = true,
hijack_netrw_behavior = "open_current",
},
buffers = {
bind_to_cwd = true,
follow_current_file = true,
group_empty_dirs = true,
},
git_status = {
group_empty_dirs = true,
},
source_selector = {
winbar = true,
statusline = false,
},
},
}

View file

@ -1,44 +0,0 @@
return {
"folke/noice.nvim",
dependencies = {
"MunifTanjim/nui.nvim",
"rcarriga/nvim-notify",
},
config = true,
opts = {
lsp = {
progress = {
enabled = true,
format = {
"({data.progress.percentage}%) ",
{ "{spinner} ", hl_group = "NoiceLspProgressSpinner" },
{ "{data.progress.title} ", hl_group = "NoiceLspProgressTitle" },
{ "{data.progress.client} ", hl_group = "NoiceLspProgressClient" },
},
},
-- override markdown rendering so that **cmp** and other plugins use **Treesitter**
override = {
["vim.lsp.util.convert_input_to_markdown_lines"] = true,
["vim.lsp.util.stylize_markdown"] = true,
["cmp.entry.get_documentation"] = true,
},
},
views = {
mini = {
position = { row = -2 },
border = { style = "rounded" },
win_options = { winblend = 0 },
},
},
status = { lsp = { event = "lsp", kind = "progress" } },
routes = { { view = "mini", filter = { event = "lsp", kind = "progress" }, opts = { skip = true } } },
-- you can enable a preset for easier configuration
presets = {
bottom_search = false, -- use a classic bottom cmdline for search
command_palette = true, -- position the cmdline and popupmenu together
long_message_to_split = false, -- long messages will be sent to a splitnoice
inc_rename = true, -- enables an input dialog for inc-rename.nvim
lsp_doc_border = true, -- add a border to hover docs and signature help
},
},
}

View file

@ -1,9 +0,0 @@
return {
"rcarriga/nvim-notify",
config = true,
opts = {
background_colour = "#000000",
fps = 60,
render = "default", -- "minimal", "simple"
},
}

View file

@ -1,15 +0,0 @@
return {
"hrsh7th/nvim-cmp",
dependencies = {
{ "hrsh7th/cmp-nvim-lsp" },
{ "hrsh7th/cmp-buffer" },
{ "hrsh7th/cmp-path" },
{ "hrsh7th/cmp-cmdline" },
{ "f3fora/cmp-spell" },
{ "petertriho/cmp-git" },
{ "Dosx001/cmp-commit" },
{ "kdheepak/cmp-latex-symbols" },
{ "L3MON4D3/LuaSnip" },
{ "saadparwaiz1/cmp_luasnip" },
},
}

View file

@ -1,14 +0,0 @@
return {
"windwp/nvim-autopairs",
lazy = true,
dependencies = {
"nvim-treesitter/nvim-treesitter",
"hrsh7th/nvim-cmp",
},
config = true,
opts = {
disable_in_macro = true,
disable_in_visualblock = true,
check_ts = true,
},
}

View file

@ -1,27 +0,0 @@
return {
"SmiteshP/nvim-navbuddy",
dependencies = { "SmiteshP/nvim-navic", "MunifTanjim/nui.nvim" },
cmd = { "Navbuddy" },
init = function() vim.keymap.set("n", "<leader>na", "<cmd>Navbuddy<cr>") end,
config = true,
opts = {
icons = require "ui.navic_icons",
window = {
border = "none",
size = "80%",
sections = {
left = { border = "rounded" },
mid = { border = "rounded" },
right = { border = "rounded", preview = "leaf" },
},
},
node_markers = {
enabled = true,
icons = {
leaf = " ",
leaf_selected = "",
branch = "",
},
},
},
}

View file

@ -1,11 +0,0 @@
return {
"SmiteshP/nvim-navic",
dependencies = "neovim/nvim-lspconfig",
lazy = true,
config = true,
opts = {
safe_output = true,
click = true,
icons = require "ui.navic_icons",
},
}

View file

@ -1,28 +0,0 @@
return {
"klen/nvim-test",
cmd = {
"TestFile",
"TestEdit",
"TestNearest",
"TestLast",
"TestVisit",
"TestInfo",
"TestSuite",
},
init = function()
vim.keymap.set("n", "<leader>ts", "<cmd>TestSuite<cr>")
vim.keymap.set("n", "<leader>tf", "<cmd>TestFile<cr>")
vim.keymap.set("n", "<leader>te", "<cmd>TestEdit<cr>")
vim.keymap.set("n", "<leader>tn", "<cmd>TestNearest<cr>")
vim.keymap.set("n", "<leader>tl", "<cmd>TestLast<cr>")
vim.keymap.set("n", "<leader>tv", "<cmd>TestVisit<cr>")
vim.keymap.set("n", "<leader>ti", "<cmd>TestInfo<cr>")
end,
config = true,
otps = {
termOpts = {
direction = "horizontal",
keep_one = true,
},
},
}

View file

@ -1,11 +0,0 @@
return {
"ahmedkhalf/project.nvim",
name = "project_nvim",
event = { "BufEnter" },
config = true,
opts = {
ignore_lsp = { "efm", "null-ls" },
show_hidden = true,
silent_chdir = true,
},
}

View file

@ -1,61 +0,0 @@
return {
"nvim-telescope/telescope.nvim",
branch = "0.1.x",
dependencies = {
{
"nvim-lua/plenary.nvim",
{ "nvim-telescope/telescope-fzf-native.nvim", build = "make" },
{ "tsakirist/telescope-lazy.nvim", dependencies = { "folke/lazy.nvim" } },
"folke/noice.nvim",
{ "benfowler/telescope-luasnip.nvim", dependencies = { "L3MON4D3/LuaSnip" } },
{
"paopaol/telescope-git-diffs.nvim",
dependencies = { "nvim-lua/plenary.nvim", "sindrets/diffview.nvim" },
},
"FeiyouG/command_center.nvim",
{ "barrett-ruth/telescope-http.nvim", dependencies = { "savq/paq-nvim" } },
"aaronhallaert/advanced-git-search.nvim",
},
},
cmd = "Telescope",
init = function()
vim.keymap.set("n", "<leader>;", "<cmd>Telescope builtin<cr>")
vim.keymap.set("n", "<leader>ff", "<cmd>Telescope find_files<cr>")
vim.keymap.set("n", "<leader>fr", "<cmd>Telescope oldfiles<cr>")
vim.keymap.set("n", "<leader>fg", "<cmd>Telescope live_grep<cr>")
vim.keymap.set("n", "<leader>fb", "<cmd>Telescope buffers<cr>")
vim.keymap.set("n", "<leader>fs", "<cmd>Telescope lsp_document_symbols<cr>")
vim.keymap.set("n", "<leader>fe", "<cmd>Telescope diagnostics<cr>")
vim.keymap.set("n", "<leader>ft", "<cmd>Telescope treesitter<cr>")
vim.keymap.set("n", "<leader>fz", "<cmd>Telescope current_buffer_fuzzy_find<cr>")
end,
config = function()
local trouble = require "trouble.providers.telescope"
require("telescope").setup {
defaults = {
layout_strategy = "flex",
mappings = {
i = { ["<c-t>"] = trouble.open_with_trouble },
n = { ["<c-t>"] = trouble.open_with_trouble },
},
winblend = vim.o.winblend,
},
extensions = {
fzf = {
fuzzy = true, -- false will only do exact matching
override_generic_sorter = true, -- override the generic sorter
override_file_sorter = true, -- override the file sorter
},
},
}
require("telescope").load_extension "fzf"
require("telescope").load_extension "lazy"
require("telescope").load_extension "noice"
require("telescope").load_extension "luasnip"
require("telescope").load_extension "git_diffs"
require("telescope").load_extension "command_center"
require("telescope").load_extension "http"
require("telescope").load_extension "advanced_git_search"
require("telescope").load_extension "projects"
end,
}

View file

@ -1,7 +0,0 @@
return {
"akinsho/toggleterm.nvim",
version = "*",
cmd = { "ToggleTerm" },
init = function() vim.keymap.set("n", "<leader>tt", "<cmd>ToggleTerm direction=horizontal<CR>") end,
config = true,
}

View file

@ -1,51 +0,0 @@
return {
"nvim-treesitter/nvim-treesitter",
event = { "BufReadPre", "BufNewFile" },
dependencies = { "nvim-treesitter/nvim-treesitter-refactor" },
config = function(_, opts)
if type(opts.ensure_installed) == "table" then
-- @type table<string, boolean>
local added = {}
opts.ensure_installed = vim.tbl_filter(function(lang)
if added[lang] then return false end
added[lang] = true
return true
end, opts.ensure_installed)
end
require("nvim-treesitter.configs").setup(opts)
end,
opts = {
ensure_installed = "all",
auto_install = true,
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
},
incremental_selection = {
enable = true,
keymaps = {
init_selection = "gnn",
node_incremental = "gnr",
scope_incremental = "gnc",
node_decremental = "gnm",
},
},
indent = {
enable = true,
},
refactor = {
smart_rename = {
enable = true,
keymaps = {
smart_rename = "grr",
},
},
navigation = {
enable = true,
keymaps = {
goto_definition_lsp_fallback = "gnd",
},
},
},
},
}

View file

@ -1,20 +0,0 @@
return {
"folke/trouble.nvim",
dependencies = "nvim-tree/nvim-web-devicons",
cmd = "TroubleToggle",
init = function()
vim.keymap.set("n", "<leader>xx", "<cmd>TroubleToggle<cr>")
vim.keymap.set("n", "<leader>xw", "<cmd>TroubleToggle workspace_diagnostics<cr>")
vim.keymap.set("n", "<leader>xd", "<cmd>TroubleToggle document_diagnostics<cr>")
vim.keymap.set("n", "<leader>xq", "<cmd>TroubleToggle quickfix<cr>")
vim.keymap.set("n", "<leader>xl", "<cmd>TroubleToggle loclist<cr>")
end,
config = true,
opts = {
mode = "workspace_diagnostics",
auto_open = false,
auto_close = false,
auto_preview = true,
auto_jump = { "lsp_definitions", "lsp_references", "lsp_implementations" },
},
}

View file

@ -1,7 +0,0 @@
return {
"folke/twilight.nvim",
dependencies = { "nvim-treesitter" },
cmd = "Twilight",
config = true,
opts = { context = 10, treesitter = true },
}

View file

@ -1,8 +0,0 @@
return {
"folke/which-key.nvim",
config = function()
vim.o.timeout = true
vim.o.timeoutlen = 300
require("which-key").setup {}
end,
}

View file

@ -1,30 +0,0 @@
return {
"folke/zen-mode.nvim",
dependencies = { "folke/twilight.nvim" },
cmd = { "ZenMode" },
init = function() vim.keymap.set("n", "<leader>z", "<cmd>ZenMode<CR>") end,
config = true,
opts = {
window = {
options = {
signcolumn = "no", -- disable signcolumn
number = false, -- disable number column
relativenumber = false, -- disable relative numbers
cursorline = false, -- disable cursorline
cursorcolumn = false, -- disable cursor column
foldcolumn = "0", -- disable fold column
list = false, -- disable whitespace characters
},
},
plugins = {
options = {
enabled = true,
},
twilight = { enabled = true },
gitsigns = { enabled = true },
tmux = { enabled = true },
},
on_open = function(win) vim.wo.scrolloff = 999 end,
on_close = function(win) vim.wo.scrolloff = 0 end,
},
}

View file

@ -1,478 +0,0 @@
local M = {}
local C = require("catppuccin.palettes").get_palette()
local lsp = require "feline.providers.lsp"
local assets = {
left_separator = "",
right_separator = "",
mode_icon = "",
dir = "",
file = "",
lsp = {
server = "",
error = "",
warning = "",
info = "",
hint = "",
},
git = {
branch = "",
added = "",
changed = "",
removed = "",
},
}
local sett = {
text = C.surface0,
bkg = C.surface0,
diffs = C.mauve,
extras = C.overlay1,
curr_file = C.maroon,
curr_dir = C.flamingo,
show_modified = false,
}
if require("catppuccin").flavour == "latte" then
local latte = require("catppuccin.palettes").get_palette "latte"
sett.text = latte.base
sett.bkg = latte.crust
end
if require("catppuccin").options.transparent_background then sett.bkg = "NONE" end
local mode_colors = {
["n"] = { "NORMAL", C.lavender },
["no"] = { "N-PENDING", C.lavender },
["i"] = { "INSERT", C.green },
["ic"] = { "INSERT", C.green },
["t"] = { "TERMINAL", C.green },
["v"] = { "VISUAL", C.flamingo },
["V"] = { "V-LINE", C.flamingo },
[""] = { "V-BLOCK", C.flamingo },
["R"] = { "REPLACE", C.maroon },
["Rv"] = { "V-REPLACE", C.maroon },
["s"] = { "SELECT", C.maroon },
["S"] = { "S-LINE", C.maroon },
[""] = { "S-BLOCK", C.maroon },
["c"] = { "COMMAND", C.peach },
["cv"] = { "COMMAND", C.peach },
["ce"] = { "COMMAND", C.peach },
["r"] = { "PROMPT", C.teal },
["rm"] = { "MORE", C.teal },
["r?"] = { "CONFIRM", C.mauve },
["!"] = { "SHELL", C.green },
}
function M.setup(opts)
if opts then
opts.assets = opts.assets or {}
opts.sett = opts.sett or {}
opts.mode_colors = opts.mode_colors or {}
else
opts = {}
end
assets = vim.tbl_deep_extend("force", assets, opts.assets)
sett = vim.tbl_deep_extend("force", sett, opts.sett)
mode_colors = vim.tbl_deep_extend("force", mode_colors, opts.mode_colors)
end
function M.get()
local shortline = false
local components = {
active = { {}, {} }, -- left, right
inactive = { {} },
}
local function is_enabled(min_width)
if shortline then return true end
return vim.api.nvim_win_get_width(0) > min_width
end
-- global components
local invi_sep = {
str = " ",
hl = {
fg = sett.bkg,
bg = sett.bkg,
},
}
-- helpers
local function any_git_changes()
local gst = vim.b.gitsigns_status_dict -- git stats
if gst then
if
gst["added"] and gst["added"] > 0
or gst["removed"] and gst["removed"] > 0
or gst["changed"] and gst["changed"] > 0
then
return true
end
end
return false
end
-- #################### STATUSLINE ->
-- ######## Left
-- Current vi mode ------>
local vi_mode_hl = function()
return {
fg = sett.text,
bg = mode_colors[vim.fn.mode()][2],
style = "bold",
}
end
components.active[1][1] = {
provider = " " .. assets.mode_icon .. " ",
hl = function()
return {
fg = sett.text,
bg = mode_colors[vim.fn.mode()][2],
}
end,
}
components.active[1][2] = {
provider = function() return mode_colors[vim.fn.mode()][1] .. " " end,
hl = vi_mode_hl,
}
-- there is a dilema: we need to hide Diffs if ther is no git info. We can do that, but this will
-- leave the right_separator colored with purple, and since we can't change the color conditonally
-- then the solution is to create two right_separators: one with a mauve sett.bkg and the other one normal
-- sett.bkg; both have the same fg (vi mode). The mauve one appears if there is git info, else the one with
-- the normal sett.bkg appears. Fixed :)
-- enable if git diffs are not available
components.active[1][3] = {
provider = assets.right_separator,
hl = function()
return {
fg = mode_colors[vim.fn.mode()][2],
bg = sett.bkg,
}
end,
enabled = function() return not any_git_changes() end,
}
-- enable if git diffs are available
components.active[1][4] = {
provider = assets.right_separator,
hl = function()
return {
fg = mode_colors[vim.fn.mode()][2],
bg = sett.diffs,
}
end,
enabled = function() return any_git_changes() end,
}
-- Current vi mode ------>
-- Diffs ------>
components.active[1][5] = {
provider = "git_diff_added",
hl = {
fg = sett.text,
bg = sett.diffs,
},
icon = " " .. assets.git.added .. " ",
}
components.active[1][6] = {
provider = "git_diff_changed",
hl = {
fg = sett.text,
bg = sett.diffs,
},
icon = " " .. assets.git.changed .. " ",
}
components.active[1][7] = {
provider = "git_diff_removed",
hl = {
fg = sett.text,
bg = sett.diffs,
},
icon = " " .. assets.git.removed .. " ",
}
components.active[1][8] = {
provider = " ",
hl = {
fg = sett.bkg,
bg = sett.diffs,
},
enabled = function() return any_git_changes() end,
}
components.active[1][9] = {
provider = assets.right_separator,
hl = {
fg = sett.diffs,
bg = sett.bkg,
},
enabled = function() return any_git_changes() end,
}
-- Diffs ------>
-- Extras ------>
-- file progess
components.active[1][10] = {
provider = function()
local current_line = vim.fn.line "."
local total_line = vim.fn.line "$"
if current_line == 1 then
return "Top"
elseif current_line == vim.fn.line "$" then
return "Bot"
end
local result, _ = math.modf((current_line / total_line) * 100)
return result .. "%%"
end,
-- enabled = shortline or function(winid)
-- return vim.api.nvim_win_get_width(winid) > 90
-- end,
hl = {
fg = sett.extras,
bg = sett.bkg,
},
left_sep = invi_sep,
}
-- position
components.active[1][11] = {
provider = "position",
-- enabled = shortline or function(winid)
-- return vim.api.nvim_win_get_width(winid) > 90
-- end,
hl = {
fg = sett.extras,
bg = sett.bkg,
},
left_sep = invi_sep,
}
-- macro
components.active[1][12] = {
provider = "macro",
enabled = function() return vim.api.nvim_get_option "cmdheight" == 0 end,
hl = {
fg = sett.extras,
bg = sett.bkg,
},
left_sep = invi_sep,
}
-- search count
components.active[1][13] = {
provider = "search_count",
enabled = function() return vim.api.nvim_get_option "cmdheight" == 0 end,
hl = {
fg = sett.extras,
bg = sett.bkg,
},
left_sep = invi_sep,
}
-- Extras ------>
-- ######## Left
-- treesitter position
-- components.active[1][14] = {
-- provider = function()
-- -- if not require("vim.treesitter.language").require_language("lua") then
-- -- return ""
-- -- end
-- local pos = require("nvim-treesitter").statusline {
-- indicator_size = 50,
-- transform_fn = function(line) return line:gsub("%s*[%[%(%{]+.*$", "") end,
-- }
-- if pos and pos ~= "" then return pos end
-- return ""
-- end,
-- hl = {
-- fg = sett.extras,
-- bg = sett.bkg,
-- },
-- left_sep = invi_sep,
-- }
-- ######## Right
-- Diagnostics ------>
-- workspace loader
components.active[2][1] = {
provider = function()
local Lsp = vim.lsp.util.get_progress_messages()[1]
if Lsp then
local msg = Lsp.message or ""
local percentage = Lsp.percentage
if not percentage then return "" end
local title = Lsp.title or ""
local spinners = {
"",
"",
"",
}
local success_icon = {
"",
"",
"",
}
local ms = vim.loop.hrtime() / 1000000
local frame = math.floor(ms / 120) % #spinners
if percentage >= 70 then
return string.format(" %%<%s %s %s (%s%%%%) ", success_icon[frame + 1], title, msg, percentage)
end
return string.format(" %%<%s %s %s (%s%%%%) ", spinners[frame + 1], title, msg, percentage)
end
return ""
end,
enabled = is_enabled(80),
hl = {
fg = sett.extras,
bg = sett.bkg,
},
right_sep = invi_sep,
}
components.active[2][2] = {
provider = "git_branch",
enabled = is_enabled(70),
hl = {
fg = sett.extras,
bg = sett.bkg,
},
icon = assets.git.branch .. " ",
right_sep = invi_sep,
}
components.active[2][3] = {
provider = function()
if next(vim.lsp.buf_get_clients()) ~= nil then
return assets.lsp.server .. " " .. "Lsp"
else
return ""
end
end,
hl = {
fg = sett.extras,
bg = sett.bkg,
},
right_sep = invi_sep,
}
-- genral diagnostics (errors, warnings. info and hints)
components.active[2][4] = {
provider = "diagnostic_errors",
enabled = function() return lsp.diagnostics_exist(vim.diagnostic.severity.ERROR) end,
hl = {
fg = C.red,
bg = sett.bkg,
},
icon = " " .. assets.lsp.error .. " ",
right_sep = invi_sep,
}
components.active[2][5] = {
provider = "diagnostic_warnings",
enabled = function() return lsp.diagnostics_exist(vim.diagnostic.severity.WARN) end,
hl = {
fg = C.yellow,
bg = sett.bkg,
},
icon = " " .. assets.lsp.warning .. " ",
right_sep = invi_sep,
}
components.active[2][6] = {
provider = "diagnostic_info",
enabled = function() return lsp.diagnostics_exist(vim.diagnostic.severity.INFO) end,
hl = {
fg = C.sky,
bg = sett.bkg,
},
icon = " " .. assets.lsp.info .. " ",
right_sep = invi_sep,
}
components.active[2][7] = {
provider = "diagnostic_hints",
enabled = function() return lsp.diagnostics_exist(vim.diagnostic.severity.HINT) end,
hl = {
fg = C.rosewater,
bg = sett.bkg,
},
icon = " " .. assets.lsp.hint .. " ",
right_sep = invi_sep,
}
-- Diagnostics ------>
components.active[2][8] = {
provider = function()
local filename = vim.fn.expand "%:t"
local extension = vim.fn.expand "%:e"
local present, icons = pcall(require, "nvim-web-devicons")
local icon = present and icons.get_icon(filename, extension) or assets.file
return (sett.show_modified and "%m" or "") .. " " .. icon .. " " .. filename .. " "
end,
enabled = is_enabled(70),
hl = {
fg = sett.text,
bg = sett.curr_file,
},
left_sep = {
str = assets.left_separator,
hl = {
fg = sett.curr_file,
bg = sett.bkg,
},
},
}
components.active[2][9] = {
provider = function()
local dir_name = vim.fn.fnamemodify(vim.fn.getcwd(), ":t")
return " " .. assets.dir .. " " .. dir_name .. " "
end,
enabled = is_enabled(80),
hl = {
fg = sett.text,
bg = sett.curr_dir,
},
left_sep = {
str = assets.left_separator,
hl = {
fg = sett.curr_dir,
bg = sett.curr_file,
},
},
}
-- ######## Right
-- Inanctive components
components.inactive[1][1] = {
provider = function() return " " .. string.upper(vim.bo.ft) .. " " end,
hl = {
fg = C.overlay2,
bg = C.mantle,
},
}
return components
end
return M

View file

@ -1,9 +0,0 @@
vim.opt.fillchars:append {
horiz = "",
horizup = "",
horizdown = "",
vert = "",
vertleft = "",
vertright = "",
verthoriz = "",
}

View file

@ -1,28 +0,0 @@
return {
File = "",
Module = "",
Namespace = "",
Package = "",
Class = "",
Method = "",
Property = "",
Field = "",
Constructor = "",
Enum = "",
Interface = "",
Function = "",
Variable = "",
Constant = "",
String = "",
Number = "",
Boolean = "",
Array = "",
Object = "",
Key = "",
Null = "",
EnumMember = "",
Struct = "",
Event = "",
Operator = "",
TypeParameter = "",
}

View file

@ -1,15 +0,0 @@
#!/bin/sh
# usage: import-gsettings
config="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-3.0/settings.ini"
if [ ! -f "$config" ]; then exit 1; fi
gnome_schema="org.gnome.desktop.interface"
gtk_theme="$(grep 'gtk-theme-name' "$config" | sed 's/.*\s*=\s*//')"
icon_theme="$(grep 'gtk-icon-theme-name' "$config" | sed 's/.*\s*=\s*//')"
cursor_theme="$(grep 'gtk-cursor-theme-name' "$config" | sed 's/.*\s*=\s*//')"
font_name="$(grep 'gtk-font-name' "$config" | sed 's/.*\s*=\s*//')"
gsettings set "$gnome_schema" gtk-theme "$gtk_theme"
gsettings set "$gnome_schema" icon-theme "$icon_theme"
gsettings set "$gnome_schema" cursor-theme "$cursor_theme"
gsettings set "$gnome_schema" font-name "$font_name"

View file

@ -1,109 +0,0 @@
#!/usr/bin/env bash
#
# A good old bash | curl script for direnv.
#
set -euo pipefail
{ # Prevent execution if this script was only partially downloaded
log() {
echo "[installer] $*" >&2
}
die() {
log "$@"
exit 1
}
at_exit() {
ret=$?
if [[ $ret -gt 0 ]]; then
log "the script failed with error $ret.\n" \
"\n" \
"To report installation errors, submit an issue to\n" \
" https://github.com/direnv/direnv/issues/new/choose"
fi
exit "$ret"
}
trap at_exit EXIT
kernel=$(uname -s | tr "[:upper:]" "[:lower:]")
case "${kernel}" in
mingw*)
kernel=windows
;;
esac
case "$(uname -m)" in
x86_64)
machine=amd64
;;
i686 | i386)
machine=386
;;
aarch64 | arm64)
machine=arm64
;;
*)
die "Machine $(uname -m) not supported by the installer.\n" \
"Go to https://direnv for alternate installation methods."
;;
esac
log "kernel=$kernel machine=$machine"
: "${use_sudo:=}"
: "${bin_path:=}"
if [[ -z "$bin_path" ]]; then
log "bin_path is not set, you can set bin_path to specify the installation path"
log "e.g. export bin_path=/path/to/installation before installing"
log "looking for a writeable path from PATH environment variable"
for path in $(echo "$PATH" | tr ':' '\n'); do
if [[ -w $path ]]; then
bin_path=$path
break
fi
done
fi
if [[ -z "$bin_path" ]]; then
die "did not find a writeable path in $PATH"
fi
echo "bin_path=$bin_path"
if [[ -n "${version:-}" ]]; then
release="tags/${version}"
else
release="latest"
fi
echo "release=$release"
log "looking for a download URL"
download_url=$(
curl -fL "https://api.github.com/repos/direnv/direnv/releases/$release" \
| grep browser_download_url \
| cut -d '"' -f 4 \
| grep "direnv.$kernel.$machine"
)
echo "download_url=$download_url"
log "downloading"
curl -o "$bin_path/direnv" -fL "$download_url"
chmod a+x "$bin_path/direnv"
cat <<DONE
The direnv binary is now available in:
$bin_path/direnv
The last step is to configure your shell to use it. For example for bash, add
the following lines at the end of your ~/.bashrc:
eval "\$(direnv hook bash)"
Then restart the shell.
For other shells, see https://direnv.net/docs/hook.html
Thanks!
DONE
}

View file

@ -1,6 +0,0 @@
mkdir -p $HOME/.fonts
cd $HOME/.fonts
curl -sSLO https://github.com/ryanoasis/nerd-fonts/releases/download/v3.0.0/FiraCode.zip
unzip FiraCode.zip -d FiraCode
rm FiraCode.zip
fc-cache

View file

@ -1,119 +0,0 @@
#!/bin/sh
# This script installs the Nix package manager on your system by
# downloading a binary distribution and running its installer script
# (which in turn creates and populates /nix).
{ # Prevent execution if this script was only partially downloaded
oops() {
echo "$0:" "$@" >&2
exit 1
}
umask 0022
tmpDir="$(mktemp -d -t nix-binary-tarball-unpack.XXXXXXXXXX || \
oops "Can't create temporary directory for downloading the Nix binary tarball")"
cleanup() {
rm -rf "$tmpDir"
}
trap cleanup EXIT INT QUIT TERM
require_util() {
command -v "$1" > /dev/null 2>&1 ||
oops "you do not have '$1' installed, which I need to $2"
}
case "$(uname -s).$(uname -m)" in
Linux.x86_64)
hash=1bdf98f951ce82ad1a12b9e6874f5858cb2aa2e402907e8c3079d8482cb8430b
path=dw0gkcqnig9qwyhkrq0sjrzai63zi6wy/nix-2.15.0-x86_64-linux.tar.xz
system=x86_64-linux
;;
Linux.i?86)
hash=c868bed9bfff72a363b1a41f95bce971f8ccca111e5e3c9f8e2fa5e9bde91f75
path=ayl7z135hkqhf4px5pacv47b4njqb9yj/nix-2.15.0-i686-linux.tar.xz
system=i686-linux
;;
Linux.aarch64)
hash=3a08669bf8d27b5994fceb2bc4653fddab189832a8bd111d013591862eb45961
path=26zpxva102pm9jz8nkb391ws3c7six2j/nix-2.15.0-aarch64-linux.tar.xz
system=aarch64-linux
;;
Linux.armv6l)
hash=88736c6fda47d2c244d38ec81250111263c6756a5c9e5232fb56d5e1245f3aae
path=1m9il80f2y41qsarmarf3dkb23ryg2h8/nix-2.15.0-armv6l-linux.tar.xz
system=armv6l-linux
;;
Linux.armv7l)
hash=44010bc59ad7504274533daf5d23d6773a286c5b7ac87960d330cc0580149462
path=v2z7fhd4rq2n5s2svdk2dh6mf112w7ca/nix-2.15.0-armv7l-linux.tar.xz
system=armv7l-linux
;;
Darwin.x86_64)
hash=d8b6a6e89f82113fcbce3d946fa501d5d2cf7cb35c88fb2017f3c12ef8392e7d
path=m01jb6iyf73jiyzdn6vfap8da347nmwf/nix-2.15.0-x86_64-darwin.tar.xz
system=x86_64-darwin
;;
Darwin.arm64|Darwin.aarch64)
hash=2d4a8060e12077f174e0635ec06d94daeee0460166165414698dfdf0ef87915a
path=aa9fsy71mdsqp6kgf5sag6kv50zavhj5/nix-2.15.0-aarch64-darwin.tar.xz
system=aarch64-darwin
;;
*) oops "sorry, there is no binary distribution of Nix for your platform";;
esac
# Use this command-line option to fetch the tarballs using nar-serve or Cachix
if [ "${1:-}" = "--tarball-url-prefix" ]; then
if [ -z "${2:-}" ]; then
oops "missing argument for --tarball-url-prefix"
fi
url=${2}/${path}
shift 2
else
url=https://releases.nixos.org/nix/nix-2.15.0/nix-2.15.0-$system.tar.xz
fi
tarball=$tmpDir/nix-2.15.0-$system.tar.xz
require_util tar "unpack the binary tarball"
if [ "$(uname -s)" != "Darwin" ]; then
require_util xz "unpack the binary tarball"
fi
if command -v curl > /dev/null 2>&1; then
fetch() { curl --fail -L "$1" -o "$2"; }
elif command -v wget > /dev/null 2>&1; then
fetch() { wget "$1" -O "$2"; }
else
oops "you don't have wget or curl installed, which I need to download the binary tarball"
fi
echo "downloading Nix 2.15.0 binary tarball for $system from '$url' to '$tmpDir'..."
fetch "$url" "$tarball" || oops "failed to download '$url'"
if command -v sha256sum > /dev/null 2>&1; then
hash2="$(sha256sum -b "$tarball" | cut -c1-64)"
elif command -v shasum > /dev/null 2>&1; then
hash2="$(shasum -a 256 -b "$tarball" | cut -c1-64)"
elif command -v openssl > /dev/null 2>&1; then
hash2="$(openssl dgst -r -sha256 "$tarball" | cut -c1-64)"
else
oops "cannot verify the SHA-256 hash of '$url'; you need one of 'shasum', 'sha256sum', or 'openssl'"
fi
if [ "$hash" != "$hash2" ]; then
oops "SHA-256 hash mismatch in '$url'; expected $hash, got $hash2"
fi
unpack=$tmpDir/unpack
mkdir -p "$unpack"
tar -xJf "$tarball" -C "$unpack" || oops "failed to unpack '$url'"
script=$(echo "$unpack"/*/install)
[ -e "$script" ] || oops "installation script is missing from the binary tarball!"
export INVOKED_FROM_INSTALL_IN=1
"$script" "$@"
} # End of wrapping

View file

@ -1,9 +0,0 @@
curl -sSLO https://github.com/neovim/neovim/releases/download/stable/nvim.appimage
curl -sSLO https://github.com/neovim/neovim/releases/download/stable/nvim.appimage.sha256sum
sha256sum -c nvim.appimage.sha256sum || {
rm nvim.appimage nvim.appimage.sha256sum
exit 1
}
rm nvim.appimage.sha256sum
chmod a+x nvim.appimage
mv nvim.appimage $HOME/.local/bin/nvim

View file

@ -1,517 +0,0 @@
#!/usr/bin/env sh
set -eu
printf '\n'
BOLD="$(tput bold 2>/dev/null || printf '')"
GREY="$(tput setaf 0 2>/dev/null || printf '')"
UNDERLINE="$(tput smul 2>/dev/null || printf '')"
RED="$(tput setaf 1 2>/dev/null || printf '')"
GREEN="$(tput setaf 2 2>/dev/null || printf '')"
YELLOW="$(tput setaf 3 2>/dev/null || printf '')"
BLUE="$(tput setaf 4 2>/dev/null || printf '')"
MAGENTA="$(tput setaf 5 2>/dev/null || printf '')"
NO_COLOR="$(tput sgr0 2>/dev/null || printf '')"
SUPPORTED_TARGETS="x86_64-unknown-linux-gnu x86_64-unknown-linux-musl \
i686-unknown-linux-musl aarch64-unknown-linux-musl \
arm-unknown-linux-musleabihf x86_64-apple-darwin \
aarch64-apple-darwin x86_64-pc-windows-msvc \
i686-pc-windows-msvc aarch64-pc-windows-msvc \
x86_64-unknown-freebsd"
info() {
printf '%s\n' "${BOLD}${GREY}>${NO_COLOR} $*"
}
warn() {
printf '%s\n' "${YELLOW}! $*${NO_COLOR}"
}
error() {
printf '%s\n' "${RED}x $*${NO_COLOR}" >&2
}
completed() {
printf '%s\n' "${GREEN}${NO_COLOR} $*"
}
has() {
command -v "$1" 1>/dev/null 2>&1
}
# Make sure user is not using zsh or non-POSIX-mode bash, which can cause issues
verify_shell_is_posix_or_exit() {
if [ -n "${ZSH_VERSION+x}" ]; then
error "Running installation script with \`zsh\` is known to cause errors."
error "Please use \`sh\` instead."
exit 1
elif [ -n "${BASH_VERSION+x}" ] && [ -z "${POSIXLY_CORRECT+x}" ]; then
error "Running installation script with non-POSIX \`bash\` may cause errors."
error "Please use \`sh\` instead."
exit 1
else
true # No-op: no issues detected
fi
}
# Gets path to a temporary file, even if
get_tmpfile() {
suffix="$1"
if has mktemp; then
printf "%s.%s" "$(mktemp)" "${suffix}"
else
# No really good options here--let's pick a default + hope
printf "/tmp/starship.%s" "${suffix}"
fi
}
# Test if a location is writeable by trying to write to it. Windows does not let
# you test writeability other than by writing: https://stackoverflow.com/q/1999988
test_writeable() {
path="${1:-}/test.txt"
if touch "${path}" 2>/dev/null; then
rm "${path}"
return 0
else
return 1
fi
}
download() {
file="$1"
url="$2"
if has curl; then
cmd="curl --fail --silent --location --output $file $url"
elif has wget; then
cmd="wget --quiet --output-document=$file $url"
elif has fetch; then
cmd="fetch --quiet --output=$file $url"
else
error "No HTTP download program (curl, wget, fetch) found, exiting…"
return 1
fi
$cmd && return 0 || rc=$?
error "Command failed (exit code $rc): ${BLUE}${cmd}${NO_COLOR}"
printf "\n" >&2
info "This is likely due to Starship not yet supporting your configuration."
info "If you would like to see a build for your configuration,"
info "please create an issue requesting a build for ${MAGENTA}${TARGET}${NO_COLOR}:"
info "${BOLD}${UNDERLINE}https://github.com/starship/starship/issues/new/${NO_COLOR}"
return $rc
}
unpack() {
archive=$1
bin_dir=$2
sudo=${3-}
case "$archive" in
*.tar.gz)
flags=$(test -n "${VERBOSE-}" && echo "-xzvof" || echo "-xzof")
${sudo} tar "${flags}" "${archive}" -C "${bin_dir}"
return 0
;;
*.zip)
flags=$(test -z "${VERBOSE-}" && echo "-qqo" || echo "-o")
UNZIP="${flags}" ${sudo} unzip "${archive}" -d "${bin_dir}"
return 0
;;
esac
error "Unknown package extension."
printf "\n"
info "This almost certainly results from a bug in this script--please file a"
info "bug report at https://github.com/starship/starship/issues"
return 1
}
usage() {
printf "%s\n" \
"install.sh [option]" \
"" \
"Fetch and install the latest version of starship, if starship is already" \
"installed it will be updated to the latest version."
printf "\n%s\n" "Options"
printf "\t%s\n\t\t%s\n\n" \
"-V, --verbose" "Enable verbose output for the installer" \
"-f, -y, --force, --yes" "Skip the confirmation prompt during installation" \
"-p, --platform" "Override the platform identified by the installer [default: ${PLATFORM}]" \
"-b, --bin-dir" "Override the bin installation directory [default: ${BIN_DIR}]" \
"-a, --arch" "Override the architecture identified by the installer [default: ${ARCH}]" \
"-B, --base-url" "Override the base URL used for downloading releases [default: ${BASE_URL}]" \
"-h, --help" "Display this help message"
}
elevate_priv() {
if ! has sudo; then
error 'Could not find the command "sudo", needed to get permissions for install.'
info "If you are on Windows, please run your shell as an administrator, then"
info "rerun this script. Otherwise, please run this script as root, or install"
info "sudo."
exit 1
fi
if ! sudo -v; then
error "Superuser not granted, aborting installation"
exit 1
fi
}
install() {
ext="$1"
if test_writeable "${BIN_DIR}"; then
sudo=""
msg="Installing Starship, please wait…"
else
warn "Escalated permissions are required to install to ${BIN_DIR}"
elevate_priv
sudo="sudo"
msg="Installing Starship as root, please wait…"
fi
info "$msg"
archive=$(get_tmpfile "$ext")
# download to the temp file
download "${archive}" "${URL}"
# unpack the temp file to the bin dir, using sudo if required
unpack "${archive}" "${BIN_DIR}" "${sudo}"
}
# Currently supporting:
# - win (Git Bash)
# - darwin
# - linux
# - linux_musl (Alpine)
# - freebsd
detect_platform() {
platform="$(uname -s | tr '[:upper:]' '[:lower:]')"
case "${platform}" in
msys_nt*) platform="pc-windows-msvc" ;;
cygwin_nt*) platform="pc-windows-msvc";;
# mingw is Git-Bash
mingw*) platform="pc-windows-msvc" ;;
# use the statically compiled musl bins on linux to avoid linking issues.
linux) platform="unknown-linux-musl" ;;
darwin) platform="apple-darwin" ;;
freebsd) platform="unknown-freebsd" ;;
esac
printf '%s' "${platform}"
}
# Currently supporting:
# - x86_64
# - i386
# - arm
# - arm64
detect_arch() {
arch="$(uname -m | tr '[:upper:]' '[:lower:]')"
case "${arch}" in
amd64) arch="x86_64" ;;
armv*) arch="arm" ;;
arm64) arch="aarch64" ;;
esac
# `uname -m` in some cases mis-reports 32-bit OS as 64-bit, so double check
if [ "${arch}" = "x86_64" ] && [ "$(getconf LONG_BIT)" -eq 32 ]; then
arch=i686
elif [ "${arch}" = "aarch64" ] && [ "$(getconf LONG_BIT)" -eq 32 ]; then
arch=arm
fi
printf '%s' "${arch}"
}
detect_target() {
arch="$1"
platform="$2"
target="$arch-$platform"
if [ "${target}" = "arm-unknown-linux-musl" ]; then
target="${target}eabihf"
fi
printf '%s' "${target}"
}
confirm() {
if [ -z "${FORCE-}" ]; then
printf "%s " "${MAGENTA}?${NO_COLOR} $* ${BOLD}[y/N]${NO_COLOR}"
set +e
read -r yn </dev/tty
rc=$?
set -e
if [ $rc -ne 0 ]; then
error "Error reading from prompt (please re-run with the '--yes' option)"
exit 1
fi
if [ "$yn" != "y" ] && [ "$yn" != "yes" ]; then
error 'Aborting (please answer "yes" to continue)'
exit 1
fi
fi
}
check_bin_dir() {
bin_dir="${1%/}"
if [ ! -d "$BIN_DIR" ]; then
error "Installation location $BIN_DIR does not appear to be a directory"
info "Make sure the location exists and is a directory, then try again."
usage
exit 1
fi
# https://stackoverflow.com/a/11655875
good=$(
IFS=:
for path in $PATH; do
if [ "${path%/}" = "${bin_dir}" ]; then
printf 1
break
fi
done
)
if [ "${good}" != "1" ]; then
warn "Bin directory ${bin_dir} is not in your \$PATH"
fi
}
print_install() {
# if the shell does not fit the default case change the config file
# and or the config cmd variable
for s in "bash" "zsh" "ion" "tcsh" "xonsh" "fish"
do
# shellcheck disable=SC2088
# we don't want these '~' expanding
config_file="~/.${s}rc"
config_cmd="eval \"\$(starship init ${s})\""
case ${s} in
ion )
# shellcheck disable=SC2088
config_file="~/.config/ion/initrc"
config_cmd="eval \$(starship init ${s})"
;;
fish )
# shellcheck disable=SC2088
config_file="~/.config/fish/config.fish"
config_cmd="starship init fish | source"
;;
tcsh )
config_cmd="eval \`starship init ${s}\`"
;;
xonsh )
config_cmd="execx(\$(starship init xonsh))"
;;
esac
printf " %s\n Add the following to the end of %s:\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}${s}${NO_COLOR}" \
"${BOLD}${config_file}${NO_COLOR}" \
"${config_cmd}"
done
for s in "elvish" "nushell"
do
warning="${BOLD}Warning${NO_COLOR}"
case ${s} in
elvish )
# shellcheck disable=SC2088
config_file="~/.elvish/rc.elv"
config_cmd="eval (starship init elvish)"
warning="${warning} Only elvish v0.17 or higher is supported."
;;
nushell )
# shellcheck disable=SC2088
config_file="${BOLD}your nu config file${NO_COLOR} (find it by running ${BOLD}\$nu.config-path${NO_COLOR} in Nushell)"
config_cmd="mkdir ~/.cache/starship
starship init nu | save -f ~/.cache/starship/init.nu
source ~/.cache/starship/init.nu"
warning="${warning} This will change in the future.
Only Nushell v0.73 or higher is supported.
Add the following to the end of ${BOLD}your Nushell env file${NO_COLOR} (find it by running ${BOLD}\$nu.env-path${NO_COLOR} in Nushell): \"mkdir ~/.cache/starship; starship init nu | save -f ~/.cache/starship/init.nu\""
;;
esac
printf " %s\n %s\n And add the following to the end of %s:\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}${s}${NO_COLOR}" \
"${warning}" \
"${config_file}" \
"${config_cmd}"
done
printf " %s\n Add the following to the end of %s:\n %s\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}PowerShell${NO_COLOR}" \
"${BOLD}Microsoft.PowerShell_profile.ps1${NO_COLOR}" \
"You can check the location of this file by querying the \$PROFILE variable in PowerShell.
Typically the path is ~\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 or ~/.config/powershell/Microsoft.PowerShell_profile.ps1 on -Nix." \
"Invoke-Expression (&starship init powershell)"
printf " %s\n You need to use Clink (v1.2.30+) with Cmd. Add the following to a file %s and place this file in Clink scripts directory:\n\n\t%s\n\n" \
"${BOLD}${UNDERLINE}Cmd${NO_COLOR}" \
"${BOLD}starship.lua${NO_COLOR}" \
"load(io.popen('starship init cmd'):read(\"*a\"))()"
printf "\n"
}
is_build_available() {
arch="$1"
platform="$2"
target="$3"
good=$(
IFS=" "
for t in $SUPPORTED_TARGETS; do
if [ "${t}" = "${target}" ]; then
printf 1
break
fi
done
)
if [ "${good}" != "1" ]; then
error "${arch} builds for ${platform} are not yet available for Starship"
printf "\n" >&2
info "If you would like to see a build for your configuration,"
info "please create an issue requesting a build for ${MAGENTA}${target}${NO_COLOR}:"
info "${BOLD}${UNDERLINE}https://github.com/starship/starship/issues/new/${NO_COLOR}"
printf "\n"
exit 1
fi
}
# defaults
if [ -z "${PLATFORM-}" ]; then
PLATFORM="$(detect_platform)"
fi
if [ -z "${BIN_DIR-}" ]; then
BIN_DIR=/usr/local/bin
fi
if [ -z "${ARCH-}" ]; then
ARCH="$(detect_arch)"
fi
if [ -z "${BASE_URL-}" ]; then
BASE_URL="https://github.com/starship/starship/releases"
fi
# Non-POSIX shells can break once executing code due to semantic differences
verify_shell_is_posix_or_exit
# parse argv variables
while [ "$#" -gt 0 ]; do
case "$1" in
-p | --platform)
PLATFORM="$2"
shift 2
;;
-b | --bin-dir)
BIN_DIR="$2"
shift 2
;;
-a | --arch)
ARCH="$2"
shift 2
;;
-B | --base-url)
BASE_URL="$2"
shift 2
;;
-V | --verbose)
VERBOSE=1
shift 1
;;
-f | -y | --force | --yes)
FORCE=1
shift 1
;;
-h | --help)
usage
exit
;;
-p=* | --platform=*)
PLATFORM="${1#*=}"
shift 1
;;
-b=* | --bin-dir=*)
BIN_DIR="${1#*=}"
shift 1
;;
-a=* | --arch=*)
ARCH="${1#*=}"
shift 1
;;
-B=* | --base-url=*)
BASE_URL="${1#*=}"
shift 1
;;
-V=* | --verbose=*)
VERBOSE="${1#*=}"
shift 1
;;
-f=* | -y=* | --force=* | --yes=*)
FORCE="${1#*=}"
shift 1
;;
*)
error "Unknown option: $1"
usage
exit 1
;;
esac
done
TARGET="$(detect_target "${ARCH}" "${PLATFORM}")"
is_build_available "${ARCH}" "${PLATFORM}" "${TARGET}"
printf " %s\n" "${UNDERLINE}Configuration${NO_COLOR}"
info "${BOLD}Bin directory${NO_COLOR}: ${GREEN}${BIN_DIR}${NO_COLOR}"
info "${BOLD}Platform${NO_COLOR}: ${GREEN}${PLATFORM}${NO_COLOR}"
info "${BOLD}Arch${NO_COLOR}: ${GREEN}${ARCH}${NO_COLOR}"
# non-empty VERBOSE enables verbose untarring
if [ -n "${VERBOSE-}" ]; then
VERBOSE=v
info "${BOLD}Verbose${NO_COLOR}: yes"
else
VERBOSE=
fi
printf '\n'
EXT=tar.gz
if [ "${PLATFORM}" = "pc-windows-msvc" ]; then
EXT=zip
fi
URL="${BASE_URL}/latest/download/starship-${TARGET}.${EXT}"
info "Tarball URL: ${UNDERLINE}${BLUE}${URL}${NO_COLOR}"
confirm "Install Starship ${GREEN}latest${NO_COLOR} to ${BOLD}${GREEN}${BIN_DIR}${NO_COLOR}?"
check_bin_dir "${BIN_DIR}"
install "${EXT}"
completed "Starship installed"
printf '\n'
info "Please follow the steps for your shell to complete the installation:"
print_install

View file

@ -1,189 +0,0 @@
#!/usr/bin/env bash
#
# Use rofi/zenity to change system runstate thanks to systemd.
#
# Note: this currently relies on associative array support in the shell.
#
# Inspired from i3pystatus wiki:
# https://github.com/enkore/i3pystatus/wiki/Shutdown-Menu
#
# Copyright 2015 Benjamin Chrétien <chretien at lirmm dot fr>
#
# 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/>.
# power-profiles-daemon implementation:
# needs package power-profiles-daemon installed and the service running see here:
# https://wiki.archlinux.org/title/CPU_frequency_scaling#power-profiles-daemon
# used in i3-blocks: ~/.config/i3/i3blocks.conf together with: ~/.config/i3/scripts/ppd-status
#######################################################################
# BEGIN CONFIG #
#######################################################################
# Use a custom lock script
#LOCKSCRIPT="i3lock-extra -m pixelize"
# Colors: FG (foreground), BG (background), HL (highlighted)
FG_COLOR="#bbbbbb"
BG_COLOR="#111111"
HLFG_COLOR="#111111"
HLBG_COLOR="#bbbbbb"
BORDER_COLOR="#222222"
# Options not related to colors
#ROFI_TEXT=":"
#ROFI_OPTIONS=(-width -11 -location 0 -hide-scrollbar -bw 30 -color-window "#dd310027,#dd0310027,#dd310027" -padding 5)
#ROFI_OPTIONS=(-width -18 -location 4 -hide-scrollbar -color-window "#cc310027,#00a0009a,#cc310027" -padding 5 -font "Sourcecode Pro Regular 10, FontAwesome 9")
#ROFI_OPTIONS=(-theme ~/.dotfiles/rofi/power-profiles.rasi)
# Zenity options
ZENITY_TITLE="Power Profiles"
ZENITY_TEXT="Set Profiles:"
ZENITY_OPTIONS=(--column= --hide-header)
#######################################################################
# END CONFIG #
#######################################################################
# Whether to ask for user's confirmation
enable_confirmation=false
# Preferred launcher if both are available
preferred_launcher="rofi"
usage="$(basename "$0") [-h] [-c] [-p name] -- display a menu for shutdown, reboot, lock etc.
where:
-h show this help text
-c ask for user confirmation
-p preferred launcher (rofi or zenity)
This script depends on:
- systemd,
- rofi or zenity."
# Check whether the user-defined launcher is valid
launcher_list=(rofi zenity)
function check_launcher() {
if [[ ! "${launcher_list[@]}" =~ (^|[[:space:]])"$1"($|[[:space:]]) ]]; then
echo "Supported launchers: ${launcher_list[*]}"
exit 1
else
# Get array with unique elements and preferred launcher first
# Note: uniq expects a sorted list, so we cannot use it
i=1
launcher_list=($(for l in "$1" "${launcher_list[@]}"; do printf "%i %s\n" "$i" "$l"; let i+=1; done \
| sort -uk2 | sort -nk1 | cut -d' ' -f2- | tr '\n' ' '))
fi
}
# Parse CLI arguments
while getopts "hcp:" option; do
case "${option}" in
h) echo "${usage}"
exit 0
;;
c) enable_confirmation=true
;;
p) preferred_launcher="${OPTARG}"
check_launcher "${preferred_launcher}"
;;
*) exit 1
;;
esac
done
# Check whether a command exists
function command_exists() {
command -v "$1" &> /dev/null 2>&1
}
# systemctl required
if ! command_exists systemctl ; then
exit 1
fi
# menu defined as an associative array
typeset -A menu
# Menu with keys/commands
menu=(
[ Performance]="powerprofilesctl set performance"
[ Balanced]="powerprofilesctl set balanced"
[ Power Saver]="powerprofilesctl set power-saver"
[ Cancel]=""
)
menu_nrows=${#menu[@]}
# Menu entries that may trigger a confirmation message
menu_confirm="Shutdown Reboot Hibernate Suspend Halt Logout"
launcher_exe=""
launcher_options=""
rofi_colors=""
function prepare_launcher() {
if [[ "$1" == "rofi" ]]; then
rofi_colors=(-bc "${BORDER_COLOR}" -bg "${BG_COLOR}" -fg "${FG_COLOR}" \
-hlfg "${HLFG_COLOR}" -hlbg "${HLBG_COLOR}")
launcher_exe="rofi"
launcher_options=(-dmenu -i -lines "${menu_nrows}" -p "${ROFI_TEXT}" \
"${rofi_colors}" "${ROFI_OPTIONS[@]}")
elif [[ "$1" == "zenity" ]]; then
launcher_exe="zenity"
launcher_options=(--list --title="${ZENITY_TITLE}" --text="${ZENITY_TEXT}" \
"${ZENITY_OPTIONS[@]}")
fi
}
for l in "${launcher_list[@]}"; do
if command_exists "${l}" ; then
prepare_launcher "${l}"
break
fi
done
# No launcher available
if [[ -z "${launcher_exe}" ]]; then
exit 1
fi
launcher=(${launcher_exe} "${launcher_options[@]}")
selection="$(printf '%s\n' "${!menu[@]}" | sort | "${launcher[@]}")"
function ask_confirmation() {
if [ "${launcher_exe}" == "rofi" ]; then
confirmed=$(echo -e "Yes\nNo" | rofi -dmenu -i -lines 2 -p "${selection}?" \
"${rofi_colors}" "${ROFI_OPTIONS[@]}")
[ "${confirmed}" == "Yes" ] && confirmed=0
elif [ "${launcher_exe}" == "zenity" ]; then
zenity --question --text "Are you sure you want to ${selection,,}?"
confirmed=$?
fi
if [ "${confirmed}" == 0 ]; then
${menu[${selection}]}
fi
}
if [[ $? -eq 0 && ! -z ${selection} ]]; then
if [[ "${enable_confirmation}" = true && \
${menu_confirm} =~ (^|[[:space:]])"${selection}"($|[[:space:]]) ]]; then
ask_confirmation
else
${menu[${selection}]}
fi
fi

View file

@ -1,185 +0,0 @@
#!/usr/bin/env bash
#
# Use rofi/zenity to change system runstate thanks to systemd.
#
# Note: this currently relies on associative array support in the shell.
#
# Inspired from i3pystatus wiki:
# https://github.com/enkore/i3pystatus/wiki/Shutdown-Menu
#
# Copyright 2015 Benjamin Chrétien <chretien at lirmm dot fr>
#
# 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/>.
# modified to work with latest rofi update by joekamprad <joekamprad@endeavouros.com>
#######################################################################
# BEGIN CONFIG #
#######################################################################
# Use a custom lock script
#LOCKSCRIPT="i3lock-extra -m pixelize"
# Colors: FG (foreground), BG (background), HL (highlighted)
FG_COLOR="#bbbbbb"
BG_COLOR="#111111"
HLFG_COLOR="#111111"
HLBG_COLOR="#bbbbbb"
BORDER_COLOR="#222222"
# Options not related to colors (most rofi options do not work anymore)
#ROFI_OPTIONS=(-theme ~/.dotfiles/rofi/powermenu.rasi)
# Zenity options
ZENITY_TITLE="Power Menu"
ZENITY_TEXT="Action:"
ZENITY_OPTIONS=(--column= --hide-header)
#######################################################################
# END CONFIG #
#######################################################################
# Whether to ask for user's confirmation
enable_confirmation=false
# Preferred launcher if both are available
preferred_launcher="rofi"
usage="$(basename "$0") [-h] [-c] [-p name] -- display a menu for shutdown, reboot, lock etc.
where:
-h show this help text
-c ask for user confirmation
-p preferred launcher (rofi or zenity)
This script depends on:
- systemd,
- rofi or zenity."
# Check whether the user-defined launcher is valid
launcher_list=(rofi zenity)
function check_launcher() {
if [[ ! "${launcher_list[@]}" =~ (^|[[:space:]])"$1"($|[[:space:]]) ]]; then
echo "Supported launchers: ${launcher_list[*]}"
exit 1
else
# Get array with unique elements and preferred launcher first
# Note: uniq expects a sorted list, so we cannot use it
i=1
launcher_list=($(for l in "$1" "${launcher_list[@]}"; do printf "%i %s\n" "$i" "$l"; let i+=1; done \
| sort -uk2 | sort -nk1 | cut -d' ' -f2- | tr '\n' ' '))
fi
}
# Parse CLI arguments
while getopts "hcp:" option; do
case "${option}" in
h) echo "${usage}"
exit 0
;;
c) enable_confirmation=true
;;
p) preferred_launcher="${OPTARG}"
check_launcher "${preferred_launcher}"
;;
*) exit 1
;;
esac
done
# Check whether a command exists
function command_exists() {
command -v "$1" &> /dev/null 2>&1
}
# systemctl required
if ! command_exists systemctl ; then
exit 1
fi
# menu defined as an associative array
typeset -A menu
# Menu with keys/commands
menu=(
[ Shutdown]="systemctl poweroff"
[ Reboot]="systemctl reboot"
[ Suspend]="systemctl suspend"
[ Hibernate]="systemctl hibernate"
[ Lock]="hyprctl dispatch exec swaylock"
[ Logout]="hyprctl dispatch exit"
[ Cancel]=""
)
menu_nrows=${#menu[@]}
# Menu entries that may trigger a confirmation message
menu_confirm="Shutdown Reboot Hibernate Suspend Halt Logout"
launcher_exe=""
launcher_options=""
rofi_colors=""
function prepare_launcher() {
if [[ "$1" == "rofi" ]]; then
rofi_colors=(-bc "${BORDER_COLOR}" -bg "${BG_COLOR}" -fg "${FG_COLOR}" \
-hlfg "${HLFG_COLOR}" -hlbg "${HLBG_COLOR}")
launcher_exe="rofi"
launcher_options=(-dmenu -i -lines "${menu_nrows}" -p "${ROFI_TEXT}" \
"${rofi_colors}" "${ROFI_OPTIONS[@]}")
elif [[ "$1" == "zenity" ]]; then
launcher_exe="zenity"
launcher_options=(--list --title="${ZENITY_TITLE}" --text="${ZENITY_TEXT}" \
"${ZENITY_OPTIONS[@]}")
fi
}
for l in "${launcher_list[@]}"; do
if command_exists "${l}" ; then
prepare_launcher "${l}"
break
fi
done
# No launcher available
if [[ -z "${launcher_exe}" ]]; then
exit 1
fi
launcher=(${launcher_exe} "${launcher_options[@]}")
selection="$(printf '%s\n' "${!menu[@]}" | sort | "${launcher[@]}")"
function ask_confirmation() {
if [ "${launcher_exe}" == "rofi" ]; then
confirmed=$(echo -e "Yes\nNo" | rofi -dmenu -i -lines 2 -p "${selection}?" \
"${rofi_colors}" "${ROFI_OPTIONS[@]}")
[ "${confirmed}" == "Yes" ] && confirmed=0
elif [ "${launcher_exe}" == "zenity" ]; then
zenity --question --text "Are you sure you want to ${selection,,}?"
confirmed=$?
fi
if [ "${confirmed}" == 0 ]; then
${menu[${selection}]}
fi
}
if [[ $? -eq 0 && ! -z ${selection} ]]; then
if [[ "${enable_confirmation}" = true && \
${menu_confirm} =~ (^|[[:space:]])"${selection}"($|[[:space:]]) ]]; then
ask_confirmation
else
${menu[${selection}]}
fi
fi

View file

@ -1,670 +0,0 @@
#!/usr/bin/env bash
##################################################################
# Polybar Pulseaudio Control #
# https://github.com/marioortizmanero/polybar-pulseaudio-control #
##################################################################
# Deprecated values, to be removed in a next release. This is kept around to
# be displayed for users using it in custom FORMAT
# shellcheck disable=SC2034
ICON_SINK="Replaced by ICON_NODE, see https://github.com/marioortizmanero/polybar-pulseaudio-control/releases/tag/v3.0.0"
SINK_NICKNAME="Replaced by NODE_NICKNAME, see https://github.com/marioortizmanero/polybar-pulseaudio-control/releases/tag/v3.0.0"
# Defaults for configurable values, expected to be set by command-line arguments
AUTOSYNC="no"
COLOR_MUTED="%{F#6b6b6b}"
ICON_MUTED=
ICON_NODE=
NODE_TYPE="output"
NOTIFICATIONS="no"
OSD="no"
NODE_NICKNAMES_PROP=
VOLUME_STEP=2
VOLUME_MAX=130
LISTEN_TIMEOUT=0.05
# shellcheck disable=SC2016
FORMAT='$VOL_ICON ${VOL_LEVEL}% $ICON_NODE $NODE_NICKNAME'
declare -A NODE_NICKNAMES
declare -a ICONS_VOLUME
declare -a NODE_BLACKLIST
# Special variable: within the script, pactl, grep, and awk commands are used
# on sinks or sources, depending on NODE_TYPE.
#
# The commands are almost always the same, except for the sink/source part.
# In order to reduce duplication, this variable is used for commands that behave
# the same, regardless of the NODE_TYPE.
#
# Having only the "radix" (ink/ource) and omitting the first letter enables us
# to use that single variable:
#
# S-ink , s-ink , s-ink -s, S-ink -s
# S-ource, s-ource, s-ource-s, S-ource-s
SINK_OR_SOURCE="ink"
# Environment & global constants for the script
export LC_ALL=C # Some calls depend on English outputs of pactl
END_COLOR="%{F-}" # For Polybar colors
# Saves the currently default node into a variable named `curNode`. It will
# return an error code when pulseaudio isn't running.
function getCurNode() {
if ! pactl info &>/dev/null; then return 1; fi
local curNodeName
curNodeName=$(pactl info | awk "/Default S${SINK_OR_SOURCE}: / {print \$3}")
curNode=$(pactl list "s${SINK_OR_SOURCE}s" | grep -B 4 -E "Name: $curNodeName\$" | sed -nE "s/^S${SINK_OR_SOURCE} #([0-9]+)$/\1/p")
}
# Saves the node passed by parameter's volume into a variable named `VOL_LEVEL`.
function getCurVol() {
VOL_LEVEL=$(pactl list "s${SINK_OR_SOURCE}s" | grep -A 15 -E "^S${SINK_OR_SOURCE} #$1\$" | grep 'Volume:' | grep -E -v 'Base Volume:' | awk -F : '{print $3; exit}' | grep -o -P '.{0,3}%' | sed 's/.$//' | tr -d ' ')
}
# Saves the name of the node passed by parameter into a variable named
# `nodeName`.
function getNodeName() {
nodeName=$(pactl list "s${SINK_OR_SOURCE}s" short | awk -v sink="$1" "{ if (\$1 == sink) {print \$2} }")
portName=$(pactl list "s${SINK_OR_SOURCE}s" | grep -e "S${SINK_OR_SOURCE} #" -e 'Active Port: ' | sed -n "/^S${SINK_OR_SOURCE} #$1\$/,+1p" | awk '/Active Port: / {print $3}')
}
# Saves the name to be displayed for the node passed by parameter into a
# variable called `NODE_NICKNAME`.
# If a mapping for the node name exists, that is used. Otherwise, the string
# "Node #<index>" is used.
function getNickname() {
getNodeName "$1"
unset NODE_NICKNAME
if [ -n "$nodeName" ] && [ -n "$portName" ] && [ -n "${NODE_NICKNAMES[$nodeName/$portName]}" ]; then
NODE_NICKNAME="${NODE_NICKNAMES[$nodeName/$portName]}"
elif [ -n "$nodeName" ] && [ -n "${NODE_NICKNAMES[$nodeName]}" ]; then
NODE_NICKNAME="${NODE_NICKNAMES[$nodeName]}"
elif [ -n "$nodeName" ]; then
# No exact match could be found, try a Glob Match
for glob in "${!NODE_NICKNAMES[@]}"; do
# shellcheck disable=SC2053 # Disable Shellcheck warning for Glob-Matching
if [[ "$nodeName/$portName" == $glob ]] || [[ "$nodeName" == $glob ]]; then
NODE_NICKNAME="${NODE_NICKNAMES[$glob]}"
# Cache that result for next time
NODE_NICKNAMES["$nodeName"]="$NODE_NICKNAME"
break
fi
done
fi
if [ -z "$NODE_NICKNAME" ] && [ -n "$nodeName" ] && [ -n "$NODE_NICKNAMES_PROP" ]; then
getNicknameFromProp "$NODE_NICKNAMES_PROP" "$nodeName"
# Cache that result for next time
NODE_NICKNAMES["$nodeName"]="$NODE_NICKNAME"
elif [ -z "$NODE_NICKNAME" ]; then
NODE_NICKNAME="S${SINK_OR_SOURCE} #$1"
fi
}
# Gets node nickname based on a given property.
function getNicknameFromProp() {
local nickname_prop="$1"
local for_name="$2"
NODE_NICKNAME=
while read -r property value; do
case "$property" in
Name:)
node_name="$value"
unset node_desc
;;
"$nickname_prop")
if [ "$node_name" != "$for_name" ]; then
continue
fi
NODE_NICKNAME="${value:3:-1}"
break
;;
esac
done < <(pactl list "s${SINK_OR_SOURCE}s")
}
# Saves the status of the node passed by parameter into a variable named
# `IS_MUTED`.
function getIsMuted() {
IS_MUTED=$(pactl list "s${SINK_OR_SOURCE}s" | grep -E "^S${SINK_OR_SOURCE} #$1\$" -A 15 | awk '/Mute: / {print $2}')
}
# Saves all the sink inputs of the sink passed by parameter into a string
# named `sinkInputs`.
function getSinkInputs() {
sinkInputs=$(pactl list sink-inputs | grep -B 4 "Sink: $1" | sed -nE "s/^Sink Input #([0-9]+)\$/\1/p")
}
# Saves all the source outputs of the source passed by parameter into a string
# named `sourceOutputs`.
function getSourceOutputs() {
sourceOutputs=$(pactl list source-outputs | grep -B 4 "Source: $1" | sed -nE "s/^Source Output #([0-9]+)\$/\1/p")
}
function volUp() {
# Obtaining the current volume from pulseaudio into $VOL_LEVEL.
if ! getCurNode; then
echo "PulseAudio not running"
return 1
fi
getCurVol "$curNode"
local maxLimit=$((VOLUME_MAX - VOLUME_STEP))
# Checking the volume upper bounds so that if VOLUME_MAX was 100% and the
# increase percentage was 3%, a 99% volume would top at 100% instead
# of 102%. If the volume is above the maximum limit, nothing is done.
if [ "$VOL_LEVEL" -le "$VOLUME_MAX" ] && [ "$VOL_LEVEL" -ge "$maxLimit" ]; then
pactl "set-s${SINK_OR_SOURCE}-volume" "$curNode" "$VOLUME_MAX%"
elif [ "$VOL_LEVEL" -lt "$maxLimit" ]; then
pactl "set-s${SINK_OR_SOURCE}-volume" "$curNode" "+$VOLUME_STEP%"
fi
if [ $OSD = "yes" ]; then showOSD "$curNode"; fi
if [ $AUTOSYNC = "yes" ]; then volSync; fi
}
function volDown() {
# Pactl already handles the volume lower bounds so that negative values
# are ignored.
if ! getCurNode; then
echo "PulseAudio not running"
return 1
fi
pactl "set-s${SINK_OR_SOURCE}-volume" "$curNode" "-$VOLUME_STEP%"
if [ $OSD = "yes" ]; then showOSD "$curNode"; fi
if [ $AUTOSYNC = "yes" ]; then volSync; fi
}
function volSync() {
# This will only be called if $AUTOSYNC is `yes`.
if ! getCurNode; then
echo "PulseAudio not running"
return 1
fi
getCurVol "$curNode"
if [[ "$NODE_TYPE" = "output" ]]; then
getSinkInputs "$curNode"
# Every output found in the active sink has their volume set to the
# current one.
for each in $sinkInputs; do
pactl "set-sink-input-volume" "$each" "$VOL_LEVEL%"
done
else
getSourceOutputs "$curNode"
# Every input found in the active source has their volume set to the
# current one.
for each in $sourceOutputs; do
pactl "set-source-output-volume" "$each" "$VOL_LEVEL%"
done
fi
}
function volMute() {
# Switch to mute/unmute the volume with pactl.
if ! getCurNode; then
echo "PulseAudio not running"
return 1
fi
if [ "$1" = "toggle" ]; then
getIsMuted "$curNode"
if [ "$IS_MUTED" = "yes" ]; then
pactl "set-s${SINK_OR_SOURCE}-mute" "$curNode" "no"
else
pactl "set-s${SINK_OR_SOURCE}-mute" "$curNode" "yes"
fi
elif [ "$1" = "mute" ]; then
pactl "set-s${SINK_OR_SOURCE}-mute" "$curNode" "yes"
elif [ "$1" = "unmute" ]; then
pactl "set-s${SINK_OR_SOURCE}-mute" "$curNode" "no"
fi
if [ $OSD = "yes" ]; then showOSD "$curNode"; fi
}
function nextNode() {
# The final nodes list, removing the blacklisted ones from the list of
# currently available nodes.
if ! getCurNode; then
echo "PulseAudio not running"
return 1
fi
# Obtaining a tuple of node indexes after removing the blacklisted devices
# with their name.
nodes=()
local i=0
while read -r line; do
index=$(echo "$line" | cut -f1)
name=$(echo "$line" | cut -f2)
# If it's in the blacklist, continue the main loop. Otherwise, add
# it to the list.
for node in "${NODE_BLACKLIST[@]}"; do
# shellcheck disable=SC2053 # Disable Shellcheck warning for Glob-Matching
if [[ "$name" == $node ]]; then
continue 2
fi
done
nodes[i]="$index"
i=$((i + 1))
done < <(pactl list short "s${SINK_OR_SOURCE}s" | sort -n)
# If the resulting list is empty, nothing is done
if [ ${#nodes[@]} -eq 0 ]; then return; fi
# If the current node is greater or equal than last one, pick the first
# node in the list. Otherwise just pick the next node avaliable.
local newNode
if [ "$curNode" -ge "${nodes[-1]}" ]; then
newNode=${nodes[0]}
else
for node in "${nodes[@]}"; do
if [ "$curNode" -lt "$node" ]; then
newNode=$node
break
fi
done
fi
# The new node is set
pactl "set-default-s${SINK_OR_SOURCE}" "$newNode"
# Move all audio threads to new node
local inputs
if [[ "$NODE_TYPE" = "output" ]]; then
inputs="$(pactl list short sink-inputs | cut -f 1)"
for i in $inputs; do
pactl move-sink-input "$i" "$newNode"
done
else
outputs="$(pactl list short source-outputs | cut -f 1)"
for i in $outputs; do
pactl move-source-output "$i" "$newNode"
done
fi
if [ $NOTIFICATIONS = "yes" ]; then
getNickname "$newNode"
if command -v dunstify &>/dev/null; then
notify="dunstify --replace 201839192"
else
notify="notify-send"
fi
$notify "PulseAudio" "Changed $NODE_TYPE to $NODE_NICKNAME" --icon=audio-headphones-symbolic &
fi
}
# This function assumes that PulseAudio is already running. It only supports
# KDE OSDs for now. It will show a system message with the status of the
# node passed by parameter, or the currently active one by default.
function showOSD() {
if [ -z "$1" ]; then
curNode="$1"
else
getCurNode
fi
getCurVol "$curNode"
getIsMuted "$curNode"
qdbus org.kde.kded /modules/kosd showVolume "$VOL_LEVEL" "$IS_MUTED"
}
function listen() {
# If this is the first time start by printing the current state. Otherwise,
# directly wait for events. This is to prevent the module being empty until
# an event occurs.
output
# Listen for changes and immediately create new output for the bar.
# This is faster than having the script on an interval.
pactl subscribe 2>/dev/null | grep --line-buffered -e "on \(card\|s${SINK_OR_SOURCE}\|server\)" | {
while read -r; do
# Output the new state
output
# Read all stdin to flush unwanted pending events, i.e. if there are
# 15 events at the same time (100ms window), output is only called
# twice.
read -r -d '' -t "$LISTEN_TIMEOUT" -n 10000
# After the 100ms waiting time, output again the state, as it may
# have changed if the user did an action during the 100ms window.
output
done
}
}
function output() {
if ! getCurNode; then
echo "PulseAudio not running"
return 1
fi
getCurVol "$curNode"
getIsMuted "$curNode"
# Fixed volume icons over max volume
local iconsLen=${#ICONS_VOLUME[@]}
if [ "$iconsLen" -ne 0 ]; then
local volSplit=$((VOLUME_MAX / iconsLen))
for i in $(seq 1 "$iconsLen"); do
if [ $((i * volSplit)) -ge "$VOL_LEVEL" ]; then
VOL_ICON="${ICONS_VOLUME[$((i-1))]}"
break
fi
done
else
VOL_ICON=""
fi
getNickname "$curNode"
# Showing the formatted message
if [ "$IS_MUTED" = "yes" ]; then
# shellcheck disable=SC2034
VOL_ICON=$ICON_MUTED
content="$(eval echo "$FORMAT")"
if [ -n "$COLOR_MUTED" ]; then
echo "${COLOR_MUTED}${content}${END_COLOR}"
else
echo "$content"
fi
else
eval echo "$FORMAT"
fi
}
function usage() {
echo "\
Usage: $0 [OPTION...] ACTION
Terminology: A node represents either a sink (output) or source (input).
Options:
--autosync | --no-autosync
Whether to maintain same volume for all programs.
Default: \"$AUTOSYNC\"
--color-muted <rrggbb>
Color in which to format when muted.
Pass empty string to disable.
Default: \"${COLOR_MUTED:4:-1}\"
--notifications | --no-notifications
Whether to show notifications when changing nodes.
Default: \"$NOTIFICATIONS\"
--osd | --no-osd
Whether to display KDE's OSD message.
Default: \"$OSD\"
--icon-muted <icon>
Icon to use when muted.
Default: none
--icon-node <icon>
Icon to use for node.
Default: none
--format <string>
Use a format string to control the output.
Remember to pass this argument wrapped in single quotes (\`'\`) instead
of double quotes (\`\"\`) to avoid your shell from evaluating the
variables early.
Available variables:
* \$VOL_ICON
* \$VOL_LEVEL
* \$ICON_NODE
* \$NODE_NICKNAME
* \$IS_MUTED (yes/no)
Default: '$FORMAT'
--icons-volume <icon>[,<icon>...]
Icons for volume, from lower to higher.
Default: none
--node-type <node_type>
Whether to consider PulseAudio sinks (output) or sources (input).
All the operations of pulseaudio-control will apply to one of the two.
Pass \`input\` for the sources, e.g. a microphone.
Pass \`output\` for the sinks, e.g. speakers, headphones.
Default: \"$NODE_TYPE\"
--volume-max <int>
Maximum volume to which to allow increasing.
Default: \"$VOLUME_MAX\"
--volume-step <int>
Step size when inc/decrementing volume.
Default: \"$VOLUME_STEP\"
--node-blacklist <name>[,<name>...]
Nodes to ignore when switching. You can use globs. Don't forget to
quote the string when using globs, to avoid unwanted shell glob
extension.
Default: none
--node-nicknames-from <prop>
pactl property to use for node names, unless overridden by
--node-nickname. Its possible values are listed under the 'Properties'
key in the output of \`pactl list sinks\` and \`pactl list sources\`.
Default: none
--node-nickname <name>:<nick>
Nickname to assign to given node name, taking priority over
--node-nicknames-from. May be given multiple times, and 'name' is
exactly as listed in the output of \`pactl list sinks short | cut -f2\`
and \`pactl list sources short | cut -f2\`.
Note that you can also specify a port name for the node with
\`<name>/<port>\`.
It is also possible to use glob matching to match node and port names.
Exact matches are prioritized. Don't forget to quote the string when
using globs, to avoid unwanted shell glob extension.
Default: none
--listen-timeout-secs
The listen command updates the output as soon as it receives an event
from PulseAudio. However, events are often accompanied by many other
useless ones, which may result in unnecessary consecutive output
updates. This script buffers the following events until a timeout is
reached to avoid this scenario, which lessens the CPU load on events.
However, this may result in noticeable latency when performing many
actions quickly (e.g., updating the volume with the mouse wheel). You
can specify what timeout to use to control the responsiveness, in
seconds.
Default: \"$LISTEN_TIMEOUT\"
Actions:
help display this message and exit
output print the PulseAudio status once
listen listen for changes in PulseAudio to automatically update
this script's output
up, down increase or decrease the default node's volume
mute, unmute mute or unmute the default node's audio
togmute switch between muted and unmuted
next-node switch to the next available node
sync synchronize all the output streams volume to be the same as
the current node's volume
Author:
Mario Ortiz Manero
More info on GitHub:
https://github.com/marioortizmanero/polybar-pulseaudio-control"
}
# Obtains the value for an option and returns 1 if no shift is needed.
function getOptVal() {
if [[ "$1" = *=* ]]; then
val="${1//*=/}"
return 1
fi
val="$2"
}
# Parsing the options from the arguments
while [[ "$1" = --* ]]; do
unset arg
unset val
arg="$1"
case "$arg" in
--autosync)
AUTOSYNC=yes
;;
--no-autosync)
AUTOSYNC=no
;;
--color-muted|--colour-muted)
if getOptVal "$@"; then shift; fi
COLOR_MUTED="%{F#$val}"
;;
--notifications)
NOTIFICATIONS=yes
;;
--no-notifications)
NOTIFICATIONS=no
;;
--osd)
OSD=yes
;;
--no-osd)
OSD=no
;;
--icon-muted)
if getOptVal "$@"; then shift; fi
ICON_MUTED="$val"
;;
--icon-node)
if getOptVal "$@"; then shift; fi
# shellcheck disable=SC2034
ICON_NODE="$val"
;;
--icons-volume)
if getOptVal "$@"; then shift; fi
IFS=, read -r -a ICONS_VOLUME <<< "${val//[[:space:]]/}"
;;
--volume-max)
if getOptVal "$@"; then shift; fi
VOLUME_MAX="$val"
;;
--volume-step)
if getOptVal "$@"; then shift; fi
VOLUME_STEP="$val"
;;
--node-blacklist)
if getOptVal "$@"; then shift; fi
IFS=, read -r -a NODE_BLACKLIST <<< "${val//[[:space:]]/}"
;;
--node-nicknames-from)
if getOptVal "$@"; then shift; fi
NODE_NICKNAMES_PROP="$val"
;;
--node-nickname)
if getOptVal "$@"; then shift; fi
NODE_NICKNAMES["${val//:*/}"]="${val//*:}"
;;
--format)
if getOptVal "$@"; then shift; fi
FORMAT="$val"
;;
--node-type)
if getOptVal "$@"; then shift; fi
if [[ "$val" != "output" && "$val" != "input" ]]; then
echo "node-type must be 'output' or 'input', got '$val'" >&2
exit 1
fi
NODE_TYPE="$val"
SINK_OR_SOURCE=$([ "$NODE_TYPE" == "output" ] && echo "ink" || echo "ource")
;;
--listen-timeout-secs)
if getOptVal "$@"; then shift; fi
LISTEN_TIMEOUT="$val"
;;
# Deprecated options, to be removed in a next release
--icon-sink)
echo "Replaced by --icon-node, see https://github.com/marioortizmanero/polybar-pulseaudio-control/releases/tag/v3.0.0" >&2
exit 1
;;
--sink-blacklist)
echo "Replaced by --node-blacklist, see https://github.com/marioortizmanero/polybar-pulseaudio-control/releases/tag/v3.0.0" >&2
exit 1
;;
--sink-nicknames-from)
echo "Replaced by --node-nicknames-from, see https://github.com/marioortizmanero/polybar-pulseaudio-control/releases/tag/v3.0.0" >&2
exit 1
;;
--sink-nickname)
echo "Replaced by --node-nickname, see https://github.com/marioortizmanero/polybar-pulseaudio-control/releases/tag/v3.0.0" >&2
exit 1
;;
# Undocumented because the `help` action already exists, but makes the
# help message more accessible.
--help)
usage
exit 0
;;
*)
echo "Unrecognised option: $arg" >&2
exit 1
;;
esac
shift
done
# Parsing the action from the arguments
case "$1" in
up)
volUp
;;
down)
volDown
;;
togmute)
volMute toggle
;;
mute)
volMute mute
;;
unmute)
volMute unmute
;;
sync)
volSync
;;
listen)
listen
;;
next-node)
nextNode
;;
output)
output
;;
help)
usage
;;
# Deprecated action, to be removed in a next release
next-sink)
echo "Replaced by next-node, see https://github.com/marioortizmanero/polybar-pulseaudio-control/releases/tag/v3.0.0" >&2
exit 1
;;
"")
echo "No action specified. Run \`$0 help\` for more information." >&2
;;
*)
echo "Unrecognised action: $1" >&2
exit 1
;;
esac

View file

@ -1,64 +0,0 @@
#!/bin/sh
bluetooth_print() {
bluetoothctl | while read -r; do
if [ "$(systemctl is-active "bluetooth.service")" = "active" ]; then
if bluetoothctl show | grep -q "Powered: no"; then
echo "󰂲 "
else
printf '󰂯 '
devices_paired=$(bluetoothctl devices Paired | grep Device | cut -d ' ' -f 2)
counter=0
for device in $devices_paired; do
device_info=$(bluetoothctl info "$device")
if echo "$device_info" | grep -q "Connected: yes"; then
device_alias=$(echo "$device_info" | grep "Alias" | cut -d ' ' -f 2-)
if [ $counter -gt 0 ]; then
printf ", %s" "$device_alias"
else
printf " %s" "$device_alias"
fi
counter=$((counter + 1))
fi
done
printf '\n'
fi
else
echo "󰂲 "
fi
done
}
bluetooth_toggle() {
if bluetoothctl show | grep -q "Powered: no"; then
bluetoothctl power on >> /dev/null
sleep 1
devices_paired=$(bluetoothctl devices Paired | grep Device | cut -d ' ' -f 2)
echo "$devices_paired" | while read -r line; do
bluetoothctl connect "$line" >> /dev/null
done
else
devices_paired=$(bluetoothctl devices Paired | grep Device | cut -d ' ' -f 2)
echo "$devices_paired" | while read -r line; do
bluetoothctl disconnect "$line" >> /dev/null
done
bluetoothctl power off >> /dev/null
fi
}
case "$1" in
--toggle)
bluetooth_toggle
;;
*)
bluetooth_print
;;
esac