From b1f1e8df7551211124bcc7bcba33096821735f1f Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sat, 16 Jun 2018 20:23:07 -0700 Subject: [PATCH] Emacs --- Debugging.md | 14 ++++++-------- Emacs.md | 27 +++++++++++++++++++-------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/Debugging.md b/Debugging.md index 8a4c6cd..fab2829 100644 --- a/Debugging.md +++ b/Debugging.md @@ -6,9 +6,7 @@ First of all, use a `--variant=debug` [[Build]]. It is compiled with `-O0 -g` wh ### 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/cquery --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/ccls --log-file=/tmp/cq.log --log-all-to-stderr`). You can find stderr output in: * 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)` @@ -35,21 +33,21 @@ nn ,al :LanguageClientStart 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 -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), execute `set scheduler-locking on`. ### 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. -* `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. +* `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 ccls to continue running after detaching. ### libclang or indexer callback issues diff --git a/Emacs.md b/Emacs.md index 6e0b81b..1a9f48a 100644 --- a/Emacs.md +++ b/Emacs.md @@ -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. ```elisp -(setq ccls-executable "/path/to/ccls/build/release/bin/ccls") -;; ;; Arch Linux aur/ccls-git aur/ccls +(setq ccls-executable "/path/to/ccls/release/ccls") ;; (setq ccls-executable "/usr/bin/ccls") ;; ;; 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 ;; (setq ccls-cache-dir ".ccls_cached_index") ;; ;; 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 -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: @@ -54,6 +61,8 @@ To turn on ccls for all C/C++ modes: ;; Also see lsp-project-whitelist lsp-project-blacklist ccls-root-matchers ``` +MaskRay's doom-emacs configuration: + ### Diagnostics * `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. +Also refer to [[Debugging]]. + ## [[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. Use `t` for true, `:json-false` for false, `:json-null` for null. ```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 @@ -120,7 +131,7 @@ Aside from definitions/references/workspace symbol, ccls provides some LSP exten ```elisp (ccls-xref-find-custom "$ccls/base") (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") ;; 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. -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 (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 ;; To customize faces used -(face-spec-set 'cquery-sem-member-face +(face-spec-set 'ccls-sem-member-face '((t :slant "normal")) 'face-defface-spec) ```