Edit : Eu transformei isso em um pequeno plugin. Esta é a minha primeira tentativa de escrever uma e não tenho idéia do que estou fazendo, portanto qualquer ajuda é muito apreciada. :)
Aqui está: https://github.com/danielbmarques/vim-dialect
----------
Quero continuar usando zg
e zw
adicionando palavras aos vim globais spellfile
, mas quero usar zG
e zW
adicionar palavras a um spellfile
específico do arquivo que estou editando . Em outras palavras, eu quero zG
e zW
seja persistente para cada arquivo.
Definir as spellfile
mudanças nos comandos zg
e zw
, enquanto o que eu quero é mudar apenas os comandos zG
e zW
.
Então, eu fiz isso:
:au BufNewFile,BufRead * let &l:spellfile = expand('%:p:h') . '/.' .
\ substitute(expand('%:t'), '\(.*\)\..*', '\1', '') . '.utf-8.add'
nnoremap zG :call LocalSpell("zG")<cr>
nnoremap zW :call LocalSpell("zW")<cr>
nnoremap zuG :call LocalSpell("zuG")<cr>
nnoremap zuW :call LocalSpell("zuW")<cr>
nnoremap zg :call GlobalSpell("zg")<cr>
nnoremap zw :call GlobalSpell("zw")<cr>
nnoremap zug :call GlobalSpell("zug")<cr>
nnoremap zuw :call GlobalSpell("zuw")<cr>
vnoremap zG :call LocalSpell("gvzG")<cr>
vnoremap zW :call LocalSpell("gvzW")<cr>
vnoremap zuG :call LocalSpell("gvzuG")<cr>
vnoremap zuW :call LocalSpell("gvzuW")<cr>
vnoremap zg :call GlobalSpell("gvzg")<cr>
vnoremap zw :call GlobalSpell("gvzw")<cr>
vnoremap zug :call GlobalSpell("gvzug")<cr>
vnoremap zuw :call GlobalSpell("gvzuw")<cr>
function! LocalSpell(cmd)
if &l:spellfile == ""
execute "normal! " . a:cmd
else
execute "normal! " . tolower(a:cmd)
endif
endfunction
function! GlobalSpell(cmd)
let b:spellfile = &l:spellfile
setlocal spellfile=
execute "normal! " . a:cmd
let &l:spellfile = b:spellfile
endfunction
E funciona ... mas não parece uma boa solução para mim (editar: já está ficando melhor :)). Por isso, pensei em publicá-lo aqui, caso alguém tenha idéias ou melhorias melhores para sugerir. O que você acha?
spellfile
só é criada quando a primeirazG
é executada.a spellfile specific to the file I'm editing
, pensei que estava usando vários arquivos de ortografia parazG
; como o nome do arquivo ortográfico é derivado do nome do arquivo (let &l:spellfile = expand('%:p:h')...
), você pode conseguir isso para um tipo de arquivo específico, definindo o nome do arquivo e os mapeamentos ao abrir esse arquivo (você precisará incluir<buffer>
nos mapeamentos). Também assumi que você desejava essa alteraçãozG
apenas para alguns arquivos específicos.spellfile
para tipos de arquivos específicos , mas umspellfile
para cada arquivo . Para adicionar palavras, e quando eu abrir esse arquivo novamente, elas ainda serão adicionadas, mas apenas para esse arquivo específico e não para outros. Também é uma ideia interessante. Infelizmente, parece que não é uma maneira de obter mais de um arquivo ortográfico; caso contrário, eu poderia fazer os dois e ter um comando para adicionar palavras ao arquivo atual e outro para adicionar palavras ao tipo de arquivo atual.one spellfile for each file
. Talvez eu tenha esquecido alguma coisa, mas se você adicionou o código ao seu,.vimrc
não poderia ter mais de um arquivo ortográfico, a menos que explicitamente:source
novamente para reavaliar o arquivo%
.Respostas:
Idéia legal!
Você não menciona o que acha que está errado com o seu código. Parece muito bom para mim!
Eu provavelmente faria o contrário: é apenas o comportamento local que você deseja alterar; portanto, idealmente, removeríamos a
GlobalSpell
função e todos os mapeamentos globais e apenas alteraríamos a funcionalidade de ortografia local.Infelizmente, essa abordagem só funciona se
'spellfile'
não estiver vazia antes da execução do comando automático. (Como com um vazio'spellfile'
, o Vim descobre um local no'runtimepath'
momento em que você adiciona uma ortografia, mas você não tem como acessar esse caminho.) Também não funcionará se'spellfile'
já houver uma lista: para ser mais robusto, deve realmente conte as entradas e altere azg
contagem de acordo.Portanto, a abordagem a seguir é adequada para uso pessoal em um .vimrc, mas você realmente não pode usá-lo em seu plugin.
No exemplo acima Eu também rodeado seu
autocommand
em umaugroup
, que é sempre uma boa idéia.Você também pode considerar o uso de mapeamentos de expressão. Você removeria o
if
bloco da função e escreveria mapeamentos como:Porém, não tenho certeza se vale a pena: neste caso, você está apenas movendo a complexidade da função para o mapeamento.
A única outra coisa que se destaca é a longa série de comandos de mapa muito semelhantes. Você pode reduzir isso um pouco com um loop (e ao contrário do acima, você pode usar esta abordagem no seu plugin):
Se você estiver se sentindo super seco , poderá criar todos os mapeamentos com uma única
:execute
linha, mas acho que é uma péssima idéia: você acabaria com um código muito mais complicado, quase tão longo quanto o original! Tentei de qualquer maneira, por diversão:Finalmente, notei que nenhuma das opções acima funciona se o arquivo que você está editando tiver um sublinhado no nome, porque você não pode usar sublinhados nos nomes dos arquivos de ortografia! Você precisará alterar seu comando automático para removê-los / transformá-los.
fonte