Estou usando o eclipse há algum tempo e achei alguns atalhos muito úteis, em particular a capacidade de mover uma seleção retangular de linhas para cima e para baixo usando Alt + Up / Down. Eu tenho procurado por essa funcionalidade no emacs. Até agora, encontrei o seguinte script:
(defun move-text-internal (arg)
(cond
((and mark-active transient-mark-mode)
(if (> (point) (mark))
(exchange-point-and-mark))
(let ((column (current-column))
(text (delete-and-extract-region (point) (mark))))
(forward-line arg)
(move-to-column column t)
(set-mark (point))
(insert text)
(exchange-point-and-mark)
(setq deactivate-mark nil)))
(t
(beginning-of-line)
(when (or (> arg 0) (not (bobp)))
(forward-line)
(when (or (< arg 0) (not (eobp)))
(transpose-lines arg))
(forward-line -1)))))
(defun move-text-down (arg)
"Move region (transient-mark-mode active) or current line
arg lines down."
(interactive "*p")
(move-text-internal arg))
(defun move-text-up (arg)
"Move region (transient-mark-mode active) or current line
arg lines up."
(interactive "*p")
(move-text-internal (- arg)))
(global-set-key [\M-up] 'move-text-up)
(global-set-key [\M-down] 'move-text-down)
Isso funciona, exceto pelo fato de que isso move a seleção . Prefiro mover todas as linhas (incluindo a nova linha à direita) incluídas na seleção. Existe uma maneira de perceber isso também?
Respostas:
drag-stuff
Confira o
drag-stuff
pacote (também disponível no Melpa).Você pode selecionar uma região e usar
drag-stuff-up
/drag-stuff-down
para mover a região para cima / baixo.Comportamento alternativo ao arrastar linhas
Por padrão, os
drag-stuff
comandos também arrastam a linhapoint
em que está (mesmo que o ponto esteja na primeira coluna). Se você quiser selecionar, digamos 2 linhas inteirasC-a C-SPC C-n C-n
, a seleção será algo como istoObserve que aqui pretendo mover apenas as linhas 2 e 3, não a linha 4 . Mas
drag-stuff
moverá essa terceira linha também por padrão.Essa foi a minha irritação (e provavelmente não se aplica a mais ninguém) e, portanto, solicitei o pacote dev para uma solução . Aqui está um truque que você pode colocar na sua configuração do emacs depois de solicitar,
drag-stuff
se você não quiser esse comportamento padrão. O hack não moverá a linha atual SE o ponto estiver na coluna 0 (primeira coluna).Demonstração de como as linhas de arrasto funcionam antes e depois do hack acima
Antes de hackear
Após o hack
Combinações de teclas
Para obter o comportamento semelhante ao eclipse, adicione as combinações de teclas apropriadas:
fonte
C-a C-SPC C-4 C-n
) ou parágrafos inteiros ( exemploC-a C-SPC M-}
). Eu sei que existeM-h
, ainda não me acostumei com isso ainda. Imagine como seria irritante se cada vez que eu acabasse arrastando meu parágrafo selecionado mais a próxima linha! :)Eu codifiquei isso há muito tempo, use-o todos os dias .
fonte
Aqui está uma maneira de fazer isso usando macros do teclado:
fonte
transpose-lines
que funciona desta maneira, mas isso só funciona para linhas simples como faz a sua sugestão ...C-p
).