A maneira mais rápida de mover o bloco de código para uma linha específica

8

Digamos que você tenha código nas linhas 4, 5, 6. Em seguida, você deseja mover esse bloco de código para a linha 9 do ponto inicial e também excluir as linhas 4, 5, 6.

Qual é a maneira mais rápida, ou seja, a menor quantidade de pressionamentos de tecla, para conseguir isso? Uma função personalizada seria mais adequada?

Edgar Aroutiounian
fonte

Respostas:

6

Começando no início da linha 4 ( ESC 4 ESC g gou M-4 M-g M-gpara ir para lá), C-3 C-k C-2 C-n C-y(ou ESC 3 C-k down down C-yse você não gostar de manter os modificadores pressionados) fará isso.

Se você não quiser fazer a aritmética em sua cabeça, mas selecione as linhas visualmente,

  • Mover para o início da zona para mover
  • C-SPC para marcar
  • Mova para o início da primeira linha para manter
  • C-w cortar
  • Mova para o local onde deseja inserir o texto recortado
  • C-y colar

Acho que não há maneira de reduzir isso, a menos que você esteja disposto a perder alguma flexibilidade (por exemplo, se você deseja mover um bloco de exatamente três linhas). Você precisa fornecer três locais: o início do bloco a ser movido, o final do bloco a ser movido e o destino. Nas seqüências acima, há um único pressionamento de tecla em cada local, o mais baixo possível.

Gilles 'SO- parar de ser mau'
fonte
8

Se a distância não for grande, você pode usar o texto em movimento :

insira a descrição da imagem aqui

Em termos de pressionamentos de tecla, para mim é:

  1. Selecione a região:

    C-SPCC-nC-nC-n

  2. Mover região:

    H-S-nH-S-nH-S-n

( move-text-downestá ligado a H-S-n)

welldan97
fonte
Você também pode fornecer um argumento numérico npara move-text-downe move-text-up. Isso reduz o passo (2) para M-3 H-S-n.
itsjeyd
3

Você pode usar a região de expansão para marcar o bloco, se for uma unidade semântica, como uma função (o site do pacote explica isso em mais detalhes). Em seguida, mova-o como a outra resposta explica. Dependendo de onde você está no bloco, uma única tecla pode marcar a coisa toda.

rlazo
fonte
Você pode expandir isso? O que você quer dizer com um bloco real? Como um bloco funcional?
Edgar Aroutiounian
Sim, o termo usado no pacote é "unidades semânticas", que podem ser palavra, linha, bloco de código, função, classe, arquivo inteiro. Editei a resposta para incluir um link para o pacote que explica isso melhor.
Rlazo 23/09/14
2

Se você estiver usando evil-mode, você também pode usar um excomando: :4,6m9(qual moves linhas 4para 6a linha 9).

shosti
fonte
Eu não entendo o ponto de mencionar um recurso exótico como a emulação vi quando não tem nada a ver com a pergunta.
Gilles 'SO- stop be evil'
2
Gilles: evil-modenão é exatamente obscuro - ele tem quase 18.000 downloads no melpa. Outra resposta usada expand-region, que também é um pacote externo. Para um site de perguntas e respostas, provavelmente é bom incluir várias maneiras de realizar a mesma coisa com pacotes diferentes (embora possa ser bom apresentar algumas diretrizes).
shosti 23/09/14