Emacs

Fangrui Song 2018-06-16 20:23:07 -07:00
parent 0f74f1812f
commit b1f1e8df75
2 changed files with 25 additions and 16 deletions

@ -6,9 +6,7 @@ First of all, use a `--variant=debug` [[Build]]. It is compiled with `-O0 -g` wh
### Dump LSP requests/responses ### Dump LSP requests/responses
`--record=/tmp/ccls`: You can find stdin/stdout (LSP requests/responses) in `/tmp/cquery.{in,out}` Alternatively, enable logs and pass the `--log-all-to-stderr` option to the ccls executable (`bin/ccls --log-file=/tmp/cq.log --log-all-to-stderr`). You can find stderr output in:
Alternatively, enable logs and pass the `--log-all-to-stderr` option to the ccls executable (`bin/cquery --log-file=/tmp/cq.log --log-all-to-stderr`). You can find stderr output in:
* LanguageClient-neovim: `/tmp/LanguageServer.log` (default) * LanguageClient-neovim: `/tmp/LanguageServer.log` (default)
* Emacs lsp-mode: `*lsp-ccls stderr*` buffer. They will also go to `*message*` buffer if `(setq lsp-print-io t)` * Emacs lsp-mode: `*lsp-ccls stderr*` buffer. They will also go to `*message*` buffer if `(setq lsp-print-io t)`
@ -35,21 +33,21 @@ nn ,al :LanguageClientStart<cr>
rm -r /tmp/ccls && CQUERY_TRACEME=1 nvim a.cc +'normal ,al' rm -r /tmp/ccls && CQUERY_TRACEME=1 nvim a.cc +'normal ,al'
``` ```
The Neovim buffer will hang there because `CCLS_TRACEME=1` causes the bin/cquery process to SIGTSTP itself. In another shell, `gdb -p $(pgrep -fn bin/cquery)` The Neovim buffer will hang there because `CCLS_TRACEME=1` causes the `ccls` process to SIGTSTP itself. In another shell, `gdb -p $(pgrep -fn debug/ccls)`
### Poor man's breakpoint ### Poor man's breakpoint
Insert an infinite loop `volatile static int z=0;while(!z);` somewhere and ccls will stop there. Attach to the cquery process with `gdb -p $(pgrep -fn cquery)`. Set some breakpoints, use `print` commands, and execute `p z=1` for continuing. Insert an infinite loop `volatile static int z=0;while(!z);` somewhere and ccls will stop there. Attach to the ccls process with `gdb -p $(pgrep -fn ccls)`. Set some breakpoints, use `print` commands, and execute `p z=1` for continuing.
When setting breakpoints, if several threads may stop on the same breakpoint (e.g. concurrent indexer threads), When setting breakpoints, if several threads may stop on the same breakpoint (e.g. concurrent indexer threads),
execute `set scheduler-locking on`. execute `set scheduler-locking on`.
### Using a debugger ### Using a debugger
Cache files are deleted to avoid possible issues related to stale cache. `CCLS_TRACEME=1` causes the cquery process to stop at the start of `main()`. You may attach to the process with: Cache files are deleted to avoid possible issues related to stale cache. `CCLS_TRACEME=1` causes the ccls process to stop at the start of `main()`. You may attach to the process with:
* `gdb -p $(pgrep -fn ccls)`. Invoke `signal SIGCONT` if you want cquery to continue running after detaching of gdb. * `gdb -p $(pgrep -fn ccls)`. Invoke `signal SIGCONT` if you want ccls to continue running after detaching of gdb.
* `lldb -p $(pgrep -fn ccls)`. Invoke `pro sig SIGCONT` when the process resumes (with a `c` command) if you want cquery to continue running after detaching. * `lldb -p $(pgrep -fn ccls)`. Invoke `pro sig SIGCONT` when the process resumes (with a `c` command) if you want ccls to continue running after detaching.
### libclang or indexer callback issues ### libclang or indexer callback issues

