OpenHarmony环境搭建代码拉取
Tags: openharmony
Published: 2024-01-04 02:08:48

# OH 环境搭建

## 一 Ubuntu安装

### 1.1 WSL安装

### 1.2 依赖安装

```c
apt-get -y install apt-utils
apt-get -y install vim
apt-get -y install software-properties-common
apt-get -y install openssh-server
apt-get -y install iputils-ping
apt-get -y install curl
apt-get -y install net-tools
apt-get -y install bsdmainutils
apt-get -y install kmod
apt-get -y install bc
apt-get -y install rsync
apt-get -y install gawk
apt-get -y install ssh
apt-get -y install ccache
apt-get -y install zip
apt-get -y install python-dev
apt-get -y install make
apt-get -y install m4
apt-get -y install gcc-multilib
apt-get -y install ca-certificates-java
apt-get -y install unzip
apt-get -y install python3-yaml
apt-get -y install perl
apt-get -y install openssl
apt-get -y install libssl1.1
apt-get -y install gnupg
apt-get -y install xsltproc
apt-get -y install x11proto-core-dev
apt-get -y install tcl
apt-get -y install python3-crypto
apt-get -y install python-crypto
apt-get -y install libxml2-utils
apt-get -y install libxml2-dev
apt-get -y install libx11-dev
apt-get -y install libssl-dev
apt-get -y install libgl1-mesa-dev
apt-get -y install lib32z1-dev
apt-get -y install lib32ncurses5-dev
apt-get -y install g++-multilib
apt-get -y install flex
apt-get -y install bison
apt-get -y install doxygen
apt-get -y install git
apt-get -y install subversion
apt-get -y install tofrodos
apt-get -y install pigz
apt-get -y install expect
apt-get -y install python3-xlrd 
apt-get -y install git-core
apt-get -y install gperf 
apt-get -y install build-essential
apt-get -y install zlib1g-dev
apt-get -y install libc6-dev-i386
apt-get -y install lib32z-dev
apt-get -y install openjdk-8-jdk
apt-get -y install ruby
apt-get -y install mtools
apt-get -y install python3-pip
apt-get -y install genext2fs
apt-get -y install liblz4-tool
apt-get -y install libssl-dev
apt-get -y install autoconf
apt-get -y install pkg-config
apt-get -y install automake
apt-get -y install zlib1g-dev
apt-get -y install libmount-dev
apt-get -y install libpixman-1-dev
apt-get -y install libncurses5-dev
apt-get -y install gcc-arm-linux-gnueabi
apt-get -f -y install exuberant-ctags
apt-get -f -y install silversearcher-ag
apt-get -f -y install libtinfo5
apt-get -y install device-tree-compiler
apt-get -y install libssl-dev
 apt-get -y install dwarves
apt-get -y install gcc-arm-none-eabi
apt-get -y install default-jdk
apt-get -y install gcc-arm-linux-gnueabi
apt-get -y install u-boot-tools
apt-get -y install mtd-utils
apt-get -y install scons

sudo apt-get update && sudo apt-get install binutils binutils-dev git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby genext2fs device-tree-compiler make libffi-dev e2fsprogs pkg-config perl openssl libssl-dev libelf-dev libdwarf-dev u-boot-tools mtd-utils cpio doxygen liblz4-tool openjdk-8-jre gcc g++ texinfo dosfstools mtools default-jre default-jdk libncurses5 apt-utils wget scons python3.8-distutils tar rsync git-core libxml2-dev lib32z-dev grsync xxd libglib2.0-dev libpixman-1-dev kmod jfsutils reiserfsprogs xfsprogs squashfs-tools pcmciautils quota ppp libtinfo-dev libtinfo5 libncurses5-dev libncursesw5 libstdc++6 gcc-arm-none-eabi vim ssh locales libxinerama-dev libxcursor-dev libxrandr-dev libxi-dev


Ubuntu20已自带python3.8.5，执行以下命令，切换python3：
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
安装pip
sudo apt-get install python3-pip

sudo apt-get update
sudo apt -y upgrade
```

