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.
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.
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.
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.
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).
C-1 C-M-y para selecionar a região ativa como a seleção secundária.
Faça o que precisar: movimente-se, selecione outro texto (altere a região), o que for.
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).
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.
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.
Se a região ficar desmarcada (que o Emacs chama de "desativada"), C-xC-xa observará (também conhecida como "reativar").
fonte
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ávelmark-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çãoset-mark
com código que mantém um anel de região (semelhante à variávelmark-ring
). Em seguida, você pode implementar umapop-region
função que se comporte de maneira semelhante apop-mark
.fonte
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.
fonte
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:
Você pode fazer o seguinte:
C-1 C-M-y
para selecionar a região ativa como a seleção secundária.Faça o que precisar: movimente-se, selecione outro texto (altere a região), o que for.
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 uma captura instantânea da região (como secundária) e, posteriormente,C-0 C-M-y
ativar a região onde estava no momento da captura instantânea.Você também pode usar
C-- C-M-y
para trocar a região e a seleção secundária. Assim, por exemplo, secat
é a região (ativa) edog
é a secundária,C-- C-M-y
torna acat
região secundária edog
(ativa).fonte
A solução a seguir tem as vantagens de exigir apenas uma única função e uma única combinação de teclas:
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.
fonte
Um fluxo de trabalho comum é
narrow-to-region
(C-x n n
) e, em seguida, execute suas tarefas na região visível. Entãowiden
(C-x n w
) para expor o restante do buffer novamente quando terminar.fonte