Emacs: como remarcar uma região marcada anteriormente

6

Ao usar o Emacs, geralmente preciso executar várias operações na mesma região (geralmente objetos grandes, mas não bem definidos, como "seção inteira", "parágrafo inteiro"). Atualmente, eu tenho que marcar manualmente a região, executar a primeira operação, depois voltar e marcar novamente a região, e executar a segunda operação, e repetir ... Isso é muito trabalhoso. Gostaria de saber se existe algum atalho para remarcar uma região marcada anteriormente? Ou alguma forma de manter uma região marcada até eu dizer ao Emacs para desmarcar.

    
por Truong 30.07.2012 / 15:13

7 respostas

4

Os trechos de script abaixo vincularão os acordes de teclado F6 , C-F6 , C-S-F6 aos marcadores de gerenciador (marca vs) . Marcadores movem-se, encolhem e aumentam, à medida que você altera o texto entre eles e entre eles. Você pode usar as teclas que preferir. Coloque o código no seu arquivo ~/.emacs config.

  • Primeiro, estabeleça os limites da região inicial (ponto de marcação).
  • Em seguida, pressione F6 para definir marcadores para os limites dessa região.
  • Faça o que você precisar fazer ...
  • Restabeleça os limites da região modificada pressionando C-F6 .Repetir * "Do .." conforme necessário
  • Quando terminar, use C-S-F6 para limpar os marcadores de região.
(global-set-key (kbd "<f6>") 'set-markers-for-region)
(defun set-markers-for-region ()
  (interactive)
  (make-local-variable 'm1)
  (make-local-variable 'm2)
  (setq m1 (copy-marker (mark)))
  (setq m2 (copy-marker (point))))

(global-set-key (kbd "<C-f6>") 'set-region-from-markers)
(defun set-region-from-markers ()
  (interactive)
  (set-mark m1)
  (goto-char m2))

(global-set-key (kbd "<C-S-f6>") 'unset-region-markers)
(defun unset-region-markers ()
  (interactive)
  (set-marker m1 nil)
  (set-marker m2 nil))
    
por 30.07.2012 / 17:49
5

Se a região acabou de ser desmarcada (o que o Emacs chama de "desativada"), C-x C-x irá comentar (a.k.a. "reativar").

    
por 21.11.2016 / 14:22
3

Infelizmente, não há recurso de histórico de região no Emacs. Há a função pop-mark , que restaura a marca para uma localização anterior obtida da variável mark-ring , mas não define o ponto e, portanto, é inútil para restaurar regiões antigas. Se você é adepto do Emacs-Lisp , você poderia informar a função set-mark com o código que mantém um anel de região (semelhante ao a variável mark-ring ). Em seguida, você poderia implementar uma função pop-region que se comporta de maneira semelhante a pop-mark .

    
por 30.07.2012 / 16:28
3

Dependendo de suas operações repetidas, você pode gravar uma macro usando o comando "pop-global-mark" para retornar à última marca no anel de marca global ou você pode salvar explicitamente seu local com o comando de registro emacs e, depois da segunda operação, retornar com o comando registre o comando . O comando register é um pouco mais grunhido e mais alguns toques de tecla, mas eu acho confiável.

    
por 30.07.2012 / 16:39
0

Se você usa a biblioteca second-sel.el , então você pode use a seleção secundária para ajudar com isso. A seleção secundária não está associada ao ponto ou marca, por isso, ela permanece ativa, mesmo quando o ponto se move (então, sim, ao contrário da região, ela pode sair da tela).

Com essa ligação de chave sugerida:

(global-set-key (kbd "C-M-y") 'secondary-yank|select|move|swap)

Você pode fazer o seguinte:

  1. C-1 C-M-y para selecionar a região ativa como a seleção secundária.

  2. Faça o que for necessário: movimente-se, selecione outro texto (altere a região), qualquer que seja.

  3. Quando você quiser colocar a região de volta onde estava, que é onde a seleção secundária ainda está, basta usar C-0 C-M-y .

Isso é tudo. Apenas C-1 C-M-y para tirar um instantâneo da região (como secundária) e depois C-0 C-M-y para ativar a região onde estava no momento do instantâneo.

Você também pode usar C-- C-M-y para trocar a região e a seleção secundária. Por exemplo, se cat for a região (ativa) e dog for secundária, então C-- C-M-y tornará cat a secundária e dog a região (ativa).

    
por 23.11.2016 / 01:09
0

A solução a seguir tem as vantagens de exigir apenas uma única função e uma única tecla de atalho:

(defun my-reuse-region (unset)
  "Enable re-use of regions.

When a region is selected, save its bounds for future use.
Otherwise, activate the saved bounds. With a prefix argument,
unsets any prior saved bounds."
  (interactive "P")
  (cond
   (unset
    (makunbound 'my-reusable-mark)
    (makunbound 'my-reusable-mark))
   ((region-active-p)
     (when (not (boundp 'my-reusable-mark))
       (make-local-variable 'my-reusable-mark))
     (when (not (boundp 'my-reusable-point))
       (make-local-variable 'my-reusable-point))
     (setq my-reusable-mark (copy-marker (mark)))
     (setq my-reusable-point (copy-marker (point)))
     (message "Region bounds saved for future use."))
   (t
     (when (and (boundp 'my-reusable-mark)
                (boundp 'my-reusable-point))
       (set-mark my-reusable-mark)
       (goto-char my-reusable-point)))))

(global-set-key (kbd "C-c C-SPC") 'my-reuse-region)

Nota: Não tenho certeza se existe um caso de uso para chamar a função com um argumento de prefixo; Eu adicionei esse código apenas para ser consciencioso e completo.

    
por 21.03.2018 / 05:59
0

Um fluxo de trabalho comum é narrow-to-region ( C-x n n ) e, em seguida, executa suas tarefas na região visível. Então, widen ( C-x n w ) para expor o restante do buffer novamente quando terminar.

    
por 21.03.2018 / 07:20

Tags