### 1.3 配置sh为bash

```
ls -l /bin/sh     
#如果显示为“/bin/sh -> bash”则为正常，否则请按以下方式修改： 
sudo dpkg-reconfigure dash   	#然后选择no
或者：
sudo rm -rf /bin/sh
sudo ln -s /bin/bash /bin/sh
```

### 1.4 git lfs安装

```
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
apt-get install git-lfs
apt install git-lfs
git lfs install
```

### 1.5 repo工具安装

```
curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > repo
chmod a+x repo
mv repo /usr/local/bin/
```

### 1.6 Git配置

```
git config --global user.name "shuai"
git config --global user.name "zhuhongtao66"
git config --global user.name "futurezhou"
git config --global user.email "fjq782976686@163.com"
git config --global user.email "1624631650@qq.com"
git config --global core.editor vim
git config --global credential.helper store
git config --global user.email "fengjunqing1@huawei.com"
git config --global user.email "guoshuai48@huawei.com"

```

### 1.7 安装hb命令（不常用）

```
# 方法一：
# 下载一套master分支的代码然后进入root目录下执行
pip3 install build/lite
vim ~/.bashrc
export PATH=$PATH:~/.local/bin
source ~/.bashrc

# 方法二：
python3 -m pip install --user ohos-build
vim ~/.bashrc
export PATH=$PATH:~/.local/bin
source ~/.bashrc

# 方法三：
# 安装指定版本，君正使用的是0.4.3
python3 -m pip install ohos-build==0.4.3
vim ~/.bashrc
export PATH=$PATH:~/.local/bin
source ~/.bashrc

# 卸载hb命令
pip3 uninstall ohos-build

# 使用hb命令
hb set # 选择系统
hb build # 编译
```

## 二 代码下载和编译

### 2.1 代码下载

1. master代码下载

    ```cpp
    mkdir -p ~/OpenHarmony/master
    cd ~/OpenHarmony/master
    repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
    repo sync -c 
    repo forall -c 'git lfs pull'  # 拉取二进制文件
    repo start master --all
    bash ./build/prebuilts_download.sh

    repo切换分支：
    repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
    代码版本回退：
    repo forall -c 'commitID=`git log --before "2022-03-18 07:00" -1 --pretty=format:"%H"`; git reset --hard $commitID'
    重置工作区, 删除所有修改(记得备份你改的代码): 
    repo forall -c "pwd;git reset --hard; git clean -fd"
    更新最新代码: 
    repo sync -c -j8; repo forall -c "pwd;git lfs install;git lfs pull"
    强制同步：
    repo sync --force-sync -c
    ```
2. 编译问题三板斧：（前提条件：确保代码同步了最新，ci看板门禁没问题）：

    * 遇到prebuilt的相关报错，无脑执行./build/prebuilts_download.sh
    * 遇到lfs报错，无脑更新下二进制：repo forall -c "git lfs pull"
    * 遇到其他正常模块报错，先到out/rk3568/下面删除对应模块的编译产物再编，实在解决不了，删除整个out

### 2.2 环境变量设置

```
vim /etc/profile
export PATH=$PATH:/home/prebuilts/llvm/llvm/bin
export PATH=~/.local/bin:$PATH
export PATH=~/toolchain/gcc-arm-none-eabi-10.3-2021.10/bin:$PATH
source ~/.bashrc
```

### 2.3 代码编译

* 全量编译

  ```c
  ./build.sh --product-name rk3568 --ccache
  ./build.sh --product-name rk3568 --ccache -j16

  ```
