Compare commits

9 Commits
Author SHA1 Message Date
romanzy313 b0679fa52f easier norm complience 2026-10-01 22:15:45 +02:00
romanzy313 d9f92eb203 remove noisy suggestions 2026-09-30 23:50:20 +02:00
romanzy313 bddad61696 update keymaps 2026-09-29 21:36:43 +02:00
romanzy313 a23783c324 oil is king 2026-09-29 21:35:52 +02:00
romanzy313 f8ba62a6bb Revert "disable oil, enable mini.files"
This reverts commit 75eae3f174.
2026-09-29 21:32:45 +02:00
romanzy313 598f684c22 support other clipboards 2026-09-29 21:28:35 +02:00
Roman Volovoy 972289799c fix codam header 2026-09-28 16:26:02 +02:00
Roman Volovoy f362f0b9b1 lazygit installed 2026-09-28 12:48:00 +02:00
Roman Volovoy b8304c06af install scripts 2026-09-28 12:45:07 +02:00
12 changed files with 178 additions and 531 deletions
+7
View File
@@ -18,3 +18,10 @@ cc-run(){
rm "${file}.out"
}
# https://pypi.org/project/c-formatter-42/
# install via
# pip3 install --user c-formatter-42
norm(){
c_formatter_42 *.c *.h
}
+15
View File
@@ -0,0 +1,15 @@
#!/bin/bash
fonts_dir="$HOME/.local/share/fonts"
mkdir -p "$fonts_dir"
# List of fonts to install
declare -a fonts=(FiraCode JetBrainsMono Hack)
for font in "${fonts[@]}"; do
echo "Installing $font..."
wget "https://github.com/ryanoasis/nerd-fonts/releases/latest/download/${font}.zip" -P "/tmp/"
unzip -o "/tmp/${font}.zip" -d "$fonts_dir"
rm "/tmp/${font}.zip"
done
fc-cache -fv
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -euo pipefail
LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | grep -Po '"tag_name": *"v\K[^"]*')
LAZYGIT_ARCH=$(uname -m | sed 's/aarch64/arm64/')
echo "Installing lazygit v${LAZYGIT_VERSION} (${LAZYGIT_ARCH})"
WORKDIR=$(mktemp -d /tmp/lazygit.XXXXXX)
trap 'rm -rf "$WORKDIR"' EXIT
curl -sLo "${WORKDIR}/lazygit.tar.gz" \
"https://github.com/jesseduffield/lazygit/releases/download/v${LAZYGIT_VERSION}/lazygit_${LAZYGIT_VERSION}_Linux_${LAZYGIT_ARCH}.tar.gz"
tar -xOf "${WORKDIR}/lazygit.tar.gz" lazygit > "${WORKDIR}/lazygit"
mkdir -p ~/.local/bin
install -m 755 "${WORKDIR}/lazygit" ~/.local/bin/lazygit
echo "Done: $(~/.local/bin/lazygit --version)"
+25
View File
@@ -0,0 +1,25 @@
#!/bin/bash
STOW_VERSION="${STOW_VERSION:-2.4.1}"
# Create temp build directory
BUILD_DIR=$(mktemp -d)
trap 'rm -rf "$BUILD_DIR"' EXIT
# 1. Download and extract
cd "$BUILD_DIR"
curl -O "http://ftp.gnu.org/gnu/stow/stow-${STOW_VERSION}.tar.gz"
tar xf "stow-${STOW_VERSION}.tar.gz"
cd "stow-${STOW_VERSION}"
# 2. Configure installation to user directory
./configure --prefix="$HOME/.local"
# 3. Compile and install (no sudo needed)
make
make install
# 4. Add to PATH (add this line to ~/.bashrc or ~/.zshrc)
export PATH="$HOME/.local/bin:$PATH"
# 5. Verify installation
stow --version
+10 -1
View File
@@ -54,6 +54,11 @@ Git shortcuts:
- `[h`, `]h`, `[H`, `]H` jump to hunks
- `<leader>th` — toggle the expanded hunk view
Oil usage:
- `-`, `<BS>` goes to the parent directory
- `<C-p>` previews the selected entry
Toggle shortcuts:
- `<leader>tw` toggle soft wrap
@@ -92,6 +97,7 @@ Useful LSP commands:
- `<leader>ca` show code actions
- `<leader>cf` apply quick fixes
- `<leader>cs` show source actions
- `<C-x><C-n>` manually word completion
Diagnostics:
@@ -101,7 +107,10 @@ Diagnostics:
- `]g`, `[g` jump to warning or error
- `<leader>ti` toggle inline diagnostics
- `<leader>tv` toggle virtual diagnostics
- `<leader>xx`, `:ProjectDiagnostics` check the current Dart or TypeScript package and show warnings and errors in Trouble. Save modified package files first. Other languages show available LSP diagnostics; project coverage depends on the language server.
- `<leader>xx`, `:ProjectDiagnostics` check the current Dart or TypeScript
package and show warnings and errors in Trouble. Save modified package files
first. Other languages show available LSP diagnostics; project coverage
depends on the language server.
## Tree-sitter
+1
View File
@@ -2,3 +2,4 @@ local o = vim.opt_local
o.textwidth = 80
o.expandtab = false
o.commentstring = "/*%s*/"
+4 -1
View File
@@ -3,7 +3,8 @@ local ac = vim.api.nvim_create_autocmd
local aug = vim.api.nvim_create_augroup
uc("W", "w|e", { desc = "write file then refresh buffer" })
uc("ProjectDiagnostics", require("romanzy.custom.project_diagnostics").run, { desc = "check project warnings and errors" })
uc("ProjectDiagnostics", require("romanzy.custom.project_diagnostics").run,
{ desc = "check project warnings and errors" })
ac("TextYankPost", {
desc = "Highlight when yanking text",
@@ -13,6 +14,8 @@ ac("TextYankPost", {
end,
})
uc("NormFormat", "!c_formatter_42 *.c *.h", { desc = "comply with the norm in C" })
-- ac("LspAttach", {
-- desc = "Notify user about attached LSP clients",
-- group = aug("LSPOnAttach", { clear = true }),
@@ -1,426 +0,0 @@
-- Custom module to config a few things for the mini.files:
-- - git highlighting
-- - refresh
-- - file open in external programs
local M = {}
local uv = vim.uv or vim.loop
local cache_ttl_ms = 1000
local status_cache = {}
local git_root_cache = {}
local known_git_roots = {}
local function is_path_inside(path, root)
return path == root or vim.startswith(path, root .. "/")
end
local function new_status_node()
return {
children = {},
status = nil,
priority = 0,
is_dir_ignored = false,
is_dir_untracked = false,
}
end
local function is_conflict(status)
if #status < 2 then
return false
end
local index_status = status:sub(1, 1)
local worktree_status = status:sub(2, 2)
return index_status == "U"
or worktree_status == "U"
or status == "AA"
or status == "DD"
end
local function status_priority(status)
-- Folder aggregation follows the Zed-inspired order create < edit <
-- delete. `subtree_status()` uses the greatest priority, so deletion
-- must outrank every create or edit status.
if #status < 2 then
return 0
end
if is_conflict(status) then
return 8
end
if status == "!!" then
return 1
end
if status == "??" then
return 2
end
local index_status = status:sub(1, 1)
local worktree_status = status:sub(2, 2)
if index_status == "D" or worktree_status == "D" then
return 4
end
if index_status == "A" then
return 2
end
if index_status == "R" or index_status == "C" then
return 3
end
if index_status == "M" or worktree_status == "M" then
return 3
end
return 0
end
local function status_highlight(status)
if not status then
return nil
end
if status == "!!" then
return "Comment"
end
if is_conflict(status) then
return "MiniDiffSignDelete"
end
if status == "??" or status:sub(1, 1) == "A" then
return "MiniDiffSignAdd"
end
if status:sub(1, 1) == "D" or status:sub(2, 2) == "D" then
return "MiniDiffSignDelete"
end
if status:sub(1, 1) == "M"
or status:sub(1, 1) == "R"
or status:sub(1, 1) == "C"
or status:sub(2, 2) == "M"
then
return "MiniDiffSignChange"
end
return nil
end
local function insert_status(root, relative_path, status, is_directory)
local priority = status_priority(status)
if priority == 0 then
return
end
local node = root
local segments = vim.split(relative_path, "/", { plain = true, trimempty = true })
for index, segment in ipairs(segments) do
node.children[segment] = node.children[segment] or new_status_node()
node = node.children[segment]
if index == #segments then
if priority > node.priority then
node.status = status
node.priority = priority
end
if is_directory and status == "!!" then
node.is_dir_ignored = true
end
if is_directory and status == "??" then
node.is_dir_untracked = true
end
end
end
end
local function subtree_status(node)
local best_status = node.status
local best_priority = node.priority
for _, child in pairs(node.children) do
local child_status, child_priority = subtree_status(child)
if child_priority > best_priority then
best_status = child_status
best_priority = child_priority
end
end
return best_status, best_priority
end
local function parse_status(output, root)
local data = {
root = root,
statuses = {},
trie = new_status_node(),
timestamp = uv.now(),
}
local records = vim.split(output, "\0", { plain = true, trimempty = true })
local record_index = 1
while record_index <= #records do
local record = records[record_index]
if #record >= 4 then
local status = record:sub(1, 2)
local relative_path = record:sub(4)
-- With -z, rename/copy output contains the new path followed by
-- the old path. Oil highlights the new path only.
if status:sub(1, 1) == "R" or status:sub(1, 1) == "C" then
record_index = record_index + 1
end
local is_directory = relative_path:sub(-1) == "/"
relative_path = relative_path:gsub("^%./", ""):gsub("/$", "")
if relative_path ~= "" then
local absolute_path = vim.fs.normalize(vim.fs.joinpath(root, relative_path))
data.statuses[absolute_path] = status
insert_status(data.trie, relative_path, status, is_directory)
end
end
record_index = record_index + 1
end
return data
end
local function find_cached_root(path)
local result
for root in pairs(known_git_roots) do
if is_path_inside(path, root) and (result == nil or #root > #result) then
result = root
end
end
return result
end
local function find_git_root(path)
local cached_root = find_cached_root(path)
if cached_root ~= nil then
return cached_root
end
local cached = git_root_cache[path]
if cached ~= nil then
return cached or nil
end
local result = vim.system({ "git", "-C", path, "rev-parse", "--show-toplevel" }, { text = true }):wait()
if result.code ~= 0 then
git_root_cache[path] = false
return nil
end
local root = vim.trim(result.stdout)
if root == "" then
git_root_cache[path] = false
return nil
end
root = vim.fs.normalize(root)
git_root_cache[path] = root
known_git_roots[root] = true
return root
end
local function get_status_data(fs_entry)
local path = fs_entry.path
if fs_entry.fs_type ~= "directory" then
path = vim.fs.dirname(path)
end
path = vim.fs.normalize(path)
local root = find_git_root(path)
if root == nil then
return nil
end
local cached = status_cache[root]
if cached ~= nil and uv.now() - cached.timestamp < cache_ttl_ms then
return cached
end
local result = vim.system({
"git",
"-C",
root,
"--no-optional-locks",
"status",
"--porcelain",
"--ignored",
"-z",
}, { text = true }):wait()
if result.code ~= 0 then
status_cache[root] = parse_status("", root)
return status_cache[root]
end
local data = parse_status(result.stdout, root)
status_cache[root] = data
return data
end
local function lookup_status(data, fs_entry)
local path = vim.fs.normalize(fs_entry.path)
local direct_status = data.statuses[path]
if fs_entry.fs_type ~= "directory" and direct_status ~= nil then
return direct_status
end
if not is_path_inside(path, data.root) then
return nil
end
local relative_path = path:sub(#data.root + 2)
local node = data.trie
for _, segment in ipairs(vim.split(relative_path, "/", { plain = true, trimempty = true })) do
if node.is_dir_ignored then
return "!!"
end
if node.is_dir_untracked then
return "??"
end
node = node.children[segment]
if node == nil then
return nil
end
end
if node.is_dir_ignored then
return "!!"
end
if node.is_dir_untracked then
return "??"
end
if next(node.children) == nil then
return node.status
end
local status = subtree_status(node)
-- Match the Oil configuration: an ignored descendant does not grey its
-- parent directory unless Git reported that directory as ignored.
if fs_entry.fs_type == "directory" and status == "!!" then
return nil
end
return status
end
function M.filter(fs_entry)
return fs_entry.name ~= ".git"
end
local function get_entry_status(fs_entry)
local data = get_status_data(fs_entry)
if data == nil then
return nil
end
return lookup_status(data, fs_entry)
end
function M.highlight(fs_entry)
local status = get_entry_status(fs_entry)
return status_highlight(status)
or (fs_entry.fs_type == "directory" and "MiniFilesDirectory" or "MiniFilesFile")
end
function M.invalidate()
status_cache = {}
git_root_cache = {}
known_git_roots = {}
end
local function refresh()
M.invalidate()
if _G.MiniFiles == nil or MiniFiles.get_explorer_state() == nil then
return
end
vim.schedule(function()
if MiniFiles.get_explorer_state() ~= nil then
MiniFiles.refresh()
end
end)
end
local function refresh_filetree()
M.invalidate()
if _G.MiniFiles == nil or MiniFiles.get_explorer_state() == nil then
return
end
vim.schedule(function()
if MiniFiles.get_explorer_state() ~= nil then
MiniFiles.refresh({
content = {
filter = M.filter,
highlight = M.highlight,
},
})
end
end)
end
local function open_external()
local fs_entry = MiniFiles.get_fs_entry()
if fs_entry == nil then
vim.notify("No file system entry under the cursor", vim.log.levels.WARN)
return
end
vim.ui.open(fs_entry.path)
end
function M.setup()
local group = vim.api.nvim_create_augroup("romanzy_mini_files_git", { clear = true })
vim.api.nvim_create_autocmd("User", {
group = group,
pattern = "MiniFilesBufferCreate",
callback = function(args)
if args.data == nil then
return
end
for _, lhs in ipairs({ "gR", "<F5>" }) do
vim.keymap.set("n", lhs, refresh_filetree, {
buffer = args.data.buf_id,
desc = "refresh mini.files filetree",
})
end
vim.keymap.set("n", "gx", open_external, {
buffer = args.data.buf_id,
desc = "open mini.files entry externally",
})
vim.keymap.set("n", "<CR>", "L", {
buffer = args.data.buf_id,
remap = true,
desc = "go in entry plus (extra)",
})
end,
})
vim.api.nvim_create_autocmd({ "BufWritePost", "FocusGained", "TermClose" }, {
group = group,
callback = refresh,
})
vim.api.nvim_create_autocmd("User", {
group = group,
pattern = {
"GitSignsUpdate",
"LazyGitClosed",
"MiniFilesActionCreate",
"MiniFilesActionDelete",
"MiniFilesActionRename",
"MiniFilesActionCopy",
"MiniFilesActionMove",
},
callback = refresh,
})
return {
content = {
filter = M.filter,
highlight = M.highlight,
},
}
end
return M
+1 -10
View File
@@ -18,18 +18,9 @@ local function telescope_picker(picker)
end
end
local function open_mini_files_at_current_buffer()
local current_path = vim.api.nvim_buf_get_name(0)
if vim.bo.buftype ~= "" or current_path == "" then
current_path = nil
end
MiniFiles.open(current_path)
end
map("n", "<leader><leader>r", ":source ~/.config/nvim/init.lua<CR>", { desc = "reload init.lua" })
map("n", "<leader><leader>h", telescope_picker("keymaps"), { desc = "show keymaps" })
map("n", "<leader>e", open_mini_files_at_current_buffer, { desc = "open mini.files" })
map("n", "<leader>e", "<Cmd>Oil<CR>", { desc = "open oil" })
map("n", "<leader>ff", telescope_picker("find_files"), { desc = "find files" })
map("n", "<leader>fg", telescope_picker("live_grep"), { desc = "live grep" })
map("n", "<leader>fb", telescope_picker("buffers"), { desc = "find buffers" })
+1 -1
View File
@@ -2,7 +2,6 @@ local g = vim.g
local o = vim.opt
g.mapleader = " " -- Uses space as the global leader key.
g.maplocalleader = " " -- Uses space as the local leader key.
g.clipboard = "osc52" -- Routes the + and * registers through OSC52 in terminal Neovim.
o.number = true -- Shows absolute line numbers.
o.relativenumber = true -- Shows relative numbers for easier motion.
@@ -33,6 +32,7 @@ o.completeopt = { "menuone", "noinsert", "fuzzy", "nosort" } -- Enables fuzzy co
o.pumheight = 8 -- Limits the completion popup menu size.
o.updatetime = 50 -- Reduces idle delay for swap and CursorHold events.
o.shell = "bash" -- Runs shell commands through bash.
g.c_syntax_for_h = true -- Unfuck header formatting
-- Only show the invisible characters inside the code editing buffers
vim.cmd([[autocmd BufWinEnter * if &buftype != '' | setlocal nolist | endif]])
@@ -10,7 +10,6 @@ local icons = require("mini.icons")
local input = require("mini.input")
local clue = require("mini.clue")
local completion = require("mini.completion")
local files = require("mini.files")
local git = require("mini.git")
local diff = require("mini.diff")
local statusline = require("mini.statusline")
@@ -56,7 +55,7 @@ clue.setup({
},
})
files.setup(require("romanzy.custom.mini_files").setup())
icons.setup({})
git.setup({})
@@ -135,7 +134,10 @@ pairs.setup({
modes = { insert = true, command = true, terminal = false },
})
completion.setup({})
completion.setup({
fallback_action = function() end,
mappings = { force_fallback = "" },
})
vim.keymap.set("i", "<CR>", function()
if vim.fn.complete_info({ "selected" }).selected ~= -1 then
return "\25"
+89 -89
View File
@@ -1,89 +1,89 @@
-- vim.pack.add({
-- {
-- src = "https://github.com/stevearc/oil.nvim",
-- name = "oil.nvim",
-- },
-- {
-- src = "https://github.com/malewicz1337/oil-git.nvim",
-- name = "oil-git.nvim",
-- },
-- })
--
-- local function set_oil_git_highlights()
-- vim.api.nvim_set_hl(0, "OilGitAdded", { link = "MiniDiffSignAdd" })
-- vim.api.nvim_set_hl(0, "OilGitUntracked", { link = "MiniDiffSignAdd" })
-- vim.api.nvim_set_hl(0, "OilGitModifiedStaged", { link = "MiniDiffSignChange" })
-- vim.api.nvim_set_hl(0, "OilGitModifiedUnstaged", { link = "MiniDiffSignChange" })
-- vim.api.nvim_set_hl(0, "OilGitRenamed", { link = "MiniDiffSignChange" })
-- vim.api.nvim_set_hl(0, "OilGitCopied", { link = "MiniDiffSignChange" })
-- vim.api.nvim_set_hl(0, "OilGitDeleted", { link = "MiniDiffSignDelete" })
-- vim.api.nvim_set_hl(0, "OilGitConflict", { link = "MiniDiffSignDelete" })
-- vim.api.nvim_set_hl(0, "OilGitIgnored", { link = "Comment" })
-- end
--
-- require("oil").setup({
-- keymaps = {
-- ["<C-h>"] = false,
-- ["<C-j>"] = false,
-- ["<C-k>"] = false,
-- ["<C-l>"] = false,
-- ["gR"] = "actions.refresh", -- replaces default <C-l> behavior
-- ["<F5>"] = "actions.refresh",
-- ["<C-s>"] = false,
-- ["<C-p>"] = { "actions.preview", opts = { vertical = true, split = "belowright" } },
-- ["<BS>"] = { "actions.parent", mode = "n" },
-- },
-- view_options = {
-- show_hidden = true,
-- is_hidden_file = function(_, _)
-- return false
-- end,
-- is_always_hidden = function(name, _)
-- return name == ".git"
-- end,
-- },
-- })
--
-- local oil_git_trie = require("oil-git.trie")
-- local oil_git_lookup = oil_git_trie.lookup
--
-- -- ugly internal monkey patch to not show partially git-ignored foldres as grey
-- rawset(oil_git_trie, "lookup", function(root, entry_path, git_root, exclude_ignored)
-- local status = oil_git_lookup(root, entry_path, git_root, exclude_ignored)
-- if status ~= "!!" or exclude_ignored then
-- return status
-- end
--
-- local relative_path = entry_path:sub(#git_root + 2)
-- local node = root
-- for segment in relative_path:gmatch("[^/\\]+") do
-- node = node.children[segment]
-- if not node then
-- return nil
-- end
-- end
--
-- -- oil-git normally propagates an ignored child's status to every parent.
-- -- Only grey a directory when Git reported that directory itself as ignored.
-- if not node.is_dir_ignored then
-- return nil
-- end
--
-- return status
-- end)
--
-- require("oil-git").setup({
-- show_file_highlights = true,
-- show_directory_highlights = true,
-- show_ignored_files = true,
-- show_ignored_directories = true,
-- show_file_symbols = true,
-- show_directory_symbols = true,
-- symbol_position = "none",
-- })
--
-- set_oil_git_highlights()
-- vim.api.nvim_create_autocmd("ColorScheme", {
-- group = vim.api.nvim_create_augroup("romanzy_oil_git_highlights", { clear = true }),
-- callback = set_oil_git_highlights,
-- })
vim.pack.add({
{
src = "https://github.com/stevearc/oil.nvim",
name = "oil.nvim",
},
{
src = "https://github.com/malewicz1337/oil-git.nvim",
name = "oil-git.nvim",
},
})
local function set_oil_git_highlights()
vim.api.nvim_set_hl(0, "OilGitAdded", { link = "MiniDiffSignAdd" })
vim.api.nvim_set_hl(0, "OilGitUntracked", { link = "MiniDiffSignAdd" })
vim.api.nvim_set_hl(0, "OilGitModifiedStaged", { link = "MiniDiffSignChange" })
vim.api.nvim_set_hl(0, "OilGitModifiedUnstaged", { link = "MiniDiffSignChange" })
vim.api.nvim_set_hl(0, "OilGitRenamed", { link = "MiniDiffSignChange" })
vim.api.nvim_set_hl(0, "OilGitCopied", { link = "MiniDiffSignChange" })
vim.api.nvim_set_hl(0, "OilGitDeleted", { link = "MiniDiffSignDelete" })
vim.api.nvim_set_hl(0, "OilGitConflict", { link = "MiniDiffSignDelete" })
vim.api.nvim_set_hl(0, "OilGitIgnored", { link = "Comment" })
end
require("oil").setup({
keymaps = {
["<C-h>"] = false,
["<C-j>"] = false,
["<C-k>"] = false,
["<C-l>"] = false,
["gR"] = "actions.refresh", -- replaces default <C-l> behavior
["<F5>"] = "actions.refresh",
["<C-s>"] = false,
["<C-p>"] = { "actions.preview", opts = { vertical = true, split = "belowright" } },
["<BS>"] = { "actions.parent", mode = "n" },
},
view_options = {
show_hidden = true,
is_hidden_file = function(_, _)
return false
end,
is_always_hidden = function(name, _)
return name == ".git"
end,
},
})
local oil_git_trie = require("oil-git.trie")
local oil_git_lookup = oil_git_trie.lookup
-- ugly internal monkey patch to not show partially git-ignored foldres as grey
rawset(oil_git_trie, "lookup", function(root, entry_path, git_root, exclude_ignored)
local status = oil_git_lookup(root, entry_path, git_root, exclude_ignored)
if status ~= "!!" or exclude_ignored then
return status
end
local relative_path = entry_path:sub(#git_root + 2)
local node = root
for segment in relative_path:gmatch("[^/\\]+") do
node = node.children[segment]
if not node then
return nil
end
end
-- oil-git normally propagates an ignored child's status to every parent.
-- Only grey a directory when Git reported that directory itself as ignored.
if not node.is_dir_ignored then
return nil
end
return status
end)
require("oil-git").setup({
show_file_highlights = true,
show_directory_highlights = true,
show_ignored_files = true,
show_ignored_directories = true,
show_file_symbols = true,
show_directory_symbols = true,
symbol_position = "none",
})
set_oil_git_highlights()
vim.api.nvim_create_autocmd("ColorScheme", {
group = vim.api.nvim_create_augroup("romanzy_oil_git_highlights", { clear = true }),
callback = set_oil_git_highlights,
})