Compare commits
3
Commits
f3f3d6a94a
...
bc408c412b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc408c412b | ||
|
|
4264a4c05c | ||
|
|
ac8adf9554 |
@@ -11,9 +11,9 @@ set -gx GOOGLE_DEFAULT_CLIENT_ID "no"
|
|||||||
set -gx GOOGLE_DEFAULT_CLIENT_SECRET "no"
|
set -gx GOOGLE_DEFAULT_CLIENT_SECRET "no"
|
||||||
|
|
||||||
# Core settings
|
# Core settings
|
||||||
set -gx EDITOR "vim"
|
set -gx EDITOR "vi"
|
||||||
set -gx VISUAL "vim"
|
set -gx VISUAL "vi"
|
||||||
set -gx MANPAGER "vim +Man!"
|
set -gx MANPAGER "vi +Man!"
|
||||||
set -gx BROWSER "firefox"
|
set -gx BROWSER "firefox"
|
||||||
set -gx COLORTERM "truecolor"
|
set -gx COLORTERM "truecolor"
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ set -gx FZF_DEFAULT_OPTS "
|
|||||||
--color=fg:#ffffff,header:#f38ba8,info:#cba6ac,pointer:#f5e0dc
|
--color=fg:#ffffff,header:#f38ba8,info:#cba6ac,pointer:#f5e0dc
|
||||||
--color=marker:#f5e0dc,fg+:#cdd6f4,prompt:#cba6ac,hl+:#f38ba8"
|
--color=marker:#f5e0dc,fg+:#cdd6f4,prompt:#cba6ac,hl+:#f38ba8"
|
||||||
|
|
||||||
set -gx FZF_DEFAULT_COMMAND "fdfind --exclude={.git,.cache,.xmake,.zig-cache,build,tmp,node_modules,elpa} --type f -H"
|
set -gx FZF_DEFAULT_COMMAND "fd --exclude={.git,.cache,.xmake,.zig-cache,build,tmp,node_modules,elpa} --type f -H"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# PATH CONFIGURATION
|
# PATH CONFIGURATION
|
||||||
@@ -82,6 +82,7 @@ alias bat 'bat --theme="ansi" --paging=never'
|
|||||||
alias :q 'exit'
|
alias :q 'exit'
|
||||||
alias files 'thunar .'
|
alias files 'thunar .'
|
||||||
alias fetch 'pfetch'
|
alias fetch 'pfetch'
|
||||||
|
alias vi 'vis'
|
||||||
|
|
||||||
# Custom shortcuts
|
# Custom shortcuts
|
||||||
alias reload 'source ~/.config/fish/config.fish'
|
alias reload 'source ~/.config/fish/config.fish'
|
||||||
|
|||||||
@@ -1,86 +0,0 @@
|
|||||||
" ============================================================================
|
|
||||||
" Vi Configuration
|
|
||||||
" ============================================================================
|
|
||||||
" General
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
set nocompatible
|
|
||||||
set encoding=utf-8
|
|
||||||
set hidden
|
|
||||||
set history=1000
|
|
||||||
set clipboard=unnamedplus
|
|
||||||
set splitright
|
|
||||||
set splitbelow
|
|
||||||
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
" UI
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
set number
|
|
||||||
set relativenumber
|
|
||||||
set wildmenu
|
|
||||||
set showcmd
|
|
||||||
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
" Transparent UI
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
augroup VimTransparent
|
|
||||||
autocmd!
|
|
||||||
autocmd ColorScheme * highlight Normal ctermbg=NONE guibg=NONE
|
|
||||||
\ | highlight NonText ctermbg=NONE guibg=NONE
|
|
||||||
\ | highlight LineNr ctermbg=NONE guibg=NONE
|
|
||||||
\ | highlight SignColumn ctermbg=NONE guibg=NONE
|
|
||||||
\ | highlight EndOfBuffer ctermbg=NONE guibg=NONE
|
|
||||||
augroup END
|
|
||||||
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
" Status Line
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
set laststatus=2
|
|
||||||
highlight EviStatus cterm=NONE ctermfg=White ctermbg=236
|
|
||||||
set statusline=%#EviStatus#%f\ %m%r\ %=%{&filetype}\ \ %l:%c\ %p%%
|
|
||||||
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
" Editing
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
set tabstop=4
|
|
||||||
set shiftwidth=4
|
|
||||||
set expandtab
|
|
||||||
set smartindent
|
|
||||||
set nowrap
|
|
||||||
set incsearch
|
|
||||||
set hlsearch
|
|
||||||
set ignorecase
|
|
||||||
set smartcase
|
|
||||||
set completeopt=menu,menuone,noselect
|
|
||||||
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
" File Types
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
syntax on
|
|
||||||
filetype plugin indent on
|
|
||||||
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
" Search
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
nnoremap <Esc><Esc> :nohlsearch<CR>
|
|
||||||
nnoremap n nzzzv
|
|
||||||
nnoremap N Nzzzv
|
|
||||||
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
" Window Navigation
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
nnoremap <C-h> <C-w>h
|
|
||||||
nnoremap <C-j> <C-w>j
|
|
||||||
nnoremap <C-k> <C-w>k
|
|
||||||
nnoremap <C-l> <C-w>l
|
|
||||||
nnoremap <C-x> <C-w>q
|
|
||||||
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
" Netrw / File Tree
|
|
||||||
" ----------------------------------------------------------------------------
|
|
||||||
let g:netrw_banner = 0
|
|
||||||
let g:netrw_liststyle = 3
|
|
||||||
let g:netrw_browse_split = 0
|
|
||||||
let g:netrw_altv = 1
|
|
||||||
let g:netrw_winsize = 33
|
|
||||||
let g:netrw_keepdir = 0
|
|
||||||
nnoremap <C-e> :Lexplore<CR>
|
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
-- ~/.config/vis/build.lua
|
||||||
|
-- Runs the nearest build.sh, shows the output, and can jump to the first
|
||||||
|
-- Odin error. Loaded from visrc.lua.
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
-- args: list of flags passed through to build.sh, e.g. { 'run' }
|
||||||
|
function M.run(args)
|
||||||
|
-- find the nearest build.sh, searching upward from vis's working dir
|
||||||
|
local p = io.popen('pwd')
|
||||||
|
local dir = p and p:read('*l')
|
||||||
|
if p then p:close() end
|
||||||
|
while dir and dir ~= '' do
|
||||||
|
local f = io.open(dir .. '/build.sh', 'r')
|
||||||
|
if f then
|
||||||
|
f:close()
|
||||||
|
break
|
||||||
|
end
|
||||||
|
dir = dir:match('^(.*)/[^/]*$')
|
||||||
|
end
|
||||||
|
if not dir or dir == '' then
|
||||||
|
vis:info('No build.sh found in this directory or any parent')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- save the current buffer so the build sees your latest changes
|
||||||
|
local win = vis.win
|
||||||
|
if win and win.file and win.file.modified and win.file.path then
|
||||||
|
vis:command('w')
|
||||||
|
end
|
||||||
|
|
||||||
|
-- shell-quote each flag and the directory
|
||||||
|
local quoted = {}
|
||||||
|
for _, a in ipairs(args) do
|
||||||
|
table.insert(quoted, "'" .. a:gsub("'", "'\\''") .. "'")
|
||||||
|
end
|
||||||
|
local argstr = table.concat(quoted, ' ')
|
||||||
|
local qdir = "'" .. dir:gsub("'", "'\\''") .. "'"
|
||||||
|
local display = ('./build.sh ' .. table.concat(args, ' ')):gsub('%s+$', '')
|
||||||
|
local qdisplay = "'" .. display:gsub("'", "'\\''") .. "'"
|
||||||
|
|
||||||
|
local out_file = os.tmpname()
|
||||||
|
local status_file = os.tmpname()
|
||||||
|
local answer_file = os.tmpname()
|
||||||
|
|
||||||
|
local script = table.concat({
|
||||||
|
'saved=$(stty -g)',
|
||||||
|
'stty sane',
|
||||||
|
'cd ' .. qdir .. ' || exit 1',
|
||||||
|
'printf "\\n\\033[1m$ %s\\033[0m (in %s)\\n\\n" ' .. qdisplay .. ' ' .. qdir,
|
||||||
|
'{ if [ -x ./build.sh ]; then ./build.sh ' .. argstr
|
||||||
|
.. '; else bash ./build.sh ' .. argstr .. '; fi; echo $? > \''
|
||||||
|
.. status_file .. "'; } 2>&1 | tee '" .. out_file .. "'",
|
||||||
|
"st=$(cat '" .. status_file .. "')",
|
||||||
|
'if [ "$st" = 0 ]; then',
|
||||||
|
' printf "\\n\\033[32m[build ok]\\033[0m enter: back to vis "',
|
||||||
|
'else',
|
||||||
|
' printf "\\n\\033[31m[build failed: exit %s]\\033[0m '
|
||||||
|
.. 'enter: back to vis | e + enter: jump to first error " "$st"',
|
||||||
|
'fi',
|
||||||
|
'read -r ans',
|
||||||
|
"printf '%s' \"$ans\" > '" .. answer_file .. "'",
|
||||||
|
'stty "$saved"',
|
||||||
|
}, '\n')
|
||||||
|
|
||||||
|
-- leave the alternate screen so the build output lands in your normal
|
||||||
|
-- terminal scrollback, run it, then come back to vis
|
||||||
|
local tty = io.open('/dev/tty', 'w')
|
||||||
|
if tty then tty:write('\27[?1049l') tty:close() end
|
||||||
|
|
||||||
|
os.execute('{\n' .. script .. '\n} </dev/tty >/dev/tty 2>&1')
|
||||||
|
|
||||||
|
tty = io.open('/dev/tty', 'w')
|
||||||
|
if tty then tty:write('\27[?1049h') tty:close() end
|
||||||
|
vis:redraw()
|
||||||
|
|
||||||
|
-- read back exit status and the key you answered with
|
||||||
|
local f = io.open(status_file, 'r')
|
||||||
|
local status = f and f:read('*l')
|
||||||
|
if f then f:close() end
|
||||||
|
f = io.open(answer_file, 'r')
|
||||||
|
local answer = f and f:read('*l')
|
||||||
|
if f then f:close() end
|
||||||
|
|
||||||
|
-- first Odin error: `file.odin(12:5)` (default) or `file.odin:12:5` (unix)
|
||||||
|
local path, line, col
|
||||||
|
f = io.open(out_file, 'r')
|
||||||
|
if f then
|
||||||
|
for l in f:lines() do
|
||||||
|
path, line, col = l:match('^%s*(.-%.odin)%((%d+):(%d+)%)')
|
||||||
|
if not path then
|
||||||
|
path, line, col = l:match('^%s*(.-%.odin):(%d+):(%d+)')
|
||||||
|
end
|
||||||
|
if path then break end
|
||||||
|
end
|
||||||
|
f:close()
|
||||||
|
end
|
||||||
|
if path and path:sub(1, 1) ~= '/' then path = dir .. '/' .. path end
|
||||||
|
|
||||||
|
os.remove(out_file)
|
||||||
|
os.remove(status_file)
|
||||||
|
os.remove(answer_file)
|
||||||
|
|
||||||
|
if status == '0' then
|
||||||
|
vis:info('build ok: ' .. display)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if not path then
|
||||||
|
vis:info('build failed: exit ' .. (status or '?'))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if answer ~= 'e' then
|
||||||
|
vis:info(string.format('build failed: first error at %s:%s', path, line))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- jump to the error: open the file unless it's already the current one
|
||||||
|
local current = vis.win and vis.win.file and vis.win.file.path
|
||||||
|
if current ~= path then
|
||||||
|
if vis.win.file.modified then
|
||||||
|
vis:info('Buffer has unsaved changes — :w first (or use :e! manually)')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
vis:command(string.format("e '%s'", path))
|
||||||
|
end
|
||||||
|
vis.win.selection:to(tonumber(line), tonumber(col))
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@@ -0,0 +1,230 @@
|
|||||||
|
-- ~/.config/vis/fzf.lua
|
||||||
|
-- Pickers: fuzzy file finder, live ripgrep, terminal file manager.
|
||||||
|
-- Loaded from visrc.lua. Each function is self-contained on purpose.
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
-- height of the drop-down fzf panel at the top ('100%' = full screen)
|
||||||
|
M.height = '50%'
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
-- files: fuzzy-find a file, or create one from the query
|
||||||
|
-- enter open the highlighted file (or create the query if nothing matches)
|
||||||
|
-- ctrl-n new file named after the query, e.g. src/util/new.odin
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
function M.files()
|
||||||
|
-- file list: fd, fdfind (Debian/Ubuntu), or plain find
|
||||||
|
local list = "find . -type f -not -path '*/.git/*' | sed 's|^\\./||'"
|
||||||
|
for _, name in ipairs({ 'fd', 'fdfind' }) do
|
||||||
|
local ok = os.execute('command -v ' .. name .. ' >/dev/null 2>&1')
|
||||||
|
if ok == true or ok == 0 then
|
||||||
|
list = name .. ' --type f --hidden --exclude .git'
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- preview: bat, batcat (Debian/Ubuntu), or head
|
||||||
|
local preview = 'head -n 500 {}'
|
||||||
|
for _, name in ipairs({ 'bat', 'batcat' }) do
|
||||||
|
local ok = os.execute('command -v ' .. name .. ' >/dev/null 2>&1')
|
||||||
|
if ok == true or ok == 0 then
|
||||||
|
preview = name .. ' --color=always --style=numbers --line-range=:500 {}'
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local cmd = list .. ' | fzf'
|
||||||
|
.. ' --height=' .. M.height .. ' --layout=reverse --border'
|
||||||
|
.. " --prompt 'files> '"
|
||||||
|
.. ' --print-query --expect=ctrl-n' -- line 1: query, line 2: key
|
||||||
|
.. " --header 'enter: open · ctrl-n: new file from query'"
|
||||||
|
.. " --preview '" .. preview .. "'"
|
||||||
|
.. " --preview-window 'right:60%:border-left'"
|
||||||
|
.. " --bind 'ctrl-/:toggle-preview'"
|
||||||
|
.. " --bind 'shift-up:preview-up,shift-down:preview-down'"
|
||||||
|
|
||||||
|
-- fzf's --height mode draws from the cursor down: start at the top-left
|
||||||
|
local tty = io.open('/dev/tty', 'w')
|
||||||
|
if tty then tty:write('\27[H') tty:close() end
|
||||||
|
|
||||||
|
local handle = io.popen(cmd)
|
||||||
|
if not handle then
|
||||||
|
vis:info('fzf: failed to start')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local out = {}
|
||||||
|
for line in handle:lines() do table.insert(out, line) end
|
||||||
|
local _, _, code = handle:close()
|
||||||
|
|
||||||
|
-- back onto the alternate screen (so quitting vis restores the
|
||||||
|
-- terminal), then repaint vis
|
||||||
|
tty = io.open('/dev/tty', 'w')
|
||||||
|
if tty then tty:write('\27[?1049h') tty:close() end
|
||||||
|
vis:redraw()
|
||||||
|
|
||||||
|
if code == 130 then return end -- Esc / Ctrl-C
|
||||||
|
|
||||||
|
local query, key, choice = out[1], out[2], out[3]
|
||||||
|
local is_new = key == 'ctrl-n' or not choice or choice == ''
|
||||||
|
local path = is_new and query or choice
|
||||||
|
if not path or path == '' then return end
|
||||||
|
|
||||||
|
-- open in the current window, unless it's already the current file
|
||||||
|
local win = vis.win
|
||||||
|
local current = win and win.file and win.file.path
|
||||||
|
local same = current ~= nil
|
||||||
|
and (current == path or current:sub(-#path - 1) == '/' .. path)
|
||||||
|
if not same then
|
||||||
|
if win and win.file and win.file.modified then
|
||||||
|
vis:info('Buffer has unsaved changes — :w first (or use :e! manually)')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
vis:command(string.format("e '%s'", path))
|
||||||
|
end
|
||||||
|
|
||||||
|
if is_new then
|
||||||
|
vis:info('New file: ' .. path .. ' (written to disk on :w)')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
-- grep: live ripgrep search across the project, jump to the match
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
function M.grep()
|
||||||
|
local ok = os.execute('command -v rg >/dev/null 2>&1')
|
||||||
|
if not (ok == true or ok == 0) then
|
||||||
|
vis:info('ripgrep (rg) not found on PATH')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- preview: bat/batcat with the match highlighted, or cat -n
|
||||||
|
-- {1} = path, {2} = line number (fields split on ':')
|
||||||
|
local preview = 'cat -n {1}'
|
||||||
|
for _, name in ipairs({ 'bat', 'batcat' }) do
|
||||||
|
local found = os.execute('command -v ' .. name .. ' >/dev/null 2>&1')
|
||||||
|
if found == true or found == 0 then
|
||||||
|
preview = name .. ' --color=always --style=numbers --highlight-line {2} {1}'
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- don't run rg on an empty query (it would match every line)
|
||||||
|
local reload = '[ -n {q} ] && rg --column --line-number --no-heading'
|
||||||
|
.. ' --color=always --smart-case --hidden --glob "!.git" -- {q} || true'
|
||||||
|
|
||||||
|
-- empty stdin: results only appear once you start typing
|
||||||
|
local cmd = ': | fzf'
|
||||||
|
.. ' --height=' .. M.height .. ' --layout=reverse --border'
|
||||||
|
.. " --prompt 'rg> '"
|
||||||
|
.. ' --ansi --disabled' -- let rg do the matching, not fzf
|
||||||
|
.. ' --delimiter :'
|
||||||
|
.. " --bind 'change:reload:" .. reload .. "'"
|
||||||
|
.. " --preview '" .. preview .. "'"
|
||||||
|
.. " --preview-window 'right:60%:border-left:+{2}/2'" -- centre match
|
||||||
|
.. " --bind 'ctrl-/:toggle-preview'"
|
||||||
|
.. " --bind 'shift-up:preview-up,shift-down:preview-down'"
|
||||||
|
|
||||||
|
-- fzf's --height mode draws from the cursor down: start at the top-left
|
||||||
|
local tty = io.open('/dev/tty', 'w')
|
||||||
|
if tty then tty:write('\27[H') tty:close() end
|
||||||
|
|
||||||
|
local handle = io.popen(cmd)
|
||||||
|
if not handle then
|
||||||
|
vis:info('fzf: failed to start')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local choice = handle:read('*l')
|
||||||
|
handle:close()
|
||||||
|
|
||||||
|
-- back onto the alternate screen, then repaint vis
|
||||||
|
tty = io.open('/dev/tty', 'w')
|
||||||
|
if tty then tty:write('\27[?1049h') tty:close() end
|
||||||
|
vis:redraw()
|
||||||
|
|
||||||
|
if not choice or choice == '' then return end
|
||||||
|
|
||||||
|
choice = choice:gsub('\27%[[%d;]*m', '') -- strip any colour codes
|
||||||
|
local path, line, col = choice:match('^(.-):(%d+):(%d+):')
|
||||||
|
if not path then return end
|
||||||
|
|
||||||
|
-- open in the current window, unless it's already the current file
|
||||||
|
local win = vis.win
|
||||||
|
local current = win and win.file and win.file.path
|
||||||
|
local same = current ~= nil
|
||||||
|
and (current == path or current:sub(-#path - 1) == '/' .. path)
|
||||||
|
if not same then
|
||||||
|
if win and win.file and win.file.modified then
|
||||||
|
vis:info('Buffer has unsaved changes — :w first (or use :e! manually)')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
vis:command(string.format("e '%s'", path))
|
||||||
|
end
|
||||||
|
|
||||||
|
vis.win.selection:to(tonumber(line), tonumber(col))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
-- fm: browse/create/rename/delete in a terminal file manager, then open the
|
||||||
|
-- file you pick. Uses the first one found: yazi, lf, nnn, ranger
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
function M.fm()
|
||||||
|
local tmp = os.tmpname()
|
||||||
|
local managers = {
|
||||||
|
{ 'yazi', "yazi --chooser-file='%s'" },
|
||||||
|
{ 'lf', "lf -selection-path '%s'" },
|
||||||
|
{ 'nnn', "nnn -p '%s'" },
|
||||||
|
{ 'ranger', "ranger --choosefile='%s'" },
|
||||||
|
}
|
||||||
|
|
||||||
|
local cmd
|
||||||
|
for _, m in ipairs(managers) do
|
||||||
|
local ok = os.execute('command -v ' .. m[1] .. ' >/dev/null 2>&1')
|
||||||
|
if ok == true or ok == 0 then
|
||||||
|
cmd = string.format(m[2], tmp)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not cmd then
|
||||||
|
os.remove(tmp)
|
||||||
|
vis:info('No file manager found (install yazi, lf, nnn or ranger)')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
os.execute(cmd .. ' </dev/tty >/dev/tty 2>&1')
|
||||||
|
|
||||||
|
-- back onto the alternate screen, then repaint vis
|
||||||
|
local tty = io.open('/dev/tty', 'w')
|
||||||
|
if tty then tty:write('\27[?1049h') tty:close() end
|
||||||
|
vis:redraw()
|
||||||
|
|
||||||
|
local f = io.open(tmp, 'r')
|
||||||
|
local path = f and f:read('*l')
|
||||||
|
if f then f:close() end
|
||||||
|
os.remove(tmp)
|
||||||
|
if not path or path == '' then return end
|
||||||
|
|
||||||
|
-- open in the current window, unless it's already the current file
|
||||||
|
local win = vis.win
|
||||||
|
local current = win and win.file and win.file.path
|
||||||
|
if current ~= path then
|
||||||
|
if win and win.file and win.file.modified then
|
||||||
|
vis:info('Buffer has unsaved changes — :w first (or use :e! manually)')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
vis:command(string.format("e '%s'", path))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
-- create missing parent directories on save, so a new file from ctrl-n like
|
||||||
|
-- src/util/new.odin can be written even if src/util/ doesn't exist yet
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
vis.events.subscribe(vis.events.FILE_SAVE_PRE, function(file, path) -- luacheck: no unused args
|
||||||
|
local dir = path and path:match('^(.*)/[^/]+$')
|
||||||
|
if dir and dir ~= '' then
|
||||||
|
os.execute("mkdir -p '" .. dir:gsub("'", "'\\''") .. "'")
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
|
||||||
|
return M
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
-- Copyright 2026 Artur Ugnivenko. See LICENSE.
|
||||||
|
-- Odin LPeg lexer.
|
||||||
|
|
||||||
|
-- References:
|
||||||
|
-- https://odin-lang.org/spec/grammar/
|
||||||
|
-- https://pkg.odin-lang.org/base/builtin/
|
||||||
|
|
||||||
|
local lexer = lexer
|
||||||
|
local P, S = lpeg.P, lpeg.S
|
||||||
|
|
||||||
|
local lex = lexer.new(...)
|
||||||
|
|
||||||
|
-- Keywords.
|
||||||
|
lex:add_rule('keyword', lex:tag(lexer.KEYWORD, lex:word_match(lexer.KEYWORD)))
|
||||||
|
|
||||||
|
-- Types.
|
||||||
|
lex:add_rule('type', lex:tag(lexer.TYPE, lex:word_match(lexer.TYPE)))
|
||||||
|
|
||||||
|
-- Functions.
|
||||||
|
local builtin_func = -lpeg.B('.') *
|
||||||
|
lex:tag(lexer.FUNCTION_BUILTIN, lex:word_match(lexer.FUNCTION_BUILTIN))
|
||||||
|
local func = lex:tag(lexer.FUNCTION, lexer.word)
|
||||||
|
lex:add_rule('function', (builtin_func + func) * #P('('))
|
||||||
|
|
||||||
|
-- Constants.
|
||||||
|
lex:add_rule('constant', lex:tag(lexer.CONSTANT_BUILTIN, lex:word_match(lexer.CONSTANT_BUILTIN)))
|
||||||
|
|
||||||
|
-- Variables.
|
||||||
|
lex:add_rule('variable', lex:word_match(lexer.VARIABLE_BUILTIN))
|
||||||
|
|
||||||
|
-- Identifiers.
|
||||||
|
lex:add_rule('identifier', lex:tag(lexer.IDENTIFIER, lexer.word))
|
||||||
|
|
||||||
|
-- Strings.
|
||||||
|
local sq_str = lexer.range("'")
|
||||||
|
local dq_str = lexer.range('"')
|
||||||
|
local raw_str = lexer.range('`')
|
||||||
|
lex:add_rule('string', lex:tag(lexer.STRING, P('L')^-1 * (sq_str + dq_str + raw_str)))
|
||||||
|
|
||||||
|
-- Comments.
|
||||||
|
local comment = lexer.to_eol(P('//') + '#!', true)
|
||||||
|
local block_comment = lexer.range('/*', '*/', false, false, true)
|
||||||
|
local file_tag = lexer.to_eol('#+')
|
||||||
|
lex:add_rule('comment', lex:tag(lexer.COMMENT, comment + block_comment + file_tag))
|
||||||
|
|
||||||
|
-- Directives.
|
||||||
|
lex:add_rule('directive', lex:tag(lexer.PREPROCESSOR, '#' * S(' \t')^0 * lexer.word))
|
||||||
|
|
||||||
|
-- Attributes.
|
||||||
|
lex:add_rule('attribute', lex:tag(lexer.PREPROCESSOR, '@' * lexer.word^-1))
|
||||||
|
|
||||||
|
-- Numbers.
|
||||||
|
lex:add_rule('number', lex:tag(lexer.NUMBER, lexer.number * S('ijk')^-1))
|
||||||
|
|
||||||
|
-- Operators.
|
||||||
|
lex:add_rule('operator', lex:tag(lexer.OPERATOR, '..' + S('+-/*%<>!=^&|?~:;,.()[]{}')))
|
||||||
|
|
||||||
|
-- Fold points.
|
||||||
|
lex:add_fold_point(lexer.OPERATOR, '(', ')')
|
||||||
|
lex:add_fold_point(lexer.OPERATOR, '[', ']')
|
||||||
|
lex:add_fold_point(lexer.OPERATOR, '{', '}')
|
||||||
|
lex:add_fold_point(lexer.COMMENT, '/*', '*/')
|
||||||
|
|
||||||
|
-- Word lists.
|
||||||
|
lex:set_word_list(lexer.KEYWORD, {
|
||||||
|
'asm', 'auto_cast', 'bit_field', 'bit_set', 'break', 'case', 'cast', 'continue', 'defer',
|
||||||
|
'distinct', 'do', 'dynamic', 'else', 'fallthrough', 'for', 'foreign', 'if', 'import', 'in', 'map',
|
||||||
|
'matrix', 'not_in', 'of_break', 'or_continue', 'or_else', 'or_return', 'package', 'proc',
|
||||||
|
'return', 'switch', 'transmute', 'typeid', 'using', 'when', 'where', 'enum', 'struct', 'union'
|
||||||
|
})
|
||||||
|
|
||||||
|
lex:set_word_list(lexer.TYPE, {
|
||||||
|
'any', 'b8', 'b16', 'b32', 'b64', 'bool', 'byte', 'complex32', 'complex64', 'complex128',
|
||||||
|
'cstring', 'cstring16', 'f16', 'f16le', 'f16be', 'f32', 'f32le', 'f32be', 'f64', 'f64le', 'f64be',
|
||||||
|
'i8', 'i16', 'i16le', 'i16be', 'i32', 'i32le', 'i32be', 'i64', 'i64le', 'i64be', 'int',
|
||||||
|
'quaternion64', 'quaternion128', 'quaternion256', 'rawptr', 'rune', 'string', 'string16',
|
||||||
|
'typeid', 'u8', 'u16', 'u16le', 'u16be', 'u32', 'u32le', 'u32be', 'u64', 'u64le', 'u64be', 'uint',
|
||||||
|
'uintptr'
|
||||||
|
})
|
||||||
|
|
||||||
|
lex:set_word_list(lexer.FUNCTION_BUILTIN, {
|
||||||
|
'abs', 'align_of', 'cap', 'clamp', 'complex', 'compress_values', 'conj', 'expand_values', 'imag',
|
||||||
|
'jmag', 'kmag', 'len', 'max', 'min', 'offset_of', 'offset_of_by_string', 'offset_of_member',
|
||||||
|
'offset_of_selector', 'quaternion', 'raw_data', 'real', 'size_of', 'soa_unzip', 'soa_zip',
|
||||||
|
'swizzle', 'type_info_of', 'type_of', 'typeid_of'
|
||||||
|
})
|
||||||
|
|
||||||
|
lex:set_word_list(lexer.CONSTANT_BUILTIN, {
|
||||||
|
'false', 'true', 'nil', 'ODIN_ARCH', 'ODIN_BUILD_MODE', 'ODIN_COMPILE_TIMESTAMP', 'ODIN_DEBUG',
|
||||||
|
'ODIN_DEFAULT_TO_NIL_ALLOCATOR', 'ODIN_DEFAULT_TO_PANIC_ALLOCATOR', 'ODIN_DISABLE_ASSERT',
|
||||||
|
'ODIN_ENDIAN', 'ODIN_ERROR_POS_STYLE', 'ODIN_NO_CRT', 'ODIN_NO_ENTRY_POINT', 'ODIN_NO_RTTI',
|
||||||
|
'ODIN_OS', 'ODIN_PLATFORM_SUBTARGET', 'ODIN_ROOT', 'ODIN_VENDOR', 'ODIN_VERSION',
|
||||||
|
'ODIN_WINDOWS_SUBSYSTEM'
|
||||||
|
})
|
||||||
|
|
||||||
|
lex:set_word_list(lexer.VARIABLE_BUILTIN, {
|
||||||
|
'context', 'runtime'
|
||||||
|
})
|
||||||
|
|
||||||
|
return lex
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
-- vis-minimal-jellybeans-soft
|
||||||
|
-- Dark neutral background, warm off-white, and muted, low-brightness accents
|
||||||
|
|
||||||
|
local bg_dark = '#131313' -- Dark off-black background instead of harsh pure black
|
||||||
|
local black1 = '#303030'
|
||||||
|
local black2 = '#585858'
|
||||||
|
|
||||||
|
local offwhite0 = '#b9b9b9' -- Softened off-white base (reduces glare)
|
||||||
|
local offwhite1 = '#b0b0b0'
|
||||||
|
local offwhite2 = '#888888'
|
||||||
|
|
||||||
|
local clear0 = '#00000000'
|
||||||
|
|
||||||
|
-- Darkened, lower-contrast Jellybeans accents
|
||||||
|
local jelly_yellow_muted = '#d9b36a' -- Subdued warm yellow (Methods / Functions)
|
||||||
|
local jelly_blue_muted = '#75a0bc' -- Muted ice blue (Types / Classes)
|
||||||
|
|
||||||
|
local lexers = vis.lexers
|
||||||
|
|
||||||
|
-- Default Softened Base
|
||||||
|
lexers.STYLE_DEFAULT = 'back:'..clear0..',fore:'..offwhite0
|
||||||
|
lexers.STYLE_NOTHING = 'back:'..bg_dark
|
||||||
|
lexers.STYLE_COMMENT = 'fore:'..black2
|
||||||
|
lexers.STYLE_ERROR = 'fore:'..offwhite0
|
||||||
|
lexers.STYLE_WHITESPACE = ''
|
||||||
|
lexers.STYLE_EMBEDDED = 'back:'..black1
|
||||||
|
|
||||||
|
-- The ONLY Colored Highlights (Deepened / Softened)
|
||||||
|
lexers.STYLE_FUNCTION = 'fore:'..jelly_yellow_muted
|
||||||
|
lexers.STYLE_TYPE = 'fore:'..jelly_blue_muted
|
||||||
|
lexers.STYLE_CLASS = 'fore:'..jelly_blue_muted
|
||||||
|
|
||||||
|
-- Neutral / Off-White Text
|
||||||
|
lexers.STYLE_VARIABLE = 'fore:'..offwhite0
|
||||||
|
lexers.STYLE_IDENTIFIER = 'fore:'..offwhite0
|
||||||
|
lexers.STYLE_KEYWORD = 'fore:'..offwhite2
|
||||||
|
lexers.STYLE_CONSTANT = 'fore:'..offwhite0
|
||||||
|
lexers.STYLE_DEFINITION = 'fore:'..offwhite0
|
||||||
|
lexers.STYLE_LABEL = 'fore:'..offwhite0
|
||||||
|
lexers.STYLE_NUMBER = 'fore:'..offwhite1
|
||||||
|
lexers.STYLE_OPERATOR = 'fore:'..offwhite0
|
||||||
|
lexers.STYLE_REGEX = 'fore:'..offwhite1
|
||||||
|
lexers.STYLE_STRING = 'fore:'..offwhite1
|
||||||
|
lexers.STYLE_PREPROCESSOR= 'fore:'..offwhite0
|
||||||
|
lexers.STYLE_TAG = 'fore:'..offwhite0
|
||||||
|
|
||||||
|
-- Editor Interface UI
|
||||||
|
lexers.STYLE_LINENUMBER = 'fore:'..black2
|
||||||
|
lexers.STYLE_LINENUMBER_CURSOR = 'fore:'..offwhite1
|
||||||
|
lexers.STYLE_CURSOR = 'back:'..offwhite2
|
||||||
|
lexers.STYLE_CURSOR_PRIMARY = lexers.STYLE_CURSOR..',fore:'..bg_dark
|
||||||
|
lexers.STYLE_CURSOR_LINE = 'underlined'
|
||||||
|
lexers.STYLE_COLOR_COLUMN = 'back:'..black1
|
||||||
|
lexers.STYLE_SELECTION = 'back:'..black1
|
||||||
|
lexers.STYLE_STATUS = 'reverse'
|
||||||
|
lexers.STYLE_STATUS_FOCUSED = 'back:'..black1..',fore:'..offwhite1
|
||||||
|
lexers.STYLE_SEPARATOR = lexers.STYLE_DEFAULT
|
||||||
|
lexers.STYLE_INFO = 'fore:default,back:default'
|
||||||
|
lexers.STYLE_EOF = ''
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
-- load the standard vis module (provides the Lua API)
|
||||||
|
require('vis')
|
||||||
|
|
||||||
|
-- ~/.config/vis/fzf.lua and ~/.config/vis/build.lua
|
||||||
|
local fzf = require('fzf')
|
||||||
|
local build = require('build')
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
-- Odin syntax highlighting (lexer lives in ~/.config/vis/lexers/odin.lua)
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
if vis.ftdetect then
|
||||||
|
if vis.ftdetect.extensions then -- newer vis (git master)
|
||||||
|
vis.ftdetect.extensions.odin = 'odin'
|
||||||
|
end
|
||||||
|
if vis.ftdetect.filetypes then -- vis 0.9 and earlier
|
||||||
|
vis.ftdetect.filetypes.odin = { ext = { '%.odin$' } }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
-- Global options, key mappings and commands
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
vis.events.subscribe(vis.events.INIT, function()
|
||||||
|
vis:command('set escdelay 15')
|
||||||
|
vis:command('set autoindent on')
|
||||||
|
vis:command('set theme custom')
|
||||||
|
|
||||||
|
-- pickers
|
||||||
|
vis:map(vis.modes.NORMAL, '<C-p>', fzf.files, 'Fuzzy find / create a file')
|
||||||
|
vis:map(vis.modes.NORMAL, '<C-f>', fzf.grep, 'Live grep the project with ripgrep')
|
||||||
|
vis:command_register('files', function() fzf.files() return true end, 'Fuzzy find / create a file')
|
||||||
|
vis:command_register('grep', function() fzf.grep() return true end, 'Live grep the project with ripgrep')
|
||||||
|
vis:command_register('fm', function() fzf.fm() return true end, 'Pick a file with a terminal file manager')
|
||||||
|
|
||||||
|
vis:map(vis.modes.NORMAL, '<C-b>', function() build.run({}) end, 'Run ./build.sh')
|
||||||
|
vis:command_register('build', function(argv)
|
||||||
|
local args = {}
|
||||||
|
for i = 1, #argv do table.insert(args, argv[i]) end
|
||||||
|
build.run(args)
|
||||||
|
return true
|
||||||
|
end, 'Run ./build.sh with optional flags, e.g. :build run')
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
-- Per-window options
|
||||||
|
-- ---------------------------------------------------------------------------
|
||||||
|
vis.events.subscribe(vis.events.WIN_OPEN, function(win) -- luacheck: no unused args
|
||||||
|
vis:command('set tabwidth 4')
|
||||||
|
vis:command('set expandtab on')
|
||||||
|
vis:command('set number on')
|
||||||
|
end)
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# ~/.config/yazi/theme.toml
|
||||||
|
# Minimal status bar: same colours as the default, as text only.
|
||||||
|
# Anything not set here falls back to yazi's built-in theme.
|
||||||
|
|
||||||
|
[mode]
|
||||||
|
# mode label (NOR / SEL / UNS) and position counter
|
||||||
|
normal_main = { fg = "blue", bold = true }
|
||||||
|
select_main = { fg = "red", bold = true }
|
||||||
|
unset_main = { fg = "red", bold = true }
|
||||||
|
|
||||||
|
# file size and Top/Bot/% segments
|
||||||
|
normal_alt = { fg = "blue" }
|
||||||
|
select_alt = { fg = "red" }
|
||||||
|
unset_alt = { fg = "red" }
|
||||||
|
|
||||||
|
[status]
|
||||||
|
overall = {}
|
||||||
|
|
||||||
|
# no powerline arrows between segments
|
||||||
|
sep_left = { open = "", close = "" }
|
||||||
|
sep_right = { open = "", close = "" }
|
||||||
|
|
||||||
|
# permissions (unchanged from default)
|
||||||
|
perm_sep = { fg = "darkgray" }
|
||||||
|
perm_type = { fg = "green" }
|
||||||
|
perm_read = { fg = "yellow" }
|
||||||
|
perm_write = { fg = "red" }
|
||||||
|
perm_exec = { fg = "cyan" }
|
||||||
|
|
||||||
|
# task progress bar, without the black track behind it
|
||||||
|
progress_label = { bold = true }
|
||||||
|
progress_normal = { fg = "green" }
|
||||||
|
progress_error = { fg = "red" }
|
||||||
+271
-100
@@ -8,25 +8,130 @@
|
|||||||
"buffers":
|
"buffers":
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"file": "config/kitty/kitty.conf",
|
"file": "config/fish/config.fish",
|
||||||
"file_size": 1776,
|
"file_size": 4388,
|
||||||
"file_write_time": 134326208246694386,
|
"file_write_time": 134353912965388191,
|
||||||
"settings":
|
"settings":
|
||||||
{
|
{
|
||||||
"buffer_size": 1776,
|
"buffer_size": 4386,
|
||||||
"line_ending": "Unix"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"file": "install.sh",
|
|
||||||
"file_size": 4218,
|
|
||||||
"file_write_time": 134327099681520306,
|
|
||||||
"settings":
|
|
||||||
{
|
|
||||||
"buffer_size": 4172,
|
|
||||||
"encoding": "UTF-8",
|
"encoding": "UTF-8",
|
||||||
"line_ending": "Unix"
|
"line_ending": "Unix"
|
||||||
}
|
},
|
||||||
|
"undo_stack":
|
||||||
|
[
|
||||||
|
[
|
||||||
|
12,
|
||||||
|
1,
|
||||||
|
"nv_vi_o",
|
||||||
|
{
|
||||||
|
"count": 1,
|
||||||
|
"mode": "mode_internal_normal",
|
||||||
|
"register": "\""
|
||||||
|
},
|
||||||
|
"AQAAAOgCAAAAAAAA6QIAAAAAAAAAAAAA",
|
||||||
|
"CgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAA0wIAAAAAAADTAgAAAAAAAAAAAAAAAPC/"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
14,
|
||||||
|
1,
|
||||||
|
"nv_vi_paste",
|
||||||
|
{
|
||||||
|
"before_cursor": false,
|
||||||
|
"count": 1,
|
||||||
|
"mode": "mode_internal_normal",
|
||||||
|
"register": "\""
|
||||||
|
},
|
||||||
|
"AQAAAOoCAAAAAAAAIAMAAAAAAAAAAAAA",
|
||||||
|
"CgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAA6QIAAAAAAADpAgAAAAAAAAAAAAAAAPC/"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
17,
|
||||||
|
1,
|
||||||
|
"nv_vi_d",
|
||||||
|
{
|
||||||
|
"count": 1,
|
||||||
|
"mode": "mode_visual_line",
|
||||||
|
"register": "\""
|
||||||
|
},
|
||||||
|
"AQAAAOkCAAAAAAAA6QIAAAAAAAABAAAACg",
|
||||||
|
"CgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAA6QIAAAAAAADqAgAAAAAAAAAAAAAAAPC/"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
18,
|
||||||
|
1,
|
||||||
|
"nv_vi_o",
|
||||||
|
{
|
||||||
|
"count": 1,
|
||||||
|
"mode": "mode_internal_normal",
|
||||||
|
"register": "\""
|
||||||
|
},
|
||||||
|
"AQAAAB8DAAAAAAAAIAMAAAAAAAAAAAAA",
|
||||||
|
"CgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAA6QIAAAAAAADpAgAAAAAAAAAAAAAAAPC/"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
30,
|
||||||
|
1,
|
||||||
|
"sequence",
|
||||||
|
{
|
||||||
|
"commands":
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"nv_vi_c",
|
||||||
|
{
|
||||||
|
"count": 1,
|
||||||
|
"mode": "mode_visual",
|
||||||
|
"register": "\""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"insert",
|
||||||
|
{
|
||||||
|
"characters": "home/jason/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"insert",
|
||||||
|
{
|
||||||
|
"characters": "ThirdPart"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"insert",
|
||||||
|
{
|
||||||
|
"characters": "y/ols"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"GgAAAAYDAAAAAAAABgMAAAAAAAAQAAAAcGF0aC90by9vbHMvcmVwbwYDAAAAAAAABwMAAAAAAAAAAAAABwMAAAAAAAAIAwAAAAAAAAAAAAAIAwAAAAAAAAkDAAAAAAAAAAAAAAkDAAAAAAAACgMAAAAAAAAAAAAACgMAAAAAAAALAwAAAAAAAAAAAAALAwAAAAAAAAwDAAAAAAAAAAAAAAwDAAAAAAAADQMAAAAAAAAAAAAADQMAAAAAAAAOAwAAAAAAAAAAAAAOAwAAAAAAAA8DAAAAAAAAAAAAAA8DAAAAAAAAEAMAAAAAAAAAAAAAEAMAAAAAAAARAwAAAAAAAAAAAAARAwAAAAAAABIDAAAAAAAAAAAAABIDAAAAAAAAEwMAAAAAAAAAAAAAEwMAAAAAAAAUAwAAAAAAAAAAAAAUAwAAAAAAABUDAAAAAAAAAAAAABUDAAAAAAAAFgMAAAAAAAAAAAAAFgMAAAAAAAAXAwAAAAAAAAAAAAAXAwAAAAAAABgDAAAAAAAAAAAAABgDAAAAAAAAGQMAAAAAAAAAAAAAGQMAAAAAAAAaAwAAAAAAAAAAAAAaAwAAAAAAABsDAAAAAAAAAAAAABsDAAAAAAAAHAMAAAAAAAAAAAAAHAMAAAAAAAAdAwAAAAAAAAAAAAAdAwAAAAAAAB4DAAAAAAAAAAAAAB4DAAAAAAAAHwMAAAAAAAAAAAAA",
|
||||||
|
"CgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAABgMAAAAAAAAWAwAAAAAAAAAAAAAAAPC/"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
17,
|
||||||
|
1,
|
||||||
|
"nv_vi_d",
|
||||||
|
{
|
||||||
|
"count": 1,
|
||||||
|
"mode": "mode_visual",
|
||||||
|
"register": "\""
|
||||||
|
},
|
||||||
|
"AQAAAGYFAAAAAAAAZgUAAAAAAAAEAAAAZmluZA",
|
||||||
|
"AQAAAAAAAAABAAAAZgUAAAAAAABqBQAAAAAAAAAAAAAAAPC/"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "config/vim/vimrc",
|
||||||
|
"file_size": 2854,
|
||||||
|
"file_write_time": 134345438284510269,
|
||||||
|
"settings":
|
||||||
|
{
|
||||||
|
"buffer_size": 2854,
|
||||||
|
"line_ending": "Unix"
|
||||||
|
},
|
||||||
|
"undo_stack":
|
||||||
|
[
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"build_system": "",
|
"build_system": "",
|
||||||
@@ -41,52 +146,84 @@
|
|||||||
"selected_items":
|
"selected_items":
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
"ter",
|
"lsp res",
|
||||||
"Open Terminal Here…"
|
"LSP: Restart Server"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"termi",
|
"lsp",
|
||||||
"Open Terminal Here…"
|
"Preferences: LSP Server Configurations"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"ins",
|
"setting",
|
||||||
"Package Control: Install Package"
|
"Preferences: Settings"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"theme",
|
"set",
|
||||||
"UI: Customize Theme"
|
"Selection: Expand to Block"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"lsp se",
|
||||||
|
"Preferences: LSP Server Configurations"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"lsp server",
|
||||||
|
"Preferences: LSP Server Configurations"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"inst",
|
"inst",
|
||||||
"Package Control: Install Package"
|
"Package Control: Install Package"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"install ",
|
"key",
|
||||||
"Package Control: Install Package"
|
"Preferences: Key Bindings"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"settings",
|
"remo",
|
||||||
"Preferences: Settings"
|
"Package Control: Remove Package"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"list p",
|
"color",
|
||||||
"Package Control: List Packages"
|
"UI: Select Color Scheme"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"insta",
|
"insta",
|
||||||
"Package Control: Install Package"
|
"Package Control: Install Package"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"install pa",
|
"remove",
|
||||||
|
"Package Control: Remove Package"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"theme",
|
||||||
|
"UI: Customize Theme"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"instal",
|
||||||
"Package Control: Install Package"
|
"Package Control: Install Package"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"install",
|
"color scheme",
|
||||||
|
"UI: Select Color Scheme"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"cust",
|
||||||
|
"UI: Customize Color Scheme"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"settings",
|
||||||
|
"Preferences: Settings"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"pack",
|
||||||
"Package Control: Install Package"
|
"Package Control: Install Package"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"package",
|
"list pac",
|
||||||
"Enable Package Control"
|
"Package Control: List Packages"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"package inst",
|
||||||
|
"Package Control: Install Package"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"width": 0.0
|
"width": 0.0
|
||||||
@@ -109,26 +246,26 @@
|
|||||||
},
|
},
|
||||||
"expanded_folders":
|
"expanded_folders":
|
||||||
[
|
[
|
||||||
"/home/jason/Projects/dotfiles"
|
"/home/jason/Projects/dotfiles",
|
||||||
|
"/home/jason/Projects/dotfiles/config"
|
||||||
],
|
],
|
||||||
"file_history":
|
"file_history":
|
||||||
[
|
[
|
||||||
"/home/jason/Projects/dotfiles/config/bash/bashrc",
|
"/home/jason/Projects/Games/pong_raylib/src/audio_manager.odin",
|
||||||
"/home/jason/Projects/dotfiles/install.sh",
|
"/home/jason/Projects/Games/pong_raylib/src/main.odin",
|
||||||
"/home/jason/Projects/dotfiles/README.md",
|
"/home/jason/Projects/Games/pong_raylib/src/entity_player.odin",
|
||||||
"/home/jason/Projects/dotfiles/scripts/installs/install_odin",
|
"/home/jason/.config/sublime-text/Packages/User/LanguageServers.sublime-settings",
|
||||||
"/home/jason/Projects/dotfiles/scripts/installs/install_raylib_deps",
|
"/home/jason/.config/sublime-text/Packages/LSP/LanguageServers.sublime-settings",
|
||||||
"/home/jason/Projects/dotfiles/scripts/installs/install_php",
|
"/home/jason/.config/sublime-text/Packages/User/Mariana.sublime-color-scheme",
|
||||||
"/home/jason/Projects/Godot/test-struct/src/entities/player/player.gd",
|
"/home/jason/.config/sublime-text/Packages/Color Scheme - Default/Mariana.sublime-color-scheme"
|
||||||
"/home/jason/Projects/raylib_reference/src/map.odin"
|
|
||||||
],
|
],
|
||||||
"find":
|
"find":
|
||||||
{
|
{
|
||||||
"height": 41.0
|
"height": 42.0
|
||||||
},
|
},
|
||||||
"find_in_files":
|
"find_in_files":
|
||||||
{
|
{
|
||||||
"height": 143.0,
|
"height": 158.0,
|
||||||
"where_history":
|
"where_history":
|
||||||
[
|
[
|
||||||
]
|
]
|
||||||
@@ -161,25 +298,62 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"buffer": 0,
|
"buffer": 0,
|
||||||
"file": "config/kitty/kitty.conf",
|
"file": "config/fish/config.fish",
|
||||||
|
"selected": true,
|
||||||
"semi_transient": false,
|
"semi_transient": false,
|
||||||
"settings":
|
"settings":
|
||||||
{
|
{
|
||||||
"buffer_size": 1776,
|
"buffer_size": 4386,
|
||||||
"regions":
|
"regions":
|
||||||
{
|
{
|
||||||
},
|
},
|
||||||
"selection":
|
"selection":
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
101,
|
1382,
|
||||||
101
|
1382
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"settings":
|
"settings":
|
||||||
{
|
{
|
||||||
"lsp_uri": "file:///home/jason/Projects/dotfiles/config/kitty/kitty.conf",
|
"_nv_visual_sel_mode": "mode_visual",
|
||||||
"syntax": "Packages/Text/Plain text.tmLanguage"
|
"lsp_uri": "file:///home/jason/Projects/dotfiles/config/fish/config.fish",
|
||||||
|
"syntax": "Packages/Text/Plain text.tmLanguage",
|
||||||
|
"tab_size": 4,
|
||||||
|
"translate_tabs_to_spaces": true
|
||||||
|
},
|
||||||
|
"translation.x": 0.0,
|
||||||
|
"translation.y": 792.0,
|
||||||
|
"zoom_level": 1.0
|
||||||
|
},
|
||||||
|
"stack_index": 0,
|
||||||
|
"stack_multiselect": false,
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 1,
|
||||||
|
"file": "config/vim/vimrc",
|
||||||
|
"semi_transient": false,
|
||||||
|
"settings":
|
||||||
|
{
|
||||||
|
"buffer_size": 2854,
|
||||||
|
"regions":
|
||||||
|
{
|
||||||
|
},
|
||||||
|
"selection":
|
||||||
|
[
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"settings":
|
||||||
|
{
|
||||||
|
"highlight_line": false,
|
||||||
|
"lsp_uri": "file:///home/jason/Projects/dotfiles/config/vim/vimrc",
|
||||||
|
"syntax": "Packages/Text/Plain text.tmLanguage",
|
||||||
|
"tab_size": 2,
|
||||||
|
"translate_tabs_to_spaces": true
|
||||||
},
|
},
|
||||||
"translation.x": 0.0,
|
"translation.x": 0.0,
|
||||||
"translation.y": 0.0,
|
"translation.y": 0.0,
|
||||||
@@ -188,50 +362,17 @@
|
|||||||
"stack_index": 1,
|
"stack_index": 1,
|
||||||
"stack_multiselect": false,
|
"stack_multiselect": false,
|
||||||
"type": "text"
|
"type": "text"
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer": 1,
|
|
||||||
"file": "install.sh",
|
|
||||||
"selected": true,
|
|
||||||
"semi_transient": false,
|
|
||||||
"settings":
|
|
||||||
{
|
|
||||||
"buffer_size": 4172,
|
|
||||||
"regions":
|
|
||||||
{
|
|
||||||
},
|
|
||||||
"selection":
|
|
||||||
[
|
|
||||||
[
|
|
||||||
12,
|
|
||||||
12
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"settings":
|
|
||||||
{
|
|
||||||
"lsp_uri": "file:///home/jason/Projects/dotfiles/install.sh",
|
|
||||||
"syntax": "Packages/ShellScript/Bash.sublime-syntax",
|
|
||||||
"tab_size": 4,
|
|
||||||
"translate_tabs_to_spaces": false
|
|
||||||
},
|
|
||||||
"translation.x": 0.0,
|
|
||||||
"translation.y": 0.0,
|
|
||||||
"zoom_level": 1.0
|
|
||||||
},
|
|
||||||
"stack_index": 0,
|
|
||||||
"stack_multiselect": false,
|
|
||||||
"type": "text"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"incremental_find":
|
"incremental_find":
|
||||||
{
|
{
|
||||||
"height": 41.0
|
"height": 42.0
|
||||||
},
|
},
|
||||||
"input":
|
"input":
|
||||||
{
|
{
|
||||||
"height": 54.0
|
"height": 59.0
|
||||||
},
|
},
|
||||||
"layout":
|
"layout":
|
||||||
{
|
{
|
||||||
@@ -255,7 +396,7 @@
|
|||||||
1.0
|
1.0
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"menu_visible": false,
|
"menu_visible": true,
|
||||||
"output.LSP Log Panel":
|
"output.LSP Log Panel":
|
||||||
{
|
{
|
||||||
"height": 0.0,
|
"height": 0.0,
|
||||||
@@ -270,6 +411,13 @@
|
|||||||
[
|
[
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"output.exec":
|
||||||
|
{
|
||||||
|
"height": 1123.0,
|
||||||
|
"history":
|
||||||
|
[
|
||||||
|
]
|
||||||
|
},
|
||||||
"output.find_results":
|
"output.find_results":
|
||||||
{
|
{
|
||||||
"height": 0.0,
|
"height": 0.0,
|
||||||
@@ -277,11 +425,18 @@
|
|||||||
[
|
[
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"output.mdpopups":
|
||||||
|
{
|
||||||
|
"height": 0.0,
|
||||||
|
"history":
|
||||||
|
[
|
||||||
|
]
|
||||||
|
},
|
||||||
"pinned_build_system": "",
|
"pinned_build_system": "",
|
||||||
"project": "dotfiles.sublime-project",
|
"project": "dotfiles.sublime-project",
|
||||||
"replace":
|
"replace":
|
||||||
{
|
{
|
||||||
"height": 78.0
|
"height": 80.0
|
||||||
},
|
},
|
||||||
"save_all_on_build": true,
|
"save_all_on_build": true,
|
||||||
"select_file":
|
"select_file":
|
||||||
@@ -291,20 +446,16 @@
|
|||||||
"selected_items":
|
"selected_items":
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
"ins",
|
"fish",
|
||||||
"install.sh"
|
"config/fish/config.fish"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"odin",
|
"main",
|
||||||
"scripts/installs/install_odin"
|
"src/main.odin"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"rayl",
|
"ene",
|
||||||
"scripts/installs/install_raylib_deps"
|
"src/entity_player.odin"
|
||||||
],
|
|
||||||
[
|
|
||||||
"install_odi",
|
|
||||||
"scripts/installs/install_odin"
|
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"width": 0.0
|
"width": 0.0
|
||||||
@@ -312,9 +463,29 @@
|
|||||||
"select_project":
|
"select_project":
|
||||||
{
|
{
|
||||||
"height": 500.0,
|
"height": 500.0,
|
||||||
"last_filter": "",
|
"last_filter": "peb",
|
||||||
"selected_items":
|
"selected_items":
|
||||||
[
|
[
|
||||||
|
[
|
||||||
|
"peb",
|
||||||
|
"~/Projects/pebble/pebble.sublime-project"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"min",
|
||||||
|
"~/Projects/min_editor/min_editor.sublime-project"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"~/Projects/dotfiles/dotfiles.sublime-project"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"pong",
|
||||||
|
"~/Projects/pong_raylib/pong_odin.sublime-project"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"dot",
|
||||||
|
"~/Projects/dotfiles/dotfiles.sublime-project"
|
||||||
|
]
|
||||||
],
|
],
|
||||||
"width": 380.0
|
"width": 380.0
|
||||||
},
|
},
|
||||||
@@ -333,11 +504,11 @@
|
|||||||
"_vintageous_reset_during_init": true,
|
"_vintageous_reset_during_init": true,
|
||||||
"lsp_show_inlay_hints": false
|
"lsp_show_inlay_hints": false
|
||||||
},
|
},
|
||||||
"show_minimap": false,
|
"show_minimap": true,
|
||||||
"show_open_files": false,
|
"show_open_files": false,
|
||||||
"show_tabs": false,
|
"show_tabs": false,
|
||||||
"side_bar_visible": true,
|
"side_bar_visible": true,
|
||||||
"side_bar_width": 271.0,
|
"side_bar_width": 328.0,
|
||||||
"status_bar_visible": true,
|
"status_bar_visible": true,
|
||||||
"template_settings":
|
"template_settings":
|
||||||
{
|
{
|
||||||
|
|||||||
+5
-3
@@ -87,8 +87,9 @@ if [ "$DO_LINKS" = true ]; then
|
|||||||
link_file "$DOTFILES_DIR/config/niri/config.kdl" "$HOME/.config/niri/config.kdl"
|
link_file "$DOTFILES_DIR/config/niri/config.kdl" "$HOME/.config/niri/config.kdl"
|
||||||
link_file "$DOTFILES_DIR/config/niri/dms/binds.kdl" "$HOME/.config/niri/dms/binds.kdl"
|
link_file "$DOTFILES_DIR/config/niri/dms/binds.kdl" "$HOME/.config/niri/dms/binds.kdl"
|
||||||
link_file "$DOTFILES_DIR/config/fish/config.fish" "$HOME/.config/fish/config.fish"
|
link_file "$DOTFILES_DIR/config/fish/config.fish" "$HOME/.config/fish/config.fish"
|
||||||
link_file "$DOTFILES_DIR/config/vim" "$HOME/.vim"
|
|
||||||
link_file "$DOTFILES_DIR/config/kanata" "$HOME/.config/kanata"
|
link_file "$DOTFILES_DIR/config/kanata" "$HOME/.config/kanata"
|
||||||
|
link_file "$DOTFILES_DIR/config/vis" "$HOME/.config/vis"
|
||||||
|
link_file "$DOTFILES_DIR/config/yazi" "$HOME/.config/yazi"
|
||||||
link_file "$DOTFILES_DIR/scripts/bin" "$HOME/.local/bin"
|
link_file "$DOTFILES_DIR/scripts/bin" "$HOME/.local/bin"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
@@ -151,10 +152,11 @@ if [ "$DO_INSTALL" = true ]; then
|
|||||||
# network & download
|
# network & download
|
||||||
wget curl ca-certificates gnupg rsync
|
wget curl ca-certificates gnupg rsync
|
||||||
# core utilities & CLI tools
|
# core utilities & CLI tools
|
||||||
git vim fd jq fzf ripgrep tree direnv make bat
|
git vis yazi fd jq fzf ripgrep tree direnv make
|
||||||
ark unzip p7zip tar gzip bzip2 xz kanata gitu
|
bat ark unzip p7zip tar gzip bzip2 xz kanata
|
||||||
# build & dev tools
|
# build & dev tools
|
||||||
alacritty base-devel valgrind tree-sitter-cli go nodejs
|
alacritty base-devel valgrind tree-sitter-cli go nodejs
|
||||||
|
# cli text editing
|
||||||
)
|
)
|
||||||
|
|
||||||
MISSING_PACKAGES=()
|
MISSING_PACKAGES=()
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user