let b:commentChar='//'
: Isso cria uma variável no vim. o b
aqui refere-se ao âmbito de aplicação, que neste caso está contido no tampão, o que significa que o ficheiro que está aberto. Os caracteres de seu comentário são cadeias de caracteres e precisam ser colocados entre aspas; as aspas não fazem parte do que será substituído ao alternar os comentários.
autocmd BufNewFile,BufReadPost *...
: Os comandos automáticos são acionados em diferentes coisas; nesse caso, são acionadas quando um novo arquivo ou o arquivo lido termina com uma certa extensão. Uma vez acionado, execute o seguinte comando, o que nos permite alterar ocommentChar
tipo de arquivo dependendo. Existem outras maneiras de fazer isso, mas elas são mais confusas para iniciantes (como eu).
function! Docomment()
: As funções são declaradas iniciando function
e terminando com endfunction
. As funções devem começar com uma capital. os !
garante que esta função substitui qualquer funções anteriores como definidos Docomment()
com esta versão Docomment()
. Sem o !
, tive erros, mas isso pode ser porque eu estava definindo novas funções através da linha de comando do vim.
execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
: Executar chama um comando. Nesse caso, estamos executando substitute
, o que pode assumir um intervalo (por padrão, esta é a linha atual), como %
para todo o buffer ou '<,'>
para a seção destacada. ^\s*
é regex para corresponder ao início de uma linha seguida por qualquer quantidade de espaço em branco, que é então anexado a (devido a &
). O .
aqui é usado para concatenação de cadeias, pois escape()
não pode ser colocado entre aspas. escape()
permite que você escape um caractere commentChar
que corresponda aos argumentos (nesse caso, \
e/
), acrescentando-os com a \
. Depois disso, concatenamos novamente com o final da nossa substitute
string, que tem oe
bandeira. Essa bandeira nos deixa falhar silenciosamente, o que significa que, se não encontrarmos uma correspondência em uma determinada linha, não gritaremos sobre isso. Como um todo, essa linha nos permite colocar um caractere de comentário seguido por um espaço antes do primeiro texto, o que significa que mantemos nosso nível de indentação.
execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
: Isso é semelhante ao nosso último grande e longo comando. Exclusivo para este, temos \v
, o que garante que não temos que escapar do nosso ()
, e 1
, que se refere ao grupo que fizemos com o nosso ()
. Basicamente, estamos combinando uma linha que começa com qualquer quantidade de espaço em branco e, em seguida, nosso caractere de comentário seguido por qualquer quantidade de espaço em branco, e estamos mantendo apenas o primeiro conjunto de espaços em branco. Novamente, e
vamos falhar silenciosamente se não tivermos um caractere de comentário nessa linha.
let l:line=getpos("'<")[1]
: define uma variável como fizemos com o nosso caractere de comentário, mas l
refere-se ao escopo local (local para esta função). getpos()
obtém a posição de, neste caso, o início de nosso destaque e o[1]
meios que nos importam apenas com o número da linha, e não com outras coisas como o número da coluna.
if match(getline(l:line), '^\s*'.b:commentChar)>-1
: você sabe como if
funciona. match()
verifica se a primeira coisa contém a segunda, então pegamos a linha na qual começamos o destaque e verificamos se ela começa com espaço em branco seguido pelo caractere de comentário. match()
retorna o índice onde isso é verdade e -1
se nenhuma correspondência foi encontrada. Como if
avalia todos os números diferentes de zero como verdadeiros, precisamos comparar nossa saída para ver se é maior que -1. Comparação nos vim
retornos 0 se falso e 1 se verdadeiro, que é o que if
deseja ver para avaliar corretamente.
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
: vnoremap
significa mapear o seguinte comando no modo visual, mas não o mapeie recursivamente (ou seja, não altere nenhum outro comando que possa ser usado de outras maneiras). Basicamente, se você é um novato em vim, sempre use noremap
para se certificar de não quebrar as coisas. <silent>
significa "Não quero suas palavras, apenas suas ações" e diz para não imprimir nada na linha de comando. <C-r>
é o que estamos mapeando, que é ctrl + r nesse caso (observe que você ainda pode usar Cr normalmente para "refazer" no modo normal com esse mapeamento). C-u
é meio confuso, mas basicamente garante que você não perca o realce visual (de acordo com esta resposta , o comando começa com '<,'>
o que queremos).call
aqui, basta dizer ao vim para executar a função que chamamos e <cr>
refere-se a pressionar oenter
botão. Temos que apertar uma vez para realmente chamar a função (caso contrário, apenas digitamos call function()
na linha de comando, e temos que apertá-la novamente para que nossos substitutos passem por todo o caminho (não sei ao certo por que, mas tanto faz).