Como quebrar o texto fornecido pela região

11

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.

nperson325681
fonte
Deseja usá-lo para inserir conteúdo arbitrário uma vez, ou um punhado de pares, várias vezes? No último caso, bibliotecas como smartparens podem ser úteis e podem ser estendidas com pares personalizados. Por exemplo, você pode adicionar um par <?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.
22714 Ver todas as
@ T.Verron: Eu sei que esses existem. Mas, para aqueles momentos em que há uma necessidade única de passar por código ea marca de material um único,, ataques de função reutilizáveis gerais melhores
nperson325681

Respostas:

6

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 " "?>"))
nperson325681
fonte
Aliás, a maneira como isso lida com alguns casos de fronteira não é ideal; a pesquisa para o início pode falhar algumas vezes e deixar as duas tags no final. Pode ser evilque eu use isso interfere aqui. Talvez uma função do tipo funcione com interactive "r" mais robustez?
N14325681
4

Eu sugeriria uma abordagem diferente. Quando existe uma região, por definição, pointdeve estar no início (ou no final) da região e markestará 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.

Tyler
fonte
Se o texto inicial e final for o mesmo, pergunto-me se algo como multiple-cursorspoderia ser ajustado para inserir texto simultaneamente no início e no final da região ativa.
glucas
Parece a maneira manual que os usuários de editores menores são obrigados a fazer de qualquer maneira. De qualquer forma, eu li o uso de macros como um subtexto da sua resposta, tenho que dizer. Gosto do seu estilo
nperson325681
1
@progo - Obrigado :) Parece uma abordagem mais manual, mas na verdade usa menos teclas do que a sua alternativa. Com essa abordagem, além do texto de quebra automática, você só precisa C-x C-x. Com sua resposta, você precisa chamar sua função ( C-c something) e também pressionar returnapó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.
Tyler #
3

Apenas por uma questão de variedade:

Outra maneira de fazer isso com algum texto inicial e final arbitrário seria usar replace-regexpna região: combinar .+e substituir por before \& after, ou qualquer texto que você queira usar para beforee 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-regexpbuffer, mas presumivelmente o texto que deseja quebrar não é tão consistente.

glucas
fonte