{"id":30335325,"url":"https://github.com/LuxVim/nvim-luxmotion","last_synced_at":"2025-08-18T05:07:19.710Z","repository":{"id":306861048,"uuid":"1024008536","full_name":"LuxVim/nvim-luxmotion","owner":"LuxVim","description":null,"archived":false,"fork":false,"pushed_at":"2025-07-28T03:42:28.000Z","size":18,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-28T05:24:52.353Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Lua","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LuxVim.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-22T03:55:12.000Z","updated_at":"2025-07-28T03:42:31.000Z","dependencies_parsed_at":"2025-07-28T05:37:08.935Z","dependency_job_id":null,"html_url":"https://github.com/LuxVim/nvim-luxmotion","commit_stats":null,"previous_names":["luxvim/nvim-luxmotion"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/LuxVim/nvim-luxmotion","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuxVim%2Fnvim-luxmotion","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuxVim%2Fnvim-luxmotion/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuxVim%2Fnvim-luxmotion/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuxVim%2Fnvim-luxmotion/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LuxVim","download_url":"https://codeload.github.com/LuxVim/nvim-luxmotion/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuxVim%2Fnvim-luxmotion/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270946068,"owners_count":24672890,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-18T02:00:08.743Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-18T05:02:03.303Z","updated_at":"2025-08-18T05:07:19.695Z","avatar_url":"https://github.com/LuxVim.png","language":"Lua","readme":"\u003ch1 align=\"left\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/546ee0e5-30fd-4e37-b219-e390be8b1c6e\"\n       alt=\"LuxVim Logo\"\n       style=\"width: 40px; height: 40px; position: relative; top: 6px; margin-right: 10px;\" /\u003e\n  nvim-luxmotion\n\u003c/h1\u003e\n\nA comprehensive **Neovim smooth motion plugin**, providing **fluid animations for all motion commands**.  \nCombines smooth **cursor movement**, **word navigation**, **text objects**, and **viewport scrolling** into one seamless experience.\n\n---\n\n## ✨ Features\n\n- **Smooth Animations**\n  - 60fps fluid animations for **all Vim motion commands**\n  - Unified smooth **cursor movement** and **viewport scrolling**\n  - Works in **Normal** and **Visual** modes with **count prefixes**\n\n- **Extensive Movement Coverage**\n  - **Basic**: `h`, `j`, `k`, `l`, `0`, `$`\n  - **Word Navigation**: `w`, `b`, `e`, `W`, `B`, `E`\n  - **Find/Till**: `f`, `F`, `t`, `T` (supports counts)\n  - **Text Objects**: `{`, `}`, `(`, `)`, `%`\n  - **Line Jumps**: `gg`, `G`, `|`\n  - **Search Navigation**: `n`, `N`\n  - **Screen Lines**: `gj`, `gk`\n  - **Viewport Scrolling**: `\u003cC-d\u003e`, `\u003cC-u\u003e`, `\u003cC-f\u003e`, `\u003cC-b\u003e`, `zz`, `zt`, `zb`\n\n- **Performance \u0026 Optimization**\n  - Object pooling and **frame reuse** to reduce garbage collection\n  - **API call caching** (50ms window) for efficient redraws\n  - Optimized for **smooth 60fps animations**\n  - **Performance Mode** for faster but less smooth rendering:\n    - Reduces animation duration and easing complexity\n    - Optional syntax highlighting toggle for large files\n\n- **Flexible Configuration**\n  - Separate settings for **cursor** and **scroll** animations:\n    - Duration (ms)\n    - Easing function (`linear`, `ease-out`, `ease-out-quad`)\n    - Enable/disable individually\n  - **Keymap control**:\n    - Enable/disable default mappings\n    - Define **custom mappings** for any motion\n  - Easily toggle **performance mode** at runtime\n\n- **Comprehensive Command \u0026 API Support**\n  - Commands:\n    - `:LuxMotionEnable` / `:LuxMotionDisable` / `:LuxMotionToggle`\n    - `:LuxMotionPerformanceEnable` / `Disable` / `Toggle`\n  - Lua API:\n    - Enable/disable cursor and scroll animations\n    - Toggle performance mode\n    - Trigger **manual smooth motions** for custom keymaps\n\n- **Customization \u0026 Extensibility**\n  - Different speeds and easing curves for cursor vs scrolling\n  - Integrate with **custom motions** or other keymaps\n  - Visual mode motions supported **out-of-the-box**\n\n- **Compatibility**\n  - Neovim **≥ 0.7**\n  - Designed to **coexist with other scroll/motion plugins** (disable keymaps if needed)\n\n---\n\n## 📦 Installation\n\n### **Using lazy.nvim**\n```lua\n{\n  \"LuxVim/nvim-luxmotion\",\n  config = function()\n    require(\"luxmotion\").setup({\n      cursor = {\n        duration = 250,\n        easing = \"ease-out\",\n        enabled = true,\n      },\n      scroll = {\n        duration = 400,\n        easing = \"ease-out\",\n        enabled = true,\n      },\n      performance = { enabled = false },\n      keymaps = {\n        cursor = true,\n        scroll = true,\n      },\n    })\n  end,\n}\n```\n\n### **Using packer.nvim**\n```lua\nuse {\n  \"LuxVim/nvim-luxmotion\",\n  config = function()\n    require(\"luxmotion\").setup()\n  end\n}\n```\n\n### **Using vim-plug**\n```vim\nPlug 'LuxVim/nvim-luxmotion'\n```\n\nThen in your `init.lua` or `init.vim`:\n```lua\nlua \u003c\u003c EOF\nrequire(\"luxmotion\").setup()\nEOF\n```\n\n---\n\n## 🛠️ Configuration\n\n```lua\nrequire(\"luxmotion\").setup({\n  cursor = {\n    duration = 250,       -- Cursor animation duration (ms)\n    easing = \"ease-out\",  -- Cursor easing function\n    enabled = true,\n  },\n  scroll = {\n    duration = 400,       -- Scroll animation duration (ms)\n    easing = \"ease-out\",  -- Scroll easing function\n    enabled = true,\n  },\n  performance = {\n    enabled = false,      -- Enable performance mode\n  },\n  keymaps = {\n    cursor = true,        -- Enable cursor motion keymaps\n    scroll = true,        -- Enable scroll motion keymaps\n  },\n})\n```\n\n---\n\n## 🎮 Commands\n\n### **Global Controls**\n- `:LuxMotionEnable` – Enable all animations\n- `:LuxMotionDisable` – Disable all animations\n- `:LuxMotionToggle` – Toggle all animations\n\n### **Individual Controls**\n- `:LuxMotionEnableCursor` / `:LuxMotionDisableCursor`\n- `:LuxMotionEnableScroll` / `:LuxMotionDisableScroll`\n\n### **Performance Mode**\n- `:LuxMotionPerformanceEnable`\n- `:LuxMotionPerformanceDisable`\n- `:LuxMotionPerformanceToggle`\n\n---\n\n## 🔧 Lua API\n\n```lua\nlocal luxmotion = require(\"luxmotion\")\n\n-- Global control\nluxmotion.enable()\nluxmotion.disable()\nluxmotion.toggle()\n\n-- Individual controls\nluxmotion.enable_cursor()\nluxmotion.disable_cursor()\nluxmotion.enable_scroll()\nluxmotion.disable_scroll()\n\n-- Performance mode\nlocal performance = require(\"luxmotion.performance\")\nperformance.enable()\nperformance.disable()\nperformance.toggle()\nperformance.is_active()\n\n-- Manual motion (if custom keymaps are used)\nlocal cursor_keymaps = require(\"luxmotion.cursor.keymaps\")\ncursor_keymaps.smooth_move(\"j\", 5)\ncursor_keymaps.smooth_word_move(\"w\", 3)\ncursor_keymaps.smooth_find_move(\"f\", \"x\", 2)\ncursor_keymaps.smooth_text_object_move(\"}\", 1)\n```\n\n---\n\n## 🎨 Customization Examples\n\n### **Disable Default Keymaps**\n```lua\nrequire(\"luxmotion\").setup({\n  keymaps = {\n    cursor = false,\n    scroll = false,\n  },\n})\n\n-- Define your own\nlocal cursor_keymaps = require(\"luxmotion.cursor.keymaps\")\nvim.keymap.set(\"n\", \"j\", function()\n  cursor_keymaps.smooth_move(\"j\", vim.v.count1)\nend)\n```\n\n### **Different Speeds for Cursor vs Scroll**\n```lua\nrequire(\"luxmotion\").setup({\n  cursor = {\n    duration = 100,\n    easing = \"linear\",\n  },\n  scroll = {\n    duration = 500,\n    easing = \"ease-out\",\n  },\n})\n```\n\n### **Performance-Oriented Setup**\n```lua\nrequire(\"luxmotion\").setup({\n  cursor = {\n    duration = 150,\n    easing = \"linear\",\n  },\n  performance = { enabled = true },\n})\n```\n\n---\n\n## 📈 Comparison\n\n| Feature                  | luxmotion | neoscroll.nvim | vim-smoothie |\n|--------------------------|----------|----------------|--------------|\n| Cursor Movement          | ✅       | ❌              | ❌           |\n| Scroll Movement          | ✅       | ✅              | ✅           |\n| Word Navigation          | ✅       | ❌              | ❌           |\n| Find/Till Support        | ✅       | ❌              | ❌           |\n| Text Objects             | ✅       | ❌              | ❌           |\n| Search Navigation        | ✅       | ❌              | ❌           |\n| Visual Mode              | ✅       | ✅ (scroll)     | ✅ (scroll)  |\n| Count Prefixes           | ✅       | ✅ (scroll)     | ✅ (scroll)  |\n\n---\n\n## 🐛 Troubleshooting\n\n- **Performance Issues**\n  - Enable performance mode: `:LuxMotionPerformanceEnable`\n  - Reduce animation duration: `cursor = { duration = 100 }`\n  - Use `linear` easing for fastest performance\n- **Conflicts**\n  - Disable default keymaps: `keymaps = { cursor = false }`\n  - Set your own mappings manually\n- **Animations Not Smooth**\n  - Ensure terminal supports **true colors**\n  - Use Neovim **≥ 0.7**\n  - Lower `scrolloff` for large jumps\n\n---\n\n## 🙏 Acknowledgments\n\nInspired by [vim-smoothie](https://github.com/psliwka/vim-smoothie) and  [neoscroll.nvim](https://github.com/karb94/neoscroll.nvim).\n\n---\n\n## 📄 License\n\nMIT License – see [LICENSE](LICENSE) for details.\n","funding_links":[],"categories":["Animation"],"sub_categories":["CSV Files"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FLuxVim%2Fnvim-luxmotion","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FLuxVim%2Fnvim-luxmotion","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FLuxVim%2Fnvim-luxmotion/lists"}