Gain the power to move lines and blocks and auto-indent them!
Find a file
2025-05-13 12:02:09 -03:00
lua feat: enable or disable indentation 2024-01-31 12:44:39 -03:00
LICENSE Create LICENSE 2024-01-31 10:13:50 -03:00
README.md Update README.md 2025-05-13 12:01:54 -03:00

move.nvim

Gain the power to move lines and blocks!

Vertical Movement

vert_line

vert_block

Horizontal Movement

hor_char

hor_block

Word Movement

word

Requirements

This plugin works with Neovim v0.5 or later.

📦 Installation

{ 
    'fedepujol/move.nvim',
    opts = {
        --- Config
    }
}
'fedepujol/move.nvim';

⚙️ Configuration

You can use the default's (leaving the setup function empty)

require('move').setup({})

or customizing it

require('move').setup({
    line = {
        enable = true, -- Enables line movement
        indent = true  -- Toggles indentation
    },
    block = {
        enable = true, -- Enables block movement
        indent = true  -- Toggles indentation
    },
    word = {
        enable = true, -- Enables word movement
    },
    char = {
        enable = false -- Enables char movement
    }
})

By default, every option is enabled except char movement. ⚠️ Disabling line/block/word/char movements, will not generate the commands.

🚀 Usage

The plugin provides the following commands:

Command Description Mode
MoveLine Moves a line up or down Normal
MoveHChar Moves the character under the cursor, left or right Normal
MoveWord Transpose the word under the cursor forwards or backwards Normal
MoveBlock Moves a selected block of text, up or down Visual
MoveHBlock Moves a visual area, left or right Visual

⌨️ Mappings

VimScript

" Normal-mode commands
nnoremap <silent> <A-j> :MoveLine(1)<CR>
nnoremap <silent> <A-k> :MoveLine(-1)<CR>
nnoremap <silent> <A-l> :MoveHChar(1)<CR>
nnoremap <silent> <A-h> :MoveHChar(-1)<CR>
nnoremap <silent> <leader>wf :MoveWord(1)<CR>
nnoremap <silent> <leader>wb :MoveWord(-1)<CR>

" Visual-mode commands
vnoremap <silent> <A-j> :MoveBlock(1)<CR>
vnoremap <silent> <A-k> :MoveBlock(-1)<CR>
vnoremap <silent> <A-l> :MoveHBlock(1)<CR>
vnoremap <silent> <A-h> :MoveHBlock(-1)<CR>

Lua

local opts = { noremap = true, silent = true }
-- Normal-mode commands
vim.keymap.set('n', '<A-j>', ':MoveLine(1)<CR>', opts)
vim.keymap.set('n', '<A-k>', ':MoveLine(-1)<CR>', opts)
vim.keymap.set('n', '<A-h>', ':MoveHChar(-1)<CR>', opts)
vim.keymap.set('n', '<A-l>', ':MoveHChar(1)<CR>', opts)
vim.keymap.set('n', '<leader>wf', ':MoveWord(1)<CR>', opts)
vim.keymap.set('n', '<leader>wb', ':MoveWord(-1)<CR>', opts)

-- Visual-mode commands
vim.keymap.set('v', '<A-j>', ':MoveBlock(1)<CR>', opts)
vim.keymap.set('v', '<A-k>', ':MoveBlock(-1)<CR>', opts)
vim.keymap.set('v', '<A-h>', ':MoveHBlock(-1)<CR>', opts)
vim.keymap.set('v', '<A-l>', ':MoveHBlock(1)<CR>', opts)

or merge with lazy config (thanks to ReKylee)

return {
    "fedepujol/move.nvim",
    keys = {
      -- Normal Mode
      { "<A-j>", ":MoveLine(1)<CR>", desc = "Move Line Up" },
      { "<A-k>", ":MoveLine(-1)<CR>", desc = "Move Line Down" },
      { "<A-h>", ":MoveHChar(-1)<CR>", desc = "Move Character Left" },
      { "<A-l>", ":MoveHChar(1)<CR>", desc = "Move Character Right" },
      { "<leader>wf", ":MoveWord(-1)<CR>", mode = { "n" }, desc = "Move Word Left" },
      { "<leader>wb", ":MoveWord(1)<CR>", mode = { "n" }, desc = "Move Word Right" },
      -- Visual Mode
      { "<A-j>", ":MoveBlock(1)<CR>", mode = { "v" }, desc = "Move Block Up" },
      { "<A-k>", ":MoveBlock(-1)<CR>", mode = { "v" }, desc = "Move Block Down" },
      { "<A-h>", ":MoveHBlock(-1)<CR>", mode = { "v" }, desc = "Move Block Left" },
      { "<A-l>", ":MoveHBlock(1)<CR>", mode = { "v" }, desc = "Move Block Right" },
    },
    opts = {
      -- Config here
    }
}

🔌 Integration

Legendary.nvim

Thanks to hinell to point this out:

Note

: Don't set up the keys like above if you're using legendary

local opts = { noremap = true }
require('legendary').setup({
    keymaps = {
        { "<A-k>", ":MoveLine -1", description = "Line: move up", opts },
        { "<A-j>", ":MoveLine 1", description = "Line: move down", opts },
        ...
    }
})

Mention

There is an original and more feature rich plugin (written in VimScript):

vim-move.