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 bastante grande, mas não um objeto bem definido, como "seção inteira", "parágrafo inteiro"). Atualmente, tenho que marcar manualmente a região, executar a primeira operação, voltar e remarcar a região, executar a segunda operação e repetir ... Isso é muito complicado. Gostaria de saber se existe algum atalho para remarcar uma região marcada anteriormente? Ou alguma maneira de manter uma região marcada até eu pedir ao Emacs para desmarcar.

Truong
fonte

Respostas:

4

O script trechos abaixo irá vincular-chave acordes F6, C-F6, C-S-F6aos marcadores gerente (vs marca) . Os marcadores se movem, encolhem e crescem, à medida que você altera o texto entre eles. Você pode usar as teclas que preferir. Coloque o código no seu ~/.emacsarquivo de configuração.

  • Primeiro, estabeleça os limites da região inicial (ponto de marcação).
  • Em seguida, pressione F6para definir marcadores nos limites dessa região.
  • Faça o que você precisa fazer ...
  • Restabeleça os limites da região modificada pressionando C-F6.Repita * "Do .." conforme necessário
  • Quando você terminar de usar, C-S-F6limpe os marcadores da 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))
Peter.O
fonte
Excelente! Isso funciona. Eu tentei várias vezes e sempre funcionou como esperado. Obrigado.
Truong
Estou oito anos atrasado para a festa - veja minha solução abaixo.
precisa saber é o seguinte
5

Se a região ficar desmarcada (que o Emacs chama de "desativada"), C-xC-xa observará (também conhecida como "reativar").

asrghawrh
fonte
3

Infelizmente, não há recurso de histórico da região no Emacs. Existe a função pop-mark, que restaura a marca para um local anterior retirado 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 , pode aconselhar a função set-markcom código que mantém um anel de região (semelhante à variável mark-ring). Em seguida, você pode implementar uma pop-regionfunção que se comporte de maneira semelhante a pop-mark.

Fran
fonte
Isso é lamentável. Obrigado por me informar também. Não sou especialista em Elisp, então acho que terei que continuar meu método trabalhoso.
30712 Truong
3

Dependendo das operações repetidas, você poderá gravar uma macro usando o comando "pop-global-mark" para retornar à última marca no anel de marcas globais ou salvar explicitamente o seu lugar com o comando emacs register depois da 2ª operação, retorne com o comando register . O comando register é um pouco mais grunhido e mais algumas teclas, mas acho confiável.

jdh
fonte
0

Se você usar a biblioteca second-sel.el, poderá usar a seleção secundária para ajudar com isso. A seleção secundária não está associada ao ponto ou marca; portanto, permanece em posição, mesmo quando o ponto é movido (portanto, ao contrário da região, ele pode sair da tela).

Com esta 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 precisar: movimente-se, selecione outro texto (altere a região), o que for.

  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-ypara tirar uma captura instantânea da região (como secundária) e, posteriormente, C-0 C-M-yativar a região onde estava no momento da captura instantânea.


Você também pode usar C-- C-M-ypara trocar a região e a seleção secundária. Assim, por exemplo, se caté a região (ativa) e dogé a secundária, C-- C-M-ytorna a catregião secundária e dog(ativa).

Desenhou
fonte
0

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

(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 muita certeza de que exista um caso de uso para chamar a função com um argumento de prefixo; Eu adicionei esse código apenas para ser consciente e completo.

user1404316
fonte
0

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

triplo
fonte