Open4
vim-lsp でローカルのLSPに接続することは可能なのか問題
そもそも、LSPとかDAPの良いところはエディタ/言語独立だということだと思うんだけど、現実にはなかなか厳しいもんがある。まぁ Java の Write Once Run Anywhere みたいなもんだな。
ただ通常の人間と違って、こっちは大量のアーキテクチャ向けのコードを1つの端末で開発しているので、そのためのソリューションを準備する必要がある。
(営業上は、さらに同じことをVSCodeでもやらないといけない。。これも辛いが仕方ない。。)
Netcatが実行できない
[Window Title]
C:\prog\ncat\ncat.exe
[Content]
C:\prog\ncat\ncat.exe
ファイルにウイルスまたは望ましくない可能性のあるソフトウェアが含まれているため、操作は正常に完了しませんでした。
[OK]
そんな事あんのか。。要は exec
オプション入りのnetcatはWindows Defenderでブロックされているようだ。
とりあえず動いた
" Configure vim-lsp
let g:lsp_auto_enable = 0
let g:lsp_log_verbose = 1
let g:lsp_log_file = expand('~/vim-lsp.log')
"" vim-plug (install)
if empty(glob('~/.vim/autoload/plug.vim'))
silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
call plug#begin('~/.vim/plugged/')
Plug 'kovisoft/slimv'
Plug 'Valloric/ListToggle'
Plug 'plasticboy/vim-markdown'
Plug 'junegunn/rainbow_parentheses.vim'
Plug 'editorconfig/editorconfig-vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
call plug#end()
...
function YuniVimLspActivate()
call lsp#register_server({
\ 'name': 'default' ,
\ 'cmd': {server_info->['f:\prog\llvm16\bin\clangd',
\ '--background-index',
\ '--clang-tidy',
\ '--compile-commands-dir=F:\yuniframe\_build\Androidx86_64@SDL2-ANGLE-Vulkan' ]},
\ 'whitelist': ['c', 'cpp', 'objc', 'objcpp']})
call lsp#enable()
endfunction
nmap II :call YuniVimLspActivate()<CR>
こういう感じで II
とタイプするとLSPが起動するようにしておいて、 :LspHover
で、
のように、Android NDKから定義を拾うことができた。vimがCygwin版なのであんまり正常に動いてないけど。
["s:on_stdout client request on_notification() error",
"Vim(let):E484: Can't open file /f/android-sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/stdio.h",
"function <SNR>78_out_cb[1]..<SNR>76_on_stdout[75]..<SNR>47_request_on_notification[3]..<SNR>48_createNext[1]..<SNR>48_subscribeSourceCallback[2]..<lambda>986[1]..<SNR>88_handle_location[10]..lsp#utils#location#_lsp_to_vim_list[7]..<SNR>91_lsp_location_item_to_vim, line 26"]
パスマッピングを張らないとダメかな。
vim-lspのバグだった
これはCygwinのパスではなくMSYSのパスになってしまう。 (Cygwin: /cygdrive/c/DIR, MSYS: /c/DIR)
というか、CygwinもMSYSもsyscallではWindowsネイティブパスを使用できるので、こちら方向は変換の必要がない。
逆方向は変換の必要がある。このままだとMSYSを壊すから、グローバル変数とかで切り替えるのが良いのかな。
" Transform cygwin paths to windows paths
let l:path = a:path
if has('win32unix')
"let l:path = substitute(a:path, '\c^/\([a-z]\)/', '\U\1:/', '')
let l:path = substitute(a:path, '\c^/cygdrive/\([a-z]\)/', '\U\1:/', '')
endif
というか、 /cygdrive
にならないケースがあるから、普通にcygpath使わせた方が良いか。。キャッシュするし。