Open4

vim-lsp でローカルのLSPに接続することは可能なのか問題

okuokuokuoku

そもそも、LSPとかDAPの良いところはエディタ/言語独立だということだと思うんだけど、現実にはなかなか厳しいもんがある。まぁ Java の Write Once Run Anywhere みたいなもんだな。

ただ通常の人間と違って、こっちは大量のアーキテクチャ向けのコードを1つの端末で開発しているので、そのためのソリューションを準備する必要がある。

(営業上は、さらに同じことをVSCodeでもやらないといけない。。これも辛いが仕方ない。。)

okuokuokuoku

Netcatが実行できない

[Window Title]
C:\prog\ncat\ncat.exe

[Content]
C:\prog\ncat\ncat.exe

ファイルにウイルスまたは望ましくない可能性のあるソフトウェアが含まれているため、操作は正常に完了しませんでした。


[OK]

そんな事あんのか。。要は exec オプション入りのnetcatはWindows Defenderでブロックされているようだ。

okuokuokuoku

とりあえず動いた

" 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"]

パスマッピングを張らないとダメかな。

okuokuokuoku

vim-lspのバグだった

https://github.com/prabirshrestha/vim-lsp/blob/7dd6b72d0c3ecbee08cdcee7e42d520f52c96208/autoload/lsp/utils.vim#L148-L152

これは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使わせた方が良いか。。キャッシュするし。