Geralmente, tenho uma situação em que preciso aplicar texto em uma região. Para HTML e casos simples, já existem bibliotecas para isso. Mas e o caso geral? Gostaria de me perguntar o que vou inserir no início e no final da região.
Geralmente, tenho uma situação em que preciso aplicar texto em uma região. Para HTML e casos simples, já existem bibliotecas para isso. Mas e o caso geral? Gostaria de me perguntar o que vou inserir no início e no final da região.
Respostas:
Pesquisei no Google e encontrei este post de John D. Cook . Ele demonstra como criar uma função interativa simples para obter tags HTML / XML facilmente na região. A partir disso, modifiquei a função para perguntar duas vezes.
(defun tag-word-or-region (text-begin text-end)
"Surround current word or region with given text."
(interactive "sStart tag: \nsEnd tag: ")
(let (pos1 pos2 bds)
(if (and transient-mark-mode mark-active)
(progn
(goto-char (region-end))
(insert text-end)
(goto-char (region-beginning))
(insert text-begin))
(progn
(setq bds (bounds-of-thing-at-point 'symbol))
(goto-char (cdr bds))
(insert text-end)
(goto-char (car bds))
(insert text-begin)))))
Mais importante, essa função também pode ser usada como uma ferramenta auxiliar, por exemplo, quando você deseja vincular teclas para mapear alguns bits específicos de texto.
(defun tag-php ()
(interactive)
(tag-word-or-region "<?php " "?>"))
evil
que eu use isso interfere aqui. Talvez uma função do tipo funcione com interactive "r"
mais robustez?
Eu sugeriria uma abordagem diferente. Quando existe uma região, por definição, point
deve estar no início (ou no final) da região e mark
estará no final (ou no início). O que significa que você pode inserir o texto que deseja no ponto e usar exchange-point-and-mark
, ou seja C-x C-x
, para pular para o outro extremo da região. Digite a segunda metade do seu invólucro e pronto.
Você não é solicitado explicitamente a solicitar o texto de inserção, mas não consigo imaginar que haveria uma maneira de realizar a mesma coisa com menos esforço.
multiple-cursors
poderia ser ajustado para inserir texto simultaneamente no início e no final da região ativa.
C-x C-x
. Com sua resposta, você precisa chamar sua função ( C-c something
) e também pressionar return
após cada entrada. Portanto, não importa o que você faça, você tem mais duas teclas. Dito isto, não ajuda se você deseja chamar algo da elisp.
Apenas por uma questão de variedade:
Outra maneira de fazer isso com algum texto inicial e final arbitrário seria usar replace-regexp
na região: combinar .+
e substituir por before \& after
, ou qualquer texto que você queira usar para before
e after
.
Você pode escrever um comando para fazer isso, mas estou pensando em um caso em que em um determinado arquivo você deseja aplicar o mesmo texto de início / fim em vários locais. Você pode gravar uma macro ou apenas usar o histórico do minibuffer para repetir em outra região.
Obviamente, se o texto que você deseja quebrar pode ser expresso como uma expressão regular, você nem precisará selecionar uma região e pode fazer um query-replace-regexp
buffer, mas presumivelmente o texto que deseja quebrar não é tão consistente.
<?php
...?>
e, quando selecionar uma região e um tipo<?php
(ou uma combinação de teclas), envolvê-lo no par. Porém, não existe uma maneira fácil de usar essas bibliotecas se você tiver muitos pares únicos.