Skip to content

Commit

Permalink
vimrc: add completefunc for c/cpp/cuda
Browse files Browse the repository at this point in the history
  • Loading branch information
jiangyinzuo committed Feb 4, 2024
1 parent e625721 commit 2fc4219
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 3 deletions.
38 changes: 36 additions & 2 deletions .vimrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ if has('autocmd') " vim-tiny does not have autocmd
set nocp "no Vi-compatible
let g:mapleader = ' '
set modeline " 开启模式行, 读取文件开头结尾类似于 /* vim:set ts=2 sw=2 noexpandtab: */ 的配置
set noexrc " 不读取当前文件夹的.vimrc
set exrc " 读取当前文件夹的.vimrc
if has("patch-7.4.1649")
packadd! matchit
endif
Expand Down Expand Up @@ -40,7 +40,6 @@ if has('autocmd') " vim-tiny does not have autocmd
set wildmode=list:full
endif
set wildignore=.git/*,build/*,.cache/*
set path=.,, " 当前目录和当前文件所在目录
set updatetime=700 " GitGutter更新和自动保存.swp的延迟时间

" https://www.skywind.me/blog/archives/2021
Expand Down Expand Up @@ -403,6 +402,37 @@ if has('autocmd') " vim-tiny does not have autocmd
if has("autocmd") && exists("+omnifunc")
autocmd Filetype * if &omnifunc == "" | setlocal omnifunc=syntaxcomplete#Complete | endif
endif

function! MyCppCompleteFunc(findstart, base)
if a:findstart
" 确定补全开始的位置
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] =~ '\S'
let start -= 1
endwhile
if line[start] != '<' && line[start] != '"'
return -3
endif
return start + 1
endif

if getline('.') =~# &include
let filetype = &filetype
if filetype == 'cpp' || filetype == 'cuda'
" r! ls -1 /usr/include/c++/13 | awk '{print " \x27"$0"\x27"}' | paste -sd,
let completions = ['algorithm', 'any', 'array', 'atomic', 'backward', 'barrier', 'bit', 'bits', 'bitset', 'cassert', 'ccomplex', 'cctype', 'cerrno', 'cfenv', 'cfloat', 'charconv', 'chrono', 'cinttypes', 'ciso646', 'climits', 'clocale', 'cmath', 'codecvt', 'compare', 'complex', 'complex.h', 'concepts', 'condition_variable', 'coroutine', 'csetjmp', 'csignal', 'cstdalign', 'cstdarg', 'cstdbool', 'cstddef', 'cstdint', 'cstdio', 'cstdlib', 'cstring', 'ctgmath', 'ctime', 'cuchar', 'cwchar', 'cwctype', 'cxxabi.h', 'debug', 'decimal', 'deque', 'exception', 'execution', 'expected', 'experimental', 'ext', 'fenv.h', 'filesystem', 'format', 'forward_list', 'fstream', 'functional', 'future', 'initializer_list', 'iomanip', 'ios', 'iosfwd', 'iostream', 'istream', 'iterator', 'latch', 'limits', 'list', 'locale', 'map', 'math.h', 'memory', 'memory_resource', 'mutex', 'new', 'numbers', 'numeric', 'optional', 'ostream', 'parallel', 'pstl', 'queue', 'random', 'ranges', 'ratio', 'regex', 'scoped_allocator', 'semaphore', 'set', 'shared_mutex', 'source_location', 'span', 'spanstream', 'sstream', 'stack', 'stacktrace', 'stdatomic.h', 'stdexcept', 'stdfloat', 'stdlib.h', 'stop_token', 'streambuf', 'string', 'string_view', 'syncstream', 'system_error', 'tgmath.h', 'thread', 'tr1', 'tr2', 'tuple', 'typeindex', 'typeinfo', 'type_traits', 'unordered_map', 'unordered_set', 'utility', 'valarray', 'variant', 'vector', 'version']
call filter(completions, 'v:val =~ "^" . a:base')
endif
" 使用getcompletion()获取文件类型的补全列表
echom a:base
let completions += getcompletion(a:base . '*.h*', 'file_in_path', 1)
let completions += getcompletion(a:base . '*/$', 'file_in_path', 1)
return completions
endif
return []
endfunction
autocmd FileType c,cpp,cuda setlocal completefunc=MyCppCompleteFunc
set laststatus=2

" file is large from 10mb
Expand Down Expand Up @@ -494,4 +524,8 @@ if has('autocmd') " vim-tiny does not have autocmd
endif
endif
endif

