diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..2f80a1c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,84 @@ +# Changelog + +## Unreleased + +### Added +- `:ChopsticksStatus` diagnostic command — checks system tools, LSP servers, linters, formatters + +## 2.1.0 — 2025-04-22 + +### Added +- Cheat sheet (`,?`) — vertical sidebar, one key per line, section headers +- Previm markdown preview restored (lazy-loaded, `,mp`) +- `:LspInstallServer` added to cheat sheet + +### Changed +- Plugin count: 25 (restored previm, dropped 5 bloat plugins) +- QUICKSTART updated — removed stale references, improved first-launch guidance + +## 2.0.0 — 2025-04-21 + +### Added +- Sidebar toggle (`,e` / `,E`) — left-side netrw with `topleft vertical`, winfixwidth, proper toggle +- Enriched statusline — SLMode, SLGit, SLAle, SLFlags +- Toggle feedback — F2/F3/F4/F6/`,ss` echo current state +- `vim .` layout — netrw left + Startify right, proper proportions +- Interactive tutorial (`:ChopsticksLearn`) + +### Removed (Unix minimalism refactor) +- **565 lines** of dead code and bloat +- 5 plugins: Goyo, Limelight, vim-obsession, indentLine, vim-unimpaired +- `modules/writing.vim` — folded into `languages.vim` +- `tutor/chopsticks.tutor` — removed (269 lines) +- Tab management keybindings (8 mappings), spell nav bindings (4 mappings) +- Dead functions: HasPaste(), CleanExtraSpaces(), ToggleNumber(), SynStack +- TTY welcome message, `,so`, `,ms`, `,sh` mappings + +### Changed +- CI plugin threshold lowered to 20 +- README: hero layout with demo GIF, badges, architecture diagram +- vim-markdown settings absorbed from writing.vim into languages.vim + +## 1.3.0 — 2025-04-20 + +### Changed +- Startup: 39ms → 19ms (51% faster) +- Dropped vim-unimpaired for performance +- Runtime tuning across modules + +## 1.2.0 — 2025-04-19 + +### Added +- Hero README with demo GIF, CI badges +- GitHub Actions CI (startup test on macOS + Ubuntu, shellcheck) +- Issue/PR templates + +### Changed +- Documentation rewrite — clean, short, for engineers + +## 1.1.0 — 2025-04-18 + +### Added +- 12-module architecture (env → plugins → core → ui → editing → navigation → lsp → lint → git → writing → languages → tools) +- Zen mode (Goyo + Limelight) +- Run file (`,cr`) with auto filetype detection +- Smart search (SmartFiles, Rg, RgWord) +- EasyMotion, yank highlight, undo tree +- Robust installer (`get.sh`) with preflight checks + +### Changed +- `.vimrc` split into 12 self-contained modules +- Comprehensive bug audit (14 fixes) + +## 1.0.0 — 2025-04-16 + +### Added +- Initial Vim configuration — migrated from Neovim +- vim-plug plugin manager +- vim-lsp + asyncomplete (pure VimScript LSP) +- ALE linting + format-on-save +- FZF fuzzy finder +- Fugitive + GitGutter +- Solarized colorscheme +- TTY detection and graceful degradation +- Platform installer (macOS, Debian, Arch, Fedora) diff --git a/modules/tools.vim b/modules/tools.vim index 1793f29..4efca84 100644 --- a/modules/tools.vim +++ b/modules/tools.vim @@ -114,6 +114,95 @@ augroup END nnoremap ]q :cnext nnoremap [q :cprev +" ── Status Diagnostic (:ChopsticksStatus) ─────────────────────────────────── + +function! s:Check(name, cmd) abort + return executable(a:cmd) ? ' OK ' . a:name : ' -- ' . a:name . ' (missing: ' . a:cmd . ')' +endfunction + +function! s:LspCheck(ft, server) abort + if !exists('*lsp#get_server_names') + return ' -- ' . a:ft . ' (vim-lsp not loaded)' + endif + let l:dir = expand('~/.local/share/vim-lsp-settings/servers/' . a:server) + if isdirectory(l:dir) + return ' OK ' . a:ft . ' (' . a:server . ')' + endif + return ' -- ' . a:ft . ' (:LspInstallServer in a ' . a:ft . ' file)' +endfunction + +function! s:ChopsticksStatus() abort + let l:lines = [] + call add(l:lines, 'chopsticks status') + call add(l:lines, repeat('─', 50)) + call add(l:lines, '') + + call add(l:lines, '── system tools ──') + call add(l:lines, s:Check('fzf', 'fzf')) + call add(l:lines, s:Check('ripgrep', 'rg')) + call add(l:lines, s:Check('git', 'git')) + call add(l:lines, s:Check('curl', 'curl')) + call add(l:lines, s:Check('node', 'node')) + call add(l:lines, s:Check('python3', 'python3')) + call add(l:lines, s:Check('go', 'go')) + call add(l:lines, '') + + call add(l:lines, '── lsp servers ── (:LspInstallServer to install)') + call add(l:lines, s:LspCheck('python', 'pylsp')) + call add(l:lines, s:LspCheck('go', 'gopls')) + call add(l:lines, s:LspCheck('rust', 'rust-analyzer')) + call add(l:lines, s:LspCheck('typescript', 'typescript-language-server')) + call add(l:lines, s:LspCheck('c/c++', 'clangd')) + call add(l:lines, s:LspCheck('bash', 'bash-language-server')) + call add(l:lines, s:LspCheck('html', 'vscode-html-language-server')) + call add(l:lines, s:LspCheck('json', 'vscode-json-language-server')) + call add(l:lines, s:LspCheck('yaml', 'yaml-language-server')) + call add(l:lines, s:LspCheck('markdown', 'marksman')) + call add(l:lines, s:LspCheck('sql', 'sqls')) + call add(l:lines, '') + + call add(l:lines, '── linters ──') + call add(l:lines, s:Check('flake8 (python)', 'flake8')) + call add(l:lines, s:Check('pylint (python)', 'pylint')) + call add(l:lines, s:Check('eslint (js/ts)', 'eslint')) + call add(l:lines, s:Check('staticcheck (go)', 'staticcheck')) + call add(l:lines, s:Check('shellcheck (sh)', 'shellcheck')) + call add(l:lines, s:Check('yamllint (yaml)', 'yamllint')) + call add(l:lines, s:Check('hadolint (docker)', 'hadolint')) + call add(l:lines, s:Check('markdownlint (md)', 'markdownlint')) + call add(l:lines, '') + + call add(l:lines, '── formatters ── (format-on-save is ON)') + call add(l:lines, s:Check('black (python)', 'black')) + call add(l:lines, s:Check('isort (python)', 'isort')) + call add(l:lines, s:Check('prettier (js/ts/json/md)', 'prettier')) + call add(l:lines, s:Check('goimports (go)', 'goimports')) + call add(l:lines, s:Check('rustfmt (rust)', 'rustfmt')) + call add(l:lines, s:Check('clang-format (c)', 'clang-format')) + call add(l:lines, '') + + let l:ok = len(filter(copy(l:lines), 'v:val =~# " OK "')) + let l:miss = len(filter(copy(l:lines), 'v:val =~# " -- "')) + call add(l:lines, repeat('─', 50)) + call add(l:lines, ' ' . l:ok . ' ready, ' . l:miss . ' missing') + call add(l:lines, '') + call add(l:lines, ' Install missing tools with ./install.sh') + call add(l:lines, ' Install LSP servers with :LspInstallServer') + + let l:name = '__ChopsticksStatus__' + if bufwinnr(l:name) > 0 + execute bufwinnr(l:name) . 'wincmd w | bd' + endif + execute 'botright new ' . l:name + resize 45 + setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile + setlocal nowrap nonumber norelativenumber signcolumn=no + call setline(1, l:lines) + setlocal nomodifiable readonly + nnoremap q :bd +endfunction +command! ChopsticksStatus call s:ChopsticksStatus() + " ── Cheat Sheet (,?) ──────────────────────────────────────────────────────── function! s:CheatSheet() abort