diff --git a/.gitignore b/.gitignore index 11f287f..b1a4e2a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ *.json !coc-settings.json +*.swp +*.swo +.DS_Store +Session.vim diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d327e3a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,85 @@ +# Changelog + +All notable changes to chopsticks are documented here. + +--- + +## [1.0.0] - 2026-03-29 + +First stable release. Full-stack engineering environment out of the box — automatic +installation, tiered LSP, TTY fallback, and coverage for 14 languages. + +### Added +- **Arch Linux support** in `install.sh` — pacman branch for all system tools +- **`hadolint`** added to system tools installation (Dockerfile linting) +- **`staticcheck`** added to Go tools (replaces archived `golint`) +- **`yamllint`** added to pip tools (YAML linting) +- **`coc-settings.json`** — configures `marksman` as Markdown LSP for CoC via + `languageserver` entry; symlinked automatically by `install.sh` +- **pip3 bootstrap** in `install.sh` — auto-installs pip3 when python3 is present + but pip3 is absent (common on Ubuntu minimal images) +- **9 named augroups** in `.vimrc` — all loose `autocmd` statements now wrapped + with `autocmd!` to prevent doubling on `:source $MYVIMRC`: + `ChopstickTabHistory`, `ChopstickResize`, `ChopstickStdin`, `CocHighlight`, + `ChopstickCleanup`, `ChopstickFiletype`, `ChopstickTTYLargeFile`, + `ChopstickWhichKey`, `ChopstickStartify` +- **TTY-safe plugin install** — `vim +PlugInstall +qall ` in special buffers) — all `` usages guarded + with `!empty(expand(''))` and `empty(&buftype)` checks +- **`g:go_def_mode` conflict** — now conditional: uses `gopls` when CoC active, + `godef` when vim-lsp active (avoids error when gopls is disabled) +- **vim startup UX** — NERDTree + Startify layout for `vim .` and bare `vim` +- **`coc-marksman` silent failure** — package does not exist on npm; replaced with + native `languageserver` configuration in `coc-settings.json` +- **CoC startup warning** in no-node environments — `g:coc_start_at_startup = 0` + and `g:coc_disable_startup_warning = 1` set when `g:use_coc = 0` + +--- + +## [0.9.0] - 2026-02-21 + +### Added +- **Full-stack language coverage** — LSP, lint, and format for: Python, + JavaScript, TypeScript, Go, Rust, Shell, YAML, HTML, CSS/SCSS, Less, + JSON, Markdown, SQL, Dockerfile +- **`install.sh` overhaul** — automated installation of system tools, npm tools, + pip tools, Go tools, and CoC language server extensions with platform detection + and interactive prompts; `--yes` flag for non-interactive mode +- **vim-startify** startup screen with dynamic header (version, cwd, git branch) +- **vim-which-key** keybinding popup on `,` + 500ms pause +- **Startup layout** — `vim .` opens NERDTree left + Startify right; bare `vim` + opens Startify with NERDTree alongside +- **Session management** via vim-obsession + vim-prosession +- **Large file handling** — syntax and undo disabled for files > 10 MB +- **Project-local config** — `.vimrc` in project root auto-loaded via `set exrc` +- **Persistent undo** — `~/.vim/.undo/` with `undolevels=1000` + +### Changed +- Tiered LSP backend: CoC (Node.js) preferred, vim-lsp (no Node.js) as fallback +- All CoC and vim-lsp keybindings unified (`gd`, `K`, `[g`/`]g`, `,rn`, `,ca`) +- ALE `fix_on_save` disabled when vim-lsp active (prevents double-format) +- NERDTree autocmd wrapped in `augroup NERDTreeAutoClose` + +### Fixed +- Multiple leader key conflicts resolved (`,ad`, `,cd`, `,cp`, `,sp`, `,t`) +- CtrlP removed (redundant with FZF) +- Duplicate `set` options cleaned up +- `A` dead mapping (no alternate-file plugin) removed + +--- + +## [0.1.0] - 2024 + +Initial release — base Vim configuration with vim-plug, basic plugins, and +TTY/non-TTY detection. diff --git a/QUICKSTART.md b/QUICKSTART.md index d9349fd..0b01fb2 100644 --- a/QUICKSTART.md +++ b/QUICKSTART.md @@ -2,6 +2,8 @@ Five minutes from zero to a working Vim engineering environment. +--- + ## Step 1: Install ```bash @@ -9,8 +11,15 @@ git clone https://github.com/m1ngsama/chopsticks.git ~/.vim cd ~/.vim && ./install.sh ``` -The script handles everything: symlinks, vim-plug, plugin download. -No root access required. +The script handles everything: symlinks, vim-plug, plugins, and all tools. +It detects your OS (macOS/Debian/Arch/Fedora) and installs what it can automatically. + +**Non-interactive (CI / server):** +```bash +./install.sh --yes +``` + +--- ## Step 2: Open Vim @@ -18,15 +27,23 @@ No root access required. vim ``` -The startup screen shows recent files and sessions. Press `q` to dismiss -or just start typing a filename to open. +The startup screen (vim-startify) shows recent files and sessions. +Press `Ctrl+p` to find a file, or just type a path. -## Step 3: Install LSP (pick one path) +To open a project: +```bash +vim . # NERDTree on left, Startify on right +vim myfile # opens file directly +``` -### Path A: With Node.js (full CoC) +--- + +## Step 3: Set Up LSP (pick your path) + +### Path A: With Node.js (CoC — full LSP) ```bash -node --version # confirm >= 14.14 +node --version # must be >= 14.14 ``` Inside Vim, install language servers for your stack: @@ -35,80 +52,75 @@ Inside Vim, install language servers for your stack: :CocInstall coc-pyright coc-tsserver coc-go coc-rust-analyzer ``` -### Path B: Without Node.js (vim-lsp) +Or let `install.sh` do it — it asks during setup. -Open a file of your language, then run: +### Path B: Without Node.js (vim-lsp — no dependencies) + +Open a source file, then run: ```vim :LspInstallServer ``` -This auto-detects and installs the correct language server binary. +This auto-detects and installs the correct language server for the current filetype. + +--- + +## The 10 Keys That Matter + +``` +, (pause 500ms) Show all shortcuts +Ctrl+p Fuzzy find file +Ctrl+n Toggle file tree +gd Go to definition +K Show documentation +[g / ]g Prev / next diagnostic +,rn Rename symbol +,rg Search project contents +,gs Git status +,w / ,q Save / Quit +``` --- ## Daily Use -### The 10 keys that matter most +### Navigate Code + +| Key | Action | +|-----|--------| +| `gd` | Go to definition | +| `gy` | Go to type definition | +| `gi` | Go to implementation | +| `gr` | List all references | +| `K` | Show docs for symbol under cursor | +| `Ctrl+o` | Jump back | +| `Ctrl+i` | Jump forward | + +### Edit Code + +| Key | Action | +|-----|--------| +| `Tab` | Select next completion item | +| `Enter` | Confirm completion | +| `gc` | Toggle comment (visual mode too) | +| `cs"'` | Change surrounding `"` to `'` | +| `ds(` | Delete surrounding `(` | +| `s`+2ch | EasyMotion: jump anywhere | + +### Manage Errors + +| Key | Action | +|-----|--------| +| `]g` | Jump to next diagnostic | +| `[g` | Jump to previous diagnostic | +| `K` | Read the error message | +| `,ca` | Apply code action / auto-fix | + +### Git Workflow ``` -,w Save -,q Quit -Ctrl+n File tree -Ctrl+p Fuzzy find file -gd Go to definition -K Show docs -[g ]g Prev/next diagnostic -,rn Rename symbol -,gs Git status -, (pause 500ms) Show all shortcuts -``` - -### Open a project - -```bash -cd ~/my-project && vim -``` - -NERDTree auto-opens when you launch Vim on a directory. Use `Ctrl+p` to -fuzzy-search files by name. Use `,rg` to search file contents. - -### Navigate code - -| Key | Action | -|-------|---------------------------------| -| `gd` | Go to definition | -| `gy` | Go to type definition | -| `gi` | Go to implementation | -| `gr` | List all references | -| `K` | Show docs for symbol under cursor | -| `Ctrl+o` | Jump back | -| `Ctrl+i` | Jump forward | - -### Edit code - -| Key | Action | -|---------|-------------------------------------| -| `Tab` | Select next completion item | -| `Enter` | Confirm completion | -| `gc` | Toggle comment (works in visual mode too) | -| `cs"'` | Change surrounding `"` to `'` | -| `ds(` | Delete surrounding `(` | -| `s`+2ch | EasyMotion: jump anywhere | - -### Manage errors - -| Key | Action | -|--------|-------------------------------| -| `]g` | Jump to next diagnostic | -| `[g` | Jump to previous diagnostic | -| `K` | Read the error message | -| `,ca` | Apply code action / auto-fix | - -### Git workflow - -``` -,gs git status (stage files with 's', commit with 'cc') +,gs git status (stage with 's', commit with 'cc') ,gd diff current file ,gb blame current file ,gc commit @@ -118,37 +130,45 @@ fuzzy-search files by name. Use `,rg` to search file contents. --- -## Common Workflows +## Language Workflows -### Python project +### Python ```bash +# tools installed by install.sh; or manually: pip install black flake8 pylint isort -vim my_script.py ``` -Auto-formats with black on save. Lint errors show in the sign column as -`X` (error) and `!` (warning). Jump between them with `[g` / `]g`. +Auto-formats with `black` + `isort` on save. Lint errors show as `X`/`!` in the sign column. -### JavaScript / TypeScript project +### JavaScript / TypeScript ```bash npm install -g prettier eslint typescript -vim src/index.ts ``` -Auto-formats with prettier on save. Use `:CocInstall coc-tsserver` for -full IntelliSense (requires Node.js). +Auto-formats with `prettier` on save. -### Go project +### Go ```bash +# tools installed by install.sh; or manually: go install golang.org/x/tools/gopls@latest -vim main.go +go install golang.org/x/tools/cmd/goimports@latest +go install honnef.co/go/tools/cmd/staticcheck@latest ``` -gofmt runs on save automatically. `gd` jumps to definitions even across -package boundaries when gopls is running. +`gofmt` + `goimports` run on save automatically. + +### Markdown + +Install `marksman` for LSP support (completions, link checking): + +```bash +brew install marksman # macOS +sudo pacman -S marksman # Arch +# or: ./install.sh (handles it automatically) +``` --- @@ -160,16 +180,26 @@ Edit config live: ,sv " reloads config without restarting ``` -Per-project overrides: create `.vimrc` in your project root. +Per-project settings: create `.vimrc` in your project root. +```vim +" project/.vimrc +set shiftwidth=2 +let g:ale_python_black_options = '--line-length=100' +``` + +Change color scheme in `~/.vimrc`: +```vim +colorscheme dracula " or: gruvbox, solarized, onedark +``` --- -## Quick Reference +## Quick Reference Card ``` FILES Ctrl+n File tree toggle - Ctrl+p Fuzzy find file + Ctrl+p Fuzzy find file (git-aware) ,b Search open buffers ,rg Search file contents (ripgrep) ,w Save | ,q Quit | ,x Save+quit @@ -185,8 +215,8 @@ CODE ,F Format whole file GIT - ,gs Status | ,gd Diff | ,gb Blame - ,gc Commit | ,gp Push | ,gl Pull + ,gs Status | ,gd Diff | ,gb Blame + ,gc Commit | ,gp Push | ,gl Pull WINDOWS Ctrl+h/j/k/l Move between panes @@ -198,8 +228,7 @@ WINDOWS SEARCH /text Search forward ?text Search backward - , Clear search highlight - ,* Replace word under cursor (project) + ,* Replace word under cursor (project-wide) ``` --- diff --git a/README.md b/README.md index ae1eb69..fe1694c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ -# chopsticks - Vim Configuration +# chopsticks — Vim Configuration -A native Vim configuration optimized for engineering workflows. Designed for -Vim 8.0+ with automatic fallbacks for minimal environments (TTY, no Node.js). +A native Vim configuration optimized for full-stack engineering workflows. +Vim 8.0+ · Tiered LSP · TTY-aware · Zero icon fonts · 14 languages. -## Quick Install +[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) +[![Vim 8.0+](https://img.shields.io/badge/Vim-8.0%2B-brightgreen.svg)](https://www.vim.org/) ```bash git clone https://github.com/m1ngsama/chopsticks.git ~/.vim @@ -16,30 +17,31 @@ See [QUICKSTART.md](QUICKSTART.md) for the 5-minute guide. ## Design Principles -- **KISS**: No icon fonts, no unicode glyphs, plain ASCII throughout -- **Tiered LSP**: CoC (full) with vim-lsp fallback - works with or without Node.js -- **TTY-aware**: Automatic detection and optimization for console environments -- **Engineering-first**: Git workflow, session management, project-local config +- **KISS** — No icon fonts, no unicode glyphs, plain ASCII throughout +- **Tiered LSP** — CoC (full) with vim-lsp fallback; works with or without Node.js +- **TTY-aware** — Automatic detection and optimization for console/SSH environments +- **Engineering-first** — Git workflow, session management, project-local config +- **Batteries included** — `install.sh` handles all dependencies automatically --- ## Requirements -| Requirement | Minimum | Notes | -|----------------|-------------|--------------------------------| -| Vim | 8.0+ | vim9script not required | -| git | any | For cloning and fugitive | -| curl | any | For vim-plug auto-install | -| Node.js | 14.14+ | Optional, enables CoC LSP | -| ripgrep (rg) | any | Optional, enables :Rg search | -| fzf | any | Optional, enables :Files/:GFiles | -| ctags | any | Optional, enables :TagbarToggle | +| Requirement | Minimum | Notes | +|-------------|---------|-------| +| Vim | 8.0+ | vim9script not required | +| git | any | For cloning and fugitive | +| curl | any | For vim-plug auto-install | +| Node.js | 14.14+ | Optional — enables CoC LSP | +| ripgrep (rg) | any | Optional — enables `:Rg` search | +| fzf | any | Optional — enables `Ctrl+p` fuzzy search | +| ctags | any | Optional — enables `F8` tag browser | --- ## Installation -### Automatic +### Automatic (recommended) ```bash git clone https://github.com/m1ngsama/chopsticks.git ~/.vim @@ -47,22 +49,30 @@ cd ~/.vim ./install.sh ``` -The script: -1. Checks for a working Vim installation -2. Backs up your existing `~/.vimrc` if present -3. Creates a symlink: `~/.vimrc -> ~/.vim/.vimrc` -4. Installs vim-plug -5. Runs `:PlugInstall` to download all plugins -6. Optionally installs CoC language servers (if Node.js is available) +The installer: +1. Checks Vim version and detects OS / package managers +2. Backs up any existing `~/.vimrc` (timestamped) +3. Creates symlinks: `~/.vimrc -> ~/.vim/.vimrc` and `~/.vim/coc-settings.json` +4. Installs vim-plug and runs `:PlugInstall` +5. Optionally installs system tools, language tools, and CoC extensions + +Supported platforms: **macOS** (Homebrew), **Debian/Ubuntu** (apt), **Arch Linux** (pacman), **Fedora** (dnf). + +Use `--yes` for non-interactive / CI environments: + +```bash +./install.sh --yes +``` ### Manual ```bash git clone https://github.com/m1ngsama/chopsticks.git ~/.vim ln -sf ~/.vim/.vimrc ~/.vimrc +ln -sf ~/.vim/coc-settings.json ~/.vim/coc-settings.json curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim -vim +PlugInstall +qall +vim +PlugInstall +qall rn`, `ca`). +Both backends expose identical key mappings: `gd`, `K`, `[g`, `]g`, `rn`, `ca`. ### CoC setup (with Node.js) @@ -90,12 +100,16 @@ Install language server extensions from inside Vim: :CocInstall coc-rust-analyzer " Rust :CocInstall coc-json coc-yaml " JSON, YAML :CocInstall coc-html coc-css " HTML, CSS -:CocInstall coc-marksman " Markdown +:CocInstall coc-sh " Shell :CocInstall coc-sql " SQL ``` `install.sh` installs all of the above automatically when prompted. +**Markdown LSP** — `marksman` is configured via `coc-settings.json` (not a CoC +extension — install `marksman` binary via `brew install marksman` or download from +[releases](https://github.com/artempyanykh/marksman/releases)). + ### vim-lsp setup (without Node.js) Install language server binaries for your languages, then run: @@ -104,8 +118,8 @@ Install language server binaries for your languages, then run: :LspInstallServer " auto-installs the right server for the current filetype ``` -Supported languages: Python, Go, Rust, TypeScript, JavaScript, Shell, -HTML, CSS/SCSS, JSON, YAML, Markdown, SQL — via `vim-lsp-settings`. +Supported languages: Python, Go, Rust, TypeScript, JavaScript, Shell, HTML, +CSS/SCSS, JSON, YAML, Markdown, SQL — via `vim-lsp-settings`. --- @@ -117,148 +131,144 @@ Press `,` and wait 500ms for an interactive guide to all bindings (vim-which-key ### Files and Buffers -| Key | Action | -|------------|-------------------------------------| -| `Ctrl+n` | Toggle file tree (NERDTree) | -| `,n` | Reveal current file in NERDTree | -| `Ctrl+p` | Fuzzy file search (FZF) | -| `,b` | Search open buffers (FZF) | -| `,rg` | Project-wide search (ripgrep+FZF) | -| `,rt` | Search tags (FZF) | -| `,gF` | Search git-tracked files (FZF) | -| `,l` | Next buffer | -| `,h` | Previous buffer | -| `,bd` | Close current buffer | -| `,,` | Switch to last file | +| Key | Action | +|-----|--------| +| `Ctrl+n` | Toggle file tree (NERDTree) | +| `,n` | Reveal current file in NERDTree | +| `Ctrl+p` | Fuzzy file search (FZF — git-aware) | +| `,b` | Search open buffers (FZF) | +| `,rg` | Project-wide search (ripgrep+FZF) | +| `,rt` | Search tags (FZF) | +| `,gF` | Search git-tracked files (FZF) | +| `,l` | Next buffer | +| `,h` | Previous buffer | +| `,bd` | Close current buffer | +| `,,` | Switch to last file | ### Windows and Tabs -| Key | Action | -|--------------|---------------------------------| -| `Ctrl+h/j/k/l` | Navigate between windows | -| `=` | Increase window height | -| `-` | Decrease window height | -| `+` | Increase window width | -| `_` | Decrease window width | -| `,tn` | New tab | -| `,tc` | Close tab | -| `,tl` | Toggle to last tab | +| Key | Action | +|-----|--------| +| `Ctrl+h/j/k/l` | Navigate between windows | +| `=` | Increase window height | +| `-` | Decrease window height | +| `+` | Increase window width | +| `_` | Decrease window width | +| `,tn` | New tab | +| `,tc` | Close tab | +| `,tl` | Toggle to last tab | ### Code Intelligence (CoC / vim-lsp) -| Key | Action | -|-------------|---------------------------------| -| `gd` | Go to definition | -| `gy` | Go to type definition | -| `gi` | Go to implementation | -| `gr` | Show references | -| `K` | Hover documentation | -| `[g` | Previous diagnostic | -| `]g` | Next diagnostic | -| `,rn` | Rename symbol | -| `,f` | Format selection | -| `,ca` | Code action (cursor) | -| `,qf` | Quick-fix current line (CoC) | -| `,cl` | Run code lens (CoC) | -| `,o` | File outline | -| `,ws` | Workspace symbols | -| `,cD` | Diagnostics list | -| `,cr` | Resume last CoC list | -| `Tab` | Next completion item | -| `Shift+Tab` | Previous completion item | -| `Enter` | Confirm completion | +| Key | Action | +|-----|--------| +| `gd` | Go to definition | +| `gy` | Go to type definition | +| `gi` | Go to implementation | +| `gr` | Show references | +| `K` | Hover documentation | +| `[g` | Previous diagnostic | +| `]g` | Next diagnostic | +| `,rn` | Rename symbol | +| `,f` | Format selection | +| `,ca` | Code action (cursor) | +| `,o` | File outline | +| `,ws` | Workspace symbols | +| `,cD` | Diagnostics list | +| `,cr` | Resume last CoC list | +| `,qf` | Quick-fix current line (CoC) | +| `,cl` | Run code lens (CoC) | +| `Tab` | Next completion item | +| `Shift+Tab` | Previous completion item | +| `Enter` | Confirm completion | Text objects (CoC only): `if`/`af` (function), `ic`/`ac` (class) ### Linting (ALE) -| Key | Action | -|----------|-----------------------| -| `[e` | Next error/warning | -| `]e` | Previous error/warning| -| `,aD` | Show error details | +| Key | Action | +|-----|--------| +| `[e` | Next error/warning | +| `]e` | Previous error/warning | +| `,aD` | Show error details | Signs: `X` = error, `!` = warning ### Git Workflow (fugitive) -| Key | Action | -|--------|---------------------------------| -| `,gs` | Git status | -| `,gc` | Git commit | -| `,gp` | Git push | -| `,gl` | Git pull | -| `,gd` | Git diff | -| `,gb` | Git blame | -| `,gF` | Search git-tracked files (FZF) | +| Key | Action | +|-----|--------| +| `,gs` | Git status | +| `,gc` | Git commit | +| `,gp` | Git push | +| `,gl` | Git pull | +| `,gd` | Git diff | +| `,gb` | Git blame | +| `,gF` | Search git-tracked files (FZF) | ### Engineering Utilities -| Key | Action | -|----------|-------------------------------------| -| `,ev` | Edit `~/.vimrc` | -| `,sv` | Reload `~/.vimrc` | -| `,F` | Format entire file (= indent) | -| `,W` | Strip trailing whitespace | -| `,wa` | Save all open buffers | -| `,wd` | Change CWD to current buffer's dir | -| `,cp` | Copy file path to clipboard | -| `,cf` | Copy filename to clipboard | -| `,y` | Yank to system clipboard | -| `,Y` | Yank line to system clipboard | -| `,*` | Search+replace word under cursor | -| `,qo` | Open quickfix list | -| `,qc` | Close quickfix list | -| `,tv` | Open terminal (vertical split) | -| `,th` | Open terminal (horizontal, 10r) | -| `Esc` | Exit terminal mode | +| Key | Action | +|-----|--------| +| `,ev` | Edit `~/.vimrc` | +| `,sv` | Reload `~/.vimrc` | +| `,F` | Format entire file | +| `,W` | Strip trailing whitespace | +| `,wa` | Save all open buffers | +| `,wd` | Change CWD to current buffer's dir | +| `,cp` | Copy file path to clipboard | +| `,cf` | Copy filename to clipboard | +| `,y` | Yank to system clipboard | +| `,Y` | Yank line to system clipboard | +| `,*` | Search+replace word under cursor | +| `,qo` | Open quickfix list | +| `,qc` | Close quickfix list | +| `,tv` | Open terminal (vertical split) | +| `,th` | Open terminal (horizontal, 10 rows) | +| `Esc` | Exit terminal mode | ### Navigation and Editing -| Key | Action | -|------------|---------------------------------------------| -| `s`+2ch | EasyMotion jump to any location | -| `Space` | Toggle code fold | -| `Y` | Yank to end of line (like `D`, `C`) | -| `n` / `N` | Search next/prev (cursor centered) | -| `Ctrl+d/u` | Half-page scroll (cursor centered) | -| `>` | Indent (keeps visual selection) | -| `<` | Dedent (keeps visual selection) | -| `[q` / `]q`| Previous/next quickfix (vim-unimpaired) | -| `[e` / `]e`| Previous/next ALE error/warning | -| `F2` | Toggle paste mode | -| `F3` | Toggle line numbers | -| `F4` | Toggle relative line numbers | -| `F5` | Toggle undo history (UndoTree) | -| `F8` | Toggle code tag browser (Tagbar) | -| `0` | Jump to first non-blank character | -| `Alt+j/k` | Move line up/down | +| Key | Action | +|-----|--------| +| `s`+2ch | EasyMotion jump to any location | +| `Space` | Toggle code fold | +| `Y` | Yank to end of line (like `D`, `C`) | +| `n` / `N` | Search next/prev (cursor centered) | +| `Ctrl+d/u` | Half-page scroll (cursor centered) | +| `>` | Indent (keeps visual selection) | +| `<` | Dedent (keeps visual selection) | +| `[q` / `]q` | Previous/next quickfix (vim-unimpaired) | +| `[e` / `]e` | Previous/next ALE error/warning | +| `F2` | Toggle paste mode | +| `F3` | Toggle line numbers | +| `F4` | Toggle relative line numbers | +| `F5` | Toggle undo history (UndoTree) | +| `F8` | Toggle code tag browser (Tagbar) | +| `0` | Jump to first non-blank character | +| `Alt+j/k` | Move line up/down | --- ## Features -### vim-startify: Startup Screen +### Startup Screen (vim-startify) Opens when Vim is launched without a file argument. Shows: +- Session list for current directory - Recently opened files -- Sessions for the current directory - Bookmarks Session auto-saves on quit. Auto-loads `Session.vim` if found in the current directory. Auto-changes to git root on file open. -### vim-which-key: Keybinding Guide +**`vim .` layout** — NERDTree on the left, Startify on the right. + +### Keybinding Guide (vim-which-key) Press `,` and pause for 500ms. A popup lists all available leader bindings organized by group. Useful for onboarding and discovering shortcuts. -### indentLine: Indent Guides - -Draws `|` characters at each indent level. Disabled automatically in TTY -environments and for filetypes where it causes display problems (JSON, -Markdown, help). - ### Session Management ```vim @@ -266,8 +276,8 @@ Markdown, help). :Obsess! " Stop tracking ``` -Sessions are stored in `~/.vim/sessions/` and automatically resumed by -vim-prosession on the next Vim launch in the same directory. +Sessions stored in `~/.vim/sessions/` and automatically resumed by vim-prosession +on the next Vim launch in the same directory. ### Project-Local Config @@ -283,91 +293,88 @@ Loaded automatically. Security-restricted via `set secure`. ### Large File Handling -Files over 10MB automatically disable syntax highlighting and undo history +Files over 10 MB automatically disable syntax highlighting and undo history to prevent Vim from freezing. ### TTY / Console Support -Detected automatically when `$TERM` is `linux` or `screen`, or when running -on a basic built-in terminal. In TTY mode: - +Detected automatically when `$TERM` is `linux` or `screen`. In TTY mode: - True color and cursorline disabled - Powerline separators replaced with plain ASCII - FZF preview windows disabled - NERDTree auto-open skipped - Syntax column limit reduced to 120 -- Simpler status line used +- Simpler status line --- ## Language Support -| Language | Indent | Formatter | Linter | -|----------------|--------|------------------|--------------------------| -| Python | 4sp | black + isort | flake8, pylint | -| JavaScript | 2sp | prettier | eslint | -| TypeScript | 2sp | prettier | eslint, tsserver | -| Go | tab | gofmt, goimports | gopls, golint | -| Rust | 4sp | rustfmt | cargo | -| Shell | 2sp | - | shellcheck | -| YAML | 2sp | prettier | yamllint | -| HTML | 2sp | prettier | - | -| CSS / SCSS | 2sp | prettier | stylelint | -| Less | 2sp | prettier | - | -| JSON | 2sp | prettier | - | -| Markdown | 2sp | prettier | markdownlint | -| SQL | 4sp | sqlfmt | sqlfluff | -| Dockerfile | 2sp | - | hadolint | +| Language | Indent | Formatter | Linter | LSP (CoC) | +|----------|--------|-----------|--------|-----------| +| Python | 4sp | black + isort | flake8, pylint | coc-pyright | +| JavaScript | 2sp | prettier | eslint | coc-tsserver | +| TypeScript | 2sp | prettier | eslint, tsserver | coc-tsserver | +| Go | tab | gofmt, goimports | staticcheck | coc-go | +| Rust | 4sp | rustfmt | cargo | coc-rust-analyzer | +| Shell | 2sp | — | shellcheck | coc-sh | +| YAML | 2sp | prettier | yamllint | coc-yaml | +| HTML | 2sp | prettier | — | coc-html | +| CSS / SCSS | 2sp | prettier | stylelint | coc-css | +| Less | 2sp | prettier | — | — | +| JSON | 2sp | prettier | — | coc-json | +| Markdown | 2sp | prettier | markdownlint | marksman (coc-settings.json) | +| SQL | 4sp | sqlfluff | sqlfluff | — | +| Dockerfile | 2sp | — | hadolint | — | -Install linters separately — `install.sh` lists the exact commands. -ALE runs them asynchronously on save (`ale_fix_on_save = 1` when using CoC). +`install.sh` installs all linters and formatters automatically. +ALE runs them asynchronously; format-on-save active when using CoC. --- ## Plugin List ### Navigation -- **NERDTree** - File tree explorer -- **fzf + fzf.vim** - Fuzzy finder -- **CtrlP** - Fallback fuzzy finder (no fzf dependency) +- **NERDTree** — File tree explorer +- **fzf + fzf.vim** — Fuzzy finder (file, buffer, tag, ripgrep) ### Git -- **vim-fugitive** - Git commands inside Vim -- **vim-gitgutter** - Diff signs in the sign column +- **vim-fugitive** — Git commands inside Vim +- **vim-gitgutter** — Diff signs in the sign column ### LSP and Completion -- **coc.nvim** - Full LSP + completion (requires Node.js 14.14+) -- **vim-lsp** - Pure VimScript LSP client (fallback, no Node.js) -- **vim-lsp-settings** - Auto-configure language servers for vim-lsp -- **asyncomplete.vim** - Async completion (used with vim-lsp) +- **coc.nvim** — Full LSP + completion (requires Node.js 14.14+) +- **vim-lsp** — Pure VimScript LSP client (fallback, no Node.js) +- **vim-lsp-settings** — Auto-configure language servers for vim-lsp +- **asyncomplete.vim** — Async completion (used with vim-lsp) ### Linting -- **ALE** - Asynchronous Lint Engine (always active) +- **ALE** — Asynchronous Lint Engine (always active) ### UI -- **vim-airline** - Status and tabline -- **vim-startify** - Startup screen -- **vim-which-key** - Keybinding hint popup -- **indentLine** - Indent guide lines (non-TTY) -- **undotree** - Undo history visualizer -- **tagbar** - Code structure sidebar +- **vim-airline** — Status and tabline +- **vim-startify** — Startup screen with sessions +- **vim-which-key** — Keybinding hint popup +- **indentLine** — Indent guide lines (non-TTY) +- **undotree** — Undo history visualizer +- **tagbar** — Code structure sidebar ### Editing -- **vim-surround** - Change surrounding quotes, brackets, tags -- **vim-commentary** - `gc` to toggle comments -- **auto-pairs** - Auto-close brackets and quotes -- **vim-easymotion** - Jump anywhere with 2 keystrokes -- **vim-unimpaired** - Bracket shortcut pairs -- **targets.vim** - Extra text objects -- **vim-snippets** - Snippet library (used with CoC/UltiSnips) +- **vim-surround** — Change surrounding quotes, brackets, tags +- **vim-commentary** — `gc` to toggle comments +- **auto-pairs** — Auto-close brackets and quotes +- **vim-easymotion** — Jump anywhere with 2 keystrokes +- **vim-unimpaired** — Bracket shortcut pairs +- **targets.vim** — Extra text objects +- **vim-snippets** — Snippet library (used with CoC/UltiSnips) ### Language Packs -- **vim-polyglot** - Syntax for 100+ languages -- **vim-go** - Go development tools +- **vim-polyglot** — Syntax for 100+ languages +- **vim-go** — Go development tools (formatting + highlighting; LSP handled by coc-go) ### Session -- **vim-obsession** - Continuous session saving -- **vim-prosession** - Project-level session management +- **vim-obsession** — Continuous session saving +- **vim-prosession** — Project-level session management ### Color Schemes - **gruvbox** (default), **dracula**, **solarized**, **onedark** @@ -400,6 +407,14 @@ True color is enabled automatically when the terminal supports it node --version # must be >= 14.14 ``` +**Markdown LSP not starting:** +```bash +marksman --version # must be installed separately +brew install marksman # macOS +sudo pacman -S marksman # Arch +# or: ./install.sh (installs automatically) +``` + **vim-lsp server not starting:** ```vim :LspInstallServer " install server for current filetype @@ -408,8 +423,7 @@ node --version # must be >= 14.14 **Colors look wrong:** ```bash -# Add to ~/.bashrc or ~/.zshrc -export TERM=xterm-256color +export TERM=xterm-256color # add to ~/.bashrc or ~/.zshrc ``` **ALE not finding linters:** @@ -421,12 +435,18 @@ which flake8 black prettier eslint # confirm tools are on PATH ## References -- [amix/vimrc](https://github.com/amix/vimrc) - [vim-plug](https://github.com/junegunn/vim-plug) - [coc.nvim](https://github.com/neoclide/coc.nvim) - [vim-lsp](https://github.com/prabirshrestha/vim-lsp) - [vim-lsp-settings](https://github.com/mattn/vim-lsp-settings) +- [amix/vimrc](https://github.com/amix/vimrc) + +--- + +## Changelog + +See [CHANGELOG.md](CHANGELOG.md). ## License -MIT +[MIT](LICENSE) © m1ng