$ccls/navigate 基於LSP documentSymbol的移動

ccls(language server)加了$ccls/navigate。 給emacs-ccls (language client)加了

(defun ccls-navigate (direction)
  "Navigate to a nearby outline symbol.
DIRECTION can be \"D\", \"L\", \"R\" or \"U\"."
  (lsp-find-custom "$ccls/navigate" `(:direction ,direction)))

這個思路也能用於其他language server。

(ccls-navigate "U")

U

(ccls-navigate "D")

D

(ccls-navigate "L")

L

(ccls-navigate "R")

R

lsp-mode沒有實現hierarchicalDocumentSymbolSupport,所以沒有textDocument/documentSymbol的層次結構。C/C++ declaration可以和definition分離,可以redeclarable (比如namespace可以出現多次),parent有lexical/semantic兩類,我還沒有想清楚如果要實現層次結構應該怎麼做。但這個移動基本能滿足我的需求了。ccls邏輯https://github.com/MaskRay/ccls/blob/master/src/messages/ccls_navigate.cc

相關:

spacemacs裏有人要加ccls/cquery到c-c++ layer了 https://github.com/syl20bnr/spacemacs/pull/11242,他要定製這麼多東西我不太適應。

週末另外實現了index.multiVersion,一個檔案可以被檢索多次獲得期中的所有引用了(比如#ifdef #else #endif的兩段,或者dependent name lookup等)

{
  "index": {
    "multiVersion": 1,
    "multiVersionBlacklist": ["^/usr/include"]
  }
}
5 个赞

这么好的帖子居然没人置顶

那就我来吧

我没看懂……这是跳转到什么地方?

declarations想象成有層級關係,ccls-navigate是上下左右移動,可能類似sp-{down,up,previous,next}-sexp