diff --git a/autoload/SpaceVim/layers/lang/c.vim b/autoload/SpaceVim/layers/lang/c.vim index d186cf745..074846031 100644 --- a/autoload/SpaceVim/layers/lang/c.vim +++ b/autoload/SpaceVim/layers/lang/c.vim @@ -6,6 +6,7 @@ " License: GPLv3 "============================================================================= +" Layer doc {{{ "" " @section lang#c, layer-lang-c @@ -80,8 +81,9 @@ " SPC l s s send selection text " < " +" }}} - +" Init layer options {{{ if exists('s:clang_executable') finish else @@ -93,11 +95,18 @@ else \ 'objc': 'c11', \ 'objcpp': 'c++1z', \ } + let s:highlight_cmd = '' + let s:enable_clang_syntax = 0 + let s:c_repl_command = '' endif +" }}} + +" Load the APIs{{{ let s:SYSTEM = SpaceVim#api#import('system') let s:CPT = SpaceVim#api#import('vim#compatible') +" }}} - +" plugins {{{ function! SpaceVim#layers#lang#c#plugins() abort let plugins = [] if !SpaceVim#layers#lsp#check_filetype('c') && !SpaceVim#layers#lsp#check_filetype('cpp') @@ -135,7 +144,9 @@ function! SpaceVim#layers#lang#c#plugins() abort endif return plugins endfunction +" }}} +" config {{{ function! SpaceVim#layers#lang#c#config() abort call SpaceVim#mapping#gd#add('c', \ function('s:go_to_def')) @@ -190,20 +201,18 @@ function! SpaceVim#layers#lang#c#config() abort let s:highlight_cmd = 'ClighterEnable' endif endfunction +" }}} -let s:highlight_cmd = '' - +" local function: highlight {{{ function! s:highlight() abort try exe s:highlight_cmd catch endtry endfunction +" }}} -let s:enable_clang_syntax = 0 - -let s:c_repl_command = '' - +" set_variable {{{ function! SpaceVim#layers#lang#c#set_variable(var) abort if has_key(a:var, 'clang_executable') let g:completor_clang_binary = a:var.clang_executable @@ -239,7 +248,9 @@ function! SpaceVim#layers#lang#c#set_variable(var) abort call extend(s:clang_std, get(a:var, 'clang_std', {})) endfunction +" }}} +" local function: language_specified_mappings {{{ function! s:language_specified_mappings() abort call SpaceVim#mapping#space#langSPC('nmap', ['l','r'], @@ -282,8 +293,9 @@ function! s:language_specified_mappings() abort \ 'call SpaceVim#plugins#repl#send("selection")', \ 'send selection and keep code buffer focused', 1) endfunction +" }}} - +" local function: update_clang_flag {{{ function! s:update_clang_flag() abort if filereadable('.clang') let argvs = readfile('.clang') @@ -293,7 +305,9 @@ function! s:update_clang_flag() abort call s:update_runner(argvs, ['c', 'cpp']) endif endfunction +" }}} +" local function: update_checkers_argv {{{ if g:spacevim_enable_neomake && g:spacevim_enable_ale == 0 function! s:update_checkers_argv(argv, fts) abort for ft in a:fts @@ -326,11 +340,15 @@ else endfunction endif +" }}} +" local function: update_autocomplete_argv {{{ function! s:update_autocomplete_argv(argv, fts) abort endfunction +" }}} +" local function: has_std {{{ function! s:has_std(argv) abort for line in a:argv if line =~# '^-std=' @@ -338,7 +356,9 @@ function! s:has_std(argv) abort endif endfor endfunction +" }}} +" local function: update_runner {{{ function! s:update_runner(argv, fts) abort if s:has_std(a:argv) let default_std = 1 @@ -364,7 +384,9 @@ function! s:update_runner(argv, fts) abort call SpaceVim#plugins#runner#reg_runner('cpp', [runner2, '#TEMP#']) endif endfunction +" }}} +" local function: update_neoinclude {{{ function! s:update_neoinclude(argv, fts) abort if s:SYSTEM.isLinux let path = '.,/usr/include,,' @@ -378,7 +400,9 @@ function! s:update_neoinclude(argv, fts) abort endfor let b:neoinclude_paths = path endfunction +" }}} +" local function: go_to_def {{{ function! s:go_to_def() abort if !SpaceVim#layers#lsp#check_filetype(&ft) execute "norm! g\" @@ -386,3 +410,4 @@ function! s:go_to_def() abort call SpaceVim#lsp#go_to_def() endif endfunction +" }}} diff --git a/doc/SpaceVim.txt b/doc/SpaceVim.txt index 42c5966a0..ec70aaf21 100644 --- a/doc/SpaceVim.txt +++ b/doc/SpaceVim.txt @@ -1625,7 +1625,7 @@ Here is an example how to use above options: name = "lang#c" clang_executable = "/usr/bin/clang" clang_flag = ['-I/user/include'] - [layer.clang_std] + [layers.clang_std] c = "c11" cpp = "c++1z" objc = "c11" @@ -1660,6 +1660,7 @@ This layer also provides REPL support for c, the key bindings are: SPC l s s send selection text < +}}} ============================================================================== LANG#CHAPEL *SpaceVim-layer-lang-chapel* diff --git a/docs/_posts/2019-05-10-use-vim-as-a-c-cpp-ide.md b/docs/_posts/2019-05-10-use-vim-as-a-c-cpp-ide.md index 1e145b0e4..443e59a89 100644 --- a/docs/_posts/2019-05-10-use-vim-as-a-c-cpp-ide.md +++ b/docs/_posts/2019-05-10-use-vim-as-a-c-cpp-ide.md @@ -16,9 +16,11 @@ Each of the following sections will be covered: - [Enable language layer](#enable-language-layer) +- [Syntax highlighting](#syntax-highlighting) - [code completion](#code-completion) - [alternate file jumping](#alternate-file-jumping) - [code running](#code-running) +- [Syntax lint](#syntax-lint) - [code format](#code-format) - [REPL support](#repl-support) @@ -36,6 +38,19 @@ SpaceVim configuration file, and add following configuration: for more info, you can read the [lang#c](../layers/lang/c/) layer documentation. +### Syntax highlighting + +The basic syntax highlighting is based on regular expression, If you want `clang` based +syntax highlighting. Enable `enable_clang_syntax_highlight` layer option: + +```toml +[[layers]] + name = 'lang#c' + enable_clang_syntax_highlight = true +``` + +This option requires `+python` or `+python3` enabled and `libclang` has been installed. + ### code completion By default the autocomplete layer has been enabled, so after loading `lang#c` layer, the code completion @@ -66,6 +81,29 @@ And the stdout will be shown on a runner buffer. ![c-cpp-runner](https://user-images.githubusercontent.com/13142418/58743787-db2bee80-846a-11e9-9b19-17202ac542c9.png) +The default runner compile option is defineded in `clang_std` and `clang_flag` option. +If you want to use `c11`, you can change `clang_std` option to: + +```toml +[[layers]] + name = "lang#c" + [layer.clang_std] + cpp = "c11" +``` + +You can also create a `.clang` file in the root directory of you project. Within this +file, all compile option should be defineded in it. for example: + +``` +-I/home/test +-I/user/std/include +``` + +### Syntax lint + +The [checker](../layers/checkers/) layer provides syntax checking for many programming languages. +Including C/C++, and the default plugin is [neomake](https://github.com/neomake/neomake). The default +lint for C/C++ is `gcc`/`g++`. These commands also read configuration in `.clang` file. ### code format diff --git a/docs/_posts/2019-05-11-use-vim-as-a-c-cpp-ide.md b/docs/_posts/2019-05-11-use-vim-as-a-c-cpp-ide.md index 9a92fdc38..f955270c0 100644 --- a/docs/_posts/2019-05-11-use-vim-as-a-c-cpp-ide.md +++ b/docs/_posts/2019-05-11-use-vim-as-a-c-cpp-ide.md @@ -19,6 +19,7 @@ SpaceVim 是一个模块化的 Vim IDE,针对 C/C++ 语言的支持主要依 - [安装模块](#安装模块) +- [语法高亮](#语法高亮) - [代码自动补全](#代码自动补全) - [语法检查](#语法检查) - [工程文件跳转](#工程文件跳转) @@ -40,6 +41,19 @@ SpaceVim 初次安装时默认并未启用相关语言模块。首先需要启 启用 `lang#c` 模块后,在打开 C/C++ 文件时,就可以使用语言专属快捷键,这些快捷键都是以 `SPC l` 为前缀的。 +### 语法高亮 + +基础的语法高亮是基于正则表达式的,如果需要基于 `clang` 解析的语法高亮, +可以启用 `enable_clang_syntax_highlight` 这一模块选项: + +```toml +[[layers]] + name = 'lang#c' + enable_clang_syntax_highlight = true +``` + +这一功能需要 Vim/Neovim 支持 `+python` 或者 `+python3`,并且安装了 `libclang`。 + ### 代码自动补全 `autocomplete` 模块为 SpaceVim 提供了自动补全功能,目前针对 C/C++ 而言,比较好的补全方案是配合使用 lsp 模块: @@ -99,6 +113,24 @@ C/C++ 代码格式化,主要依赖 `format` 模块,快捷键为 `SPC b f`, ![c-cpp-runner](https://user-images.githubusercontent.com/13142418/58743787-db2bee80-846a-11e9-9b19-17202ac542c9.png) +默认的代码快速运行命令会读取模块选项 `clang_std` 和 `clang_flag`。 +例如,如果需要使用 `c11`,可以设置 `clang_std` 选项如下: + +```toml +[[layers]] + name = "lang#c" + [layer.clang_std] + cpp = "c11" +``` + +与此同时,你也可以在项目根目录新建一个 `.clang` 文件,在其内逐行写入 C/C++ 编译的参数, +比如: + +``` +-I/home/test +-I/user/std/include +``` + ### 交互式编程 在编辑 C/C++ 文件时,可通过快捷键 `SPC l s i` 启动 `php -a` 交互窗口,