@ -15,8 +15,7 @@ The only required configuration is `ccls-executable`. Others have good defaults.
`xref-find-definitions` (default: `M-.`) / highlighting of the symbol at point / type signature in echo area should work out-of-box. Read on for customization and more features. `xref-find-definitions` (default: `M-.`) / highlighting of the symbol at point / type signature in echo area should work out-of-box. Read on for customization and more features.
```elisp ```elisp
(setq ccls-executable "/path/to/ccls/build/release/bin/ccls") (setq ccls-executable "/path/to/ccls/release/ccls")
;; ;; Arch Linux aur/ccls-git aur/ccls
;; (setq ccls-executable "/usr/bin/ccls") ;; (setq ccls-executable "/usr/bin/ccls")
;; ;; Log file ;; ;; Log file
@ -24,12 +23,20 @@ The only required configuration is `ccls-executable`. Others have good defaults.
;; ;; Cache directory, both relative and absolute paths are supported ;; ;; Cache directory, both relative and absolute paths are supported
;; (setq ccls-cache-dir ".ccls_cached_index") ;; (setq ccls-cache-dir ".ccls_cached_index")
;; ;; Initialization options ;; ;; Initialization options
;; (setq ccls-extra-init-params '(:cacheFormat "msgpack")) ;; (setq ccls-extra-init-params '(:completion (:detailedLabel t)))
```
You may leave `ccls-executable` unchanged (default: `ccls`) and create a shell wrapper named `ccls` and put it into your `PATH`:
```zsh
#!/bin/zsh
#export CCLS_TRACEME=1 # if you want to debug ccls, stop it right after main() is called
#export LD_LIBRARY_PATH=~/Dev/llvm/release/lib # if you link against shared library libLLVM.so, not statically
exec ~/Dev/Util/ccls/release/ccls --log-file=/tmp/ccls.log "$@"
``` ```
#### Projects with subprojects #### Projects with subprojects
For each source file that has turned on `lsp-ccls-enable`, variable `MaskRay-roots`, projectile, `compile_commands.json` are consulted to locate the project root and the associated lsp-mode workspace. If your project has subprojects, `(projectile-project-root)` may think files in the subproject belong to the child workspace, which is not desired. `(setq MaskRay-roots '("~/my-root-project" ))` to override projectile roots. For each source file that has turned on `lsp-ccls-enable`, projectile is consulted to locate the project root and the associated lsp-mode workspace. If your project has subprojects, `(projectile-project-root)` may think files in the subproject belong to the child workspace, which is not desired. `touch .ccls-root` in the root directory to override projectile roots.
If you do not mind files in subprojects are treated as part of the whole project in projectile: If you do not mind files in subprojects are treated as part of the whole project in projectile:
@ -54,6 +61,8 @@ To turn on ccls for all C/C++ modes:
;; Also see lsp-project-whitelist lsp-project-blacklist ccls-root-matchers ;; Also see lsp-project-whitelist lsp-project-blacklist ccls-root-matchers
``` ```
MaskRay's doom-emacs configuration: <https://github.com/MaskRay/Config/blob/master/home/.config/doom/modules/private/my-cc/config.el>
### Diagnostics ### Diagnostics
* `M-x lsp-capabilities` LSP workspace is initialized correctly * `M-x lsp-capabilities` LSP workspace is initialized correctly
@ -62,13 +71,15 @@ To turn on ccls for all C/C++ modes:
The buffer `*lsp-ccls stderr*` and `--log-file=/tmp/cq.log` contain logs. The buffer `*lsp-ccls stderr*` and `--log-file=/tmp/cq.log` contain logs.
Also refer to [[Debugging]].
## [[Initialization options]] ## [[Initialization options]]
Initialization options are defined in [config.h](https://github.com/MaskRay/ccls/blob/master/src/config.h), but you need to customize them in S-exp. Initialization options are defined in [config.h](https://github.com/MaskRay/ccls/blob/master/src/config.h), but you need to customize them in S-exp.
Use `t` for true, `:json-false` for false, `:json-null` for null. Use `t` for true, `:json-false` for false, `:json-null` for null.
```elisp ```elisp
(setq ccls-extra-init-params '(:index (:comments 2) :cacheFormat "msgpack" :completion (:detailedLabel t))) (setq ccls-extra-init-params '(:index (:comments 2) :completion (:detailedLabel t)))
``` ```
### Find definitions/references ### Find definitions/references
@ -120,7 +131,7 @@ Aside from definitions/references/workspace symbol, ccls provides some LSP exten
```elisp ```elisp
(ccls-xref-find-custom "$ccls/base") (ccls-xref-find-custom "$ccls/base")
(ccls-xref-find-custom "$ccls/callers") (ccls-xref-find-custom "$ccls/callers")
(ccls-xref-find-custom "$ccls/derived") ; Use lsp-goto-implementation or lsp-ui-peek-find-implementation for derived types/functions
(ccls-xref-find-custom "$ccls/vars") (ccls-xref-find-custom "$ccls/vars")
;; Alternatively, use lsp-ui-peek interface ;; Alternatively, use lsp-ui-peek interface
@ -151,7 +162,7 @@ Install [company-lsp](https://github.com/tigersoldier/company-lsp) and add `comp
Type `#i"` (or `#include "`) for quote-style includes and `#i<` (or `#include <`) for system headers. Type `#i"` (or `#include "`) for quote-style includes and `#i<` (or `#include <`) for system headers.
See https://github.com/MaskRay/ccls/pull/391#issuecomment-362872732 for an alternative view (contextual parent as detail, signature as label) See https://github.com/cquery-project/cquery/pull/391#issuecomment-362872732 for an alternative view (contextual parent as detail, signature as label)
```elisp ```elisp
(setq ccls-extra-init-params '(:completion (:detailedLabel t))) (setq ccls-extra-init-params '(:completion (:detailedLabel t)))
``` ```
@ -182,7 +193,7 @@ ccls-sem-macro-colors
ccls-sem-member-face ;; defaults to t :slant italic ccls-sem-member-face ;; defaults to t :slant italic
;; To customize faces used ;; To customize faces used
(face-spec-set 'cquery-sem-member-face (face-spec-set 'ccls-sem-member-face
'((t :slant "normal")) '((t :slant "normal"))
'face-defface-spec) 'face-defface-spec)
``` ```