if filereadable(expand("~/config_single_vimrc.vim"))
source $HOME/config_single_vimrc.vim
endif
endif
26 changes: 26 additions & 0 deletions root/.vim/doc/complete.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
## omnicomplete

在没有插件的情况下,Vim 提供了一些基础的代码自动补全选项。其中最常用的可能是 Omnicomplete 和关键字补全。

1. **Omnicomplete(全能补全)**: Omnicomplete 可以对诸如 C/C++, Python, Java 等编程语言进行上下文相关的补全。使用 `<C-x><C-o>`(按住 `Ctrl` 键然后依次按 `x``o`)来触发 Omnicomplete。
Expand Down Expand Up @@ -40,3 +42,27 @@ filetype plugin indent on
设置了 `filetype plugin on` 之后,Vim 会根据当前文件的类型来加载相应的插件。这些插件通常会设置一些特定于该文件类型的行为,比如补全函数、语法高亮等。对于像 Python 这样的编程语言,这通常也会设置一个适当的 `omnifunc`(全能补全函数),从而使得 `<C-x><C-o>` 可以工作。

所以,如果你想用 Omnicomplete,确保在 `.vimrc` 文件中启用了 `filetype plugin on` 是一个好主意。

## completefunc thesaurusfunc和omnicomplete

在Vim中,`completefunc``thesaurusfunc``omnifunc`是三种不同的补全功能,它们提供了不同的补全机制和用途。以下是每种功能的概述和它们之间的主要区别:

### 1. `completefunc` (或称为`'completefunc'`)

- **用途**`completefunc`是用户定义的补全函数,通常用于实现特定类型的补全,例如基于项目或文件类型的自定义补全逻辑。它不依赖于Vim的内置补全机制,而是允许用户通过脚本自定义补全行为。
- **触发方式**:通过按下`<C-x><C-u>`(在插入模式下)手动触发,或者通过脚本自动触发。
- **自定义性**:高。用户可以完全自定义补全逻辑和数据来源。

### 2. `thesaurusfunc` (或称为`'thesaurusfunc'`)

- **用途**`thesaurusfunc`是用户定义的查找同义词的函数,主要用于在编辑文本时查找词汇的同义词。这个功能特别适合写作和编辑任务,帮助用户寻找词汇的变体或替代词。
- **触发方式**:通常通过特定的命令或快捷键触发(如用户自定义的命令或快捷键),并不像`completefunc``omnifunc`那样直接与代码补全集成。
- **自定义性**:非常高。用户需要提供完整的同义词查找逻辑,包括如何检索和显示同义词。

### 3. `omnifunc` (或称为`'omnifunc'`)

- **用途**`omnifunc`提供了一种上下文相关的补全机制,主要用于编程语言的语法和代码补全。Vim本身或通过插件可以为不同的编程语言提供`omnifunc`,以支持变量名、函数名等的自动补全。
- **触发方式**:通过按下`<C-x><C-o>`(在插入模式下)手动触发。许多现代Vim配置和IDE风格插件也可能提供更自动化的触发方式。
- **自定义性**:中等。虽然`omnifunc`通常由插件或Vim的语言支持提供,但用户仍然可以指定自定义的函数来覆盖默认行为或增加对新语言的支持。

**总结**:这三种补全函数各有其用途和特点。`completefunc`提供了一种完全自定义的补全机制,适用于特定的补全需求;`thesaurusfunc`专注于文本编辑中的同义词查找;而`omnifunc`则是为编程和代码编辑提供上下文相关的补全功能。用户可以根据具体的编辑需求和偏好来选择和配置这些功能。
3 changes: 3 additions & 0 deletions root/.vim/doc/tags.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ Install on Ubuntu: >

*ctags*

直接下载二进制程序
https://github.com/universal-ctags/ctags-nightly-build/releases

*tag跳转* CTRL-]
ctags生成python tag `ctags --language-force=python hello.py`

Expand Down
1 change: 0 additions & 1 deletion root/.vim/vimrc
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ if has('autocmd') " vim-tiny does not have autocmd
set wildmode=list:full
endif
set wildignore=.git/*,build/*,.cache/*
set path=.,, " 当前目录和当前文件所在目录
set updatetime=700 " GitGutter更新和自动保存.swp的延迟时间

" https://www.skywind.me/blog/archives/2021
Expand Down

0 comments on commit 2fc4219

Please sign in to comment.