Suponha que eu já tenha selecionado algum texto no buffer atual. É possível selecionar outro trecho de texto, mantendo a seleção anterior (e assim por diante)?
Adicionado : Uma motivação para essa funcionalidade é a seguinte: Suponha que eu tenha algum texto parecido com este:
paragraph 1 ...
paragraph 2 ...
paragraph 3 ...
paragraph 4 ...
paragraph 5 ...
Gostaria de remover alguns parágrafos (por exemplo, 2, 4 e 6) e inseri-los antes do parágrafo 1.
multiple-cursors
pode dar uma solução.Respostas:
Você pode usar
append-next-kill
(vinculadoC-M-w
por padrão) para acumular o texto que deseja inserir acimaparagraph 1
:Mate
paragraph 2
como faria normalmente.Marque
paragraph 4
e pressioneC-M-w
antes de matá-lo. Repita esta etapa para todos os parágrafos que você deseja mover antesparagraph 1
.Quando terminar, você pode puxar o texto acumulado antes
paragraph 1
.fonte
Você pode usar registros combinados com o anel da marca. Empurre as marcas atuais com
C-<SPC> C-<SPC>
, recupere-as mais tarde comC-u C-<SPC>
ou salve-as em um registro, digamosb
, viaC-x r <SPC> b
e volte mais tarde comC-x r j b
.Agora marque outra região.
C-u C-x r s a
copiará a região marcada para registrara
e excluir o texto. Em seguida, marque a próxima região eC-u C-x r + a
anexará outra seleção a esse registroa
e a excluirá.Você pode inserir o conteúdo com
C-x r i a
.Consulte a seção "Salvando texto nos registros" do manual do Emacs.
fonte
O novo suporte à região retangular no Emacs-24.4 realmente introduziu (grande parte) a infraestrutura necessária para essa funcionalidade [afinal, uma região retangular é uma região não contígua].
Portanto, agora deve ser possível implementar um pacote de "região dividida" que forneça exatamente a funcionalidade que você está solicitando.
É certo que muitos comandos do Emacs ainda não foram adaptados para usar a nova infraestrutura (por exemplo, comandos como upcase-region ou undo-in-region, query-replace, ...) e, portanto, ainda não funcionam corretamente em retângulos (para que eles também não funcionassem corretamente em uma "região dividida"), mas esses são erros que esperamos que sejam corrigidos com o tempo.
fonte
Instale browse-kill-ring.el
copie e mate todas as regiões de interesse.
Chegou ao ponto onde a reinserção deve começar.
M-x
browse-kill-ring
RET irá abrir um buffer e colocar o cursor nele.Digite npara viajar em pedaços.
RET lá irá inserir o pedaço no ponto no original / outro buffer.
fonte
Se as linhas que você deseja manipular puderem ser distinguidas por meio de uma correspondência de regex, use o modo de ocorrência para visualizá-las em uma nova janela. Você pode usar o modo de edição de ocorrências para editá- los, com o buffer original refletindo as alterações feitas no buffer Ocorrer.
Isso funciona maravilhosamente, por exemplo, em combinação com o modo de cursores múltiplos : como as linhas que você selecionou para aparecer no buffer Ocorrer são exibidas de forma contígua, independentemente da distância que estão no buffer original, você pode marcar todos eles ou um subconjunto e, em seguida, ative
mc/edit-lines
e edite todos de uma vez. (Sim, eu sei que vários cursores podem fazer isso sozinhosmc/mark-all-like-this
, mas é bom ter opções.)Qualquer outra operação de edição que seria mais fácil se você estivesse vendo apenas as linhas nas quais queria trabalhar, como configurar uma pesquisa e substituição complicada de regex ou uma macro que precise ser executada em cada linha de um buffer por sua vez, também pode ser feito dessa maneira.
fonte
Isso responde à sua pergunta geral, mas não particularmente ao caso de uso mencionado (movendo bits de código).
O Emacs agora tem o que chama de região não contígua , que é o tipo de seleção que você está perguntando. O Vanilla Emacs não fornece nenhuma maneira especial de criar uma região não contígua, exceto se for um retângulo . Mas a biblioteca Zones sim.
As zonas da biblioteca permitem definir várias zonas no seu buffer. Uma lista de zonas é uma região não contígua . Você também pode pensar nele como várias regiões, dependendo de como deseja utilizá-lo. Você pode ter várias listas de zonas definidas a qualquer momento, cada uma atribuída a uma variável de zonas diferentes, e pode alternar entre elas.
Se você também usar a biblioteca Bookmark + , poderá salvar as listas de zonas persistentemente e restaurá-las nas sessões posteriores do Emacs. O Marcador + também permite atribuir tags arbitrárias a um marcador. Isso significa que você pode marcar uma lista de zonas.
As zonas em uma determinada lista de zonas geralmente estão no mesmo buffer, mas não precisam estar. Nesse caso, uma lista de zonas é mais geral que uma região não contígua. Também é mais geral, pois cada zona pode conter informações adicionais, além dos limites da zona, e pode ter um identificador.
Existem várias maneiras de criar uma zona. Um dos mais fáceis é usar
C-x n a
: define uma zona da região ativa e a adiciona ao conjunto de zonas atual. (C-x n n
(narrow-to-region
) também faz isso, além de restringir.)Estas são algumas das ações que você pode fazer com um conjunto (lista) de zonas:
facemenu+.el
.Consulte também Narrow Indirect , que permite criar buffers indiretos que são clones de um determinado buffer e que são limitados a diferentes partes dele.
fonte
Outra opção: transposição de parágrafos
Por uma questão de completude, você pode obter sua reordenação de parágrafos (sequencialmente) com regiões marcadas e
M-0 M-x transpose-paragraph
(o argumento zero faz com quetra-par
os parágrafos sejam trocados nos pontos e marcas, ou seja, a região começa e termina)!A propósito, isso funciona para todos os
transpose-.*
comandos (-words, -sexp, -sentences, ...) e é extremamente útil em muitas situações.fonte
Outra maneira é usar o pacote contestado (eu sou o autor). Você pode marcar qualquer objeto de texto com
m
o ponto que é movido automaticamente para o próximo objeto do tipo atual. Desmarque qualquer objeto navegando até ele e pressione m novamente. Aqui está um exemplo de screencast (mostra linhas de marcação, mas funciona para outros objetos, como parágrafos, desafia ... também):fonte
package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found
.M-x package-refresh-contents
e entãoM-x package-install
.