|
27 | 27 | ;; protocol's "textDocument/foldingRange" functionality. It can be enabled |
28 | 28 | ;; with |
29 | 29 | ;; (require 'lsp-origami) |
30 | | -;; (add-hook 'origami-mode-hook #'lsp-origami-mode) |
| 30 | +;; (add-hook 'lsp-after-open-hook #'lsp-origami-try-enable) |
31 | 31 |
|
32 | 32 | ;;; Code: |
33 | 33 |
|
|
36 | 36 |
|
37 | 37 | (defun lsp-origami--folding-range-to-fold (range create) |
38 | 38 | (funcall create |
39 | | - (lsp--folding-range-beg range) |
40 | | - (lsp--folding-range-end range) |
41 | | - 0 |
42 | | - (seq-map |
43 | | - (lambda (range) (lsp-origami--folding-range-to-fold range create)) |
44 | | - (seq-remove (lambda (child-range) |
45 | | - (or (eq (lsp--folding-range-beg child-range) |
46 | | - (lsp--folding-range-beg range)) |
47 | | - (eq (lsp--folding-range-end child-range) |
48 | | - (lsp--folding-range-end range)))) |
49 | | - (lsp--folding-range-children range))))) |
| 39 | + (lsp--folding-range-beg range) |
| 40 | + (lsp--folding-range-end range) |
| 41 | + 0 |
| 42 | + (seq-map |
| 43 | + (lambda (range) (lsp-origami--folding-range-to-fold range create)) |
| 44 | + (seq-remove (lambda (child-range) |
| 45 | + (or (eq (lsp--folding-range-beg child-range) |
| 46 | + (lsp--folding-range-beg range)) |
| 47 | + (eq (lsp--folding-range-end child-range) |
| 48 | + (lsp--folding-range-end range)))) |
| 49 | + (lsp--folding-range-children range))))) |
50 | 50 |
|
51 | 51 | (defun lsp-origami--parser (create) |
52 | 52 | "Get a list of Folding Ranges for the current buffer." |
|
57 | 57 | (lsp-origami--folding-range-to-fold range create)) |
58 | 58 | (lsp--get-nested-folding-ranges)))) |
59 | 59 |
|
| 60 | +;;;###autoload |
| 61 | +(defun lsp-origami-try-enable () |
| 62 | + "Turn on `origami-mode' locally and try to enable `lsp-origami-mode'." |
| 63 | + (interactive) |
| 64 | + (origami-mode 1) |
| 65 | + (cond ((lsp--capability "foldingRangeProvider") |
| 66 | + (lsp-origami-mode 1)) |
| 67 | + ((called-interactively-p 'any) |
| 68 | + (signal 'lsp-capability-not-supported (list "foldingRangeProvider"))) |
| 69 | + (t |
| 70 | + (lsp-log "This server does not support foldingRangeProvider")))) |
| 71 | + |
60 | 72 | ;;;###autoload |
61 | 73 | (define-minor-mode lsp-origami-mode |
62 | 74 | "Toggle code folding support for origami." |
63 | 75 | :group 'lsp-origami |
64 | 76 | :global nil |
65 | 77 | (cond |
66 | 78 | (lsp-origami-mode |
67 | | - (setq-local origami-fold-style 'lsp-mode)) |
| 79 | + (setq-local origami-fold-style 'lsp-mode) |
| 80 | + (setq-local origami-parser-alist |
| 81 | + (cons '(lsp-mode . lsp-origami--parser) origami-parser-alist))) |
68 | 82 | (t |
69 | 83 | (setq-local origami-fold-style nil)))) |
70 | 84 |
|
71 | | -(push '(lsp-mode . lsp-origami--parser) origami-parser-alist) |
72 | | - |
73 | 85 | (provide 'lsp-origami) |
74 | 86 | ;;; lsp-origami.el ends here |
0 commit comments