From 4bdcfabe83c5bc63992fa784004d507dd766a769 Mon Sep 17 00:00:00 2001 From: "G. Hentschke" <123444711+ghentschke@users.noreply.github.com> Date: Tue, 20 Feb 2024 10:57:48 +0100 Subject: [PATCH] Improve readme (#263) --- README.md | 29 ++++++++++++++++++++++------- images/editor.png | Bin 0 -> 18137 bytes 2 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 images/editor.png diff --git a/README.md b/README.md index 25fa88c..41ec89b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Eclipse CDT LSP - LSP based C/C++ Editor -**Target audience** are Eclipse plugin developers who want to use/develop a LSP based C/C++ Editor. +**Target audience** CDT users who want to use a language server based C/C++ Editor which supports newer C/C++ standards and Eclipse plugin developers who want to use/develop a LSP based C/C++ Editor. The editor in this Eclipse feature is backed by the [LLVM clangd C/C++ language server](https://clangd.llvm.org/). This plugin is based on the [LSP4E](https://github.com/eclipse/lsp4e) and [TM4E](https://github.com/eclipse/tm4e) Eclipse projects. The editor is based on the [`ExtensionBasedTextEditor`](https://github.com/eclipse-platform/eclipse.platform.ui/blob/master/bundles/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/ExtensionBasedTextEditor.java#L55-L56) in Eclipse. @@ -52,7 +52,7 @@ int main() { --> The Editors features depends on the support on client ([LSP4E](https://github.com/eclipse/lsp4e)) and server ([clangd](https://clangd.llvm.org/)) side. -Currently these feature are supported (clangd 15 and 16) and current LSP4E: +Currently these feature are supported (clangd 17) and current LSP4E: - Auto completion - Hovering @@ -70,8 +70,11 @@ Not supported (yet): ### Activating LSP based C/C++ Editor -The `org.eclipse.cdt.lsp.clangd` plugin provides an activation UI for the LSP based C/C++ Editor on project and workspace level. -The clangd language server path and the arguments can be changed in the workspace preferences as well: +The `org.eclipse.cdt.lsp` plugin provides an activation UI for the LSP based C/C++ Editor on project and workspace level. + +![image](images/editor.png "editor.png") + +The clangd path and the arguments can be changed in the workspace preferences as well: ![image](images/preferences.png "preferences.png") @@ -108,7 +111,17 @@ The following tools are needed on the `PATH` to operate the demo. ### Import an existing project -You can import an existing project that contains a `compile_commands.json` file, or follow these instructions to create a simple starting project. +You can import an existing project that contains a `compile_commands.json` file, or follow these instructions to create a simple starting project. +The language server (clangd) searches for a `compile_commands.json` file in the source file folder and its parents. Users can define a `.clangd` file in the project root to configure clangd (e.g. add include paths). +A [.clangd](https://clangd.llvm.org/config#files) is a text file with YAML syntax. A `compile_commands.json` file can be generated by CMake. + +[!TIP] +This configuration entry in the `.clangd` file would tell clangd to use the `compile_commands.json` file in the build/default folder: + +```yaml +CompileFlags: + CompilationDatabase: build/default +``` ### Create an example CMake project @@ -128,9 +141,11 @@ This file may be hidden by default, therefore to see the file uncheck the *.\* r By default C/C++ will be opened with the standard CEditor. The default can be changed per project or per workspace with the *C/C++ General* -> *Editor (LSP)* -> *Set C/C++ Editor (LSP) as default* checkbox in the project properties or workspace preference page. -- Note: The workspace setting will be used for projects that have not checked the *Enable project specific settings* checkbox in the project properties -> *C/C++ General* -> *Editor (LSP)* page. +[!TIP] +The workspace setting will be used for projects that have not checked the *Enable project specific settings* checkbox in the project properties -> *C/C++ General* -> *Editor (LSP)* page. -**Note:** Opening a C/C++ file using *Open With* in the context menu of a file won't work for the LSP based editor, because the language server won't be started if *Set C/C++ Editor (LSP) as default* is not enabled! +[!NOTE] +Opening a C/C++ file using *Open With* in the context menu of a file won't work for the LSP based editor, because the language server won't be started if *Set C/C++ Editor (LSP) as default* is not enabled! With the *C/C++ Editor (LSP)* open, the presentation of the C++ file will follow the LSP4E conventions augmented by the information returned from clangd. diff --git a/images/editor.png b/images/editor.png new file mode 100644 index 0000000000000000000000000000000000000000..674706ae0d178c785275ba74c1ab603a1c794d7d GIT binary patch literal 18137 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 literal 0 HcmV?d00001