Перемещение всей линии вверх и вниз в Vim
В Notepad ++ я могу использовать Ctrl + Shift + Up/Down для перемещения текущей строки вверх и вниз. Есть ли в Vim аналогичная команда? Я просмотрел бесконечные гиды, но ничего не нашел.
Если этого не происходит, как я могу связать действие с этой комбинацией клавиш?
Изменить: ответ Миколы работает для всех строк, кроме тех, которые находятся в начале и в конце буфера. Перемещение первой строки или нижней строки удаляет строку, а при перемещении нижней строки она сначала перепрыгивает на два пространства, как пешка! Может ли кто-нибудь предложить какие-либо уточнения?
Ответы
Ответ 1
Поместите следующее на ваш .vimrc, чтобы выполнить задание
noremap <c-s-up> :call feedkeys( line('.')==1 ? '' : 'ddkP' )<CR>
noremap <c-s-down> ddp
Исчезновение строки выглядит как ошибка Vim. Я сделал взломы, чтобы избежать этого. Вероятно, есть более точное решение.
Обновление
Существует множество необъяснимых трудностей при использовании комбинаций Vim. Эти строки отсутствуют и добавляются дополнительные строки.
Итак, вот решение для сценариев, которое можно разместить либо внутри .vimrc, либо ~/.vim/plugin/swap_lines.vim
function! s:swap_lines(n1, n2)
let line1 = getline(a:n1)
let line2 = getline(a:n2)
call setline(a:n1, line2)
call setline(a:n2, line1)
endfunction
function! s:swap_up()
let n = line('.')
if n == 1
return
endif
call s:swap_lines(n, n - 1)
exec n - 1
endfunction
function! s:swap_down()
let n = line('.')
if n == line('$')
return
endif
call s:swap_lines(n, n + 1)
exec n + 1
endfunction
noremap <silent> <c-s-up> :call <SID>swap_up()<CR>
noremap <silent> <c-s-down> :call <SID>swap_down()<CR>
Ответ 2
Если я хочу поменять одну строку на строку выше, я обычно делаю следующее
ddkP
Объяснение
- dd удалит строку и добавит ее в регистр по умолчанию.
- k будет двигаться вверх по линии (j будет двигаться вниз по линии)
- P будет вставляться поверх текущей строки
Ответ 3
Предполагая, что курсор находится в строке, которую вы хотите переместить.
Перемещение вверх и вниз:
:m
для перемещения
:m +1
- перемещается вниз на 1 строку
:m -2
- перемещение вверх на 1 строку
(Обратите внимание, что вы можете заменить +1 на любые числа, в зависимости от того, сколько строк вы хотите переместить вверх или вниз, т.е. +2 сдвинет его на две линии, -3 переместит его на 2 строки)
Чтобы перейти к определенной строке
:set number
- отобразить числовые линии (проще видеть, куда вы его перемещаете)
:m 3
- переместите строку после третьей строки (замените 3 на любую нужную строку)
Перемещение нескольких строк:
V
(т.е. Shift - V) и перемещайте курсор вверх и вниз, чтобы выбрать несколько строк в VIM
после выбранного удара : и выполните приведенные выше команды, m +1
и т.д.
Ответ 4
Переместите строку вверх: ddkP
Переместите строку вниз: ddp
Ответ 5
Это сработало для меня:
http://vim.wikia.com/wiki/Moving_lines_up_or_down_in_a_file
Кстати, если вы хотите использовать ALT + some_key и ваш терминал (urxvt делает это) отказывается соблюдать, вы должны ввести что-то вроде этого в вашем .vimrc:
" For moving lines (^] is a special character; use <M-k> and <M-j> if it works)
nnoremap ^]k mz:m-2<CR>`z==
inoremap ^]j <Esc>:m+<CR>==gi
inoremap ^]k <Esc>:m-2<CR>==gi
vnoremap ^]j :m'>+<CR>gv=`<my`>mzgv`yo`z
nnoremap ^]j mz:m+<CR>`z==
vnoremap ^]k :m'<-2<CR>gv=`>my`<mzgv`yo`z
где ^] один символ, который представляет ключ ALT.
Чтобы ввести этот символ, используйте C+v, Esc в Vim (C+q, Esc в Windows).
Ответ 6
В командном режиме установите курсор на строку, которую вы хотите переместить вниз, а затем
ddp
Объяснение:
dd удаляет текущую строку в общий буфер
p ставит его назад ПОСЛЕ положения курсора или в случае целых строк, одна строка ниже.
Существует некоторая путаница в отношении команд p и P во многих документах.
В действительности p вставляет ПОСЛЕ курсора и курсор P AT.
Ответ 7
добавьте следующее в файл ~/.vimrc(убедитесь, что у вас нет сопоставления для n, m)
nmap n :m +1<CR>
nmap m :m -2<CR>
теперь нажатие клавиши n
переместит строку вниз, а m
переместит линию вверх.
Ответ 8
Просто добавьте этот код в .vimrc(или .gvimrc)
nnoremap <A-j> :m+<CR>==
nnoremap <A-k> :m-2<CR>==
inoremap <A-j> <Esc>:m+<CR>==gi
inoremap <A-k> <Esc>:m-2<CR>==gi
vnoremap <A-j> :m'>+<CR>gv=gv
vnoremap <A-k> :m-2<CR>gv=gv
Ответ 9
Именно то, что вы ищете в этом удивительном плагине: https://github.com/vim-scripts/upAndDown
Ответ 10
Вот упрощенная версия для MacVim, использующая примеры статей Wikia (см. ссылку из комментария к пистолету).
" Move selection up/down (add =gv to reindent after move)
:vmap <D-S-Up> :m-2<CR>gv
:vmap <D-S-Down> :m'>+<CR>gv
Я использую только вариант выбора блока, потому что все, что требуется, это Shift-V, чтобы выбрать текущую строку и, при необходимости, курсор вверх/вниз, чтобы выбрать еще несколько строк.
В соответствии с ярлыками выше, нажатие Cmd-Shift-Up/Down сдвигает выбор блока вверх/вниз. "D" - это командный ключ в MacVim, для Windows попробуйте "C" (Control) или "A" (Alt) (например, < C-A-f > будет Control Alt f).
В статье Wikia добавляется "= gv", что позволяет отрегулировать отступ блока после перемещения, основываясь на окружающем тексте. Это сбивает с толку, поэтому я удалил его и добавил ярлыки для быстрого отступов выбора.
" Indent selection left/right (Cmd Shift Left/Right is used for Tab switching)
:vmap <D-A-Left> <gv
:vmap <D-A-Right> >gv
Разум, то же самое можно сделать с < и → , но выбор будет потерян, поэтому эти ярлыки выше позволяют отступы несколько раз и по-прежнему перемещать блок, потому что выбор поддерживается.
Мой MacVim настроен для переключения вкладок с помощью Cmd-Shift-Left/Right, поэтому я использовал Cmd-Alt-Left/Right.
Здесь переключение Tab для MacVim (добавьте в .gvimrc с остальным выше):
:macm Window.Select\ Previous\ Tab key=<D-S-Left>
:macm Window.Select\ Next\ Tab key=<D-S-Right>
Ответ 11
В конце моего .vimrc файла я поставил следующее:
noremap H ddkkp
noremap N ddp
Итак, теперь "H" и "N" перемещают текущую линию вверх и вниз соответственно.
Ответ 12
A простое решение состоит в том, чтобы вставить .vimrc
следующие строки:
nmap <C-UP> :m-2<CR>
nmap <C-DOWN> :m+1<CR>
Ответ 13
: m. + 1 или: m.-2, если вы перемещаете одну строку. Здесь my script для перемещения нескольких строк. В визуальном режиме Alt-up/Alt-down будет перемещать строки, содержащие визуальный выбор вверх/вниз, на одну строку. В режиме вставки или в обычном режиме Alt-up/Alt-down перемещает текущую строку, если префикс счетчика не задан. Если есть префикс count, Alt-up/Alt-down переместит много строк, начинающихся с текущей строки вверх/вниз на одну строку.
function! MoveLines(offset) range
let l:col = virtcol('.')
let l:offset = str2nr(a:offset)
exe 'silent! :' . a:firstline . ',' . a:lastline . 'm'
\ . (l:offset > 0 ? a:lastline + l:offset : a:firstline + l:offset)
exe 'normal ' . l:col . '|'
endf
imap <silent> <M-up> <C-O>:call MoveLines('-2')<CR>
imap <silent> <M-down> <C-O>:call MoveLines('+1')<CR>
nmap <silent> <M-up> :call MoveLines('-2')<CR>
nmap <silent> <M-down> :call MoveLines('+1')<CR>
vmap <silent> <M-up> :call MoveLines('-2')<CR>gv
vmap <silent> <M-down> :call MoveLines('+1')<CR>gv
Ответ 14
В обычном режиме вы можете нажать:
Shift + j
Ответ 15
vim plugin unimpaired.vim [e и] e
Ответ 16
Режим VIM в Sublime Text 2
Не VIM, но я нашел здесь способ сделать это в Vintage Mode ST2, поэтому он может быть полезен другим.
Для тех, кто использует Sublime Text 2, вы можете использовать...
Control + Command + Up/Down
... для перемещения строки вверх или вниз соответственно.