suoto / vim-hdl

Vim plugin to aid VHDL development (for LSP, see https://github.com/suoto/hdl_checker)
GNU General Public License v3.0
59 stars 5 forks source link

Ale compatibility? #41

Closed twilco closed 5 years ago

twilco commented 5 years ago

Hi there! Thanks for making this awesome tool. I see integration with Syntastic is possible, but what about ale? Is this currently possible?

suoto commented 5 years ago

Happy you liked :)

It's possible yes, but it does require some changes on the backed side first to support LSP (planned but not yet started at the moment). Async checks is something I'd be keen on adding anyway, let's see how it goes

suoto commented 5 years ago

vim-hdl uses HDL Code Checker and since ALE implements LSP, you can just use HDL Code Checker instead.

  1. Install HDL Code Checker
    pip install hdlcc
  2. Add the following to your .vimrc

    " Gets the path to the nearest g:vimhdl_conf_file
    function! s:GetProjectRoot(buffer) abort
      let l:config_file = get(b:, 'vimhdl_conf_file', get(g:, 'vimhdl_conf_file', 'vimhdl.prj'))
    
      let l:project_root = ale#path#FindNearestFile(a:buffer, l:config_file)
      let l:project_root = !empty(l:project_root) ? fnamemodify(l:project_root, ':h') : ''
    
      return l:project_root
    endfunction
    
    " Setup ALE to use HDL Code Checker
    function! s:hdlccLspSetup() abort
    
      for l:filetype in ['vhdl', 'verilog', 'systemverilog']
        try
          call ale#linter#Define(l:filetype, {
                \ 'name': 'vimhdl',
                \ 'lsp': 'stdio',
                \ 'language': l:filetype,
                \ 'executable': 'hdlcc',
                \ 'command': 'hdlcc --lsp',
                \ 'project_root': function('s:GetProjectRoot'),
                \ })
    
          if exists('g:ale_linters')
            let l:existing = get(g:ale_linters, l:filetype, [])
            let g:ale_linters[l:filetype] = l:existing + ['vimhdl', ]
          else
            let g:ale_linters = { l:filetype : ['vimhdl', ] }
          endif
    
        catch /^Vim\%((\a\+)\)\=:E117/
          " If setting up ALE didn't work, just bail
          return
        endtry
      endfor
    endfunction
  3. Restart vim
  4. On a VHDL/Verilog/SystemVerilog file, you can then use ALEInfo to check which linters are available

    :ALEInfo
     Current Filetype: verilog
    Available Linters: ['vimhdl', 'iverilog', 'verilator', 'vlog', 'xvlog']
      Enabled Linters: ['vimhdl']
    
    ...
    
      Command History:
    (executable check - success) hdlcc
    (started) ['/bin/bash', '-c', 'hdlcc --lsp']

    Let me know if you have any issues