From dd2e744f0b13d89bf641c2c584388a25fe2bcbd3 Mon Sep 17 00:00:00 2001 From: Anup Sebastian Date: Wed, 29 Oct 2025 21:07:26 -0500 Subject: [PATCH] feat: added initial configs for flutter, python and svelte --- SETUP-GUIDE.md | 307 +++++++++++++++++++++++++++++++++ TESTING.md | 128 ++++++++++++++ init.lua | 81 ++++++--- lazy-lock.json | 29 ++++ lua/custom/plugins/flutter.lua | 132 ++++++++++++++ lua/custom/plugins/init.lua | 125 +++++++++++++- lua/custom/plugins/python.lua | 105 +++++++++++ lua/custom/plugins/svelte.lua | 168 ++++++++++++++++++ 8 files changed, 1044 insertions(+), 31 deletions(-) create mode 100644 SETUP-GUIDE.md create mode 100644 TESTING.md create mode 100644 lazy-lock.json create mode 100644 lua/custom/plugins/flutter.lua create mode 100644 lua/custom/plugins/python.lua create mode 100644 lua/custom/plugins/svelte.lua diff --git a/SETUP-GUIDE.md b/SETUP-GUIDE.md new file mode 100644 index 00000000..baafd0b2 --- /dev/null +++ b/SETUP-GUIDE.md @@ -0,0 +1,307 @@ +# VS Code-like Profile Setup for Neovim + +This configuration implements a VS Code-like "profiles" system where language-specific plugins and tools only load when working with their respective file types. + +## 🎯 Architecture + +### File Structure +``` +~/.config/nvim/ +├── init.lua # Main config with shared LSP, Treesitter, etc. +└── lua/ + └── custom/ + └── plugins/ + ├── init.lua # Common plugins (Copilot, Neo-tree) + ├── flutter.lua # Flutter/Dart profile + ├── python.lua # Python profile + └── svelte.lua # Svelte/Web profile +``` + +### How It Works +- **lazy.nvim** loads plugins based on file types (`ft = { 'dart', 'python', 'svelte' }`) +- When you open a `.dart` file → Flutter tools load +- When you open a `.py` file → Python tools load +- When you open a `.svelte` file → Svelte tools load +- Common plugins (Copilot, Neo-tree) are always available + +## 📦 What's Included + +### Common (All Profiles) +- **GitHub Copilot**: AI pair programming +- **Neo-tree**: File explorer (commented out, enable if desired) +- **Telescope**: Fuzzy finder +- **Treesitter**: Syntax highlighting +- **blink.cmp**: Autocompletion engine +- **lua_ls**: LSP for Neovim config editing + +### Flutter Profile (`flutter.lua`) +**Loads on**: `.dart` files + +**Tools**: +- `flutter-tools.nvim`: Flutter development tools +- `dartls`: Dart LSP server +- Widget guides, closing tags, hot reload + +**Keymaps** (under `f`): +- `fr` - Flutter run +- `fq` - Flutter quit +- `fR` - Flutter restart +- `fd` - Flutter devices +- `fe` - Flutter emulators +- `fo` - Flutter outline +- `fc` - Copy profiler URL +- `fl` - Restart LSP + +### Python Profile (`python.lua`) +**Loads on**: `.py` files + +**Tools**: +- `pyright`: Python LSP server with type checking +- `ruff_format`: Fast Python formatter +- `ruff_organize_imports`: Import sorting +- Alternative: `black` + `isort` (commented out) + +**Format on save**: Enabled for Python files + +### Svelte Profile (`svelte.lua`) +**Loads on**: `.svelte`, `.ts`, `.js` files + +**Tools**: +- `svelte-language-server`: Svelte LSP +- `ts_ls`: TypeScript/JavaScript LSP +- `tailwindcss`: Tailwind CSS LSP with completions +- `prettier`: Code formatter for web files +- `emmet-vim`: HTML/CSS abbreviation expansion + +**Keymaps**: +- `,` - Expand Emmet abbreviation (e.g., `div.container` → full HTML) + +**Treesitter parsers**: svelte, typescript, tsx, javascript, css, html, json + +## 🚀 Installation Steps + +### 1. Restart Neovim +```bash +nvim +``` + +### 2. Install Plugins +Once Neovim opens, lazy.nvim should automatically start installing plugins. If not: +```vim +:Lazy sync +``` + +Wait for all plugins to install. This may take a few minutes. + +### 3. Install LSP Servers & Tools +```vim +:Mason +``` + +Press `g?` for help. Verify these are installed: +- **Flutter**: `dart-language-server` (dartls) +- **Python**: `pyright`, `ruff`, `black` (optional), `isort` (optional) +- **Svelte**: `svelte-language-server`, `typescript-language-server`, `tailwindcss-language-server`, `prettier` +- **Common**: `lua-language-server`, `stylua` + +Mason will auto-install most of these via `mason-tool-installer`. + +### 4. Install Treesitter Parsers +Parsers should auto-install when you open files. To manually install: +```vim +:TSInstall dart python svelte typescript tsx javascript css html json +``` + +Check status: +```vim +:TSInstallInfo +``` + +### 5. Test Each Profile + +#### Test Flutter Profile +```bash +nvim test.dart +``` + +Inside Neovim: +- Type some Dart code (e.g., `void main() {`) +- Check LSP is active: `:LspInfo` +- Try hot reload keymaps if in a Flutter project: `fr` + +#### Test Python Profile +```bash +nvim test.py +``` + +Inside Neovim: +- Type some Python code (e.g., `def hello():`) +- Check LSP is active: `:LspInfo` +- Save file to trigger auto-formatting +- Try hover: `K` on a function/variable + +#### Test Svelte Profile +```bash +nvim test.svelte +``` + +Inside Neovim: +- Type Svelte component code +- Check LSP is active: `:LspInfo` +- Try Emmet: type `div.container>ul>li*3` then `,` +- Save file to trigger prettier formatting + +## 🔧 Configuration Details + +### Node.js for Copilot +Node.js is configured via fnm (Fast Node Manager): +- **Path**: `~/.local/share/fnm/aliases/default/bin` +- **Version**: Currently v24.11.0 LTS +- **Auto-update**: Using fnm aliases, so updating Node.js via `fnm install --lts` will automatically work + +To update Node.js: +```bash +fnm install --lts +fnm default lts-latest +``` + +### Shared LSP Capabilities +All language-specific LSPs use shared capabilities from `blink.cmp` for consistent completion behavior. This is configured automatically. + +### Format on Save +Enabled by default for all languages except C/C++. Language-specific formatters are defined in their respective profile files. + +To disable for a specific file type, edit `init.lua`: +```lua +local disable_filetypes = { c = true, cpp = true, python = true } -- example +``` + +## 📝 Customization + +### Adding a New Language Profile + +1. Create `lua/custom/plugins/mylang.lua`: +```lua +return { + { + 'neovim/nvim-lspconfig', + ft = { 'mylang' }, -- file type trigger + config = function() + local capabilities = require('blink.cmp').get_lsp_capabilities() + require('lspconfig').mylang_ls.setup { + capabilities = capabilities, + } + end, + }, + + { + 'stevearc/conform.nvim', + ft = { 'mylang' }, + opts = { + formatters_by_ft = { + mylang = { 'my_formatter' }, + }, + }, + }, + + { + 'nvim-treesitter/nvim-treesitter', + ft = { 'mylang' }, + opts = { + ensure_installed = { 'mylang' }, + }, + }, +} +``` + +2. Restart Neovim and open a `.mylang` file + +### Enabling Neo-tree +The file tree is currently commented out. To enable: + +Edit `lua/custom/plugins/init.lua` and uncomment the Neo-tree section: +```lua +return { + { + 'nvim-neo-tree/neo-tree.nvim', + -- ... (uncomment the entire block) + }, +} +``` + +Then `:Lazy sync` and use `e` to toggle the file tree. + +### Changing Keymaps +Edit the respective language file in `lua/custom/plugins/`. + +Example: Change Flutter hot reload from `fr` to `h`: +```lua +-- In lua/custom/plugins/flutter.lua +vim.keymap.set('n', 'h', 'FlutterRun', { desc = '[H]ot reload' }) +``` + +## 🐛 Troubleshooting + +### Plugins not loading +```vim +:Lazy check +:Lazy sync +``` + +### LSP not working +```vim +:LspInfo " Check if LSP is attached +:Mason " Verify servers are installed +:checkhealth lsp " Run LSP diagnostics +``` + +### Copilot not working +```vim +:Copilot setup " Initial setup (if not done) +:Copilot status " Check connection +``` + +If Node.js path issues: +```bash +# Verify Node.js is in fnm default alias +ls ~/.local/share/fnm/aliases/default/bin/node +``` + +### Formatter not running on save +Check if formatter is installed: +```vim +:Mason +``` + +Check if file type has formatter configured: +```vim +:ConformInfo +``` + +### Treesitter parsers missing +```vim +:TSInstall +# Or install all at once: +:TSInstall dart python svelte typescript tsx javascript css html json +``` + +## 📚 Resources + +- **Neovim LSP**: `:help lsp` +- **lazy.nvim**: `:help lazy.nvim` +- **Telescope**: `:help telescope.nvim` +- **Treesitter**: `:help nvim-treesitter` +- **conform.nvim**: `:help conform.nvim` +- **Mason**: `:help mason.nvim` + +## 🎉 What's Next? + +Your setup is ready! Here are some next steps: + +1. **Explore Copilot**: Try getting AI suggestions as you code +2. **Learn Flutter Tools**: Use `fr` to run Flutter apps with hot reload +3. **Try Emmet**: Speed up HTML/Svelte writing with abbreviations +4. **Customize**: Add more keymaps, plugins, or language profiles as needed +5. **Consider Neo-tree**: Uncomment if you prefer a file explorer sidebar + +Enjoy your VS Code-like Neovim setup! 🚀 diff --git a/TESTING.md b/TESTING.md new file mode 100644 index 00000000..10335e47 --- /dev/null +++ b/TESTING.md @@ -0,0 +1,128 @@ +# Profile Testing Instructions + +## How to Test Each Profile + +### 1. Flutter Profile (test.dart) +```bash +nvim test.dart +``` + +**What to check:** +- [ ] LSP loads automatically (check with `:LspInfo`) +- [ ] You see dartls in the LSP list +- [ ] Hover over `StatelessWidget` and press `K` - should show documentation +- [ ] Try completion: type `Theme.of(` and see suggestions +- [ ] Check Flutter keymaps work: + - Press `` (space by default) and wait - should see Flutter commands + - Try `fl` to restart LSP +- [ ] Widget guides should show (vertical lines for nested widgets) +- [ ] Closing tags should appear (e.g., `// MyApp` after closing brace) + +### 2. Python Profile (test.py) +```bash +nvim test.py +``` + +**What to check:** +- [ ] LSP loads automatically (check with `:LspInfo`) +- [ ] You see pyright in the LSP list +- [ ] Hover over `calculate_fibonacci` and press `K` - should show type info +- [ ] Try completion: type `fib.` and see list methods +- [ ] **Test formatting on save:** + 1. Add some messy code: `x=1+2+3+4+5` + 2. Save the file (`:w`) + 3. Should auto-format to: `x = 1 + 2 + 3 + 4 + 5` +- [ ] Add an unused import at the top: `import os` + - Save the file - ruff should remove it or flag it +- [ ] Lint errors should appear (the f-string and unused sys import) + +### 3. Svelte Profile (test.svelte) +```bash +nvim test.svelte +``` + +**What to check:** +- [ ] LSP loads automatically (check with `:LspInfo`) +- [ ] You should see svelte-language-server +- [ ] Syntax highlighting works (script, template, style sections) +- [ ] **Test Emmet expansion:** + 1. In the `
` section, type: `div.test>ul>li*3` + 2. Press `,` (Ctrl+e then comma) + 3. Should expand to nested div/ul/li structure +- [ ] **Test formatting on save:** + 1. Mess up some HTML: `` + 2. Save the file (`:w`) + 3. Should auto-format with prettier +- [ ] Try completion on Tailwind classes: type `class="bg-` and see suggestions + +### 4. Test Lazy Loading +```bash +nvim test.lua # or init.lua +``` + +**What to check:** +- [ ] Open a Lua file +- [ ] Check `:LspInfo` - should only see lua_ls, NOT dartls, pyright, or svelte +- [ ] Check `:Lazy` - Flutter, Python, Svelte plugins should be "not loaded" +- [ ] Now open test.py in a split: `:split test.py` +- [ ] Check `:Lazy` again - Python plugins should now be "loaded" + +### 5. Verify Mason Tools +```bash +nvim +``` +Then run `:Mason` + +**Tools that should be installed:** +- [x] lua-language-server (lua_ls) +- [x] stylua +- [ ] dart-language-server (dartls) # For Flutter +- [ ] pyright # For Python +- [ ] ruff # For Python +- [ ] svelte-language-server +- [ ] typescript-language-server (tsserver/ts_ls) +- [ ] tailwindcss-language-server +- [ ] prettier + +**If any are missing:** +1. Highlight the missing tool in Mason +2. Press `i` to install +3. Or wait - mason-tool-installer should install them automatically + +## Common Issues + +### LSP not loading +```vim +:checkhealth lsp +:LspLog " Check for errors +``` + +### Formatter not working +```vim +:ConformInfo " Check formatter config +:Mason " Verify formatter is installed +``` + +### Plugins not loading +```vim +:Lazy check " Check plugin status +:Lazy sync " Re-sync plugins +``` + +### Node.js issues with Copilot +```vim +:echo $PATH " Should include fnm path +``` + +## Success Criteria + +✅ All three language profiles should: +1. Load their respective LSP automatically on file open +2. Provide completions and hover info +3. Auto-format on save +4. NOT load when opening other file types (lazy loading works) + +✅ Common plugins: +1. Copilot should work in all file types (`:Copilot status`) +2. Telescope should work (`:Telescope find_files`) +3. Which-key should show keymaps when pressing `` diff --git a/init.lua b/init.lua index b98ffc61..9d38526f 100644 --- a/init.lua +++ b/init.lua @@ -93,6 +93,22 @@ vim.g.maplocalleader = ' ' -- Set to true if you have a Nerd Font installed and selected in the terminal vim.g.have_nerd_font = false +-- [[ Setup Node.js PATH for plugins like Copilot ]] +-- Add fnm's Node.js to PATH so Neovim can find it +-- This is required for GitHub Copilot and other Node.js based plugins +-- Uses fnm's alias resolution to always point to the default/latest version +local home = vim.env.HOME +local fnm_node_path = home .. '/.local/share/fnm/aliases/default/bin' +-- Fallback: also add the fnm multishell path if it exists +local fnm_multishell = home .. '/.local/state/fnm_multishells' +if vim.fn.isdirectory(fnm_node_path) == 1 then + vim.env.PATH = fnm_node_path .. ':' .. vim.env.PATH +elseif vim.fn.isdirectory(fnm_multishell) == 1 then + -- If multishell is being used, fnm will handle it via shell integration + -- We just need to ensure the PATH includes typical fnm locations + vim.env.PATH = home .. '/.local/share/fnm:' .. vim.env.PATH +end + -- [[ Setting options ]] -- See `:help vim.o` -- NOTE: You can change these options as you wish! @@ -102,7 +118,7 @@ vim.g.have_nerd_font = false vim.o.number = true -- You can also add relative line numbers, to help with jumping. -- Experiment for yourself to see if you like it! --- vim.o.relativenumber = true +vim.o.relativenumber = true -- Enable mouse mode, can be useful for resizing splits for example! vim.o.mouse = 'a' @@ -661,33 +677,19 @@ require('lazy').setup({ -- So, we create new capabilities with blink.cmp, and then broadcast that to the servers. local capabilities = require('blink.cmp').get_lsp_capabilities() - -- Enable the following language servers - -- Feel free to add/remove any LSPs that you want here. They will automatically be installed. + -- Enable language servers that apply to all profiles (general editing) + -- Language-specific servers (Flutter, Python, Svelte, etc.) are configured + -- in their respective profile files in lua/custom/plugins/ -- - -- Add any additional override configuration in the following tables. Available keys are: + -- Add any additional override configuration in the following tables. Available keys are: -- - cmd (table): Override the default command used to start the server -- - filetypes (table): Override the default list of associated filetypes for the server -- - capabilities (table): Override fields in capabilities. Can be used to disable certain LSP features. -- - settings (table): Override the default settings passed when initializing the server. -- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/ local servers = { - -- clangd = {}, - -- gopls = {}, - -- pyright = {}, - -- rust_analyzer = {}, - -- ... etc. See `:help lspconfig-all` for a list of all the pre-configured LSPs - -- - -- Some languages (like typescript) have entire language plugins that can be useful: - -- https://github.com/pmizio/typescript-tools.nvim - -- - -- But for many setups, the LSP (`ts_ls`) will work just fine - -- ts_ls = {}, - -- - + -- Lua LSP for Neovim configuration editing lua_ls = { - -- cmd = { ... }, - -- filetypes = { ... }, - -- capabilities = {}, settings = { Lua = { completion = { @@ -698,6 +700,11 @@ require('lazy').setup({ }, }, }, + + -- Add other general-purpose LSP servers here that should always be available + -- (e.g., JSON, YAML, TOML, etc.) + -- jsonls = {}, + -- yamlls = {}, } -- Ensure the servers and tools above are installed @@ -768,11 +775,9 @@ require('lazy').setup({ end, formatters_by_ft = { lua = { 'stylua' }, - -- Conform can also run multiple formatters sequentially - -- python = { "isort", "black" }, - -- - -- You can use 'stop_after_first' to run the first available formatter from the list - -- javascript = { "prettierd", "prettier", stop_after_first = true }, + -- Language-specific formatters (Python, Svelte, etc.) are configured + -- in their respective profile files in lua/custom/plugins/ + -- This keeps formatting rules scoped to their language contexts }, }, }, @@ -944,7 +949,27 @@ require('lazy').setup({ main = 'nvim-treesitter.configs', -- Sets main module to use for opts -- [[ Configure Treesitter ]] See `:help nvim-treesitter` opts = { - ensure_installed = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' }, + -- Base parsers that are always installed + -- Language-specific parsers (dart, python, svelte, etc.) are installed + -- by their respective language profile files in lua/custom/plugins/ + ensure_installed = { + 'bash', + 'c', + 'diff', + 'html', + 'lua', + 'luadoc', + 'markdown', + 'markdown_inline', + 'query', + 'vim', + 'vimdoc', + -- Core web languages (used by multiple profiles) + 'javascript', + 'typescript', + 'css', + 'json', + }, -- Autoinstall languages that are not installed auto_install = true, highlight = { @@ -977,14 +1002,14 @@ require('lazy').setup({ -- require 'kickstart.plugins.indent_line', -- require 'kickstart.plugins.lint', -- require 'kickstart.plugins.autopairs', - -- require 'kickstart.plugins.neo-tree', + require 'kickstart.plugins.neo-tree', -- require 'kickstart.plugins.gitsigns', -- adds gitsigns recommend keymaps -- NOTE: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua` -- This is the easiest way to modularize your config. -- -- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going. - -- { import = 'custom.plugins' }, + { import = 'custom.plugins' }, -- -- For additional information with loading, sourcing and examples see `:help lazy.nvim-🔌-plugin-spec` -- Or use telescope! diff --git a/lazy-lock.json b/lazy-lock.json new file mode 100644 index 00000000..809a28c2 --- /dev/null +++ b/lazy-lock.json @@ -0,0 +1,29 @@ +{ + "LuaSnip": { "branch": "master", "commit": "458560534a73f7f8d7a11a146c801db00b081df0" }, + "blink.cmp": { "branch": "main", "commit": "327fff91fe6af358e990be7be1ec8b78037d2138" }, + "conform.nvim": { "branch": "master", "commit": "9fd3d5e0b689ec1bf400c53cbbec72c6fdf24081" }, + "copilot.vim": { "branch": "release", "commit": "da369d90cfd6c396b1d0ec259836a1c7222fb2ea" }, + "dressing.nvim": { "branch": "master", "commit": "2d7c2db2507fa3c4956142ee607431ddb2828639" }, + "emmet-vim": { "branch": "master", "commit": "e98397144982d1e75b20d94d55a82de3ec8f648d" }, + "fidget.nvim": { "branch": "main", "commit": "e32b672d8fd343f9d6a76944fedb8c61d7d8111a" }, + "flutter-tools.nvim": { "branch": "main", "commit": "69db9cdac65ce536e20a8fc9a83002f007cc049c" }, + "gitsigns.nvim": { "branch": "main", "commit": "20ad4419564d6e22b189f6738116b38871082332" }, + "guess-indent.nvim": { "branch": "main", "commit": "84a4987ff36798c2fc1169cbaff67960aed9776f" }, + "lazy.nvim": { "branch": "main", "commit": "f0f5bbb9e5bfae5e6468f9359ffea3d151418176" }, + "lazydev.nvim": { "branch": "main", "commit": "c2dfe354571a8255c5d3e96a9a4c297c89ce2347" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "3590d66effccc7376d8c3dbe45e8291f9fed2843" }, + "mason-tool-installer.nvim": { "branch": "main", "commit": "517ef5994ef9d6b738322664d5fdd948f0fdeb46" }, + "mason.nvim": { "branch": "main", "commit": "ad7146aa61dcaeb54fa900144d768f040090bff0" }, + "mini.nvim": { "branch": "main", "commit": "ee4a4a4abed25e3d108d985b0553c5271f2f71aa" }, + "neo-tree.nvim": { "branch": "main", "commit": "8cdd6b1940f333c1dd085526a9c45b30fb2dbf50" }, + "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, + "nvim-lspconfig": { "branch": "master", "commit": "87d30189b24caa496b54affd65594a309ac6d929" }, + "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, + "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, + "telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" }, + "telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" }, + "telescope.nvim": { "branch": "master", "commit": "b4da76be54691e854d3e0e02c36b0245f945c2c7" }, + "todo-comments.nvim": { "branch": "main", "commit": "411503d3bedeff88484de572f2509c248e499b38" }, + "tokyonight.nvim": { "branch": "main", "commit": "2642dbb83333e0575d1c3436e1d837926871c5fb" }, + "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } +} diff --git a/lua/custom/plugins/flutter.lua b/lua/custom/plugins/flutter.lua new file mode 100644 index 00000000..3c89917b --- /dev/null +++ b/lua/custom/plugins/flutter.lua @@ -0,0 +1,132 @@ +-- ======================================================================== +-- FLUTTER/DART PROFILE - Language-specific plugins and LSP configuration +-- ======================================================================== +-- +-- This file contains all Flutter and Dart-specific plugins and configurations. +-- These plugins will ONLY load when you open a .dart file, keeping your +-- startup time fast and avoiding conflicts with other languages. +-- +-- Key features to configure here: +-- - Flutter tools (hot reload, device management, widget inspector) +-- - Dart LSP (dartls via flutter-tools) +-- - Dart-specific formatters and linters +-- - Flutter-specific keymaps (e.g., fr for Flutter Run) +-- +-- Usage: Just open a .dart file and these plugins will automatically load! +-- ======================================================================== + +return { + -- ======================================================================== + -- FLUTTER TOOLS - Complete Flutter development environment + -- ======================================================================== + -- Provides Flutter-specific features like hot reload, device management, + -- widget inspector, and integrates the Dart LSP server. + -- + -- Flutter-specific keymaps (available in .dart files): + -- fr - Flutter Run (start app) + -- fq - Flutter Quit (stop app) + -- fR - Flutter Hot Restart + -- fd - Flutter Devices (show connected devices) + -- fe - Flutter Emulators (launch emulator) + -- fo - Flutter Outline (toggle outline/widget tree) + -- fc - Flutter Copy Profile URL (for DevTools) + -- ======================================================================== + { + 'nvim-flutter/flutter-tools.nvim', + ft = 'dart', -- Only load when opening Dart files + dependencies = { + 'nvim-lua/plenary.nvim', + 'stevearc/dressing.nvim', -- Optional: better UI for Flutter commands + }, + config = function() + -- Get shared LSP capabilities from blink.cmp + local capabilities = require('blink.cmp').get_lsp_capabilities() + + require('flutter-tools').setup { + -- Flutter SDK path (usually auto-detected, but you can specify if needed) + -- flutter_path = '/path/to/flutter/bin/flutter', + + lsp = { + capabilities = capabilities, + -- Settings passed to the Dart LSP + settings = { + -- Show TODOs in the problems pane + showTodos = true, + -- Completion settings + completeFunctionCalls = true, + -- Enable/disable specific lints + -- analysisExcludedFolders = {}, + renameFilesWithClasses = 'prompt', + enableSnippets = true, + }, + }, + + -- Flutter-specific settings + decorations = { + statusline = { + -- Set to true to show Flutter app info in statusline + app_version = false, + device = true, -- Show device name + }, + }, + + widget_guides = { + enabled = true, -- Show visual guides for widget nesting + }, + + closing_tags = { + highlight = 'Comment', -- Highlight color for closing tags + prefix = '// ', -- Text to show before closing tag + enabled = true, -- Show closing tags for widgets + }, + + dev_log = { + enabled = true, + open_cmd = 'tabedit', -- Open logs in a new tab + }, + + debugger = { + enabled = true, -- Enable Flutter debugger integration + run_via_dap = false, -- Use Flutter tools debugger (not DAP) + }, + } + + -- ======================================================================== + -- FLUTTER-SPECIFIC KEYMAPS + -- ======================================================================== + -- These keymaps are only available when editing Dart files + -- They provide quick access to common Flutter commands + -- ======================================================================== + vim.api.nvim_create_autocmd('FileType', { + pattern = 'dart', + callback = function() + local opts = { buffer = true, silent = true } + + -- Flutter run/quit + vim.keymap.set('n', 'fr', 'FlutterRun', vim.tbl_extend('force', opts, { desc = '[F]lutter [R]un' })) + vim.keymap.set('n', 'fq', 'FlutterQuit', vim.tbl_extend('force', opts, { desc = '[F]lutter [Q]uit' })) + vim.keymap.set('n', 'fR', 'FlutterRestart', vim.tbl_extend('force', opts, { desc = '[F]lutter Hot [R]estart' })) + + -- Device management + vim.keymap.set('n', 'fd', 'FlutterDevices', vim.tbl_extend('force', opts, { desc = '[F]lutter [D]evices' })) + vim.keymap.set('n', 'fe', 'FlutterEmulators', vim.tbl_extend('force', opts, { desc = '[F]lutter [E]mulators' })) + + -- Dev tools + vim.keymap.set('n', 'fo', 'FlutterOutlineToggle', vim.tbl_extend('force', opts, { desc = '[F]lutter [O]utline Toggle' })) + vim.keymap.set( + 'n', + 'fc', + 'FlutterCopyProfilerUrl', + vim.tbl_extend('force', opts, { desc = '[F]lutter [C]opy Profiler URL' }) + ) + vim.keymap.set('n', 'fl', 'FlutterLspRestart', vim.tbl_extend('force', opts, { desc = '[F]lutter [L]SP Restart' })) + + -- Register Flutter group with which-key + require('which-key').add { + { 'f', group = '[F]lutter', mode = 'n' }, + } + end, + }) + end, + }, +} diff --git a/lua/custom/plugins/init.lua b/lua/custom/plugins/init.lua index be0eb9d8..a719b687 100644 --- a/lua/custom/plugins/init.lua +++ b/lua/custom/plugins/init.lua @@ -1,5 +1,124 @@ --- You can add your own plugins here or in other files in this directory! --- I promise not to create any merge conflicts in this directory :) +-- ======================================================================== +-- COMMON PLUGINS - Loaded for all filetypes/profiles +-- ======================================================================== +-- +-- This file contains plugins that are always loaded regardless of what +-- file type you're working with. These are your "core" plugins that +-- provide functionality across all your language profiles. +-- +-- Examples: file explorers, git tools, common UI elements, copilot, etc. -- -- See the kickstart.nvim README for more information -return {} +-- ======================================================================== + +return { + -- ======================================================================== + -- FILE EXPLORER - Neo-tree + -- ======================================================================== + -- Neo-tree provides a modern file explorer sidebar similar to VS Code. + -- It's loaded for all profiles so you can browse files regardless of + -- what language you're working with. + -- + -- Keybindings: + -- \ (backslash) - Toggle Neo-tree file explorer + -- Within Neo-tree: + -- a - Add file/folder + -- d - Delete + -- r - Rename + -- x - Cut + -- c - Copy + -- p - Paste + -- ? - Show help (see all keybindings) + -- + -- Note: This references the existing neo-tree configuration from + -- kickstart/plugins/neo-tree.lua. We're just ensuring it's loaded. + -- ======================================================================== +-- { +-- 'nvim-neo-tree/neo-tree.nvim', +-- version = '*', +-- dependencies = { +-- 'nvim-lua/plenary.nvim', +-- 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended +-- 'MunifTanjim/nui.nvim', +-- }, +-- cmd = 'Neotree', -- Lazy load on command +-- keys = { +-- { '\\', ':Neotree reveal', desc = 'NeoTree reveal', silent = true }, +-- }, +-- opts = { +-- filesystem = { +-- window = { +-- mappings = { +-- ['\\'] = 'close_window', +-- }, +-- }, +-- follow_current_file = { +-- enabled = true, -- Focus on the current file when opening +-- }, +-- hijack_netrw_behavior = 'open_current', -- Use neo-tree instead of netrw +-- }, +-- }, +-- }, + + -- ======================================================================== + -- GITHUB COPILOT - AI pair programming assistant + -- ======================================================================== + -- GitHub Copilot provides AI-powered code completions and suggestions. + -- Works across all file types and integrates with your completion engine. + -- + -- Setup: + -- 1. After installing, run :Copilot setup + -- 2. Follow the authentication flow + -- 3. You'll need an active GitHub Copilot subscription + -- + -- Usage: + -- - Copilot suggestions appear automatically as you type + -- - Press Tab to accept a suggestion + -- - Press Ctrl+] to see next suggestion + -- - Press Ctrl+[ to see previous suggestion + -- - :Copilot panel - Open completion panel with multiple suggestions + -- + -- Commands: + -- :Copilot setup - Authenticate with GitHub + -- :Copilot status - Check authentication status + -- :Copilot enable - Enable Copilot + -- :Copilot disable - Disable Copilot + -- ======================================================================== + { + 'github/copilot.vim', + lazy = false, -- Load immediately on startup (not lazy-loaded) + config = function() + -- Copilot keybindings (optional customization) + -- By default, Tab accepts suggestions, but this might conflict with completion + -- Uncomment below to use Ctrl+J to accept instead: + -- vim.keymap.set('i', '', 'copilot#Accept("\\")', { + -- expr = true, + -- replace_keycodes = false, + -- }) + -- vim.g.copilot_no_tab_map = true + + -- Optional: Disable Copilot for certain filetypes + -- vim.g.copilot_filetypes = { + -- ['*'] = true, + -- ['markdown'] = false, + -- ['text'] = false, + -- } + end, + }, + + -- ======================================================================== + -- ADDITIONAL COMMON PLUGINS + -- ======================================================================== + -- You can add more common plugins here that should be available across + -- all language profiles. Examples: + -- + -- - Better terminal integration + -- - Git integration enhancements (beyond gitsigns in init.lua) + -- - Session management + -- - Project management + -- - Alternative completion sources + -- - UI enhancements + -- + -- Just add them to this return table following the same pattern as above. + -- ======================================================================== +} diff --git a/lua/custom/plugins/python.lua b/lua/custom/plugins/python.lua new file mode 100644 index 00000000..6638fb2e --- /dev/null +++ b/lua/custom/plugins/python.lua @@ -0,0 +1,105 @@ +-- ======================================================================== +-- PYTHON PROFILE - Language-specific plugins and LSP configuration +-- ======================================================================== +-- +-- This file contains all Python-specific plugins and configurations. +-- These plugins will ONLY load when you open a .py file, keeping your +-- startup time fast and avoiding conflicts with other languages. +-- +-- Key features to configure here: +-- - Python LSP (pyright or pylsp) +-- - Python formatters (black, ruff, isort, etc.) +-- - Python linters and type checkers +-- - Debugger integration (debugpy) +-- - Testing tools (pytest) +-- - Virtual environment detection +-- - Python-specific keymaps +-- +-- Usage: Just open a .py file and these plugins will automatically load! +-- ======================================================================== + +return { + -- ======================================================================== + -- PYTHON LSP - Language Server Protocol for Python + -- ======================================================================== + -- Provides intelligent code completion, go-to-definition, type checking, + -- and more for Python files using pyright (fast, feature-rich LSP) + -- ======================================================================== + { + 'neovim/nvim-lspconfig', + ft = 'python', -- Only load when opening Python files + dependencies = { + 'WhoIsSethDaniel/mason-tool-installer.nvim', -- For installing pyright + }, + config = function() + -- Get shared LSP capabilities from blink.cmp + local capabilities = require('blink.cmp').get_lsp_capabilities() + + -- Setup pyright LSP server + require('lspconfig').pyright.setup { + capabilities = capabilities, + settings = { + python = { + analysis = { + -- Type checking mode: "off", "basic", or "strict" + typeCheckingMode = 'basic', + -- Auto-import completions + autoImportCompletions = true, + -- Automatically search for stubs + autoSearchPaths = true, + -- Use library code for types + useLibraryCodeForTypes = true, + -- Diagnostic mode: "openFilesOnly" or "workspace" + diagnosticMode = 'openFilesOnly', + }, + }, + }, + } + + -- Install Python tools via Mason + require('mason-tool-installer').setup { + ensure_installed = { + 'pyright', -- LSP server for type checking and completions + 'ruff', -- Fast formatter, linter, and import organizer (replaces black, isort, flake8) + }, + } + end, + }, + + -- ======================================================================== + -- PYTHON FORMATTERS - Auto-format Python code + -- ======================================================================== + -- Uses Ruff for fast formatting and import organization + -- Ruff provides Black-compatible formatting + import sorting in one tool + -- ======================================================================== + { + 'stevearc/conform.nvim', + ft = 'python', + opts = function(_, opts) + -- Extend the existing formatters_by_ft table + opts.formatters_by_ft = opts.formatters_by_ft or {} + opts.formatters_by_ft.python = { + -- Ruff handles both formatting and import sorting (fast & modern) + 'ruff_organize_imports', -- First: organize imports + 'ruff_format', -- Then: format code (Black-compatible) + } + return opts + end, + }, + + -- ======================================================================== + -- PYTHON-SPECIFIC KEYMAPS AND CONFIGURATION + -- ======================================================================== + -- Additional Python-specific settings and keymaps + -- ======================================================================== + { + 'nvim-treesitter/nvim-treesitter', + ft = 'python', + opts = function(_, opts) + -- Ensure Python parser is installed + opts.ensure_installed = opts.ensure_installed or {} + vim.list_extend(opts.ensure_installed, { 'python' }) + return opts + end, + }, +} diff --git a/lua/custom/plugins/svelte.lua b/lua/custom/plugins/svelte.lua new file mode 100644 index 00000000..8ca48362 --- /dev/null +++ b/lua/custom/plugins/svelte.lua @@ -0,0 +1,168 @@ +-- ======================================================================== +-- SVELTE PROFILE - Language-specific plugins and LSP configuration +-- ======================================================================== +-- +-- This file contains all Svelte-specific plugins and configurations. +-- These plugins will ONLY load when you open a .svelte file, keeping your +-- startup time fast and avoiding conflicts with other languages. +-- +-- Key features to configure here: +-- - Svelte LSP (svelte-language-server) +-- - TypeScript/JavaScript support for Svelte components +-- - Tailwind CSS integration (if using Tailwind) +-- - Prettier formatting for Svelte files +-- - Emmet support for Svelte +-- - Svelte-specific keymaps +-- +-- Note: You may also want to configure support for related web files: +-- - JavaScript/TypeScript (.js, .ts) +-- - HTML/CSS (.html, .css) +-- +-- Usage: Just open a .svelte file and these plugins will automatically load! +-- ======================================================================== + +return { + -- ======================================================================== + -- SVELTE LSP - Language Server Protocol for Svelte + -- ======================================================================== + -- Provides intelligent code completion, diagnostics, and more for Svelte + -- components, including support for TypeScript, CSS, and HTML within .svelte files + -- ======================================================================== + { + 'neovim/nvim-lspconfig', + ft = { 'svelte', 'typescript', 'javascript' }, -- Load for web files + dependencies = { + 'WhoIsSethDaniel/mason-tool-installer.nvim', + }, + config = function() + -- Get shared LSP capabilities from blink.cmp + local capabilities = require('blink.cmp').get_lsp_capabilities() + + -- Setup Svelte LSP server + require('lspconfig').svelte.setup { + capabilities = capabilities, + settings = { + svelte = { + plugin = { + html = { completions = { enable = true, emmet = true } }, + svelte = { completions = { enable = true } }, + css = { completions = { enable = true } }, + typescript = { diagnostics = { enable = true } }, + }, + }, + }, + } + + -- Optional: Setup TypeScript LSP for .ts/.js files in Svelte projects + require('lspconfig').ts_ls.setup { + capabilities = capabilities, + -- Configure to work well with Svelte + filetypes = { + 'javascript', + 'javascriptreact', + 'typescript', + 'typescriptreact', + }, + } + + -- Optional: Setup Tailwind CSS LSP if you're using Tailwind + require('lspconfig').tailwindcss.setup { + capabilities = capabilities, + filetypes = { + 'svelte', + 'html', + 'css', + 'scss', + 'javascript', + 'javascriptreact', + 'typescript', + 'typescriptreact', + }, + } + + -- Install web development tools via Mason + require('mason-tool-installer').setup { + ensure_installed = { + 'svelte-language-server', -- Svelte LSP + 'typescript-language-server', -- TypeScript/JavaScript LSP + 'tailwindcss-language-server', -- Tailwind CSS LSP (optional) + 'prettier', -- Code formatter for web files + 'eslint_d', -- Fast ESLint for linting JS/TS + }, + } + end, + }, + + -- ======================================================================== + -- WEB FORMATTERS - Prettier for Svelte/JS/TS/CSS + -- ======================================================================== + -- Configures prettier to format Svelte and related web files + -- ======================================================================== + { + 'stevearc/conform.nvim', + ft = { 'svelte', 'typescript', 'javascript', 'css', 'html', 'json' }, + opts = function(_, opts) + -- Extend the existing formatters_by_ft table + opts.formatters_by_ft = opts.formatters_by_ft or {} + opts.formatters_by_ft.svelte = { 'prettier' } + opts.formatters_by_ft.javascript = { 'prettier' } + opts.formatters_by_ft.javascriptreact = { 'prettier' } + opts.formatters_by_ft.typescript = { 'prettier' } + opts.formatters_by_ft.typescriptreact = { 'prettier' } + opts.formatters_by_ft.css = { 'prettier' } + opts.formatters_by_ft.html = { 'prettier' } + opts.formatters_by_ft.json = { 'prettier' } + opts.formatters_by_ft.markdown = { 'prettier' } + return opts + end, + }, + + -- ======================================================================== + -- TREESITTER PARSERS - Syntax highlighting for web languages + -- ======================================================================== + -- Ensures Treesitter parsers are installed for better syntax highlighting + -- ======================================================================== + { + 'nvim-treesitter/nvim-treesitter', + ft = { 'svelte', 'typescript', 'javascript', 'css', 'html' }, + opts = function(_, opts) + -- Ensure web language parsers are installed + opts.ensure_installed = opts.ensure_installed or {} + vim.list_extend(opts.ensure_installed, { + 'svelte', + 'typescript', + 'tsx', + 'javascript', + 'jsdoc', + 'css', + 'html', + 'json', + }) + return opts + end, + }, + + -- ======================================================================== + -- EMMET - HTML/CSS abbreviation expansion + -- ======================================================================== + -- Provides Emmet abbreviation support for faster HTML/CSS writing + -- Type abbreviations like `div.container>ul>li*3` and expand with , + -- ======================================================================== + { + 'mattn/emmet-vim', + ft = { 'svelte', 'html', 'css', 'javascript', 'typescript' }, + init = function() + -- Set Emmet leader key (default is ) + vim.g.user_emmet_leader_key = '' + -- Enable only for specific file types + vim.g.user_emmet_install_global = 0 + -- Enable Emmet for Svelte files + vim.api.nvim_create_autocmd('FileType', { + pattern = { 'html', 'css', 'svelte', 'javascript', 'typescript' }, + callback = function() + vim.cmd 'EmmetInstall' + end, + }) + end, + }, +}