Haskell LSP(보너스: Vim용)

9775 단어 vimlsphaskell
그래서 당신은 하스켈로 코딩하는 것을 즐깁니다. 그리고 요즘 아이들이 이 LSP 것을 사용하여 코딩하는 것을 들었습니다.

본론으로 들어가 보자. LSP는 자동 완성, 코드 탐색, 보푸라기 및 현대 IDE에서 흔히 볼 수 있는 모든 유용한 기능을 표준화하는 사양이다. 선호하는 언어로 LSP를 사용하려면 선택한 편집기와 통신할 언어 서버가 필요합니다.

이 기사에서는 haskell's language server 에 중점을 둘 것입니다. 얼마 전까지만 해도 선택한 언어 서버는 hie였지만 지금은 더 이상 사용되지 않습니다.

시작하겠습니다! Haskell Stack이 실행 중이라고 가정합니다.

$ stack install ghcid hspec-discover # optional but great
$ git clone https://github.com/haskell/haskell-language-server --recurse-submodules
$ cd haskell-language-server
$ stack ./install.hs help
$ stack ./install.hs hls


일반적인 위치에 있을 바이너리: ~/.local/bin
맞아요 근데 어떻게 사용하나요? 편집자에 따라 다릅니다. 내 .vimrc에서 어떻게 하는지 보여드리겠습니다.

Plug 'prabirshrestha/vim-lsp'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'mattn/vim-lsp-settings'


설명서를 읽어보세요!

" vim-lsp-settings won't detect hls automatically as of today (2020-10-26). Let's teach it:
if (executable('haskell-language-server-wrapper'))
  au User lsp_setup call lsp#register_server({
      \ 'name': 'haskell-language-server-wrapper',
      \ 'cmd': {server_info->['haskell-language-server-wrapper', '--lsp']},
      \ 'whitelist': ['haskell'],
      \ })
endif

" My Mappings
function! s:on_lsp_buffer_enabled() abort
    setlocal omnifunc=lsp#complete
    setlocal signcolumn=yes
    if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif
    nmap <buffer> gd <plug>(lsp-definition)
    nmap <buffer> gr <plug>(lsp-references)
    nmap <buffer> gf <plug>(lsp-code-action)
    nmap <buffer> gi <plug>(lsp-implementation)
    nmap <buffer> gt <plug>(lsp-type-definition)
    nmap <buffer> <F2> <plug>(lsp-rename)
    nmap <buffer> [g <Plug>(lsp-previous-diagnostic)
    nmap <buffer> ]g <Plug>(lsp-next-diagnostic)
    nmap <buffer> K <plug>(lsp-hover)
    xmap <buffer> f <plug>(lsp-document-range-format)
    nmap <buffer> <F5> <plug>(lsp-code-lens)

    " buffer format on save
    " autocmd BufWritePre <buffer> LspDocumentFormatSync
endfunction

" Decorations
augroup lsp_install
    au!
    let g:lsp_signs_enabled = 1         " enable signs
    let g:lsp_diagnostics_echo_cursor = 1 " enable echo under cursor when in normal mode
    let g:lsp_signs_error = {'text': '✗'}
    " let g:lsp_signs_warning = {'text': '‼', 'icon': '/path/to/some/icon'} " icons require GUI
    " let g:lsp_signs_hint = {'icon': '/path/to/some/other/icon'} " icons require GUI
    let g:lsp_signs_warning = {'text': '‼'}
    let g:lsp_highlight_references_enabled = 1
    highlight link LspErrorText GruvboxRedSign " requires gruvbox
    highlight clear LspWarningLine
    " highlight lspReference ctermfg=red guifg=red ctermbg=green guibg=green
    highlight lspReference guibg=#303010

    " call s:on_lsp_buffer_enabled only for languages that has the server registered.
    autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
augroup END


하스켈 파일로 vim을 처음 시작하면 시간이 좀 걸립니다( :LspStatus 로 vim-lsp의 상태를 확인할 수 있습니다). 왼쪽 여백(1자 너비)이 표시되면 준비가 된 것입니다!

이제 Vim은 강력한 LSP입니다.
  • 호버:


  • 자동 완성:



  • 등 등 등

    즐기다!

    좋은 웹페이지 즐겨찾기