Neovim 中的 ALE 固定器配置

ALE Fixer Configuration in Neovim

我想配置我的 Ruby 修复程序来执行以下序列:

  1. 关闭语法
  2. 运行 rubocop 修复者
  3. 打开语法

根据:help ale-fix-configuration

Synchronous functions and asynchronous jobs will be run in a sequence for fixing files, and can be combined. For example:

  let g:ale_fixers = {
  \   'javascript': [
  \       'DoSomething',
  \       'eslint',
  \       {buffer, lines -> filter(lines, 'v:val !=~ ''^\s*//''')},
  \   ],
  \}

我试着效仿这个例子:

function! SyntaxTurnOff()
  exec "syntax off"
endfunction

function! SyntaxTurnOn()
  exec "syntax on"
endfunction

" FIXERS
let g:ale_fixers = {
      \   '*': ['remove_trailing_lines', 'trim_whitespace'],
      \ 'ruby': [
      \ 'SyntaxTurnOff',
      \ 'rubocop',
      \ 'SyntaxTurnOn',
      \],
      \ 'python': ['flake8'],
      \ 'json': ['jq'],
      \}

但是,当我尝试通过在编辑器中调用 :ALEFix 来执行它时,出现以下错误:

Error detected while processing function ale#fix#Fix[37]..<SNR>305_RunFixer:                                                                                                          
line   17:
E118: Too many arguments for function: SyntaxTurnOff

我做错了什么?

我找到了另一种方法来完成这项工作。

我没有尝试在固定器对象中对函数调用进行排序,而是使用了自动分组。

首先我定义了以下函数:

function! SyntaxTurnOff()
  "Turns syntax off only in current buffer
  exec "syntax clear"
endfunction

function! SyntaxTurnOn()
  exec "syntax on"
endfunction

然后,我使用了内置的 ALEFixPreALEFixPost 自动命令:

augroup YourGroup
    autocmd!
    autocmd User ALEFixPre     call SyntaxTurnOff()
    autocmd User ALEFixPost    call SyntaxTurnOn()
augroup END

我的修复者回到了他们以前的简单配置。

" FIXERS
let g:ale_fixers = {
      \   '*': ['remove_trailing_lines', 'trim_whitespace'],
      \ 'ruby': ['rubocop'],
      \ 'python': ['flake8'],
      \ 'json': ['jq'],
      \}

我很高兴听到更好的方法,但这对我有用,我希望它能帮助其他人。

这是因为我有一个 400 行的文件,修复起来非常慢,这不是因为 rubocop,而是因为 Neovim 中的语法突出显示。以前,运行 ALEFix 会占用该缓冲区很长时间;现在它不是瞬时的,但它非常快。公平地说,这不是因为 ALEFix 本身,而是因为 Neovim 必须做些什么来用语法高亮重绘缓冲区。