Imagine que tenho o seguinte texto:
some random stuff
* asdf
* foo
* bar
some other random stuff
Quero substituir os marcadores de asterisco por números, da seguinte forma:
some random stuff
1. asdf
2. foo
3. bar
some other random stuff
Como isso pode ser feito no vim?
substitute
filetype-markdown
range
markup
counting
Brennan Vincent
fonte
fonte
1.
? Então:%s/^* /1. /
faria isso. Isso parece muito menos trabalho.Respostas:
Você pode tentar o seguinte comando:
Primeiro, inicializa a variável
c
(let c=0
), depois executa o comando globalg
que procura o padrão^*
(um início de linha, seguido por um asterisco e um espaço).Sempre que uma linha que contém esse padrão é encontrada, o comando global executa o comando:
let c+=1 | s//\=c.'. '
Incrementa a variável
c
(let c+=1
) e (|
) substitui (s
) o padrão pesquisado anterior (//
) pela avaliação de uma expressão (\=
):o conteúdo da variável
c
concatenada (.
) com a string'. '
Se você não quiser modificar todas as linhas do seu buffer, mas apenas um parágrafo específico, poderá passar um intervalo para o comando global. Por exemplo, para modificar apenas as linhas cujo número está entre 5 e 10:
Se você tiver um arquivo contendo várias listas semelhantes que deseja converter, por exemplo, algo como isto:
Você pode fazer isso com o seguinte comando:
É apenas uma variante do comando anterior, que redefine a variável
c
quando você alterna para outra lista. Para detectar se você está em outra lista, a variáveld
é usada para armazenar o número da última linha em que uma substituição foi feita.O comando global compara o número da linha atual (
line('.')
) comd+1
. Se eles são iguais, significa que estamos na mesma lista de antes, por issoc
é incrementado (c+1
); caso contrário, significa que estamos em uma lista diferente, por issoc
é redefinido (1
).Dentro de uma função, o comando
let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
pode ser reescrito assim:Ou assim:
Para salvar algumas teclas, você também pode definir o comando personalizado
:NumberedLists
, que aceita um intervalo cujo valor padrão é1,$
(-range=%
):Quando
:NumberedLists
será executado<line1>
e<line2>
será automaticamente substituído pelo intervalo usado.Portanto, para converter todas as listas no buffer, digite:
:NumberedLists
Somente as listas entre as linhas 10 e 20:
:10,20NumberedLists
Somente a seleção visual:
:'<,'>NumberedLists
Para mais informações, veja:
fonte
Isso funciona apenas com uma versão recente do Vim (que possui
:h v_g_CTRL-A
):*
) e substituí-los com0
(cursor está na primeira*
):Ctrl-v
j
j
r
0
.gv
g
Ctrl-a
... e é isso :)
(Se você deseja obter um ponto após cada número, altere a 1ª etapa para
Ctrl-v
j
j
s
0
.
Esc
:)fonte
Selecione visualmente as linhas e execute este comando de substituição:
Ver
:help sub-replace-expression
,:help line()
e:help '<
.Para evitar ter que selecionar as linhas, pesquisas para trás e para frente com deslocamentos podem ser usadas para especificar o intervalo de substituição como este:
Vejo
:help cmdline-ranges
fonte
Outra maneira:
fonte
Você também pode definir operadores personalizados
Você pode mapeá-los para as seqüências principais
'*
e'#
. As marcas*
e#
não existem, portanto você não substituirá nenhuma funcionalidade padrão. A razão para escolher'
como prefixo é obter algum tipo de mnemônica. Você está adicionando um sinal / marca na frente de algumas linhas. E, geralmente, para ir a uma marca, você usa o prefixo'
.Também funciona no modo visual.
Os comandos ex são bons para scripts, mas para um uso interativo, um operador normal provavelmente é melhor, porque você pode combiná-lo com qualquer movimento ou objeto de texto.
Por exemplo, você pode alternar uma lista prefixada com asteriscos ou sinais de menos dentro do parágrafo atual pressionando
'*ip
. Aqui,'*
é um operador eip
é o objeto de texto no qual trabalha.E faça o mesmo para uma lista prefixada com números nas próximas 10 linhas pressionando
'#10j
. Aqui,'#
existe outro operador e10j
é um movimento que cobre as linhas nas quais o operador trabalha.O outro benefício do uso de um operador personalizado é que você pode repetir sua última edição com o comando dot.
fonte