Estou tentando fazer algo que espero ser simples, mas não entendo por que não funciona.
Para as próximas linhas em um arquivo markdown, quero definir um mapeamento para sublinhar uma linha, por exemplo:
line 0
# line 1
## line 2
### line 3
#### line 4
##### line 5
###### line 6
####### line 7
######## line 8
O que eu quero é o seguinte: quando o cursor estiver na linha 0 ou 1 ou qualquer outra coisa, só quero adicionar:
<u>
no início da linha se a linha não tiver # --ou--<u>
após o último # da linha</u>
no final da linha
Então o que eu quero é que quando eu pressionar U
qualquer linha, ele adicione as tags <u>
and </u>
, como a seguir:
<u> line 0 </u>
# <u> line 1 </u>
## <u> line 2 </u>
### <u> line 3 </u>
#### <u> line 4 </u>
##### <u> line 5 </u>
###### <u> line 6 </u>
####### <u> line 7 </u>
######## <u> line 8 </u>
No teclado, posso simplesmente fazer ^f#;;;;;;;;;;;;;;a <u><C-c>A </u><C-c>
e funciona bem.
No meu .vimrc, por que nnoremap U ^f#;;;;;;;;;;;;;;a <u><C-c>A </u><C-c>
não funciona?
(nota: escrevi muitos pontos e vírgulas caso o título seja muito longo)
É a abundância de ponto e vírgula que quebra o mapeamento. Citando de
:help map-error
:Um
;
sem#
para onde saltar causa um erro e anula o mapeamento. Você pode reduzir o ponto e vírgula e ver se funciona se (e somente se) o número certo de hashes for fornecido.Uma alternativa quase funcional, mas muito melhor, seria usar um movimento apropriado,
:help motion.txt
comoe
ir até o final de uma palavra em vez de vários pontos e vírgulas. Observe que isso ainda falhará se não houver um único#
presente na linha atual. Usare
seria mais limpo, mas ainda assim falharia.Podemos obter um mapeamento funcional usando o
:substitute
comando e uma expressão regular que permite um número opcional de hashes. É um comando Ex e, portanto, evita mudanças de modo desnecessárias.Observe que usei
@
em vez do familiar/
padrão separado e string de substituição para não precisar escapar da barra em</u>
.O padrão em si é a âncora do início da linha
^
seguida por qualquer número#
e qualquer número de espaços em branco\s
. O\zs
átomo inicia a partida (ou seja, ignoramos qualquer coisa antes dele). É.*
apenas um jogo ganancioso.A string de substituição é
<u> & </u>
, são as duas tags com a correspondência entre elas.Tudo isso está documentado em
:help :substitute
e:help pattern
, especialmente:help /^
,:help /\zs
e:help s/\&
.Conforme mencionado no comentário, o acima não funcionará no Visual Studio Code com o plugin VSCodeVim. A razão parece ser que ele não reconhece o
\zs
átomo. Podemos escrever um padrão com dois grupos de captura que funcionam da mesma formaNo Vim, teríamos que escapar dos parênteses para grupos de captura (a menos que estejamos usando um modo muito mágico ). Este não parece ser o caso do VSCodeVim.
Você também pode estar interessado em não parar de mapear em não encontrado