summaryrefslogtreecommitdiff
path: root/files/nvim
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-10-17 12:22:00 -0400
committerAndrew Opalach <andrew@akon.city> 2025-10-17 12:32:42 -0400
commit544da1ba50d9cbf51a18ca0abf1db66b3baa7460 (patch)
tree1caa87664ea4937c5f4e6e8dc83c49b3132ddd70 /files/nvim
parent85a47287e56ba9100420246531ebea5996cc0486 (diff)
downloaddotfiles-544da1ba50d9cbf51a18ca0abf1db66b3baa7460.tar.gz
dotfiles-544da1ba50d9cbf51a18ca0abf1db66b3baa7460.tar.bz2
dotfiles-544da1ba50d9cbf51a18ca0abf1db66b3baa7460.zip
Gentoo desktop
Diffstat (limited to 'files/nvim')
-rw-r--r--files/nvim/fzf_no_linenum.diff24
-rw-r--r--files/nvim/init.vim368
-rw-r--r--files/nvim/local/autoload/Juliana.vim46
-rw-r--r--files/nvim/mini_completion_no_title.diff0
-rw-r--r--files/nvim/mini_starter_picture.diff288
5 files changed, 0 insertions, 726 deletions
diff --git a/files/nvim/fzf_no_linenum.diff b/files/nvim/fzf_no_linenum.diff
deleted file mode 100644
index bed26be..0000000
--- a/files/nvim/fzf_no_linenum.diff
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/autoload/fzf/vim.vim b/autoload/fzf/vim.vim
-index 67945c3..ccfe729 100755
---- a/autoload/fzf/vim.vim
-+++ b/autoload/fzf/vim.vim
-@@ -789,7 +789,7 @@ endfunction
-
- function! fzf#vim#_format_buffer(b)
- let name = bufname(a:b)
-- let line = exists('*getbufinfo') ? getbufinfo(a:b)[0]['lnum'] : 0
-+ "let line = exists('*getbufinfo') ? getbufinfo(a:b)[0]['lnum'] : 0
- let fullname = empty(name) ? '' : fnamemodify(name, ":p:~:.")
- let dispname = empty(name) ? '[No Name]' : name
- let flag = a:b == bufnr('') ? s:blue('%', 'Conditional') :
-@@ -797,8 +797,8 @@ function! fzf#vim#_format_buffer(b)
- let modified = getbufvar(a:b, '&modified') ? s:red(' [+]', 'Exception') : ''
- let readonly = getbufvar(a:b, '&modifiable') ? '' : s:green(' [RO]', 'Constant')
- let extra = join(filter([modified, readonly], '!empty(v:val)'), '')
-- let target = empty(name) ? '' : (line == 0 ? fullname : fullname.':'.line)
-- return s:rstrip(printf("%s\t%d\t[%s] %s\t%s\t%s", target, line, s:yellow(a:b, 'Number'), flag, dispname, extra))
-+ let target = empty(name) ? '' : (fullname)
-+ return s:rstrip(printf("%s\t[%s] %s\t%s\t%s", target, s:yellow(a:b, 'Number'), flag, dispname, extra))
- endfunction
-
- function! s:sort_buffers(...)
diff --git a/files/nvim/init.vim b/files/nvim/init.vim
deleted file mode 100644
index 780f9d5..0000000
--- a/files/nvim/init.vim
+++ /dev/null
@@ -1,368 +0,0 @@
-" Basic settings.
-set number
-set noshowmode
-set signcolumn=yes
-set updatetime=250
-set scrolloff=5
-
-" Change directory based on current file.
-if !empty($NIX_SHELL)
- " Attempt to conflict less with plugins.
- autocmd BufEnter * if gitbranch#name() != '' | silent! lcd %:p:h
-else
- set autochdir
-endif
-
-" inotify compat?
-set backupcopy=yes
-
-" Old defaults (I think).
-set splitright
-set splitbelow
-
-" Syntax and indent from filetype.
-set nocompatible
-filetype plugin indent on
-syntax on
-
-" Check for SHIFT_JIS.
-set fileencodings=ucs-bom,utf-8,sjis,default,latin1
-
-" 4 spaces autoindent.
-set tabstop=4
-set shiftwidth=4
-set expandtab
-set autoindent
-
-" C syntax preference.
-let g:c_syntax_for_h=1
-let g:c_no_curly_error=1
-let g:c_function_pointers=1
-set cinoptions=:0,=4,l1,g2,h2,(4,u4,+4,m1,j1,J1
-set cindent
-
-" Set different format for mail and text files.
-set nowrap nolinebreak nolist formatoptions=l textwidth=0
-autocmd FileType mail,text setlocal wrap formatoptions=l textwidth=0
-
-" Ex tab complete that makes sense to me.
-set wildmode=longest,list,full
-set wildmenu
-
-" Allow distinguishing <C-i> from <Tab> in bindings.
-let &t_TI = '\<Esc>[>4;2m'
-let &t_TE = '\<Esc>[>4;m'
-" Treat shift + backspace as normal backspace.
-tnoremap <S-BS> <BS>
-
-" System clipboard on linux.
-set clipboard+=unnamedplus
-
-" Session options.
-set ssop=skiprtp,blank,buffers,folds,winsize,terminal
-set vop-=curdir
-if isdirectory(expand('~/c'))
- let view_dir = expand('~/c/sessions/views')
- if !isdirectory(view_dir)
- call mkdir(view_dir, 'p', 0755)
- endif
- let &viewdir=view_dir
-
- " Staggered backups.
- let backup_dir = '/mnt/store/backup/vim'
- if !isdirectory(backup_dir)
- let backup_dir = expand('~/c/sessions/backup//')
- if !isdirectory(backup_dir)
- call mkdir(backup_dir, 'p', 0755)
- endif
- endif
- let &backupdir=backup_dir
- set backup
-
- " Swap file directory.
- let swap_dir = expand('~/c/sessions/swaps//')
- if !isdirectory(swap_dir)
- call mkdir(swap_dir, 'p', 0755)
- endif
- let &directory=swap_dir
-
- if has('persistent_undo')
- let undo_dir = expand('~/c/sessions/undo')
- if !isdirectory(undo_dir)
- call mkdir(undo_dir, 'p', 0755)
- endif
- let &undodir=undo_dir
- set undofile
- endif
-endif
-
-" Colorscheme.
-set termguicolors
-colo wal-gui
-
-" Cursor blink.
-"set guicursor=a:blinkon1
-
-" Highlight whitespace.
-au BufEnter * match ExtraWhitespace /\s\+$/
-au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
-au InsertLeave * match ExtraWhitespace /\s\+$/
-
-" Fzf format.
-let g:fzf_colors = {
- \'fg': ['fg', 'Normal'],
- \'bg': ['bg', 'Normal'],
- \'hl': ['fg', 'Type'],
- \'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'],
- \'bg+': ['bg', 'CursorLine', 'CursorColumn'],
- \'hl+': ['fg', 'Type'],
- \'info': ['fg', 'PreProc'],
- \'border': ['fg', 'Operator'],
- \'prompt': ['fg', 'Identifier'],
- \'pointer': ['fg', 'Type'],
- \'marker': ['fg', 'Keyword'],
- \'spinner': ['fg', 'String'],
- \'header': ['fg', 'Type']
-\}
-let g:fzf_preview_window = ['right,55%']
-" This is redundant but I want to keep FZF_DEFAULT_OPTS here.
-let $FZF_DEFAULT_OPTS = '--preview-window=border-sharp'
-let g:fzf_layout = {
- \'window': { 'width': 0.75, 'height': 0.60, 'rounded': 0 },
-\}
-
-function! StatuslineMode() abort
- if mode() == nr2char(22)
- return mode()
- else
- return '-'.mode()
- endif
-endfunction
-
-function! StatuslineGit()
- let l:branchname = gitbranch#name()
- return strlen(l:branchname) > 0 ? ' '.l:branchname.' ' : ' '
-endfunction
-
-function! StatuslineLsp() abort
- return luaeval('get_lsp_name()')
-endfunction
-
-" Custom statusline.
-function! Statusline() abort
- let focused = g:statusline_winid == win_getid(winnr())
- let status = focused ? '%#StatusLine#' : '%#StatusLineNC#'
- let status .= '%{StatuslineGit()}'
- let status .= ' %f'
- let status .= ' vim@%{hostname()}'
- let status .= '%='
- let status .= ' %y'
- let status .= '%{StatuslineLsp()}'
- let status .= ' %{&fileencoding}'
- let status .= '[%{&fileformat}]'
- let status .= '%3p%%'
- let status .= ' %3l:%-3c'
- return status
-endfunction
-set statusline=%!Statusline()
-
-" Make shift + nav keys no-ops.
-nmap H <nop>
-nmap J <nop>
-nmap K <nop>
-nmap L <nop>
-" Normal mode tab no-op.
-nmap <Tab> <nop>
-" ctrl + c no-op.
-nmap <C-c> <nop>
-" Disable F1 for help.
-nmap <F1> <nop>
-" Disable q: for histroy.
-nmap q: <nop>
-" Simplify split movement.
-nmap <silent> <C-h> :wincmd h<CR>
-nmap <silent> <C-j> :wincmd j<CR>
-nmap <silent> <C-k> :wincmd k<CR>
-nmap <silent> <C-l> :wincmd l<CR>
-nmap <silent> <C-o> :vsplit<CR>
-" Make ctrl + '.' and ',' map to previous buffer.
-nmap <C-,> <C-^>
-nmap <C-.> <C-^>
-" Swap ctrl + f and b.
-"nnoremap <C-b> <C-f>
-"nnoremap <C-f> <C-b>
-" Toggle colorcolumn.
-nmap <silent> C :execute 'set colorcolumn=' . (&colorcolumn == '' ? '101' : '')<CR>
-" Personally intuitive pop-up menu binds.
-inoremap <expr> <CR> pumvisible() ? '<C-y><CR>' : '<CR>'
-inoremap <expr> <Up> pumvisible() ? '<C-p>' : '<Up>'
-inoremap <expr> <Down> pumvisible() ? '<C-n>' : '<Down>'
-" Lsp Binds.
-nmap <C-d> <C-]>
-" Fzf binds.
-nmap <silent> \ :Buffers<CR>
-nmap <silent> <C-i> :GGrep<CR>
-nmap <silent> <C-\> :GFiles<CR>
-" Only Neogit bind, handle all further operations from this menu.
-nmap <silent> Y :Neogit<CR>
-nmap <silent> L :lua neogit_log_current()<CR>
-" Undotree.
-nmap <silent> U :UndotreeToggle<CR>
-" Toggle hex color highlighting.
-nnoremap <silent> # :CccHighlighterToggle<CR>
-
-command Tabify set noexpandtab | %retab! | set expandtab
-command Untabify set expandtab | %retab!
-
-" https://stackoverflow.com/a/37040415
-function! SyntaxGroup()
- let l:s = synID(line('.'), col('.'), 1)
- echo synIDattr(l:s, 'name') . ' -> ' . synIDattr(synIDtrans(l:s), 'name')
-endfun
-
-" https://vi.stackexchange.com/a/456
-function! TrimWhitespace()
- let l:save = winsaveview()
- keeppatterns %s/\s\+$//e
- call winrestview(l:save)
-endfun
-
-" https://github.com/junegunn/fzf.vim?tab=readme-ov-file#example-git-grep-wrapper
-command! -bang -nargs=* GGrep
- \ call fzf#vim#grep(
- \ 'git grep --line-number -- '.fzf#shellescape(<q-args>),
- \ fzf#vim#with_preview({'dir': systemlist('git rev-parse --show-toplevel')[0]}), <bang>0)
-
-" https://vim.fandom.com/wiki/Replace_a_builtin_command_using_cabbrev
-function! CommandCabbr(abbreviation, expansion)
- execute 'cabbr ' . a:abbreviation . ' <C-R>=getcmdpos() == 1 && getcmdtype() == ":" ? "' . a:expansion . '" : "' . a:abbreviation . '"<CR>'
-endfunction
-command! -nargs=+ CommandCabbr call CommandCabbr(<f-args>)
-CommandCabbr no nohlsearch
-
-call Juliana#Init() " Custom insert mode tab behavior inherited from Emacs.
-inoremap <silent><Tab> <C-R>=Juliana#CompleteTab('START')<CR>
- \<C-R>=Juliana#CompleteTab('TAB')<CR>
- \<C-R>=Juliana#CompleteTab('ALIGN')<CR>
- \<C-R>=Juliana#CompleteTab('NEXT')<CR>
-inoremap <silent><S-Tab> <C-R>=Juliana#CompleteSTab('PREV')<CR>
-
-lua << EOF
-function get_lsp_name()
- local active_clients = vim.lsp.get_clients({bufnr = vim.api.nvim_get_current_buf()})
- if next(active_clients) == nil then
- return ''
- else
- str = '<'
- for _, v in pairs(active_clients) do
- str = str .. v.name .. '+'
- end
- return str:sub(1, -2) .. '>'
- end
-end
-
-buf_is_big = function(bufnr)
- local max_filesize = 100 * 1024 -- 100KB
- local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(bufnr))
- if ok and stats and stats.size > max_filesize then
- return true
- else
- return false
- end
-end
-
--- LSP configs.
-if os.getenv('NIX_SHELL') ~= nil then
- vim.diagnostic.config({ virtual_text = true })
- vim.lsp.config('clangd', {
- cmd = {
- 'clangd',
- '-j=4',
- '--log=error',
- '--malloc-trim',
- '--background-index',
- '--clang-tidy',
- '--completion-style=bundled',
- '--pch-storage=memory',
- '--header-insertion=never',
- '--header-insertion-decorators=0',
- '--query-driver=gcc'
- },
- capabilities = {
- textDocument = {
- semanticHighlightingCapabilities = {
- semanticHighlighting = true
- },
- completion = {
- completionItem = {
- snippetSupport = false
- }
- }
- }
- },
- })
- vim.lsp.enable({'clangd', 'ruff', 'ty'})
- -- https://github.com/neovim/nvim-lspconfig/issues/2626#issuecomment-2117022664
- -- https://github.com/neovim/nvim-lspconfig/issues/2508
- vim.api.nvim_create_autocmd('BufReadPre', {
- callback = function(t)
- if buf_is_big(t.buf) then
- vim.o.eventignore = 'FileType'
- vim.schedule(function()
- vim.o.eventignore = ''
- print('Dropped FileType events because the buffer is too big')
- end)
- end
- end
- })
- require('inc_rename').setup({})
- vim.keymap.set('n', '<C-n>', function()
- return ':IncRename ' .. vim.fn.expand('<cword>')
- end, { expr = true })
-end
-
--- Set sessions folder and autowrite.
-if vim.fn.isdirectory(vim.fn.expand('~/c')) then
- require('mini.sessions').setup({
- autoread = false,
- autowrite = true,
- directory = '~/c/sessions'
- })
-end
-
--- Completion.
-require('mini.completion').setup({
- window = {
- info = { border = 'none' },
- signature = { border = 'none' }
- }
-})
-
--- Don't use tabs in Neogit.
-require('neogit').setup({
- disable_hint = true,
- kind = 'vsplit',
- commit_editor = { kind = 'split' },
- commit_select_view = { kind = 'vsplit' },
- commit_view = { kind = 'vsplit' },
- log_view = { kind = 'split' },
- reflog_view = { kind = 'split' },
- preview_buffer = { kind = 'split' },
- popup = { kind = 'split' },
- refs_view = { kind = 'split' },
- -- Allow basic movement in Neogit without mapping conflicts.
- mappings = {
- popup = { ['l'] = false, ['L'] = 'LogPopup', ['d'] = false },
- status = { ['$'] = false, ['#'] = 'CommandHistory' }
- },
- integrations = {}
-})
-
--- Doesn't work consistently.
-function neogit_log_current()
- require("neogit").action("log", "log_current", { "--", vim.fn.expand("%:p") })()
-end
-
--- Preview colors in #<hex> format.
-require('ccc').setup({ highlighter = { auto_enable = false, lsp = true } })
-EOF
diff --git a/files/nvim/local/autoload/Juliana.vim b/files/nvim/local/autoload/Juliana.vim
deleted file mode 100644
index 1b684b9..0000000
--- a/files/nvim/local/autoload/Juliana.vim
+++ /dev/null
@@ -1,46 +0,0 @@
-" https://github.com/neitanod/vim-clevertab
-
-function! Juliana#Init()
- let g:Juliana#has_selection = 0
- augroup JulianaPersistAu
- autocmd ModeChanged [V\x16]*:i let g:Juliana#has_selection = 1
- autocmd InsertLeave * let g:Juliana#has_selection = 0
- augroup END
-endfunction
-
-function! Juliana#CompleteTab(type)
- if a:type == "START"
- let g:Juliana#stop=0
- return ""
- endif
-
- if !g:Juliana#stop
- " Vanilla <Tab> if we are at the front of a line.
- if a:type == "TAB" && col(".") >= col("$") && !pumvisible()
- let g:Juliana#stop=1
- return "\<Tab>"
- elseif a:type == "ALIGN" && !pumvisible() " Align if !pumvisible().
- let g:Juliana#stop=1
- if g:Juliana#has_selection
- return "\<ESC>gv=i"
- else
- return "\<ESC>\<C-v>=i"
- endif
- elseif a:type == "NEXT" " If pumvisible(), goto the next result.
- let g:Juliana#stop=1
- return "\<C-n>"
- endif
- endif
-
- return ""
-endfunction
-
-function! Juliana#CompleteSTab(type)
- if a:type == "PREV"
- if pumvisible() " If pumvisible(), goto the previous result.
- return "\<C-p>"
- else
- return "\<Tab>" " <S-Tab> = <Tab>
- endif
- endif
-endfunction
diff --git a/files/nvim/mini_completion_no_title.diff b/files/nvim/mini_completion_no_title.diff
deleted file mode 100644
index e69de29..0000000
--- a/files/nvim/mini_completion_no_title.diff
+++ /dev/null
diff --git a/files/nvim/mini_starter_picture.diff b/files/nvim/mini_starter_picture.diff
deleted file mode 100644
index 2efc2a1..0000000
--- a/files/nvim/mini_starter_picture.diff
+++ /dev/null
@@ -1,288 +0,0 @@
-diff --git a/lua/mini/starter.lua b/lua/mini/starter.lua
-index 66d46a52..9b7e4397 100644
---- a/lua/mini/starter.lua
-+++ b/lua/mini/starter.lua
-@@ -138,7 +138,7 @@
- --- local timer = vim.loop.new_timer()
- --- local n_seconds = 0
- --- timer:start(0, 1000, vim.schedule_wrap(function()
----- if vim.bo.filetype ~= 'ministarter' then
-+--- if vim.bo.filetype ~= 'dashboard' then
- --- timer:stop()
- --- return
- --- end
-@@ -239,6 +239,9 @@ MiniStarter.config = {
- -- If `nil` (default), default items will be used (see |mini.starter|).
- items = nil,
-
-+ -- Empty lines at the top of the content.
-+ top_padding = 0,
-+
- -- Header to be displayed before items. Converted to single string via
- -- `tostring` (use `\n` to display several lines). If function, it is
- -- evaluated first. If `nil` (default), polite greeting will be used.
-@@ -249,6 +252,12 @@ MiniStarter.config = {
- -- evaluated first. If `nil` (default), default usage help will be shown.
- footer = nil,
-
-+ -- Amount of empty lines between items and the footer.
-+ footer_offset = 1,
-+
-+ -- Picture to show to the side of the content.
-+ picture = nil,
-+
- -- Array of functions to be applied consecutively to initial content.
- -- Each function should take and return content for Starter buffer (see
- -- |mini.starter| and |MiniStarter.get_content()| for more details).
-@@ -373,7 +382,7 @@ MiniStarter.refresh = function(buf_id)
- data.footer = H.normalize_header_footer(config.footer or H.default_footer)
-
- -- Evaluate content
-- local content = H.make_initial_content(data.header, items, data.footer)
-+ local content = H.make_initial_content(data.header, items, data.footer, config)
- local hooks = config.content_hooks or H.default_content_hooks
- for _, f in ipairs(hooks) do
- content = f(content, buf_id)
-@@ -400,6 +409,16 @@ MiniStarter.refresh = function(buf_id)
-
- -- Apply current query (clear command line afterwards)
- H.make_query(buf_id)
-+
-+ -- The picture drawn here used to get cleared at some point
-+ -- that _usually_ came before any scheduled timers fired.
-+ -- That seems to not happen anymore (nvim-0.11.1, kitty 0.42.1).
-+ H.draw_picture(config, false)
-+ --local timer = vim.loop.new_timer()
-+ --timer:start(0, 0, vim.schedule_wrap(function()
-+ -- timer:stop()
-+ -- H.draw_picture(config, false)
-+ --end))
- end
-
- --- Close Starter buffer
-@@ -729,18 +748,45 @@ MiniStarter.gen_hook.aligning = function(horizontal, vertical)
- local win_id = vim.fn.bufwinid(buf_id)
- if win_id < 0 then return end
-
-+ local config = H.get_config()
-+
- local line_strings = MiniStarter.content_to_lines(content)
-
-+ H.win_width = vim.api.nvim_win_get_width(win_id)
-+ H.win_height = vim.api.nvim_win_get_height(win_id)
-+
- -- Align horizontally
- -- Don't use `string.len()` to account for multibyte characters
- local lines_width = vim.tbl_map(function(l) return vim.fn.strdisplaywidth(l) end, line_strings)
-- local min_right_space = vim.api.nvim_win_get_width(win_id) - math.max(unpack(lines_width))
-+ -- Ignore the max line width
-+ local min_right_space = H.win_width -- - math.max(unpack(lines_width))
- local left_pad = math.max(math.floor(horiz_coef * min_right_space), 0)
-
- -- Align vertically
-- local bottom_space = vim.api.nvim_win_get_height(win_id) - #line_strings
-+ local bottom_space = H.win_height - #line_strings
- local top_pad = math.max(math.floor(vert_coef * bottom_space), 0)
-
-+ -- Position picture
-+ if config.picture ~= nil then
-+ if config.picture.width == nil then config.picture.width = 25 end
-+ if config.picture.position ~= 'right' then config.picture.position = 'left' end
-+ if config.picture.padding == nil then config.picture.padding = {} end
-+ if config.picture.padding.left == nil then config.picture.padding.left = 0 end
-+ if config.picture.padding.top == nil then config.picture.padding.top = 0 end
-+ if config.picture.padding.text == nil then config.picture.padding.text = 0 end
-+
-+ local picture_left_pad = (config.picture.width / 2.0) - config.picture.padding.left
-+
-+ left_pad = left_pad + config.picture.padding.text
-+ if config.picture.position == 'left' then
-+ H.picture_x = left_pad - picture_left_pad
-+ else
-+ H.picture_x = left_pad + picture_left_pad
-+ end
-+ if H.picture_x < 0.0 then H.picture_x = 0.0 end
-+ H.picture_y = top_pad + config.picture.padding.top + config.top_padding
-+ end
-+
- return MiniStarter.gen_hook.padding(left_pad, top_pad)(content)
- end
- end
-@@ -1003,7 +1049,7 @@ H.default_footer = [[
- Type query to filter items
- <BS> deletes latest character from query
- <Esc> resets current query
--<Down/Up>, <C-n/p>, <M-j/k> move current item
-+<C-j/k> move current item
- <CR> executes action of current item
- <C-c> closes this buffer]]
-
-@@ -1044,8 +1090,54 @@ end
-
- H.apply_config = function(config) MiniStarter.config = config end
-
-+H.is_file_readable = function(path)
-+ return vim.fn.filereadable(vim.fn.expand(path)) ~= 0
-+end
-+
-+H.draw_picture = function(config, clear)
-+ if config ~= nil then
-+ if config.picture == nil or config.picture.path == nil or not H.is_file_readable(config.picture.path) then return end
-+ else
-+ -- No picture, so nothing to clear
-+ if H.picture_x == nil or H.picture_y == nil then return end
-+ end
-+ local cmd = ''
-+ if clear and not config.picture.kitty then
-+ cmd = ('for i in $(seq %d %d); do tput cup $i 0 && tput el; done'):format(0, H.win_height - 1)
-+ else
-+ cmd = ('chafa %s --align left,top -s %dx%d 2>&1'):format(config.picture.path, config.picture.width, (H.win_height - 2) - H.picture_y)
-+ end
-+ -- Resizing will not clear on non-kitty mode
-+ local output = ''
-+ if config.picture.kitty then
-+ output = output .. '\027_Ga=d\027\\'
-+ end
-+ if not clear or not config.picture.kitty then
-+ local handle = io.popen(cmd)
-+ output = output .. handle:read('*a')
-+ -- `rc` doesn't work when run from inside vim (last tested in neovim-0.9)
-+ local rc = {handle:close()}
-+ end
-+ local tty, err = io.open('/proc/self/fd/0', 'wb')
-+ if tty then
-+ tty:write('\x1b[s')
-+ if not clear then
-+ tty:write(('\x1b[%d;%dH'):format(H.picture_y, H.picture_x))
-+ elseif not config.picture.kitty then
-+ tty:write('\x1b[48;5;0m')
-+ end
-+ tty:write(output)
-+ if not clear then
-+ tty:write('\x1b[u')
-+ end
-+ tty:close()
-+ else
-+ H.echo('Error opening tty: ' .. err)
-+ end
-+end
-+
- H.create_autocommands = function(config)
-- local gr = vim.api.nvim_create_augroup('MiniStarter', {})
-+ H.augroup = vim.api.nvim_create_augroup('MiniStarter', {})
-
- if config.autoopen then
- local on_vimenter = function()
-@@ -1057,7 +1149,7 @@ H.create_autocommands = function(config)
- vim.cmd('noautocmd lua MiniStarter.open()')
- end
-
-- local au_opts = { group = gr, nested = true, once = true, callback = on_vimenter, desc = 'Open on VimEnter' }
-+ local au_opts = { group = H.augroup, nested = true, once = true, callback = on_vimenter, desc = 'Open on VimEnter' }
- vim.api.nvim_create_autocmd('VimEnter', au_opts)
- end
-
-@@ -1103,9 +1195,11 @@ H.normalize_header_footer = function(x)
- end
-
- -- Work with buffer content ---------------------------------------------------
--H.make_initial_content = function(header, items, footer)
-+H.make_initial_content = function(header, items, footer, config)
- local content = {}
-
-+ H.content_add_empty_lines(content, config.top_padding)
-+
- -- Add header lines
- for _, l in ipairs(header) do
- H.content_add_line(content, { H.content_unit(l, 'header', 'MiniStarterHeader') })
-@@ -1116,7 +1210,7 @@ H.make_initial_content = function(header, items, footer)
- H.content_add_items(content, items)
-
- -- Add footer lines
-- H.content_add_empty_lines(content, #footer > 0 and 1 or 0)
-+ H.content_add_empty_lines(content, #footer > 0 and config.footer_offset or 0)
- for _, l in ipairs(footer) do
- H.content_add_line(content, { H.content_unit(l, 'footer', 'MiniStarterFooter') })
- end
-@@ -1319,11 +1413,23 @@ H.make_buffer_autocmd = function(buf_id)
- au('VimResized', function() MiniStarter.refresh(buf_id) end, 'Refresh')
- au('CursorMoved', function() H.position_cursor_on_current_item(buf_id) end, 'Position cursor')
-
-+ local config = H.get_config()
-+
- local cache_showtabline = vim.o.showtabline
- au('BufLeave', function()
- if vim.o.cmdheight > 0 then vim.cmd("echo ''") end
- if vim.o.showtabline == 1 then vim.o.showtabline = cache_showtabline end
-+ H.draw_picture(config, true)
- end, 'On BufLeave')
-+
-+ au('BufEnter', function()
-+ H.draw_picture(config, false)
-+ --local timer = vim.loop.new_timer()
-+ --timer:start(0, 0, vim.schedule_wrap(function()
-+ -- timer:stop()
-+ -- H.draw_picture(config, false)
-+ --end))
-+ end, 'On BufEnter')
- end
-
- H.apply_buffer_options = function(buf_id)
-@@ -1336,7 +1442,7 @@ H.apply_buffer_options = function(buf_id)
- vim.api.nvim_feedkeys('\28\14', 'nx', false)
-
- -- Having `noautocmd` is crucial for performance: ~9ms without it, ~1.6ms with it
-- vim.cmd('noautocmd silent! set filetype=ministarter')
-+ vim.cmd('noautocmd silent! set filetype=dashboard')
-
- local options = {
- -- Taken from 'vim-startify'
-@@ -1383,12 +1489,8 @@ H.apply_buffer_mappings = function(buf_id)
-
- buf_keymap('<CR>', 'MiniStarter.eval_current_item()')
-
-- buf_keymap('<Up>', [[MiniStarter.update_current_item('prev')]])
-- buf_keymap('<C-p>', [[MiniStarter.update_current_item('prev')]])
-- buf_keymap('<M-k>', [[MiniStarter.update_current_item('prev')]])
-- buf_keymap('<Down>', [[MiniStarter.update_current_item('next')]])
-- buf_keymap('<C-n>', [[MiniStarter.update_current_item('next')]])
-- buf_keymap('<M-j>', [[MiniStarter.update_current_item('next')]])
-+ buf_keymap('<C-k>', [[MiniStarter.update_current_item('prev')]])
-+ buf_keymap('<C-j>', [[MiniStarter.update_current_item('next')]])
-
- -- Make all special symbols to update query
- for _, key in ipairs(vim.split(H.get_config().query_updaters, '')) do
-@@ -1464,21 +1566,21 @@ H.is_something_shown = function()
- end
-
- -- Utilities ------------------------------------------------------------------
--H.error = function(msg) error('(mini.starter) ' .. msg, 0) end
-+H.error = function(msg) error('' .. msg, 0) end
-
- H.check_type = function(name, val, ref, allow_nil)
- if type(val) == ref or (ref == 'callable' and vim.is_callable(val)) or (allow_nil and val == nil) then return end
- H.error(string.format('`%s` should be %s, not %s', name, ref, type(val)))
- end
-
--H.set_buf_name = function(buf_id, name) vim.api.nvim_buf_set_name(buf_id, 'ministarter://' .. buf_id .. '/' .. name) end
-+H.set_buf_name = function(buf_id, name) vim.api.nvim_buf_set_name(buf_id, '*dashboard*') end
-
- H.echo = function(msg, is_important)
- if H.get_config().silent then return end
-
- -- Construct message chunks
- msg = type(msg) == 'string' and { { msg } } or msg
-- table.insert(msg, 1, { '(mini.starter) ', 'WarningMsg' })
-+ table.insert(msg, 1, { '', 'Warning' })
-
- -- Avoid hit-enter-prompt
- local max_width = vim.o.columns * math.max(vim.o.cmdheight - 1, 0) + vim.v.echospace
-@@ -1527,7 +1629,7 @@ H.eval_fun_or_string = function(x, string_as_cmd)
- if type(x) == 'function' then return x() end
- if type(x) == 'string' then
- if string_as_cmd then
-- vim.cmd(x)
-+ pcall(function() vim.cmd(x) end)
- else
- return x
- end