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
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 代码下载
-
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
编译问题三板斧:(前提条件:确保代码同步了最新,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 代码编译
- 全量编译
./build.sh --product-name rk3568 --ccache
./build.sh --product-name rk3568 --ccache -j16
- 测试用例编译
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文件需要使用命令格式化一下,才能通过门禁。 命令类似:
~/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
打开setting,在搜索框中输入renderControlCharacters,选中勾选框,即可显示tab.
在搜索框中输入renderWhitespace,选择all,即可显示空格.
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
添加配置文件
点击VSCode侧边栏的 “远程资源管理器” 图标,选择 ssh targets
,点击右上角的小齿轮(设置),打开编辑 config 文件
Host <远程主机名称1>
HostName <远程主机1 IP>
User <用户名1>
Port <ssh端口,默认22>
IdentityFile <本机SSH私钥路径>
ForwardAgent yes <VSCode 自己添加的,不用管>
连接测试
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 添加扩展
GitLens
Git History
GN Language Server
shell-format
C/C++
Draw.io Integration
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"
}
3.5 配置mingw-w64的gcc、g++编译器和GDB调试器
https://zhuanlan.zhihu.com/p/130711420
四 vim安装配置
安装
sudo apt-get install vim-gtk -y
备份并更新配置
// 把原本的文件备份
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
设置:
{
"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了
}
Top comments (0)