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 g
comando.
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 /c
modificador ao padrão de substituição:
:%s/.*is supposed.*/"&"/c
Explicação
:%s
significa 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 :global
comando e :normal
:
:g/is supposed/normal yss"
Ou apenas faça uma busca por linhas correspondentes e repita via n
e.
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:
qq
inicia uma macro chamada "q" (qa iniciaria a macro "a")I" ESC
Insere 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" ESC
Vai 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 supposed
Depois 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.zzq
centraliza 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 @q
para repetir todas as ações que acabou de realizar ou, digamos, 5@q
para 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. q
para de gravar a macro.
Depois disso, voltamos a algum lugar exatamente como começamos, para que possamos executar a macro ( @
) que salvamos para q
fazer 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.