Quero inserir texto como este:
similar text wordA similar text ...
similar text wordB similar text ...
similar text wordC similar text ...
Sei que posso colar o texto várias vezes e depois usar a substituição para alterar uma única palavra para cada linha, mas ainda acho esse método muito inconveniente.
Existe uma maneira de salvar uma palavra ou uma lista de palavras em uma "variável" e usar essa variável para gerar texto semelhante?
EDIT Eu fiz algo pouco claro na pergunta original, na verdade estou tentando fazer algumas definições de funções muito parecidas, então wordA
wordB
... podem aparecer muitas vezes em cada clone de texto e o texto pode conter muitas linhas. o padrão é exatamente assim:
similar_text1 wordA similar_text2 wordA similar_text3 ...
similar_text1 wordB similar_text2 wordB similar_text3 ...
similar_text1 wordC similar_text2 wordC similar_text3 ...
(o texto pode conter novas linhas e wordA, wordB ... pode existir várias vezes)
2ª EDIÇÃO As partes "similar_text" podem ser diferentes cada vez que faço esse trabalho, portanto é melhor que a solução para esse trabalho seja reutilizável. Porque estou tentando fazer definições de funções muito parecidas, ou uma string para a tabela de mapeamento de funções.
Depois de ler as respostas e algumas práticas, acho que é mais conveniente pensar nesse trabalho como algum tipo de substituição, porque é difícil escrever "parte1", "parte2" ... "parteN", que pode conter novas linhas, por isso escreva um modelo primeiro:
similar_text1 $WORD similar_text2 $WORD similar_text3 ...
(text may contain <ENTER>, make sure $WORD not exist in "similar_text" parts )
Então, tentar colocar clones do texto, mas substituir $ WORD por uma lista de palavras é um pensamento mais direto.
Parece que meu problema mudou para "como clonar um bloco de texto várias vezes, mas sempre substituindo uma palavra-chave por uma palavra de uma lista?"
fonte
Respostas:
Você pode usar a seguinte função:
Nas variáveis
firstpart
esecondpart
coloque o texto a ser repetido antes e depois das palavras e na listawords
coloque as palavras que devem mudar.Em seguida, o loop criará o conteúdo da linha para cada palavra da lista, insira a linha no buffer e vá para essa nova linha.
Você pode então simplesmente chamar a função:
call GenerateLines()
.Editar Para facilitar a manipulação, você também pode passar as diferentes partes como argumentos, a função deve ser assim:
E você pode chamar assim:
fonte
call map(a:words, 'a:firstpart . v:val . a:secondpart')
ecall append(line('.'), a:words)
.Minha estratégia nesses casos varia, mas geralmente segue as seguintes etapas:
Escreva a (s) palavra (s) única (s), por exemplo
Ou
a) faça uma pesquisa e substitua, por exemplo
b) ou use o modo de bloqueio visual, consulte
:h blockwise-visual
. Em particular, selecionarei as palavras e as utilizareiI
para inserir texto semelhante na frente ouA
para adicionar texto semelhante depois.Eu argumentaria que essa estratégia faz sentido quando você realiza esse tipo de tarefa de edição relativamente raramente. No entanto, se você achar necessário fazer isso com frequência, siga a sugestão de @ statox com uma função que expanda a lista de palavras.
fonte
:read
seguido de sua substituição faz muito sentido.Argumentarei que este é um trabalho para o bloco visual ( Ctrl+ v). Primeiro eu escreveria todas as palavras distintas:
Começando com o cursor no primeiro,
w
eu executaria:Posso controlar quantas colunas preciso pressionando
A <esc>p
quantas vezes quiser. Vamos supor que eu precisei de três colunas, como mostra o comando acima. Agora temos o seguinte:E o cursor está no início do terceiro
wordA
na primeira linha. Em seguida, eu bloquearia a seleção da coluna de espaço em branco entre as colunas, retrocedendo e adicionando o texto entre elas. No local atual do cursor:Isso resulta em (o% marca a posição do cursor):
Repita para a próxima coluna:
E a última / primeira coluna (a do lado esquerdo):
Finalmente resultando em:
Atualização: adicionado um screencast
Parece haver muita digitação, mas na verdade é muito fácil se acostumar. Ele oferece a liberdade de alterar o número de palavras, o número de colunas e até o espaçamento entre as colunas.
A desvantagem é que você precisa saber o número de palavras distintas que está usando. Eu tenho um
5
código fixo em todos os comandos acima, porque é o número de linhas em que os comandos estão operando.Nota sobre a depuração: todos os comandos iniciam e terminam no modo normal; se você se encontra no modo visual ou de inserção no final de um comando, está fazendo algo errado.
fonte