Como defino um comando automático para funcionar em todos os arquivos, exceto um determinado tipo de arquivo?

8

Por exemplo, eu tenho a seguinte autocommanddefinição:

augroup cursorline
    autocmd!
    autocmd WinLeave,BufLeave * set nocursorline
    autocmd WinEnter,BufEnter * set cursorline
augroup end

Eu quero definir algo que exclui *.texarquivos:

autocmd WinEnter,BufEnter * "except *.tex" set cursorline

Qual é a sintaxe para isso? Não tenho certeza de quais palavras-chave pesquisar nos documentos de ajuda.

Kit
fonte

Respostas:

8

Com o mesmo espírito da resposta @Sundar, mas com uma sintaxe um pouco mais flexível, você pode:

let ftToIgnore = ['latex', 'plaintex']
autocmd BufWritePre * if index(ftToIgnore, &ft) < 0 | set your options

Costumo preferir esta sintaxe porque:

  • Você pode facilmente adicionar novos tipos de arquivos, se desejar.
  • A duração da condição permanece a mesma, não importa quantos tipos de arquivos você esteja verificando.
statox
fonte
Arrumado ! Onde você descobriu que poderia executar uma condição / função dentro do comando automático?
nobe4 24/08/15
2
Bem, é o mesmo princípio da resposta @sundar, exceto que a condição não está no valor de uma variável, mas no valor de retorno de uma função.
statox
3

E se:

autocmd WinEnter,BufEnter * if &filetype != "latex" && &filetype != "plaintex" | set cursorline | endif

melhor formatado como

autocmd WinEnter,BufEnter * if &filetype != "latex" && &filetype != "plaintex" 
                            \ | set cursorline 
                            \ | endif

Isso depende do filetypeque foi detectado ou definido pelo Vim e, portanto, não possui nenhum problema de distinção entre maiúsculas e minúsculas. (Você pode verificar como seus arquivos tex estão sendo detectados, executando set filetype?na linha de comando do Vim).

sundar - Restabelecer Monica
fonte
1

Não encontrei nada que pareça dar suporte ao que você deseja, mas você pode fazer o mesmo com um pouco de script:

function! s:ToggleCursorLine(open) abort
  let l:extension = expand('%:e')
  if l:extension !=? 'tex'
    if a:open
      set cursorline
    else
      set nocursorline
    endif
  endif
endfunction

augroup cursorline
  autocmd!
  autocmd WinLeave,BufLeave * call s:ToggleCursorLine(1)
  autocmd WinEnter,BufEnter * call s:ToggleCursorLine(0)
augroup end

Referência: :h expand()

nobe4
fonte
11
Você pode usar em !=#vez de !=no UNIX e !=?no Windows. Caso contrário, o resultado depende do valor de ignorecase.
Sato Katsura
Você poderia me indicar uma explicação da diferença entre !=#e !=?? Porque :h expr4nele não menciona Windows / Unix.
nobe4
11
Os nomes de arquivo UNIX fazem distinção entre maiúsculas e minúsculas e os Windows não diferenciam maiúsculas de minúsculas.
Sato Katsura
0

Isso funciona para Syntaxcomandos automáticos, em que o padrão ( <match>) é apenas o tipo de arquivo. Exclui quaisquer rstarquivos:

au Syntax *\(^rst\)\@<! …
azulado
fonte