Coloque várias linhas entre aspas do Vim

Coloque várias linhas entre aspas do Vim

Eu tenho blocos do seguinte formato:

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

Preciso colocar entre aspas as linhas que afirmam que devem ser colocadas entre aspas:

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

Existe uma maneira semiautomática de fazer isso com o Vim? Achei que uma possível solução poderia envolver o gcomando.

Responder1

Usando expressões regulares:

:%s/.*is supposed.*/"&"/

Se por "semiautomático" você quer dizer que gostaria de ser avisado antes de cada substituição, basta adicionar o /cmodificador ao padrão de substituição:

:%s/.*is supposed.*/"&"/c

Explicação

  • :%ssignifica aplicar esta substituição a todas as linhas no buffer atual
  • O padrão que combinamos é qualquer linha contendo as palavras is supposed(se algumas outras linhas contiverem as palavras "é suposto" sem "ser colocado entre aspas" depois delas, você sempre poderá alterar o padrão para.*is supposed to be enclosed in quotes.*
  • A string que usamos para substituir o padrão correspondente é "&", onde &representa tudo o que foi correspondido pelo padrão.

Responder2

O famosoplug-in surroundfornece vários mapeamentos que tornam isso rápido e fácil. Para citar uma linha inteira (sem recuo), basta usar yss". Você pode aplicar isso a todas as linhas correspondentes do seu texto de exemplo automaticamente por meio do :globalcomando e :normal:

:g/is supposed/normal yss"

Ou apenas faça uma busca por linhas correspondentes e repita via ne.

Responder3

Quase sempre prefiro macros para pesquisar e substituir porque elas são mais poderosas e menos memorizadas, ao mesmo tempo que mantenho a opção de verificar interativamente antes de pular. Tente isso na primeira linha que você gostaria de alterar (não digite os espaços que coloquei em ESC e ENTER para facilitar a leitura):

qqI" ESC $bea" ESC /is supposed ENTER zzq

O que faz:

  • qqinicia uma macro chamada "q" (qa iniciaria a macro "a")
  • I" ESCInsere um " antes da primeira palavra, não no início da linha como "0" faria, preservando assim o espaço em branco normalmente valioso.
  • $bea" ESCVai até o final da linha ($), mas depois recua uma palavra (b) e avança novamente até o final dela (e), finalmente acrescentando (a) o ". Esta manobra acrescenta após a última palavra da linha mesmo se seguido por espaços em branco normalmente inúteis.
  • /is supposedDepois de realizar a edição, ele procura a próxima instância de "é suposto", que pode estar muitas páginas mais abaixo, e posiciona o cursor ali para você olhar e decidir se continua com as edições. Se nenhum "é suposto" for encontrado, a macro será encerrada sem danos.
  • zzqcentraliza bem a linha na página (zz) para que você possa ver algumas linhas além da atual. Útil quando você aplica a macro rapidamente e deseja dar uma olhada em alguns movimentos à frente. "q" encerra a definição da macro, que também é chamada de "q".

Como usar:

  • A primeira linha já foi alterada ao terminar de definir a macro acima.
  • Se houver um erro, você pode simplesmente desfazer esta linha e tentar novamente.
  • O cursor agora está posicionado na segunda correspondência, se houver, e bem centralizado na página.
  • Você pode aplicar a macro se quiser (ou outras macros semelhantes!), com @q, que editaria a linha e o posicionaria na terceira correspondência.
  • Você pode reaplicar a última macro com @@ (mais rápido que @q).
  • Você pode fazer vários de uma vez, como: 111@@. Lembre-se que se houver ALGUM erro ao aplicar a macro não haverá mais repetições.
  • Ou você pode avançar manualmente com PageDown e amigos e reaplicar a macro.
  • E você pode intercalar as macros com qualquer outra edição.
  • E você pode :tab next aplicar esta macro a outros buffers ou arquivos.
  • Cereja na torta: a macro é lembrada mesmo depois que você sai do vim!

Depois de se sentir confortável com macros, você terá poderes incríveis!

Responder4

A versão da expressão regular funciona se suas linhas realmente forem assim, e houver alguma string distinta que identifique quais linhas são quais. Caso contrário, podemos registrar ummacropara fazer o que quiser.

Para fazer isso, vá até o início da linha 2 e pressione:

qq I" Escape A" Escape 3j q

Isso citará a primeira linha e nos levará para a próxima. Em seguida, você pode pressionar @qpara repetir todas as ações que acabou de realizar ou, digamos, 5@qpara fazê-lo cinco vezes.

Como isso funciona: qé o comando para iniciar a gravação de uma macro, que também estamos chamando q(você pode escolher qualquer letra). Nessa macro, inserimos aspas duplas no início da linha ( I"), saímos do modo de inserção (Escape), acrescentamos aspas duplas no final da linha ( A") e saímos do modo de inserção novamente. Descemos três linhas ( 3j) até a próxima linha a ser citada. qpara de gravar a macro.

Depois disso, voltamos a algum lugar exatamente como começamos, para que possamos executar a macro ( @) que salvamos para qfazer isso novamente no próximo par de linhas. Com uma contagem antes de @, como em 5@q, fazemos isso muitas vezes.


Em vez de 3j, se o espaçamento for irregular, você pode usar }}k: descer dois parágrafos até a linha em branco após o próximo (}}) e backup ( k). De qualquer forma, executar a macro é o mesmo.

Na verdade, você pode registrar qualquer série de ações que façam o que você deseja e o levem de volta para onde você queria estar. Contanto que as etapas executadas façam sentido em todos os contextos em que você irá executá-la, você pode iniciar uma macro, fazer todas as alterações necessárias e passar para o próximo local, depois interromper a macro e repetir.

informação relacionada