DEV Community

shuai991102
shuai991102

Posted on

OpenHarmony环境搭建代码拉取

OH 环境搭建

一 Ubuntu安装

1.1 WSL安装

1.2 依赖安装

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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/
Enter fullscreen mode Exit fullscreen mode

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"

Enter fullscreen mode Exit fullscreen mode

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 # 编译
Enter fullscreen mode Exit fullscreen mode

二 代码下载和编译

2.1 代码下载

  1. master代码下载

    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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

2.3 代码编译

  • 全量编译
  ./build.sh --product-name rk3568 --ccache
  ./build.sh --product-name rk3568 --ccache -j16

Enter fullscreen mode Exit fullscreen mode
  • 测试用例编译
  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
Enter fullscreen mode Exit fullscreen mode
  • 子系统下单模块编译
  文件管理子系统单个部件编译:
  ./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
Enter fullscreen mode Exit fullscreen mode
  • 反编译
  cd OpenHarmony/master/out/rk3568/lib.unstripped/filemanagement/file_api
  addr2line -Cfi -e libfs.z.so 00033d4e
Enter fullscreen mode Exit fullscreen mode

2.4 GN格式修改

  • 所有的BUILD.gn文件需要使用命令格式化一下,才能通过门禁。 命令类似:
  ~/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
Enter fullscreen mode Exit fullscreen mode

三 VSCode配置

3.1 vscode配置

显示空格和Tab

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

3.2 连接服务器

使用Remote SSHhttps://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
Enter fullscreen mode Exit fullscreen mode

添加配置文件

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

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

连接测试 ​

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窗口,重新打开。
Enter fullscreen mode Exit fullscreen mode

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

3.3 添加扩展

GitLens
Git History
GN Language Server
shell-format
C/C++
Draw.io Integration
Enter fullscreen mode Exit fullscreen mode

3.4 个人设置

VSCode 修改工作区配色|极客教程 (geek-docs.com)

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

// 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"
  }
Enter fullscreen mode Exit fullscreen mode

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

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

四 vim安装配置

安装

sudo apt-get install vim-gtk -y
Enter fullscreen mode Exit fullscreen mode

备份并更新配置

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

配置文件内容:

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

Enter fullscreen mode Exit fullscreen mode

五 clangd

设置:

{
    "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了
  }

Enter fullscreen mode Exit fullscreen mode

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay