Skip to main content

Usage Guide

Learn how to use haft.nvim commands, Telescope integration, Lua API, and common workflows.

Command Reference

All Haft CLI commands are available in Neovim with the :Haft prefix. Each command runs asynchronously and provides enhanced UI.

Project Information Commands

Neovim CommandCLI EquivalentDescription
:HaftInfohaft infoShow project info in floating window (CLI docs →)
:HaftRouteshaft routesShow API routes in floating window (CLI docs →)
:HaftStatshaft statsShow code statistics in floating window (CLI docs →)

Example:

:HaftInfo
" Output: Floating window with project details

:HaftRoutes
" Output: List of all @RestController endpoints

:HaftStats
" Output: Code statistics with COCOMO estimates

Dependency Management Commands

Neovim CommandCLI EquivalentDescription
:HaftAdd [dep...]haft add [dep...]Add dependencies (CLI docs →)
:HaftRemove [dep...]haft remove [dep...]Remove dependencies (CLI docs →)

Interactive Mode (no arguments):

:HaftAdd
" Opens Telescope picker with all available dependencies
" Press <Tab> to multi-select, <Enter> to confirm

:HaftRemove
" Opens Telescope picker with current project dependencies
" Select dependencies to remove

Direct Mode (with arguments):

:HaftAdd lombok validation
" Adds lombok and spring-boot-starter-validation

:HaftRemove lombok
" Removes lombok dependency

Code Generation Commands

Neovim CommandCLI EquivalentDescription
:HaftGenerateResource [name]haft generate resource [name]Generate complete CRUD resource (CLI docs →)
:HaftGenerateController [name]haft generate controller [name]Generate REST controller (CLI docs →)
:HaftGenerateService [name]haft generate service [name]Generate service layer (CLI docs →)
:HaftGenerateRepository [name]haft generate repository [name]Generate JPA repository (CLI docs →)
:HaftGenerateEntity [name]haft generate entity [name]Generate JPA entity (CLI docs →)
:HaftGenerateDto [name]haft generate dto [name]Generate Request/Response DTOs (CLI docs →)

With Name Argument:

:HaftGenerateResource Product
" Generates: ProductController, ProductService, ProductRepository,
" Product (entity), ProductRequest, ProductResponse, etc.
" Auto-opens ProductController.java

Without Name Argument:

:HaftGenerateController
" Prompts: "Enter controller name:"
" Type: Order
" Generates: OrderController.java

Note: All generation respects your project's architecture and conventions. Haft automatically adapts to your codebase structure.


Telescope Integration

haft.nvim provides Telescope pickers for enhanced dependency management.

Loading the Extension

require("telescope").load_extension("haft")

Available Pickers

Dependencies Picker

Interactive picker for adding dependencies:

:Telescope haft dependencies

" Or via Lua:
:lua require("telescope").extensions.haft.dependencies()

Features:

  • Search all Spring Boot dependencies
  • Browse by category
  • Multi-select with <Tab>
  • Preview pane shows dependency details
  • Press / to filter

Remove Dependencies Picker

Interactive picker for removing dependencies:

:Telescope haft remove

" Or via Lua:
:lua require("telescope").extensions.haft.remove()

Features:

  • Shows current project dependencies
  • Multi-select for batch removal
  • Shows version and scope information

Telescope Keybindings

Default Telescope keybindings in pickers:

KeyAction
<Enter>Select (single) or confirm (multi)
<Tab>Toggle selection (multi-select mode)
<C-x>Open in horizontal split
<C-v>Open in vertical split
/Search/filter
<Esc>Close picker
<C-c>Close picker

Lua API

Use haft.nvim programmatically from Lua.

Setup

require("haft").setup(config)

Project Detection

local haft = require("haft")

-- Check if current directory is a Haft project
if haft.is_haft_project() then
print("Haft project detected")
end

-- Get project information
local info = haft.get_project_info()
if info then
print("Project:", info.name)
print("Type:", info.type)
end

Commands (Programmatic)

local haft = require("haft")

-- Project information
haft.info()
haft.routes()
haft.stats()

-- Dependency management
haft.add() -- Opens picker
haft.add({ "lombok", "validation" }) -- Direct add
haft.remove() -- Opens picker
haft.remove({ "lombok" }) -- Direct remove

-- Code generation
haft.generate_resource("User")
haft.generate_controller("Order")
haft.generate_service("Payment")
haft.generate_repository("Product")
haft.generate_entity("Customer")
haft.generate_dto("Invoice")

Keybindings

haft.nvim provides no default keybindings. Configure your own based on your workflow.

Suggested Keybindings

Leader-Based (General Use)

-- Project info
vim.keymap.set("n", "<leader>hi", "<cmd>HaftInfo<cr>", { desc = "Haft: Info" })
vim.keymap.set("n", "<leader>hr", "<cmd>HaftRoutes<cr>", { desc = "Haft: Routes" })
vim.keymap.set("n", "<leader>hs", "<cmd>HaftStats<cr>", { desc = "Haft: Stats" })

-- Dependencies
vim.keymap.set("n", "<leader>ha", "<cmd>HaftAdd<cr>", { desc = "Haft: Add dependency" })
vim.keymap.set("n", "<leader>hR", "<cmd>HaftRemove<cr>", { desc = "Haft: Remove dependency" })

-- Generation
vim.keymap.set("n", "<leader>hg", "<cmd>HaftGenerateResource<cr>", { desc = "Haft: Generate resource" })
vim.keymap.set("n", "<leader>hc", "<cmd>HaftGenerateController<cr>", { desc = "Haft: Generate controller" })
vim.keymap.set("n", "<leader>he", "<cmd>HaftGenerateEntity<cr>", { desc = "Haft: Generate entity" })

LocalLeader (Java/Kotlin Files Only)

vim.api.nvim_create_autocmd("FileType", {
pattern = { "java", "kotlin" },
callback = function()
local opts = { buffer = true }
vim.keymap.set("n", "<localleader>i", "<cmd>HaftInfo<cr>", vim.tbl_extend("force", opts, { desc = "Project info" }))
vim.keymap.set("n", "<localleader>r", "<cmd>HaftRoutes<cr>", vim.tbl_extend("force", opts, { desc = "API routes" }))
vim.keymap.set("n", "<localleader>a", "<cmd>HaftAdd<cr>", vim.tbl_extend("force", opts, { desc = "Add dependency" }))
vim.keymap.set("n", "<localleader>g", "<cmd>HaftGenerateResource<cr>", vim.tbl_extend("force", opts, { desc = "Generate resource" }))
end,
})

With which-key.nvim

local wk = require("which-key")
wk.add({
{ "<leader>h", group = "Haft" },
{ "<leader>hi", "<cmd>HaftInfo<cr>", desc = "Info" },
{ "<leader>hr", "<cmd>HaftRoutes<cr>", desc = "Routes" },
{ "<leader>hs", "<cmd>HaftStats<cr>", desc = "Stats" },
{ "<leader>ha", "<cmd>HaftAdd<cr>", desc = "Add dependency" },
{ "<leader>hR", "<cmd>HaftRemove<cr>", desc = "Remove dependency" },
{ "<leader>hg", "<cmd>HaftGenerateResource<cr>", desc = "Generate resource" },
})

Common Workflows

Workflow 1: Generate New Feature

" 1. Generate complete CRUD resource
:HaftGenerateResource Product

" Output:
" ✓ Generated 8 files
" ✓ Opened ProductController.java

" 2. Navigate generated files via quickfix
:cnext " ProductService.java
:cnext " ProductServiceImpl.java
:cnext " ProductRepository.java

" 3. Review all files
:copen " Open quickfix window to see all files

Workflow 2: Add Dependencies

" 1. Open dependency picker
:HaftAdd

" 2. In Telescope picker:
" - Type 'valid' to search
" - Press <Tab> on 'spring-boot-starter-validation'
" - Type 'mapstr'
" - Press <Tab> on 'mapstruct'
" - Press <Enter> to confirm

" 3. Dependencies added to pom.xml/build.gradle
" ✓ Added 2 dependencies

Workflow 3: Analyze Project

" View project metadata
:HaftInfo
" Shows: group, artifact, Java version, Spring Boot version, dependencies count

" View API endpoints
:HaftRoutes
" Shows: HTTP method, path, controller method

" View code statistics
:HaftStats
" Shows: LOC, files, packages, COCOMO estimates

Workflow 4: Refactor with Context

" 1. Check existing routes
:HaftRoutes

" 2. See which controllers exist
" Output shows UserController, OrderController

" 3. Generate new matching controller
:HaftGenerateController Payment

" 4. Review and edit
:e PaymentController.java

File Opening Behavior

After generation commands, haft.nvim can automatically open files based on your configuration.

Strategy: "first" (Default)

:HaftGenerateResource User
" Opens: UserController.java (first file)
" Quickfix: All 8 files added

Strategy: "all"

require("haft").setup({
auto_open = { strategy = "all" },
})
:HaftGenerateResource User
" Opens: All 8 files as buffers
" Use: :bnext, :bprev to navigate

Strategy: "none"

require("haft").setup({
auto_open = { enabled = false },
})
:HaftGenerateResource User
" Opens: Nothing (files added to quickfix only)
" Use: :copen, :cnext to navigate

Integration with Other Plugins

nvim-tree / neo-tree

Generated files appear in file tree automatically. Refresh with R if needed.

trouble.nvim

Quickfix entries from haft.nvim appear in Trouble:

:Trouble quickfix

harpoon

Mark frequently generated file locations:

-- After generating User resource
require("harpoon.mark").add_file() -- Mark UserController.java

Tips & Tricks

1. Quick Generate from Visual Selection

-- Map visual selection to generate
vim.keymap.set("v", "<leader>hg", function()
local text = vim.fn.getreg('"')
vim.cmd("HaftGenerateResource " .. text)
end, { desc = "Generate resource from selection" })

-- Usage:
-- 1. Visual select "Product"
-- 2. Press <leader>hg
-- 3. Generates ProductController, etc.

2. Auto-Refresh Profile

If your project structure changes frequently:

require("haft").setup({
commands = { generate = { refresh = true } },
})

3. Combine with LSP

After generating files, format with LSP:

:HaftGenerateResource Order
:cnext | lua vim.lsp.buf.format() " Format OrderService
:cnext | lua vim.lsp.buf.format() " Format OrderRepository

4. Custom Command Wrapper

Create convenience commands:

" Generate and format all
command! -nargs=1 HaftGen execute 'HaftGenerateResource ' .. <q-args> | cfdo lua vim.lsp.buf.format()

" Usage:
:HaftGen Product