mirror of
https://github.com/iofq/nvim.nix.git
synced 2026-01-23 08:55:16 -06:00
dart persist + picker
This commit is contained in:
parent
9457c7436e
commit
4b7636090f
13 changed files with 149 additions and 519 deletions
16
flake.lock
generated
16
flake.lock
generated
|
|
@ -1,5 +1,20 @@
|
||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
|
"dart": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1754291267,
|
||||||
|
"owner": "iofq",
|
||||||
|
"repo": "dart.nvim",
|
||||||
|
"rev": "617587d40fd2f2727c18758c4e6decac78459529",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "iofq",
|
||||||
|
"repo": "dart.nvim",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"flake-compat": {
|
"flake-compat": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
|
|
@ -376,6 +391,7 @@
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
|
"dart": "dart",
|
||||||
"flake-utils": "flake-utils",
|
"flake-utils": "flake-utils",
|
||||||
"gen-luarc": "gen-luarc",
|
"gen-luarc": "gen-luarc",
|
||||||
"neovim-nightly-overlay": "neovim-nightly-overlay",
|
"neovim-nightly-overlay": "neovim-nightly-overlay",
|
||||||
|
|
|
||||||
33
flake.nix
33
flake.nix
|
|
@ -9,6 +9,10 @@
|
||||||
url = "github:mrcjkb/nix-gen-luarc-json";
|
url = "github:mrcjkb/nix-gen-luarc-json";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
dart = {
|
||||||
|
url = "github:iofq/dart.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
# Add bleeding-edge plugins here.
|
# Add bleeding-edge plugins here.
|
||||||
# They can be updated with `nix flake update` (make sure to commit the generated flake.lock)
|
# They can be updated with `nix flake update` (make sure to commit the generated flake.lock)
|
||||||
# wf-nvim = {
|
# wf-nvim = {
|
||||||
|
|
@ -16,19 +20,22 @@
|
||||||
# flake = false;
|
# flake = false;
|
||||||
# };
|
# };
|
||||||
};
|
};
|
||||||
outputs = inputs @ {
|
outputs =
|
||||||
self,
|
inputs@{
|
||||||
nixpkgs,
|
self,
|
||||||
flake-utils,
|
nixpkgs,
|
||||||
...
|
flake-utils,
|
||||||
}: let
|
...
|
||||||
systems = builtins.attrNames nixpkgs.legacyPackages;
|
}:
|
||||||
|
let
|
||||||
|
systems = builtins.attrNames nixpkgs.legacyPackages;
|
||||||
|
|
||||||
# This is where the Neovim derivation is built.
|
# This is where the Neovim derivation is built.
|
||||||
neovim-overlay = import ./nix/neovim-overlay.nix {inherit inputs;};
|
neovim-overlay = import ./nix/neovim-overlay.nix { inherit inputs; };
|
||||||
in
|
in
|
||||||
flake-utils.lib.eachSystem systems (
|
flake-utils.lib.eachSystem systems (
|
||||||
system: let
|
system:
|
||||||
|
let
|
||||||
pkgs = import nixpkgs {
|
pkgs = import nixpkgs {
|
||||||
inherit system;
|
inherit system;
|
||||||
config.allowUnfree = true;
|
config.allowUnfree = true;
|
||||||
|
|
@ -48,7 +55,6 @@
|
||||||
nil
|
nil
|
||||||
stylua
|
stylua
|
||||||
luajitPackages.luacheck
|
luajitPackages.luacheck
|
||||||
alejandra
|
|
||||||
nvim-dev
|
nvim-dev
|
||||||
];
|
];
|
||||||
shellHook = ''
|
shellHook = ''
|
||||||
|
|
@ -58,7 +64,8 @@
|
||||||
ln -Tfns $PWD/nvim ~/.config/nvim-dev
|
ln -Tfns $PWD/nvim ~/.config/nvim-dev
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
packages = rec {
|
packages = rec {
|
||||||
default = nvim;
|
default = nvim;
|
||||||
nvim = pkgs.nvim-pkg;
|
nvim = pkgs.nvim-pkg;
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,13 @@ let
|
||||||
};
|
};
|
||||||
mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; };
|
mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; };
|
||||||
|
|
||||||
|
dart-nvim-git = mkNvimPlugin inputs.dart "dart.nvim";
|
||||||
|
|
||||||
all-plugins = with pkgs.vimPlugins; [
|
all-plugins = with pkgs.vimPlugins; [
|
||||||
blink-cmp
|
blink-cmp
|
||||||
blink-ripgrep-nvim
|
blink-ripgrep-nvim
|
||||||
conform-nvim
|
conform-nvim
|
||||||
|
dart-nvim-git
|
||||||
diffview-nvim
|
diffview-nvim
|
||||||
eyeliner-nvim
|
eyeliner-nvim
|
||||||
friendly-snippets
|
friendly-snippets
|
||||||
|
|
@ -43,12 +46,12 @@ let
|
||||||
# Extra packages that should be included on nixos but don't need to be bundled
|
# Extra packages that should be included on nixos but don't need to be bundled
|
||||||
extraPackages = with pkgs; [
|
extraPackages = with pkgs; [
|
||||||
# linters
|
# linters
|
||||||
alejandra
|
|
||||||
yamllint
|
yamllint
|
||||||
jq
|
jq
|
||||||
hadolint
|
hadolint
|
||||||
nixfmt
|
nixfmt
|
||||||
shellcheck
|
shellcheck
|
||||||
|
golangci-lint
|
||||||
|
|
||||||
# LSPs
|
# LSPs
|
||||||
gopls
|
gopls
|
||||||
|
|
|
||||||
57
nvim/lua/config/autocmd.lua
Normal file
57
nvim/lua/config/autocmd.lua
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
-- create undopath
|
||||||
|
local undopath = vim.fn.stdpath('data') .. 'undo'
|
||||||
|
vim.api.nvim_create_autocmd('VimEnter', {
|
||||||
|
command = 'silent !mkdir -p ' .. undopath,
|
||||||
|
group = vim.api.nvim_create_augroup('Init', {}),
|
||||||
|
})
|
||||||
|
|
||||||
|
-- open :h in buffers
|
||||||
|
vim.api.nvim_create_autocmd('BufWinEnter', {
|
||||||
|
pattern = '*',
|
||||||
|
callback = function(event)
|
||||||
|
if vim.bo[event.buf].filetype == 'help' then
|
||||||
|
vim.cmd.only()
|
||||||
|
vim.keymap.set('n', 'q', vim.cmd.bdelete, { noremap = true, silent = true })
|
||||||
|
vim.bo.buflisted = false
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Allow basic deletion in qflist
|
||||||
|
vim.api.nvim_create_autocmd({ 'FileType' }, {
|
||||||
|
pattern = 'qf',
|
||||||
|
callback = function()
|
||||||
|
vim.keymap.set({ 'n', 'i' }, 'dd', function()
|
||||||
|
local ln = vim.fn.line('.')
|
||||||
|
local qf = vim.fn.getqflist()
|
||||||
|
if #qf == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
table.remove(qf, ln)
|
||||||
|
vim.fn.setqflist(qf, 'r')
|
||||||
|
vim.cmd('copen')
|
||||||
|
-- move cursor to stay at same index (or up one if at EOF)
|
||||||
|
vim.api.nvim_win_set_cursor(vim.fn.win_getid(), { ln < #qf and ln or math.max(ln - 1, 1), 0 })
|
||||||
|
end, { buffer = true })
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- resize splits if window got resized
|
||||||
|
vim.api.nvim_create_autocmd({ 'VimResized' }, {
|
||||||
|
group = vim.api.nvim_create_augroup('resize_splits', { clear = true }),
|
||||||
|
callback = function()
|
||||||
|
local current_tab = vim.fn.tabpagenr()
|
||||||
|
vim.cmd('tabdo wincmd =')
|
||||||
|
vim.cmd('tabnext ' .. current_tab)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Check if we need to reload the file when it changed
|
||||||
|
vim.api.nvim_create_autocmd({ 'FocusGained', 'TermClose', 'TermLeave' }, {
|
||||||
|
group = vim.api.nvim_create_augroup('check_reload', { clear = true }),
|
||||||
|
callback = function()
|
||||||
|
if vim.o.buftype ~= 'nofile' then
|
||||||
|
vim.cmd('checktime')
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
@ -1,14 +1,9 @@
|
||||||
vim.opt.autowrite = true
|
vim.opt.autowrite = true
|
||||||
|
|
||||||
vim.opt.backspace = 'indent,eol,start'
|
vim.opt.backspace = 'indent,eol,start'
|
||||||
vim.opt.confirm = true
|
vim.opt.confirm = true
|
||||||
vim.opt.completeopt = { 'menu', 'menuone', 'noselect' }
|
vim.opt.completeopt = { 'menu', 'menuone', 'noselect' }
|
||||||
vim.opt.cmdheight = 1
|
|
||||||
vim.opt.diffopt = 'internal,filler,closeoff,inline:char'
|
vim.opt.diffopt = 'internal,filler,closeoff,inline:char'
|
||||||
vim.opt.expandtab = true -- insert tabs as spaces
|
vim.opt.expandtab = true -- insert tabs as spaces
|
||||||
vim.o.foldenable = true
|
|
||||||
vim.o.foldmethod = 'expr' -- use tree-sitter for folding method
|
|
||||||
vim.o.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
|
|
||||||
vim.o.foldlevelstart = 99
|
vim.o.foldlevelstart = 99
|
||||||
vim.opt.inccommand = 'split' -- incremental live completion
|
vim.opt.inccommand = 'split' -- incremental live completion
|
||||||
vim.opt.list = true
|
vim.opt.list = true
|
||||||
|
|
@ -27,30 +22,6 @@ vim.opt.virtualedit = 'onemore'
|
||||||
vim.opt.winborder = 'single'
|
vim.opt.winborder = 'single'
|
||||||
vim.cmd('colorscheme iofq')
|
vim.cmd('colorscheme iofq')
|
||||||
|
|
||||||
-- Switch tab length on the fly
|
|
||||||
vim.keymap.set('n', '\\t', function()
|
|
||||||
vim.o.tabstop = vim.o.tabstop == 8 and 2 or 2 * vim.o.tabstop
|
|
||||||
end, { silent = true, desc = 'toggle tabstop' })
|
|
||||||
|
|
||||||
-- autocmd
|
|
||||||
----------------------------------------
|
|
||||||
local undopath = vim.fn.stdpath('data') .. 'undo'
|
|
||||||
vim.api.nvim_create_autocmd('VimEnter', {
|
|
||||||
command = 'silent !mkdir -p ' .. undopath,
|
|
||||||
group = vim.api.nvim_create_augroup('Init', {}),
|
|
||||||
})
|
|
||||||
-- open :h in buffers
|
|
||||||
vim.api.nvim_create_autocmd('BufWinEnter', {
|
|
||||||
pattern = '*',
|
|
||||||
callback = function(event)
|
|
||||||
if vim.bo[event.buf].filetype == 'help' then
|
|
||||||
vim.cmd.only()
|
|
||||||
vim.keymap.set('n', 'q', vim.cmd.bdelete, { noremap = true, silent = true })
|
|
||||||
vim.bo.buflisted = false
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Configure Neovim diagnostic messages
|
-- Configure Neovim diagnostic messages
|
||||||
vim.diagnostic.config {
|
vim.diagnostic.config {
|
||||||
virtual_text = true,
|
virtual_text = true,
|
||||||
|
|
@ -62,62 +33,3 @@ vim.diagnostic.config {
|
||||||
source = 'if_many',
|
source = 'if_many',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Allow basic deletion in qflist
|
|
||||||
vim.api.nvim_create_autocmd({ 'FileType' }, {
|
|
||||||
pattern = 'qf',
|
|
||||||
callback = function()
|
|
||||||
vim.keymap.set({ 'n', 'i' }, 'dd', function()
|
|
||||||
local ln = vim.fn.line('.')
|
|
||||||
local qf = vim.fn.getqflist()
|
|
||||||
if #qf == 0 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
table.remove(qf, ln)
|
|
||||||
vim.fn.setqflist(qf, 'r')
|
|
||||||
vim.cmd('copen')
|
|
||||||
-- move cursor to stay at same index (or up one if at EOF)
|
|
||||||
vim.api.nvim_win_set_cursor(vim.fn.win_getid(), { ln < #qf and ln or math.max(ln - 1, 1), 0 })
|
|
||||||
end, { buffer = true })
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
-- random keymaps
|
|
||||||
vim.keymap.set({ 'v', 'i' }, 'wq', '<esc>l', { noremap = true, silent = true })
|
|
||||||
vim.keymap.set({ 'v', 'n' }, 'q:', '<nop>')
|
|
||||||
vim.keymap.set('v', '<', '<gv')
|
|
||||||
vim.keymap.set('v', '>', '>gv')
|
|
||||||
vim.keymap.set('n', 'n', 'nzz', { noremap = true })
|
|
||||||
vim.keymap.set('n', 'N', 'Nzz', { noremap = true })
|
|
||||||
vim.keymap.set('n', '<C-u>', '<C-u>zz', { noremap = true })
|
|
||||||
vim.keymap.set('n', '<C-d>', '<C-d>zz', { noremap = true })
|
|
||||||
vim.keymap.set('v', '<A-j>', ":m '>+1<CR>gv=gv", { desc = 'move selection down' })
|
|
||||||
vim.keymap.set('v', '<A-k>', ":m '<-2<CR>gv=gv", { desc = 'move selection up' })
|
|
||||||
vim.keymap.set('n', 'gq', vim.cmd.bdelete, { noremap = true, silent = true, desc = 'close buffer' })
|
|
||||||
vim.keymap.set('n', 'gQ', function()
|
|
||||||
vim.cmd('bufdo bdelete')
|
|
||||||
end, { noremap = true, silent = true, desc = 'close all buffers' })
|
|
||||||
|
|
||||||
-- custom tabline
|
|
||||||
local dart = require('plugins.lib.dart')
|
|
||||||
dart.setup()
|
|
||||||
|
|
||||||
-- resize splits if window got resized
|
|
||||||
vim.api.nvim_create_autocmd({ 'VimResized' }, {
|
|
||||||
group = vim.api.nvim_create_augroup('resize_splits', { clear = true }),
|
|
||||||
callback = function()
|
|
||||||
local current_tab = vim.fn.tabpagenr()
|
|
||||||
vim.cmd('tabdo wincmd =')
|
|
||||||
vim.cmd('tabnext ' .. current_tab)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Check if we need to reload the file when it changed
|
|
||||||
vim.api.nvim_create_autocmd({ 'FocusGained', 'TermClose', 'TermLeave' }, {
|
|
||||||
group = vim.api.nvim_create_augroup('check_reload', { clear = true }),
|
|
||||||
callback = function()
|
|
||||||
if vim.o.buftype ~= 'nofile' then
|
|
||||||
vim.cmd('checktime')
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
|
||||||
18
nvim/lua/config/keymaps.lua
Normal file
18
nvim/lua/config/keymaps.lua
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
-- Switch tab length on the fly
|
||||||
|
vim.keymap.set('n', '\\t', function()
|
||||||
|
vim.o.tabstop = vim.o.tabstop == 8 and 2 or 2 * vim.o.tabstop
|
||||||
|
end, { silent = true, desc = 'toggle tabstop' })
|
||||||
|
vim.keymap.set({ 'v', 'i' }, 'wq', '<esc>l', { noremap = true, silent = true })
|
||||||
|
vim.keymap.set({ 'v', 'n' }, 'q:', '<nop>')
|
||||||
|
vim.keymap.set('v', '<', '<gv')
|
||||||
|
vim.keymap.set('v', '>', '>gv')
|
||||||
|
vim.keymap.set('n', 'n', 'nzz', { noremap = true })
|
||||||
|
vim.keymap.set('n', 'N', 'Nzz', { noremap = true })
|
||||||
|
vim.keymap.set('n', '<C-u>', '<C-u>zz', { noremap = true })
|
||||||
|
vim.keymap.set('n', '<C-d>', '<C-d>zz', { noremap = true })
|
||||||
|
vim.keymap.set('v', '<A-j>', ":m '>+1<CR>gv=gv", { desc = 'move selection down' })
|
||||||
|
vim.keymap.set('v', '<A-k>', ":m '<-2<CR>gv=gv", { desc = 'move selection up' })
|
||||||
|
vim.keymap.set('n', 'gq', vim.cmd.bdelete, { noremap = true, silent = true, desc = 'close buffer' })
|
||||||
|
vim.keymap.set('n', 'gQ', function()
|
||||||
|
vim.cmd('bufdo bdelete')
|
||||||
|
end, { noremap = true, silent = true, desc = 'close all buffers' })
|
||||||
|
|
@ -1,361 +0,0 @@
|
||||||
local Dart = {}
|
|
||||||
local M = {}
|
|
||||||
|
|
||||||
-- table of {bufnr = int, mark = string}
|
|
||||||
M.state = {}
|
|
||||||
|
|
||||||
Dart.setup = function(config)
|
|
||||||
config = M.setup_config(config)
|
|
||||||
M.apply_config(config)
|
|
||||||
M.create_autocommands()
|
|
||||||
M.create_default_hl()
|
|
||||||
|
|
||||||
_G.Dart = Dart
|
|
||||||
end
|
|
||||||
|
|
||||||
M.config = {
|
|
||||||
-- list of characters to use to mark 'pinned' buffers
|
|
||||||
-- the characters will be chosen for new pins in order
|
|
||||||
marklist = { 'a', 's', 'd', 'f', 'q', 'w', 'e', 'r' },
|
|
||||||
-- list of characters to use to mark recent buffers
|
|
||||||
-- we track the last #buflist opened buffers to display on the left side of the tabline
|
|
||||||
buflist = { 'z', 'x', 'c' },
|
|
||||||
|
|
||||||
mappings = {
|
|
||||||
mark = '<leader>mm',
|
|
||||||
jump = '<leader>m',
|
|
||||||
pick = '<leader>mp',
|
|
||||||
next = '<S-l>',
|
|
||||||
prev = '<S-h>',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
M.setup_config = function(config)
|
|
||||||
M.config = vim.tbl_deep_extend('force', M.config, config or {})
|
|
||||||
return M.config
|
|
||||||
end
|
|
||||||
|
|
||||||
M.apply_config = function(config)
|
|
||||||
-- built list of all marks (buf + pin) to sort tabline by
|
|
||||||
M.order = {}
|
|
||||||
for i, key in ipairs(vim.list_extend(vim.deepcopy(config.buflist), config.marklist)) do
|
|
||||||
M.order[key] = i
|
|
||||||
end
|
|
||||||
|
|
||||||
vim.opt.showtabline = 2
|
|
||||||
vim.opt.tabline = '%!v:lua.Dart.gen_tabline()'
|
|
||||||
|
|
||||||
-- setup keymaps
|
|
||||||
local function map(mode, lhs, rhs, opts)
|
|
||||||
if lhs == '' then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
opts = vim.tbl_deep_extend('force', { silent = true }, opts or {})
|
|
||||||
vim.keymap.set(mode, lhs, rhs, opts)
|
|
||||||
end
|
|
||||||
|
|
||||||
map('n', config.mappings.mark, Dart.mark, { desc = 'Dart: mark current buffer' })
|
|
||||||
map('n', config.mappings.jump, function()
|
|
||||||
Dart.jump(vim.fn.getcharstr())
|
|
||||||
end, { desc = 'Dart: jump to buffer' })
|
|
||||||
map('n', config.mappings.pick, Dart.pick, { desc = 'Dart: pick buffer' })
|
|
||||||
map('n', config.mappings.next, Dart.next, { desc = 'Dart: next buffer' })
|
|
||||||
map('n', config.mappings.prev, Dart.prev, { desc = 'Dart: prev buffer' })
|
|
||||||
end
|
|
||||||
|
|
||||||
M.create_autocommands = function()
|
|
||||||
local group = vim.api.nvim_create_augroup('Dart', {})
|
|
||||||
|
|
||||||
-- cleanup deleted buffers
|
|
||||||
vim.api.nvim_create_autocmd('BufDelete', {
|
|
||||||
group = group,
|
|
||||||
callback = function(args)
|
|
||||||
M.del_by_bufnr(args.buf)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
-- track last n opened buffers
|
|
||||||
vim.api.nvim_create_autocmd({ 'BufWinEnter', 'BufAdd' }, {
|
|
||||||
group = group,
|
|
||||||
callback = function(args)
|
|
||||||
M.shift_buflist(args.buf)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Clickable tabs
|
|
||||||
vim.api.nvim_exec2(
|
|
||||||
[[function! SwitchBuffer(buf_id, clicks, button, mod)
|
|
||||||
execute 'buffer' a:buf_id
|
|
||||||
endfunction]],
|
|
||||||
{}
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Use Mini Tabline for default highlights, since it's well supported by many colorschemes
|
|
||||||
-- override the foreground for labels to be more visible
|
|
||||||
M.create_default_hl = function()
|
|
||||||
local set_default_hl = function(name, opts)
|
|
||||||
opts.default = true
|
|
||||||
vim.api.nvim_set_hl(0, name, opts)
|
|
||||||
end
|
|
||||||
|
|
||||||
local override_label = function(hl, link)
|
|
||||||
local prev = vim.api.nvim_get_hl(0, { name = link })
|
|
||||||
vim.api.nvim_set_hl(0, hl, { bg = prev.bg, fg = 'orange', bold = true })
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Current selection
|
|
||||||
set_default_hl('DartCurrent', { link = 'MiniTablineCurrent' })
|
|
||||||
override_label('DartCurrentLabel', 'MiniTablineCurrent')
|
|
||||||
|
|
||||||
-- Current selection if modified
|
|
||||||
set_default_hl('DartCurrentModified', { link = 'MiniTablineModifiedCurrent' })
|
|
||||||
override_label('DartCurrentLabelModified', 'MiniTablineModifiedCurrent')
|
|
||||||
|
|
||||||
-- Visible but not selected
|
|
||||||
set_default_hl('DartVisible', { link = 'MiniTablineVisible' })
|
|
||||||
override_label('DartVisibleLabel', 'MiniTablineVisible')
|
|
||||||
|
|
||||||
-- Visible and modified but not selected
|
|
||||||
set_default_hl('DartVisibleModified', { link = 'MiniTablineModifiedVisible' })
|
|
||||||
override_label('DartVisibleLabelModified', 'MiniTablineModifiedVisible')
|
|
||||||
|
|
||||||
-- Fill
|
|
||||||
set_default_hl('DartFill', { link = 'MiniTablineFill' })
|
|
||||||
end
|
|
||||||
|
|
||||||
M.get_state_by_field = function(field, value)
|
|
||||||
for _, m in ipairs(M.state) do
|
|
||||||
if m[field] == value then
|
|
||||||
return m
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
M.state_from_bufnr = function(bufnr)
|
|
||||||
return M.get_state_by_field('bufnr', bufnr)
|
|
||||||
end
|
|
||||||
|
|
||||||
M.state_from_mark = function(mark)
|
|
||||||
return M.get_state_by_field('mark', mark)
|
|
||||||
end
|
|
||||||
|
|
||||||
M.del_by_bufnr = function(bufnr)
|
|
||||||
for i, m in ipairs(M.state) do
|
|
||||||
if m.bufnr == bufnr then
|
|
||||||
table.remove(M.state, i)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
M.should_show = function(bufnr)
|
|
||||||
return vim.api.nvim_buf_is_valid(bufnr) -- buffer exists and is loaded
|
|
||||||
and vim.api.nvim_buf_is_loaded(bufnr)
|
|
||||||
and vim.bo[bufnr].buflisted -- don't show hidden buffers
|
|
||||||
and vim.bo[bufnr].buftype == '' -- don't show pickers, prompts, etc.
|
|
||||||
and vim.api.nvim_buf_get_name(bufnr) ~= '' -- don't show unnamed files
|
|
||||||
end
|
|
||||||
|
|
||||||
M.next_unused_mark = function()
|
|
||||||
for _, m in ipairs(M.config.marklist) do
|
|
||||||
if not M.state_from_mark(m) then
|
|
||||||
return m
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return 'Z'
|
|
||||||
end
|
|
||||||
|
|
||||||
M.shift_buflist = function(bufnr)
|
|
||||||
if M.state_from_bufnr(bufnr) or not M.should_show(bufnr) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local buflist = M.config.buflist
|
|
||||||
|
|
||||||
-- if there's a free buflist mark, set it
|
|
||||||
for _, mark in ipairs(buflist) do
|
|
||||||
if not M.state_from_mark(mark) then
|
|
||||||
M.mark(bufnr, mark)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- if not, shift buflist right and set new buffer to element 1
|
|
||||||
for i = #buflist, 2, -1 do
|
|
||||||
local mark = M.state_from_mark(buflist[i])
|
|
||||||
local next = M.state_from_mark(buflist[i - 1])
|
|
||||||
mark.bufnr = next.bufnr
|
|
||||||
end
|
|
||||||
M.state_from_mark(buflist[1]).bufnr = bufnr
|
|
||||||
end
|
|
||||||
|
|
||||||
-- param direction -1 for prev, 1 for next
|
|
||||||
M.cycle_tabline = function(direction)
|
|
||||||
local cur = vim.api.nvim_get_current_buf()
|
|
||||||
for i, m in ipairs(M.state) do
|
|
||||||
if cur == m.bufnr then
|
|
||||||
local next = ((i + direction - 1) % #M.state) + 1 -- wrap around list
|
|
||||||
if M.state[next] then
|
|
||||||
vim.api.nvim_set_current_buf(M.state[next].bufnr)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
M.gen_tabpage = function()
|
|
||||||
local n_tabpages = vim.fn.tabpagenr('$')
|
|
||||||
if n_tabpages == 1 then
|
|
||||||
return ''
|
|
||||||
end
|
|
||||||
return string.format('%%= Tab %d/%d ', vim.fn.tabpagenr(), n_tabpages)
|
|
||||||
end
|
|
||||||
|
|
||||||
M.gen_tabline_item = function(item)
|
|
||||||
local bufnr = item.bufnr
|
|
||||||
local filename = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(bufnr), ':t')
|
|
||||||
local is_current = bufnr == vim.api.nvim_get_current_buf()
|
|
||||||
local modified = vim.bo[bufnr].modified and 'Modified' or ''
|
|
||||||
|
|
||||||
local hl_label = is_current and 'DartCurrentLabel' or 'DartVisibleLabel'
|
|
||||||
local label = item.mark ~= '' and item.mark .. ' ' or ''
|
|
||||||
local hl = is_current and 'DartCurrent' or 'DartVisible'
|
|
||||||
local content = filename ~= '' and filename or '*'
|
|
||||||
|
|
||||||
return {
|
|
||||||
bufnr = bufnr,
|
|
||||||
hl_label = hl_label .. modified,
|
|
||||||
label = label,
|
|
||||||
hl = hl .. modified,
|
|
||||||
content = content,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
M.format_tabline_item = function(item)
|
|
||||||
local click = string.format('%%%s@SwitchBuffer@', item.bufnr)
|
|
||||||
return string.format('%%#%s#%s %s%%#%s#%s %%X', item.hl_label, click, item.label, item.hl, item.content)
|
|
||||||
end
|
|
||||||
|
|
||||||
M.mark = function(bufnr, mark)
|
|
||||||
if not bufnr then
|
|
||||||
bufnr = vim.api.nvim_get_current_buf()
|
|
||||||
end
|
|
||||||
if not M.should_show(bufnr) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if not mark then
|
|
||||||
mark = M.next_unused_mark()
|
|
||||||
end
|
|
||||||
|
|
||||||
local exists = M.state_from_bufnr(bufnr)
|
|
||||||
if not exists then
|
|
||||||
table.insert(M.state, { bufnr = bufnr, mark = mark })
|
|
||||||
elseif vim.tbl_contains(M.config.buflist, exists.mark) then
|
|
||||||
exists.mark = mark -- allow for re-marking buffers in the buflist
|
|
||||||
else
|
|
||||||
return -- skip sort if no change
|
|
||||||
end
|
|
||||||
table.sort(M.state, function(a, b)
|
|
||||||
return (M.order[a.mark] or 998) < (M.order[b.mark] or 999)
|
|
||||||
end)
|
|
||||||
vim.cmd.redrawtabline()
|
|
||||||
end
|
|
||||||
|
|
||||||
Dart.state = M.state
|
|
||||||
Dart.mark = M.mark
|
|
||||||
|
|
||||||
Dart.jump = function(mark)
|
|
||||||
local m = M.state_from_mark(mark)
|
|
||||||
if m and m.bufnr then
|
|
||||||
vim.api.nvim_set_current_buf(m.bufnr)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Dart.pick = function()
|
|
||||||
local prompt = { 'Jump to buffer:' }
|
|
||||||
for _, mark in ipairs(M.state) do
|
|
||||||
local name = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(mark.bufnr), ':t')
|
|
||||||
table.insert(prompt, string.format(' %s → %s', mark.mark, name))
|
|
||||||
end
|
|
||||||
|
|
||||||
local selected = vim.fn.input(table.concat(prompt, '\n') .. '\n> ')
|
|
||||||
Dart.jump(selected)
|
|
||||||
end
|
|
||||||
|
|
||||||
Dart.next = function()
|
|
||||||
M.cycle_tabline(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
Dart.prev = function()
|
|
||||||
M.cycle_tabline(-1)
|
|
||||||
end
|
|
||||||
|
|
||||||
Dart.gen_tabline = function()
|
|
||||||
local items = {}
|
|
||||||
local center = 1
|
|
||||||
local cur = vim.api.nvim_get_current_buf()
|
|
||||||
local columns = vim.o.columns
|
|
||||||
|
|
||||||
for i, m in ipairs(M.state) do
|
|
||||||
if M.should_show(m.bufnr) then
|
|
||||||
table.insert(items, M.gen_tabline_item(m))
|
|
||||||
if m.bufnr == cur then
|
|
||||||
center = i
|
|
||||||
end
|
|
||||||
else
|
|
||||||
M.del_by_bufnr(m.bufnr)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function width(tabline)
|
|
||||||
return vim.api.nvim_strwidth(table.concat(
|
|
||||||
vim.tbl_map(function(m)
|
|
||||||
return string.format(' %s %s ', m.label, m.content)
|
|
||||||
end, tabline),
|
|
||||||
''
|
|
||||||
)) + 3 -- save room for trunc
|
|
||||||
end
|
|
||||||
|
|
||||||
local result = { items[center] }
|
|
||||||
local left = center - 1
|
|
||||||
local right = center + 1
|
|
||||||
local trunc_left = false
|
|
||||||
local trunc_right = false
|
|
||||||
|
|
||||||
while left >= 1 or right <= #items do
|
|
||||||
local added = false
|
|
||||||
|
|
||||||
if left >= 1 then
|
|
||||||
table.insert(result, 1, items[left])
|
|
||||||
if width(result) >= columns then
|
|
||||||
table.remove(result, 1)
|
|
||||||
trunc_left = true
|
|
||||||
else
|
|
||||||
left = left - 1
|
|
||||||
added = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if right <= #items then
|
|
||||||
table.insert(result, items[right])
|
|
||||||
if width(result) >= columns then
|
|
||||||
table.remove(result)
|
|
||||||
trunc_right = true
|
|
||||||
else
|
|
||||||
right = right + 1
|
|
||||||
added = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if not added then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return (trunc_left and '%#DartVisibleLabel# < ' or '')
|
|
||||||
.. table.concat(vim.tbl_map(M.format_tabline_item, result), '')
|
|
||||||
.. (trunc_right and '%#DartVisibleLabel# > ' or '')
|
|
||||||
.. '%X%#DartFill#'
|
|
||||||
.. M.gen_tabpage()
|
|
||||||
end
|
|
||||||
|
|
||||||
return Dart
|
|
||||||
|
|
@ -9,18 +9,18 @@ M.get_id = function()
|
||||||
end
|
end
|
||||||
|
|
||||||
local result = vim
|
local result = vim
|
||||||
.system({
|
.system({
|
||||||
'jj',
|
'jj',
|
||||||
'log',
|
'log',
|
||||||
'-r',
|
'-r',
|
||||||
'latest(heads(::@ & bookmarks()))',
|
'latest(heads(::@ & bookmarks()))',
|
||||||
'--template',
|
'--template',
|
||||||
'bookmarks',
|
'bookmarks',
|
||||||
'--no-pager',
|
'--no-pager',
|
||||||
'--no-graph',
|
'--no-graph',
|
||||||
})
|
})
|
||||||
:wait()
|
:wait()
|
||||||
local branch = vim.trim(string.gsub(result.stdout, '[\n*]', '')) -- trim newlines and unpushed indicator
|
local branch = vim.trim(string.gsub(result.stdout, '[\n*]', '')) -- trim newlines and unpushed indicator
|
||||||
local root = vim.trim(string.gsub(jj_root.stdout, '\n', ''))
|
local root = vim.trim(string.gsub(jj_root.stdout, '\n', ''))
|
||||||
local id = string.gsub(string.format('jj:%s:%s', root, branch), '[./]', '-') -- slugify
|
local id = string.gsub(string.format('jj:%s:%s', root, branch), '[./]', '-') -- slugify
|
||||||
return id
|
return id
|
||||||
|
|
@ -49,12 +49,10 @@ M.load = function()
|
||||||
if c == 'Yes' then
|
if c == 'Yes' then
|
||||||
-- load session (buffers, etc) as well as shada (marks)
|
-- load session (buffers, etc) as well as shada (marks)
|
||||||
sessions.read(id)
|
sessions.read(id)
|
||||||
vim.cmd('rshada')
|
|
||||||
vim.notify('loaded jj session: ' .. id)
|
vim.notify('loaded jj session: ' .. id)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
else
|
else
|
||||||
vim.cmd('wshada') -- create session if it did not exist
|
|
||||||
sessions.write(id)
|
sessions.write(id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,4 @@
|
||||||
M = {}
|
M = {}
|
||||||
M.marks = function()
|
|
||||||
Snacks.picker.marks {
|
|
||||||
['local'] = false,
|
|
||||||
on_show = function()
|
|
||||||
vim.cmd.delmarks { args = { '0-9' } }
|
|
||||||
vim.cmd.delmarks { args = { '"' } }
|
|
||||||
end,
|
|
||||||
actions = {
|
|
||||||
markdel = function(picker)
|
|
||||||
for _, item in ipairs(picker:selected { fallback = true }) do
|
|
||||||
vim.cmd.delmarks { args = { item.label } }
|
|
||||||
end
|
|
||||||
vim.cmd('wshada')
|
|
||||||
picker.list:set_selected()
|
|
||||||
picker.list:set_target()
|
|
||||||
picker:find()
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
win = {
|
|
||||||
input = {
|
|
||||||
keys = { ['<c-x>'] = { 'markdel', mode = { 'n', 'i' } } },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
end
|
|
||||||
M.diagnostics = function(filter)
|
M.diagnostics = function(filter)
|
||||||
Snacks.picker.diagnostics {
|
Snacks.picker.diagnostics {
|
||||||
filter = filter,
|
filter = filter,
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,18 @@ return {
|
||||||
require('mini.sessions').setup {
|
require('mini.sessions').setup {
|
||||||
file = '',
|
file = '',
|
||||||
autowrite = true,
|
autowrite = true,
|
||||||
|
hooks = {
|
||||||
|
pre = {
|
||||||
|
read = function(session) -- load Dart state *before* buffers are loaded
|
||||||
|
vim.cmd('rshada')
|
||||||
|
Dart.read_session(session['name'])
|
||||||
|
end,
|
||||||
|
write = function(session)
|
||||||
|
vim.cmd('wshada')
|
||||||
|
Dart.write_session(session['name'])
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
verbose = {
|
verbose = {
|
||||||
write = false,
|
write = false,
|
||||||
},
|
},
|
||||||
|
|
@ -126,12 +138,11 @@ return {
|
||||||
markdown = true,
|
markdown = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
local jj = require('plugins.lib.minidiff_jj')
|
|
||||||
local diff = require('mini.diff')
|
local diff = require('mini.diff')
|
||||||
diff.setup {
|
diff.setup {
|
||||||
options = { wrap_goto = true },
|
options = { wrap_goto = true },
|
||||||
source = {
|
source = {
|
||||||
jj.gen_source(),
|
require('plugins.lib.minidiff_jj').gen_source(),
|
||||||
diff.gen_source.git(),
|
diff.gen_source.git(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -185,7 +196,9 @@ return {
|
||||||
vim.keymap.set('n', '`', function()
|
vim.keymap.set('n', '`', function()
|
||||||
local cur_entry_path = MiniFiles.get_fs_entry().path
|
local cur_entry_path = MiniFiles.get_fs_entry().path
|
||||||
local cur_directory = vim.fs.dirname(cur_entry_path)
|
local cur_directory = vim.fs.dirname(cur_entry_path)
|
||||||
vim.fn.chdir(cur_directory)
|
if cur_directory ~= '' then
|
||||||
|
vim.fn.chdir(cur_directory)
|
||||||
|
end
|
||||||
end, { buffer = args.data.buf_id })
|
end, { buffer = args.data.buf_id })
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,9 @@
|
||||||
return {
|
return {
|
||||||
|
{
|
||||||
|
'iofq/dart.nvim',
|
||||||
|
event = 'VeryLazy',
|
||||||
|
config = true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
'jinh0/eyeliner.nvim',
|
'jinh0/eyeliner.nvim',
|
||||||
event = 'VeryLazy',
|
event = 'VeryLazy',
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ return {
|
||||||
matcher = {
|
matcher = {
|
||||||
frecency = true,
|
frecency = true,
|
||||||
history_bonus = true,
|
history_bonus = true,
|
||||||
|
cwd_bonus = true,
|
||||||
},
|
},
|
||||||
layout = 'ivy_split',
|
layout = 'ivy_split',
|
||||||
sources = {
|
sources = {
|
||||||
|
|
@ -109,13 +110,6 @@ return {
|
||||||
end,
|
end,
|
||||||
desc = 'snacks explorer',
|
desc = 'snacks explorer',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
'<leader>fg',
|
|
||||||
function()
|
|
||||||
Snacks.picker.git_files()
|
|
||||||
end,
|
|
||||||
desc = 'Fuzzy find git files',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
'<leader>ff',
|
'<leader>ff',
|
||||||
function()
|
function()
|
||||||
|
|
@ -186,13 +180,6 @@ return {
|
||||||
end,
|
end,
|
||||||
desc = 'pick treesitter nodes',
|
desc = 'pick treesitter nodes',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
'<leader>fm',
|
|
||||||
function()
|
|
||||||
require('plugins.lib.snacks').marks()
|
|
||||||
end,
|
|
||||||
desc = 'pick global marks',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
'<leader>jf',
|
'<leader>jf',
|
||||||
function()
|
function()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue