fedepujol / move.nvim

Gain the power to move lines and blocks and auto-indent them!
GNU General Public License v3.0
348 stars 6 forks source link
lua move neovim nvim plugin vim

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

:zap: Requirements

This plugin works with Neovim v0.5 or later.

:package: Installation

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

:gear: 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
    }
})

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

:rocket: 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

:keyboard: 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)

:electric_plug: 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.