Coloque várias linhas na citação Vim

2

Eu tenho blocos da seguinte forma:

    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

Eu preciso colocar as linhas que afirmam que elas devem estar 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 semi-automática de fazer isso com o Vim? Eu pensei que uma possível solução poderia envolver o comando g .

    
por lord.garbage 23.06.2014 / 12:10

4 respostas

4

Usando expressões regulares:

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

Se por "semi-automático" você quer dizer que gostaria de ser avisado antes de cada substituição, basta adicionar o modificador /c ao padrão de substituição:

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

Explicação

  • :%s significa aplicar essa 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 "incluir entre aspas" após elas, 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 é "&" , em que & significa o que foi correspondido pelo padrão.
por 23.06.2014 / 12:18
1

O famoso plug-in surround oferece vários mapeamentos que tornam isso fácil e rápido. Para citar uma linha inteira (sem recuo), use apenas yss" . Você pode aplicar isso a todas as linhas correspondentes de seu texto de exemplo automaticamente por meio do comando :global e :normal :

:g/is supposed/normal yss"

Ou faça uma pesquisa por linhas correspondentes e repita por meio de n e .

    
por 23.06.2014 / 12:48
1

Quase sempre prefiro que macros procurem um substituto porque são mais potentes e menos memorizáveis, mantendo a opção de verificar interativamente antes de você pular. Tente isto na primeira linha que você gostaria de mudar (não digite os espaços que eu coloquei em ESC e ENTER para legibilidade):

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

O que faz:

  • qq inicia uma macro com o nome "q" (qa iniciava a macro "a")
  • I" ESC Insere um "antes da primeira palavra, não no início da linha como" 0 ", preservando assim o espaço em branco geralmente valioso lá.
  • $bea" ESC Vai para o final da linha ($), mas então faz o backup de uma palavra (b) e encaminha novamente para o final dela (e), finalmente anexando (a) o ". Esta manobra acrescenta após a última palavra de a linha, mesmo que seguida por um espaço em branco geralmente inútil.
  • /is supposed Tendo executado a edição, esta pesquisa pela próxima ocorrência de "supostamente", que pode ter várias páginas abaixo, e posiciona o cursor para que você possa analisar e decidir se continua as edições. Se nenhum "é suposto" for encontrado, a macro será encerrada sem danos.
  • zzq centra a linha na página (zz) para que você possa ver algumas linhas além da atual. Útil quando você rapidamente aplicar a macro e quiser olhar um par se move para frente. "q" termina a definição da macro, que também acontece de ser chamada "q".

Como usar:

  • A primeira linha já foi alterada quando foi feita a definição da macro acima.
  • Se houver um erro, você pode simplesmente desfazer essa linha e tentar novamente.
  • O cursor agora está posicionado no segundo jogo, se houver, e bem centralizado na página.
  • Você pode aplicar a macro se quiser (ou outras macros semelhantes!) com @q, o que editaria a linha e posicionaria você na terceira correspondência.
  • Você pode reaplicar a última macro com @@ (mais rápido que @q).
  • Você pode fazer várias ao mesmo tempo, como: 111 @@. Lembre-se que, se houver algum erro ao aplicar a macro, não haverá mais repetições.
  • Ou você pode pular manualmente com PageDown e amigos e reaplicar a macro.
  • E você pode intercalar as macros com qualquer outra edição.
  • E você pode: aba próximo para aplicar essa macro a outros buffers ou arquivos.
  • Cherry on pie: a macro é lembrada mesmo depois que você sai do vim!

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

    
por 23.06.2014 / 15:40
0

A versão de expressão regular funciona se suas linhas realmente forem assim, e há alguma string distinta que identifica quais linhas são quais. Caso contrário, podemos gravar uma macro para fazer o que você deseja.

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

qq I" Escape A" Escape 3j q

Isso vai citar a primeira linha e nos levar para a próxima para ver. Então, você pode pressionar @q para reproduzir todas as ações que você acabou de realizar ou, digamos, 5@q para fazer isso cinco vezes.

Como isso funciona: q é o comando para começar a gravar uma macro, que também chamamos q (você pode escolher qualquer letra). Nessa macro, inserimos uma aspa dupla no início da linha ( I" ), deixamos o modo de inserção (Escape), acrescentamos uma aspa dupla no final da linha ( A" ) e deixamos o modo de inserção novamente. Desceremos três linhas ( 3j ) para a próxima linha a ser citada. q pára de gravar a macro.

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

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

Na verdade, você pode gravar qualquer série de ações que façam o que você quer e leve você de volta para onde você queria estar. Enquanto os passos que você fizer fizerem sentido em todos os contextos em que for executado, você poderá iniciar uma macro, fazer todas as alterações necessárias e passar para o próximo local, depois parar a macro e repetir.

    
por 23.06.2014 / 12:37