* 测试用例编译

  ```c
  TDD测试用例：
  ~/OpenHarmony/master/目录下：
  ./build.sh --product-name rk3568 --build-target make_test --ccache #编译所有用例
  ./build.sh --product-name rk3568 --build-target linuxkerneltest # 编译内核测试用例
  ./build.sh --product-name rk3568 -T linuxkerneltest
  编译生成的结果，以二进制形式存储在OpenHarmony/master/out/hispark_taurus/tests下

  XTS测试用例：
  ~/OpenHarmony/master/test/xts/acts/目录下：
  ./build.sh product_name=rk3568 system_size=standard target_subsystem=kernel target_arch=arm64
  ./build.sh product_name=rk3568 system_size=standard target_subsystem=storage # 不指定arch，默认32位
  编译生成的结果，以二进制形式存储在/home/shuai/OpenHarmony/master/out/rk3568/tests/unittest/filemanagement/file_api/filemgmt_libn_test下 (WSL)

  需要重新编译的情况下，一定要先删除out/rk3568/下对应模块的编译产物，再编
  rm -rf ../../../out/rk3568/obj/test/xts
  OH——SDK编译命令：
  ./build.sh --product-name ohos-sdk --disable-package-image --gn-args skip_generate_module_list_file=true --disable-part-of-post-build output_part_rom_status --disable-part-of-post-build get_warning_list --disable-part-of-post-build compute_overlap_rate --gn-args use_thin_lto=false
  ```
* 子系统下单模块编译

  ```
  文件管理子系统单个部件编译：
  ./build.sh --product-name rk3568 --ccache --build-target app_file_service
  ./build.sh --product-name rk3568 --ccache --build-target file_api
  不修改build.gn文件的情况下，可执行快速编译命令：
  ./build.sh --product-name rk3568 --ccache --build-target file_api --fast-rebuild
  ```
* 反编译


  ```
  cd OpenHarmony/master/out/rk3568/lib.unstripped/filemanagement/file_api
  addr2line -Cfi -e libfs.z.so 00033d4e
  ```
* ‍

### 2.4 GN格式修改

* 所有的BUILD.gn文件需要使用命令格式化一下，才能通过门禁。 命令类似：

  ```c
  ~/OpenHarmony/master/目录下：
  cat kernel/linux/build/test/fuzztest/memory/BUILD.gn | prebuilts/build-tools/linux-x86/bin/gn format --stdin > FORMAT_RESULT.gn;cp -f FORMAT_RESULT.gn kernel/linux/build/test/fuzztest/memory/BUILD.gn;rm FORMAT_RESULT.gn
  cat kernel/linux/build/test/kernel_ltp/kernel_interface_template.gni | prebuilts/build-tools/linux-x86/bin/gn format --stdin > FORMAT_RESULT.gni;cp -f FORMAT_RESULT.gni kernel/linux/build/test/kernel_ltp/kernel_interface_template.gni;rm FORMAT_RESULT.gni
  ```

## 三 VSCode配置

### 3.1 vscode配置

显示空格和Tab

```cpp
打开setting,在搜索框中输入renderControlCharacters,选中勾选框,即可显示tab.
在搜索框中输入renderWhitespace,选择all,即可显示空格.
```

### 3.2 连接服务器

