Haskellをやりたい
明けましておめでとうございます。
突然ですが僕はHaskerllをやりたい。理由は下記の動画やTAPLを読み始めたから。
Language Server導入
僕は形から入るタイプなので、vimで.hsを弄れるようにする。
vimでの補完は全てLanguage serverを使っているようにしているので、haskellのlsを調べたところ以下のようなリポジトリが見つかった。
何もhaskell分からないが stackでコンパイラやpackageの管理をすれば良いというのだけ確認し、stackを導入した。
$ brew install stack
次にhaskell-ide-engineを導入するために、ビルドする。
$ stack ./install.hs stack-install-cabal $ stack ./install.hs hie-8.6.5 $ stack ./install.hs build-data
ビルドするときに私の場合下記のようなエラーが発生した。
$ stack ./install.hs stack-install-cabal
Linking /Users/TrsNium/.stack/setup-exe-cache/x86_64-osx/tmp-Cabal-simple_mPHDZzAJ_2.4.0.1_ghc-8.6.5 ...
ld64.lld: warning: ignoring unknown argument: --gc-sections
ld64.lld: warning: ignoring unknown argument: -u
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ld64.lld: warning: ignoring unknown argument: -u
ld64.lld: warning: ignoring unknown argument: -u
ld64.lld: warning: ignoring unknown argument: -u
ld64.lld: warning: ignoring unknown argument: -search_paths_first
ld64.lld: warning: ignoring unknown argument: -dead_strip_dylibs
ld64.lld: warning: -sdk_version is required when emitting min version load command. Setting sdk version to match provided min version
Cannot open /Users/TrsNium/.stack/setup-exe-src/setup-mPHDZzAJ.o: bad relocation (Invalid pointer diff) in section __TEXT/__text (r1_address=21c, r1_type=5, r1_extern=1, r1_length=2, r1_pcrel=0, r1_symbolnum=37), (r2_address=21c, r2_type=0, r2_extern=1, r2_length=2, r2_pcrel=0, r2_symbolnum=30)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
`clang' failed in phase `Linker'. (Exit code: 1)
-- While building simple Setup.hs using:
/Users/TrsNium/.stack/programs/x86_64-osx/ghc-8.6.5/bin/ghc-8.6.5 -rtsopts -threaded -clear-package-db -global-package-db -hide-all-packages -package base -main-is StackSetupShim.mainOverride -package Cabal-2.4.0.1 /Users/TrsNium/.stack/setup-exe-src/setup-mPHDZzAJ.hs /Users/TrsNium/.stack/setup-exe-src/setup-shim-mPHDZzAJ.hs -o /Users/TrsNium/.stack/setup-exe-cache/x86_64-osx/tmp-Cabal-simple_mPHDZzAJ_2.4.0.1_ghc-8.6.5
Process exited with code: ExitFailure 1
これはghcのコンパイラのオプションがgcc向けの設定になっているようだった。
以下を参考にし ~/.stack/programs/x86_64-osx/ghc-8.6.5/lib/ghc-8.6.5/settings 辺りの設定を良しなに変えた。
ビルドされたパッケージーは $HOME/.local/bin に生成されるらしいので、pathを通しておく。
試しにビルドされたhaskell-ide-engineを実行してみる。
$ hie-wrapper 2020-01-05 01:44:54.574095 [ThreadId 4] - run entered for hie-wrapper(hie-wrapper) Version 1.0.0.0, Git revision b7ce8b8f2fc4a071db2119516aa1dcffc577dca0 (3541 commits) x86_64 ghc-8.6.5 2020-01-05 01:44:54.57757 [ThreadId 4] - Current directory:/Users/TrsNium/Documents/TrsNium/kell 2020-01-05 01:44:54.577999 [ThreadId 4] - Operating system:darwin 2020-01-05 01:44:54.57827 [ThreadId 4] - args:[] 2020-01-05 01:44:54.583853 [ThreadId 4] - Cabal-Helper dirs: ["/Users/TrsNium/Documents/TrsNium/kell","/Users/TrsNium/Documents/TrsNium/kell/File.hs"] 2020-01-05 01:44:56.725063 [ThreadId 4] - Cradle directory:/Users/TrsNium/Documents/TrsNium/kell 2020-01-05 01:44:56.725759 [ThreadId 4] - Use Stack GHC 2020-01-05 01:44:57.066709 [ThreadId 4] - Project GHC version:8.6.5 2020-01-05 01:44:57.067207 [ThreadId 4] - hie exe candidates :["hie-8.6.5","hie-8.6","hie"] 2020-01-05 01:44:57.067991 [ThreadId 4] - found hie exe at:/Users/TrsNium/.local/bin/hie-8.6.5 2020-01-05 01:44:57.068399 [ThreadId 4] - args:[] 2020-01-05 01:44:57.068593 [ThreadId 4] - launching .... Running HIE(hie-8.6.5) Version 1.0.0.0, Git revision b7ce8b8f2fc4a071db2119516aa1dcffc577dca0 (3541 commits) x86_64 ghc-8.6.5 To run as a LSP server on stdio, provide the '--lsp' argument Current directory:/Users/TrsNium/Documents/TrsNium/kell args:[] Looking for project config cradle... 2020-01-05 01:44:57.159521 [ThreadId 4] - Cabal-Helper dirs: ["/Users/TrsNium/Documents/TrsNium/kell","/Users/TrsNium/Documents/TrsNium/kell/File.hs"] Cradle:Stack project 2020-01-05 01:44:58.83182 [ThreadId 4] - done
良さそう。この辺りを LanguageClient-neovim に設定していく。
[[plugins]]
repo = 'autozimu/LanguageClient-neovim'
on_ft = ['elixir', 'python', 'ruby', 'rust', 'cpp', 'go', 'erlang', 'haskell']
rev = 'next'
build = 'source install.sh'
hook_add = '''
set hidden
set signcolumn=yes
let g:LanguageClient_serverCommands = {
\ 'python': ['pyls'],
\ 'ruby': ['solargraph', 'stdio'],
\ 'cpp': ['clangd'],
\ 'go': ['bingo', '-mode', 'stdio'],
\ 'rust': ['rustup', 'run', 'nightly', 'rls'],
\ 'erlang': ['$HOME/erlang_ls/_build/prod/rel/erlang_ls/erlang_ls-0.0.1/bin/erlang_ls foreground'],
\ 'elixir': ['$HOME/.config/elixir-ls/language_server.sh'],
\ 'haskell': ['hie-wrapper', '--lsp']
\}
let g:LanguageClient_hasSnippetSupport = 0
let g:neosnippet#enable_complete_done = 0
let g:LanguageClient_rootMarkers = ['*.cabal', 'stack.yaml']
nnoremap <silent> K :call LanguageClient#textDocument_hover()<CR>
nnoremap <silent> gd :call LanguageClient#textDocument_definition()<CR>
nnoremap <silent> <F2> :call LanguageClient#textDocument_rename()<CR>
nnoremap <leader>lm :call LanguageClient_contextMenu()<CR>
let g:LanguageClient_loggingLevel = 'DEBUG'
let g:LanguageClient_loggingFile = expand('~/.local/share/nvim/LanguageClient.log')
let g:LanguageClient_serverStderr = expand('~/.local/share/nvim/LanguageServer.log')
let g:LanguageClient_settingsPath = expand('$XDG_CONFIG_HOME/lsp/settings.json')
let g:LanguageClient_loadSettings = 1
'''
だいたいこんな感じ。
何も分からんが補完は効いてそう。

終わりに
去年の夏に負荷試験ツールを作っていたのですが、中途半端になってたので完成させたいなぁって思ったり。