使用Remote SSH[https://zhuanlan.zhihu.com/p/412736012](https://zhuanlan.zhihu.com/p/412736012)

**安装 SSH**

通过安装 Git 来获取 SSH 功能，如何验证？使用 `Win + R + cmd`​，打开控制窗口，直接输入 `ssh`​查看。

**添加插件**

​`Remote - SSH`​安装完插件后，在侧边栏可以看到 “远程资源管理器” 图标。

**配置SSH密钥**

```
1. 生成ssh密钥
ssh-keygen
或：ssh-keygen -t rsa -C "youremail@example.com"

2. 一般生成的密钥文件，路径为：C:\Users\user\.ssh ，
   找到公钥文件 id_rsa.pub ，复制到远程服务器 根目录 的 .ssh 文件夹中。

3. 生成 authorized_keys 文件
cat id_rsa.pub > authorized_keys
```

**添加配置文件**

点击VSCode侧边栏的 “远程资源管理器” 图标，选择 `ssh targets`​ ，点击右上角的小齿轮（设置），打开编辑 config 文件

```
Host <远程主机名称1>
    HostName <远程主机1 IP>
    User <用户名1>
    Port <ssh端口，默认22>
    IdentityFile <本机SSH私钥路径>
    ForwardAgent yes <VSCode 自己添加的，不用管>
```

**连接测试 ​**

```cpp
VScode更新导致断连：
1. 删除服务器中的commitID命名的文件
[17:40:00.032] Log Level: 2
[17:40:00.046] SSH Resolver called for "ssh-remote+sunweifu", attempt 1
[17:40:00.047] "remote.SSH.useLocalServer": true
...   ...   ...
[17:40:00.056] VS Code version: 1.78.2
[17:40:00.056] Remote-SSH version: remote-ssh@0.102.0
[17:40:00.056] win32 x64
[17:40:00.058] SSH Resolver called for host: sunweifu
[17:40:00.059] Setting up SSH remote "sunweifu"
[17:40:00.063] Acquiring local install lock: C:\Users\Feng\AppData\Local\Temp\vscode-remote-ssh-8cfd2c89-install.lock
[17:40:00.064] Looking for existing server data file at c:\Users\Feng\AppData\Roaming\Code\User\globalStorage\ms-vscode-remote.remote-ssh\vscode-ssh-host-8cfd2c89-b3e4e68a0bc097f0ae7907b217c1119af9e03435-0.102.0\data.json
[17:40:00.065] Using commit id "b3e4e68a0bc097f0ae7907b217c1119af9e03435" and quality "stable" for server
[17:40:00.068] Install and start server if needed

2. 关闭所有vscode窗口，重新打开。
```

在终端查找`Using commit id`​并前往服务器~/.vscode-server目录，删除该ID相关的文件

### 3.3 添加扩展

```cpp
GitLens
Git History
GN Language Server
shell-format
C/C++
Draw.io Integration
```

### 3.4 个人设置

[VSCode 修改工作区配色|极客教程 (geek-docs.com)](https://geek-docs.com/vscode/vscode-tutorials/vscode-modifies-workspace-colors.html)

多层级彩色括号，卸载 Bracket-Pair-Colorizer 插件。

```ts
// settings.json
  
  "editor.bracketPairColorization.enabled": true,
  "workbench.colorCustomizations": {
    "editorBracketHighlight.foreground1": "#ffd700",
    "editorBracketHighlight.foreground2": "#da70d6",
    "editorBracketHighlight.foreground3": "#87cefa",
    "editorBracketHighlight.foreground4": "#ffd700",
    "editorBracketHighlight.foreground5": "#da70d6",
    "editorBracketHighlight.foreground6": "#87cefa",
    "editorBracketHighlight.unexpectedBracket.foreground": "#ff0000"
  }
```

### 3.5 配置mingw-w64的gcc、g++编译器和GDB调试器

https://zhuanlan.zhihu.com/p/130711420

## 四 vim安装配置

**安装**

```cpp
sudo apt-get install vim-gtk -y
```

**备份并更新配置**

```cpp
// 把原本的文件备份
sudo cp /etc/vim/vimrc /etc/vim/vimrc.back
//删除vimrc
sudo rm /etc/vim/vimrc
// 新建文件vimrc
sudo vi /etc/vim/vimrc
// 进入文件后按“a",表示插入，接下来把下面的内容复制到这个文件中，按”esc“，表示退出，再输入”wq“+”回车“就保存退出了。
```

**配置文件内容：**

```
au FileType php setlocal dict+=~/.vim/dict/php_funclist.dict
au FileType css setlocal dict+=~/.vim/dict/css.dict
au FileType c setlocal dict+=~/.vim/dict/c.dict
au FileType cpp setlocal dict+=~/.vim/dict/cpp.dict
au FileType scale setlocal dict+=~/.vim/dict/scale.dict
au FileType javascript setlocal dict+=~/.vim/dict/javascript.dict
au FileType html setlocal dict+=~/.vim/dict/javascript.dict
au FileType html setlocal dict+=~/.vim/dict/css.dict

" 显示中文帮助
if version >= 603
        set helplang=cn
        set encoding=utf-8
endif


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新文件标题
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java文件，自动插入文件头 
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.rb,*.java,*.py exec ":call SetTitle()" 
""定义函数SetTitle，自动插入文件头 
func SetTitle() 
    "如果文件类型为.sh文件 
    if &filetype == 'sh' 
        call setline(1,"#!/bin/bash") 
        call append(line("."), "##########################################################################") 
        call append(line(".")+1, "# File Name: ".expand("%")) 
        call append(line(".")+2, "# Author: fengjq") 
        call append(line(".")+3, "# mail: fjq782976686@163.com") 
        call append(line(".")+4, "# Created Time: ".strftime("%c")) 
        call append(line(".")+5, "#########################################################################") 
        call append(line(".")+6, "")
    elseif &filetype == 'py'
        call setline(1,"#!/usr/bin/env python")
        call append(line("."),"# coding=utf-8")
        call append(line(".")+1, "") 
    "elseif &filetype == 'ruby'
    "    call setline(1,"#!/usr/bin/env ruby")
    "    call append(line("."),"# encoding: utf-8")
    "    call append(line(".")+1, "")
    else 
        call setline(1, "/*************************************************************************") 
        call append(line("."), "        > File Name: ".expand("%")) 
        call append(line(".")+1, "        > Author: fengjq") 
        call append(line(".")+2, "        > Mail: fjq782976686@163.com") 
        call append(line(".")+3, "        > Created Time: ".strftime("%c")) 
        call append(line(".")+4, " ************************************************************************/") 
        call append(line(".")+5, "")
    endif

    if expand("%:e") == 'cpp'
        call append(line(".")+6, "#include <iostream>")
        call append(line(".")+7, "using namespace std;")
        call append(line(".")+8, "")
    endif

    if &filetype == 'c'
        call append(line(".")+6, "#include <stdio.h>")
        call append(line(".")+7, "#include <stdlib.h>")
        call append(line(".")+8, "#include <string.h>")
        call append(line(".")+9, "")
    endif

    if expand("%:e") == 'h'
        call append(line(".")+6, "#ifndef _".toupper(expand("%:r"))."_H")
        call append(line(".")+7, "#define _".toupper(expand("%:r"))."_H")
        call append(line(".")+8, "#endif")
    endif

    if &filetype == 'java'
        call append(line(".")+6,"public class ".expand("%:r"))
        call append(line(".")+7,"")
    endif

    "新建文件后，自动定位到文件末尾
    autocmd BufNewFile * normal G
    command WQ wq 
    command Wq wq 
endfunc 

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"键盘命令
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
:nmap <silent> <F9> <ESC>:Tlist<RETURN>
" shift tab pages
map <S-Left> :tabp<CR>
map <S-Right> :tabn<CR>
map! <C-Z> <Esc>zzi
map! <C-O> <C-Y>,
map <C-A> ggVG$"+y
map <Esc><Esc> :w<CR>
map <F12> gg=G
map <C-w> <C-w>w
imap <C-k> <C-y>,
imap <C-t> <C-q><TAB>
imap <C-j> <ESC>
" 选中状态下 Ctrl+c 复制
"map <C-v> "*pa
imap <C-v> <Esc>"*pa
imap <C-a> <Esc>^
imap <C-e> <Esc>$
vmap <C-c> "+y
"set mouse=v
"set clipboard=unnamed
"去注释  
nnoremap <F1> :g/^\s*#/d<CR>
"去空行  
nnoremap <F2> :g/^\s*$/d<CR>
"比较文件  
nnoremap <C-F2> :vert diffsplit 
"nnoremap <Leader>fu :CtrlPFunky<Cr>
"nnoremap <C-n> :CtrlPFunky<Cr>
"列出当前目录文件  
map <F3> :NERDTreeToggle<CR>
imap <F3> <ESC> :NERDTreeToggle<CR>
"打开树状文件目录  
map <C-F3> \be  
:autocmd BufRead,BufNewFile *.dot map <F5> :w<CR>:!dot -Tjpg -o %<.jpg % && eog %<.jpg  <CR><CR> && exec "redr!"
"C，C++ 按F5编译运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
        exec "w"
        if &filetype == 'c'
                exec "!g++ % -o %<"
                exec "!time ./%<"
        elseif &filetype == 'cpp'
                exec "!g++ % -std=c++11 -o %<"
                exec "!time ./%<"
        elseif &filetype == 'java' 
                exec "!javac %" 
                exec "!time java %<"
        elseif &filetype == 'sh'
                :!time bash %
        elseif &filetype == 'python'
                exec "!time python2.7 %"
    elseif &filetype == 'html'
        exec "!firefox % &"
    elseif &filetype == 'go'
"        exec "!go build %<"
        exec "!time go run %"
    elseif &filetype == 'mkd'
        exec "!~/.vim/markdown.pl % > %.html &"
        exec "!firefox %.html &"
        endif
endfunc

"C,C++的调试
map <F8> :call Rungdb()<CR>
func! Rungdb()
        exec "w"
        exec "!g++ % -std=c++11 -g -o %<"
        exec "!gdb ./%<"
endfunc


"代码格式优化化
map <F6> :call FormartSrc()<CR><CR>

"定义FormartSrc()
func FormartSrc()
    exec "w"
    if &filetype == 'c'
        exec "!astyle --style=ansi -a --suffix=none %"
    elseif &filetype == 'cpp' || &filetype == 'hpp'
        exec "r !astyle --style=ansi --one-line=keep-statements -a --suffix=none %> /dev/null 2>&1"
    elseif &filetype == 'perl'
        exec "!astyle --style=gnu --suffix=none %"
    elseif &filetype == 'py'||&filetype == 'python'
        exec "r !autopep8 -i --aggressive %"
    elseif &filetype == 'java'
        exec "!astyle --style=java --suffix=none %"
    elseif &filetype == 'jsp'
        exec "!astyle --style=gnu --suffix=none %"
    elseif &filetype == 'xml'
        exec "!astyle --style=gnu --suffix=none %"
    else
        exec "normal gg=G"
        return
    endif
    exec "e! %"
endfunc


""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"实用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"当打开vim且没有文件时自动打开NERDTree
autocmd vimenter * if !argc() | NERDTree | endif
" 只剩 NERDTree时自动关闭
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif

" quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
" 设置当文件被改动时自动载入
set autoread
" 保存全局变量
" set viminfo+=!
" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
"代码补全 
set completeopt=preview,menu 
"共享剪贴板  
set clipboard=unnamed 
"从不备份  
set nobackup
"make 运行
:set makeprg=g++\ -Wall\ \ %
"自动保存
set autowrite
set ruler                   " 打开状态栏标尺
set cursorline              " 突出显示当前行
set magic                   " 设置魔术
set guioptions-=T           " 隐藏工具栏
set guioptions-=m           " 隐藏菜单栏
" 设置在状态行显示的信息
set foldcolumn=0
set foldmethod=indent 
"set foldmethod=manual   " 手动折叠 
set foldlevel=3 
"set foldenable      " 允许折叠  
" 不要使用vi的键盘模式，而是vim自己的
set nocompatible
" 语法高亮
set syntax=on
" 去掉输入错误的提示声音
set noeb
" 在处理未保存或只读文件的时候，弹出确认
set confirm
" 自动缩进
set autoindent
set cindent
" Tab键的宽度
set tabstop=4            " ts
" 统一缩进为4 
set softtabstop=4
set shiftwidth=4         " sw
" 使用空格代替制表符
set expandtab            " et   " 不替换 noexpandtab
" 在行和段开始处使用制表符
set smarttab             " sm
" 显示行号
set number
" 历史记录数
set history=1000
"禁止生成临时文件
set nobackup
set noswapfile
"搜索忽略大小写
set ignorecase
"搜索逐字符高亮
set hlsearch
set incsearch
"行内替换
set gdefault
"编码设置
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"语言设置
set langmenu=zh_CN.UTF-8
set helplang=cn
" 状态行显示的内容（包括文件类型和解码）
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
" 启动显示状态行(1),总是显示状态行(2)
set laststatus=2
" 命令行（在状态行下）的高度，默认为1，这里是2
set cmdheight=2
" 侦测文件类型
filetype on
" 载入文件类型插件
filetype plugin on
" 为特定文件类型载入相关缩进文件
filetype indent on
" 保存全局变量
set viminfo+=!
" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
" 字符间插入的像素行数目
set linespace=0
" 增强模式中的命令行自动完成操作
set wildmenu
" 使回格键（backspace）正常处理indent, eol, start等
set backspace=2
" 允许backspace和光标键跨越行边界
set whichwrap+=<,>,h,l
" 可以在buffer的任何地方使用鼠标（类似office中在工作区双击鼠标定位）
set mouse=a
set selection=exclusive
set selectmode=mouse,key
" 通过使用: commands命令，告诉我们文件的哪一行被改变过
set report=0
" 在被分割的窗口间显示空白，便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\
" 高亮显示匹配的括号
set showmatch
" 匹配括号高亮的时间（单位是十分之一秒）
set matchtime=1
" 光标移动到buffer的顶部和底部时保持3行距离
set scrolloff=3
" 为C程序提供自动缩进
set smartindent
" 高亮显示普通txt文件（需要txt.vim脚本）
 au BufRead,BufNewFile *  setfiletype txt
"自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
":inoremap { {<CR>}<ESC>O
":inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
    if getline('.')[col('.') - 1] == a:char
        return "\<Right>"
    else
        return a:char
    endif
endfunction

```

‍

五 clangd

设置：

```json
{
    "C_Cpp.errorSquiggles": "enabled",
    "C_Cpp.default.intelliSenseMode": "linux-gcc-arm",
    "C_Cpp.intelliSenseEngine": "Disabled",
    // clangd
    "clangd.path": "/home/fengjq/.vscode-server/data/User/globalStorage/llvm-vs-code-extensions.vscode-clangd/install/16.0.2/clangd_16.0.2/bin/clangd", // 直接使用环境变量 // "/usr/bin/clangd"
    // Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)
    "clangd.arguments": [
        "--all-scopes-completion",
        "--background-index",
        "--clang-tidy",
        "--clang-tidy-checks=performance-*, bugprone-*, misc-*, google-*, modernize-*, readability-*, portability-*",
        "--compile-commands-dir=${workspaceFolder}/build/",
        "--completion-parse=auto",
        "--completion-style=detailed",
        "--enable-config",
        "--fallback-style=Google",
        "--function-arg-placeholders=true",
        "--header-insertion-decorators",
        "--header-insertion=iwyu",
        "--include-cleaner-stdlib",
        "--log=verbose",
        "--pch-storage=memory",
        "--pretty",
        "--ranking-model=decision_forest",
        "-j=12"
    ],
    // Clangd 找不到编译数据库(例如 compile_flags.json 文件)时采用的设置,缺陷是不能直接索引同一项目的不同文件,只能分析系统头文件、当前文件和include的文件
    "clangd.fallbackFlags": [
        "-std=c++17",
        "-I${workspaceFolder}/src/includes",
        "--target=x86_64-linux-gnu"
    ],
    "clangd.onConfigChanged": "restart", // 重启 clangd 时重载配置,具体方法: F1 + Fn 打开命令面板，然后搜索“clangd: restart”
    "clangd.serverCompletionRanking": true, // 借助网上的信息排序建议
    "clangd.detectExtensionConflicts": true, // 当其它拓展与 clangd 冲突时警告并建议禁用
    "editor.suggest.snippetsPreventQuickSuggestions": true,
    "clangd.checkUpdates": false,
    "merge-conflict.autoNavigateNextConflict.enabled": true,
    "gnuGlobal.encoding": "",
    "C_Cpp.codeAnalysis.clangTidy.enabled": true, // clangd的snippets有很多的跳转点，不用这个就必须手动触发Intellisense了
  }

```