前言:工欲善其事必先利其器,vim作为开发利器,是服务端编程必不可少的武器。这篇博文原载于:https://github.com/whuwzp/vim_config,开启vim之旅吧。
.vim
文件的压缩包,以免以后换环境时都得下载, 使用时直接解压至~/.vim
.vimrc
, .clang-format
, .ycm_extra_conf.py
等配置文件, 地址: https://github.com/whuwzp/vim_config参考网址: https://github.com/ycm-core/YouCompleteMe/wiki/Building-Vim-from-source
安装各类依赖库
sudo apt install libncurses5-dev libgnome2-dev libgnomeui-dev \
libgtk2.0-dev libatk1.0-dev libbonoboui2-dev \
libcairo2-dev libx11-dev libxpm-dev libxt-dev python-dev \
python3-dev ruby-dev lua5.1 liblua5.1-dev libperl-dev git
下载最新版vim并编译
git clone [email protected]:vim/vim.git
cd vim/
./configure --with-features=huge \
--enable-multibyte \
--enable-rubyinterp=yes \
--enable-python3interp=yes \
--with-python3-config-dir=/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu \
--enable-perlinterp=yes \
--enable-luainterp=yes \
--enable-gui=gtk2 \
--enable-cscope \
--enable-multibyte \
--prefix=/usr/local
make
make install
检测
vim --version
# 截至20200301, 此方法最新版是8.2
注意:
with-python3-config-dir
: 这个的查看方式是: 命令行python --version
, 我的是3.6, 所以就在/usr/lib/python3.6/
中去找类似config-3.6m-x86_64-linux-gnu
这样名字的文件夹, 总之就是确保: python3版本和路径一致, 路径正确.参考网址: https://llvhttps://m.org/docs/GettingStarted.html#getting-started-with-llvm
安装准备环境
# clang的编译需要gcc等
sudo apt install gcc
sudo apt install g++
sudo apt install make
sudo apt install cmake
下载并编译
git clone https://github.com/llvm/llvm-project.git
cd llvm-project
mkdir build
cd build
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ../llvm -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi;compiler-rt;clang-tools-extra;openmp;lldb;lld"
make -j2
make install
测试
clang --version
# 截至20200301最新版是11.0
注意:
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ../llvm
: 这一步不要改动DLLVM_ENABLE_PROJECTS
: 这里面选择要安装的选项, 分号分隔, 参看网址选择, 一般都选clang;libcxx;libcxxabi;compiler-rt;clang-tools-extra
, 我怕后期又要装啥麻烦, 就又选了lldb(调试), lld(链接优化)参考网址: https://github.com/ycm-core/YouCompleteMe#linux-64-bit
建议不要用这个博客的方法: https://github.com/yangyangwithgnu/use_vim_as_ide
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
# 在 ~/.vimrc 增加相关配置信息
" vundle 环境设置
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
" vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'ycm-core/YouCompleteMe'
" 插件列表结束
call vundle#end()
filetype plugin indent on
:PluginInstall
, 下载YouCompleteMe# 依赖项
sudo apt install build-essential cmake python3-dev
cd ~/.vim/bundle/YouCompleteMe
# 如果要选择其他语言支持可以选, 参考网址里有
python install.py --clang-completer
.ycm_extra_conf.py
,我们只需要改flags中头文件的目录即可,内容如下(此内容参考https://github.com/yangyangwithgnu/use_vim_as_ide):import os
import ycm_core
flags = [
'-std=c++11',
'-O0',
'-Werror',
'-Weverything',
'-Wno-documentation',
'-Wno-deprecated-declarations',
'-Wno-disabled-macro-expansion',
'-Wno-float-equal',
'-Wno-c++98-compat',
'-Wno-c++98-compat-pedantic',
'-Wno-global-constructors',
'-Wno-exit-time-destructors',
'-Wno-missing-prototypes',
'-Wno-padded',
'-Wno-old-style-cast',
'-Wno-weak-vtables',
'-x',
'c++',
'-I',
'.',
'-isystem',
'/usr/local/include/c++/v1/',
'-isystem',
'/usr/include/',
'-isystem',
'/usr/',
'-isystem',
'/usr/include/x86_64-linux-gnu/',
]
compilation_database_folder = ''
if compilation_database_folder:
database = ycm_core.CompilationDatabase( compilation_database_folder )
else:
database = None
SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ]
def DirectoryOfThisScript():
return os.path.dirname( os.path.abspath( __file__ ) )
def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
if not working_directory:
return list( flags )
new_flags = []
make_next_absolute = False
path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
for flag in flags:
new_flag = flag
if make_next_absolute:
make_next_absolute = False
if not flag.startswith( '/' ):
new_flag = os.path.join( working_directory, flag )
for path_flag in path_flags:
if flag == path_flag:
make_next_absolute = True
break
if flag.startswith( path_flag ):
path = flag[ len( path_flag ): ]
new_flag = path_flag + os.path.join( working_directory, path )
break
if new_flag:
new_flags.append( new_flag )
return new_flags
def IsHeaderFile( filename ):
extension = os.path.splitext( filename )[ 1 ]
return extension in [ '.h', '.hxx', '.hpp', '.hh' ]
def GetCompilationInfoForFile( filename ):
if IsHeaderFile( filename ):
basename = os.path.splitext( filename )[ 0 ]
for extension in SOURCE_EXTENSIONS:
replacement_file = basename + extension
if os.path.exists( replacement_file ):
compilation_info = database.GetCompilationInfoForFile( replacement_file )
if compilation_info.compiler_flags_:
return compilation_info
return None
return database.GetCompilationInfoForFile( filename )
def FlagsForFile( filename, **kwargs ):
if database:
compilation_info = GetCompilationInfoForFile( filename )
if not compilation_info:
return None
final_flags = MakeRelativePathsInFlagsAbsolute(
compilation_info.compiler_flags_,
compilation_info.compiler_working_dir_ )
else:
relative_to = DirectoryOfThisScript()
final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )
return {
'flags': final_flags,
'do_cache': True
}
这个在 https://github.com/whuwzp/vim_config 中有保存注意:
.ycm_extra_conf.py
中的头文件添加方法: 我安装clang是用默认的路径/usr/local
,所以增加了'-isystem', '/usr/local/include/c++/v1/'
'-isystem','/usr/include/'
: 这个是系统头文件'-isystem','/usr/'
: 这也是系统的'-isystem','/usr/include/x86_64-linux-gnu/'
:这个是linux的.ycm_extra_conf.py
中, 例如sys/socket.h
没有自动补全,百度发现在/usr/include/x86_64-linux-gnu/
中, 然后在添加'-isystem','/usr/include/x86_64-linux-gnu/'
即可~/.vim/bundle/youcompleteme
目录下,install,具体如下:# 如果不执行这一步,下一步就报错
git submodule update --init --recursive
# 然后install
sudo ./install.sh --clang-completer
# 如果上一步报错缺少regex或者cregex,那就是git submodule update --init --recursive没有完全下载,那就去目录下找,例如我的是regex,到youcompleteme的github下找到了thrid/ycmd/third/regex,然后发现子项目的地址https://github.com/ycm-core/regex.git,然后自己git clone下来,手动拷贝到那个目录就好,例如git clone https://github.com/ycm-core/regex.git
解压到一个目录
tar -zxvf boost_1_66_0.tar.gz
1、正常编译:
进入boost_1_66_0目录中
cd boost_1_66_0
./bootstrap.sh --with-libraries=all --with-toolset=gcc
--with-liraries:需要编译的库
--with-toolset:编译时使用的编译器
安装boost库
./b2 install --prefix=/usr
主要是c++相关的. ~/.vimrc
文件在GitHub上有:https://github.com/whuwzp/vim_config
以下内容参考: https://github.com/yangyangwithgnu/use_vim_as_ide
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
在 .vimrc 增加相关配置信息
" vundle 环境设置
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
" vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'dyng/ctrlsf.vim'
" 插件列表结束
call vundle#end()
filetype plugin indent on
其中,每项Plugin 'dyng/ctrlsf.vim'
,对应一个插件(这与 go 语言管理不同代码库的机制类似),后续若有新增插件,只需追加至该列表中即可。
安装插件:
先找到其在 github.com 的地址,再将配置信息其加入 .vimrc 中的call vundle#begin() 和 call vundle#end() 之间,如Plugin 'dyng/ctrlsf.vim'
, 最后进入 vim 执行:PluginInstall
删除插件
要卸载插件,先在 .vimrc 中注释或者删除对应插件配置信息,然后在 vim 中执行::PluginClean
即可删除对应插件。
更新插件
更新频率较高,差不多每隔一个月你应该看看哪些插件有推出新版本,批量更新,只需执行:PluginUpdate
。
Plugin 'Valloric/YouCompleteMe'
Plugin 'derekwyatt/vim-protodef'
Plugin 'SirVer/ultisnips'
安装参见上面. 以下是配置:
" Youcompleteme 语义补全
" 菜单
highlight Pmenu ctermfg=2 ctermbg=3 guifg=#005f87 guibg=#EEE8D5
" 选中项
highlight PmenuSel ctermfg=2 ctermbg=3 guifg=#AFD700 guibg=#106900
" 补全功能在注释中同样有效
let g:ycm_complete_in_comments=1
" 允许 vim 加载 .ycm_extra_conf.py 文件,不再提示
let g:ycm_confirm_extra_conf=0
" 开启 YCM 标签补全引擎
let g:ycm_collect_identifiers_from_tags_files=1
" 引入 C++ 标准库tags
" set tags+=/usr/include/c++/7/stdcpp.tags, 我只使用clang中的就好
set tags+=/usr/local/include/c++/v1/clang.tags
" set tags+=/usr/include/sys.tags,这个太大了了
" YCM 集成 OmniCppComplete 补全引擎,设置其快捷键
inoremap ;
" 补全内容不以分割子窗口形式出现,只显示补全列表
set completeopt-=preview
" 从第一个键入字符就开始罗列匹配项
let g:ycm_min_num_of_chars_for_completion=1
" 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_cache_omnifunc=0
" 语法关键字补全
let g:ycm_seed_identifiers_with_syntax=1
let OmniCpp_DefaultNamespaces = ["_GLIBCXX_STD"]
" 设置用于关闭补全列表的快捷键,默认为ctrl+y, 改为了;'
let g:ycm_key_list_stop_completion = ["'"]
配置
在h中声明,然后cpp中用插件帮我们生成实现函数的壳子.
Plugin 'derekwyatt/vim-fswitch'
Plugin 'derekwyatt/vim-protodef'
" 设置 pullproto.pl 脚本路径
" 原博客是这个,但是我的路径是vim-protodef,所以改了
" let g:protodefprotogetter='~/.vim/bundle/protodef/pullproto.pl'
let g:protodefprotogetter='~/.vim/bundle/vim-protodef/pullproto.pl'
" 成员函数的实现顺序与声明顺序一致
let g:disable_protodef_sorting=1
使用示例:
class MyClass
{
public:
void printMsg (int = 16);
virtual int getSize (void) const;
virtual void doNothing (void) const = 0;
virtual ~MyClass ();
private:
int num_;
};
;P
即可生成如下内容:int MyClass::getSize(void) const
{
return 0;
}
void MyClass::youprint(int)
{
}
MyClass::~MyClass()
{
}
使用
在h中定义class,然后新建同名cpp, 用快捷键
,我的是;PP
生成对应cpp内容.
配置
" SirVer/ultisnips 模板补全
" mysnippets默认路径: ~/.vim/bundle/ultisnips/mysnippets/cpp.snippets
let g:UltiSnipsSnippetDirectories=["~/.mysnippets"]
" UltiSnips 的 tab 键与 YCM 冲突,重新设定
let g:UltiSnipsExpandTrigger=""
let g:UltiSnipsJumpForwardTrigger=""
let g:UltiSnipsJumpBackwardTrigger=""
注意: 编辑~/.mysnippets/cpp.snippets
可以修改模板,改到这个位置,相当于程序和配置分离,这样可以方便推送到GitHub上保存,换个环境也可以直接用了
使用
按照博客设置即可, 按;
就可以, 再按一次就可以跳到下一个位置, 例如if(1){2}.
按照该博客的设置,有如下快捷:
INC
: #include""inc
: #include<>if
: if语句ei
: else if语句el
: else 语句re
: returndo
: do while语句wh
: while语句sw
: switch语句for
: for语句(大小写for组合出多种场景,试试)
: try catchset
map
lst
vec
: 试试就知道了,对应容器的cl
: classb
: ()st
: []br
: {}q
: “”se
: ‘’ar
: ->, 这个是arrow剩下的感觉效果不大这里不记了.
注意:snippet b "bracket" I
这里的I表示只有遇到整词b才会补全,printfb这样的就不会, 如果改成i就会遇到b字符就补全
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'tomasr/molokai'
配置
let g:airline#extensions#tabline#enabled = 1
let g:airline_theme='molokai'
配置
set background=dark
set t_Co=256
colorscheme molokai
Plugin 'octol/vim-cpp-enhanced-highlight'
Plugin 'nathanaelkane/vim-indent-guides'
Plugin 'crooloose/nerdcommenter'
Plugin 'vim-clang-format'
" vim-cpp-enhanced-highlight cpp语法高亮
let g:cpp_class_scope_highlight = 1
let g:cpp_member_variable_highlight = 1
let g:cpp_class_decl_highlight = 1
let g:cpp_posix_standard = 1
let g:cpp_concepts_highlight = 1
let g:cpp_no_function_highlight = 1
let g:cpp_experimental_simple_template_highlight = 1
syntax keyword cppSTLtype initializer_list
注意: 需要确保以下内容:
" 开启文件类型侦测 filetype on " 根据侦测到的不同类型加载对应的插件 filetype plugin on
" vim-indent-guides 缩进显示
let g:indent_guides_enable_on_vim_startup=1
" 从第二层开始可视化显示缩进
let g:indent_guides_start_level=2
" 色块宽度
let g:indent_guides_guide_size=1
" 快捷键 i 开/关缩进可视化
nmap i IndentGuidesToggle
"clang-format 代码风格格式化
" map to cf in C++ code
" 可以在~/.clang-format中编辑更加详细的设置
set ts=4
" 退出insert模式时自动格式化, 如果加了这个那么ultisnip插件就会受影响,因为模板补全后会由insert变为select,这样会同时触发clang-format和ultisnip
" let g:clang_format#auto_format_on_insert_leave=1
autocmd FileType c,cpp,objc nnoremap cf :ClangFormat
autocmd FileType c,cpp,objc vnoremap cf :ClangFormat
注意:
apt install clang-format
~/.clang-format
具体配置格式, 参考文件保存在: https://github.com/whuwzp/vim_config" 默认cc, cu
Plugin 'dyng/ctrlsf.vim'
Plugin 'mileszs/ack.vim'
Plugin 'yegappan/grep'
Plugin 'terryma/vim-multiple-cursors'
Plugin 'Yggdroot/LeaderF'
" vim-multiple-cursors 选中多选
" 默认是ctrl+N,这里不修改
" let g:multi_cursor_next_key=''
" let g:multi_cursor_skip_key=''
我想将 prtHelpInfo() 集体更名为 showHelpInfo(),先通过 ctrlsf 找到工程中所有 prtHelpInfo,然后直接在 ctrlsf 子窗口中选中第一个 ptr,再通过 vim-multiple-cursors 选中第二个 ptr(在子窗口按CTRL+n
选中下一个),然后ESC, insert, 进入编辑模式, 接着统一删除 ptr 并统一键入 show,最后保存并重新加载替换后的文件(:wq, Y, L)。
" ctrlsf.vim 搜索
" 插件在工程内全局查找光标所在关键字,设置快捷键。快捷键速记法:search in project
noremap sp :CtrlSF
注意: 需要安装grep-ack工具
sudo apt install grep-ack
" ctags标签书签相关
Plugin 'majutsushi/tagbar'
Plugin 'vim-scripts/indexer.tar.gz'
Plugin 'vim-scripts/DfrankUtil'
Plugin 'vim-scripts/vimprj'
Plugin 'kshenoy/vim-signature'
Plugin 'ludovicchabant/vim-gutentags'
Plugin 'skywind3000/gutentags_plus'
注意:需要安装ctags, sudo apt install ctags
原理是在工程目录下生成名为tags的文件,根据该文件跳转。
sudo apt install ctags
cd /data/workplace/example/
ctags -R --c++-kinds=+p+l+x+c+d+e+f+g+m+n+s+t+u+v --fields=+liaS --extra=+q --language-force=c++
这个命令就是生成tags文件,还有很多,参照:https://blog.csdn.net/foreverling/article/details/80329586:set tags+=/data/workplace/example/tags
以下是为tn和tp设置的快捷键:
" 正向遍历同名标签
nmap tn :tnext
" 反向遍历同名标签
nmap tp :tprevious
用这个就不用手动生成更新tags文件了.
" 修改ctags生成tags文件的参数
let g:indexer_ctagsCommandLineOptions="--c++-kinds=+p+l+x+c+d+e+f+g+m+n+s+t+u+v --fields=+iaSl --extra=+q"
注意: indexer 还要自己的配置文件,用于设定各个工程的根目录路径,配置文件位于 ~/.indexer_files
,内容可以设定为:
--------------- ~/.indexer_files --------------- [foo] /data/workplace/foo/src/ [bar] /data/workplace/bar/src/
只有添加了目录才会自动生成更新tags文件(buffer中的估计是,没有落地成文件).
注意: 必须用全路径,万万不要用~/test/
,要用/home/username/test/
" tagbar 标签窗口
" 设置 tagbar 子窗口的位置出现在主编辑区的左边
let tagbar_left=1
" 设置显示/隐藏标签列表子窗口的快捷键。速记:tag bar
nnoremap tb :TagbarToggle
" 设置标签子窗口的宽度
let tagbar_width=16
" tagbar 子窗口中不显示冗余帮助信息
let g:tagbar_compact=1
" 自动设置焦点在tagbar
let g:tagbar_autofocus = 1
" 设置自动打开tagbar
" autocmd BufReadPost *.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen()
za,zr,zm和之前的折叠展开一样, 快捷键如下, 参照: http://aiezu.com/article/linux_vim_golang_tagbar_nerdtree.html
常用命令
" vim-signature 收藏书签
let g:SignatureMap = {
\ 'Leader' : "m",
\ 'PlaceNextMark' : "m,",
\ 'ToggleMarkAtLine' : "m.",
\ 'PurgeMarksAtLine' : "m-",
\ 'DeleteMark' : "dm",
\ 'PurgeMarks' : "mda",
\ 'PurgeMarkers' : "m",
\ 'GotoNextLineAlpha' : "']",
\ 'GotoPrevLineAlpha' : "'[",
\ 'GotoNextSpotAlpha' : "`]",
\ 'GotoPrevSpotAlpha' : "`[",
\ 'GotoNextLineByPos' : "]'",
\ 'GotoPrevLineByPos' : "['",
\ 'GotoNextSpotByPos' : "mn",
\ 'GotoPrevSpotByPos' : "mp",
\ 'GotoNextMarker' : "[+",
\ 'GotoPrevMarker' : "[-",
\ 'GotoNextMarkerAny' : "]=",
\ 'GotoPrevMarkerAny' : "[=",
\ 'ListLocalMarks' : "ms",
\ 'ListLocalMarkers' : "m?"
\ }
常用命令:
注意: 由于leaderf在一个目录查找后就会把那个目录当作当前默认目录,所以一旦在其他目录查找了, 就很难切回来, 改进的是:这里的
%:h
是表示当前文件的目录路径
" 在当前目录查找
nnoremap fl :LeaderfFile %:h
" 在当前用户目录查找
nnoremap fu :LeaderfFile ~
" 自定义查找位置, 可以输入../之类的
nnoremap fc :LeaderfFile
" don't show the help in normal mode
let g:Lf_HideHelp = 1
let g:Lf_UseCache = 0
let g:Lf_UseVersionControlTool = 0
let g:Lf_IgnoreCurrentBufferName = 1
" popup mode
let g:Lf_WindowPosition = 'popup'
let g:Lf_PreviewInPopup = 1
let g:Lf_StlSeparator = { 'left': "\ue0b0", 'right': "\ue0b2", 'font': "DejaVu Sans Mono for Powerline" }
let g:Lf_PreviewResult = {'Function': 0, 'BufTag': 0 }
let g:Lf_CommandMap = {'': [''], '': ['']}
" 排除文件
let g:Lf_WildIgnore = {
\ 'dir': ['.svn','.git'],
\ 'file': ['*.bak','*.a','*.o','*.so']
\}
;f
: 查找文件;b
: 查找bufferPlugin 'gcmt/wildfire.vim'
Plugin 'tpope/vim-surround'
" 快捷键
map (wildfire-fuel)
vmap (wildfire-water)
" 适用于哪些结对符
let g:wildfire_objects = [“i’”, ‘i"’, “i)”, “i]”, “i}”, “ip”, “it”]
我只需按下空格(normal模式下),自动选中光标所在区域最近的一层结对符内的文本,如果没有结对符,则选择最近的一个段落。
使用:
:在normal模式下(因为是nmap)空格,选中第一层,多按几次就选上一层;
:取消选中(原博客是),但是估计是shift+space这个快捷键被占用了vmap " S"
vmap ' S'
vmap ` S`
vmap [ S[
vmap ( S(
vmap { S{
vmap } S}
vmap ] S]
vmap ) S)
vmap > S>
选中内容,然后按自己想要的结对符即可.
Plugin ‘derekwyatt/vim-fswitch’
Plugin ‘scrooloose/nerdtree’
" *.cpp 和 *.h 间切换
nmap sw :FSHere
初始状态先打开了接口文件 MyClass.h,键入 ;sw 后,vim 在新 buffer 中打开实现文件 MyClass.cpp,并在当前窗口中显示;再次键入 ;sw 后,当前窗口切回接口文件。
介于LeaderF功能和展示都比较方便好, 已经不再使用nerdtree, 用LeaderF代替, nerdtree的一大缺点是占用了buffer,给buffer切换带来麻烦.
Plugin 'scrooloose/nerdtree'
" 使用 NERDTree 插件查看工程文件。设置快捷键,速记:file list
nmap fl :NERDTreeToggle
" 以下是新加的,在nerdtree github说明中找到的,设置成vim启动自动打开列表
autocmd vimenter * NERDTree
常用命令:
键入 fl 后,右边子窗口为工程项目文件列表,其他使用如下:
w
: 正向移动到相邻单词的首字符b
: 逆向移动到相邻单词的首字符e
: 正向移动到相邻单词的尾字符ge
: 逆向移动到相邻单词的尾字符fa
: 正向移动到第一个字符 a 处Fa
: 逆向移动到第一个字符 a 处8w
: 正向移动到相隔八个单词的首字符执行4Fa
: 逆向移动到第四个 a 字符处0
: 行尾$
: 行首gg
: 跳转到文件头Shift+g
: 跳转到文件末尾u
: 撤销上一步的操作Ctrl+r
: 恢复上一步被撤销的操作CTRL+s
: 锁死Ctrl+Q
: 来解除锁死CTRL+w即可, 上述的tagbar和搜索的窗口相互切换.
;wh
: 向左切换窗口;wj
: 向下切换窗口;wk
: 向上切换窗口;wl
: 向右切换窗口" 基于缩进或语法进行代码折叠
"set foldmethod=indent
set foldmethod=syntax
" 启动 vim 时关闭折叠代码
set nofoldenable
操作:za,打开或关闭当前折叠;zm,关闭所有折叠;zr,打开所有折叠。
gd
: 高亮显示所有相同的单词shift + "*"
: 向下查找相同单词并高亮显示shift + "#"
: 向上查找相同单词并高亮显示:noh
: 命令行模式下输出:“noh” 命令取消高亮显示" 取消高亮单词
nnoremap no :noh
:3,5s/my/your/[flags]
:
, 之后系统默认变为:'<,'>
,所以我们只需要再输入:s/my/your/[flags]
:args **/.cpp **/.h
告知 vim 范围,再执行替换.请确保你的 vim 支持这两个特性:
vim --version | grep mksession
vim --version | grep viminfo
" 设置环境保存项
set sessionoptions="blank,buffers,globals,localoptions,tabpages,sesdir,folds,help,options,resize,winpos,winsize"
" 保存 undo 历史
set undodir=~/.undo_history/
set undofile
" 保存快捷键
map ss :mksession! my.vim :wviminfo! my.viminfo
" 恢复快捷键
map rs :source my.vim :rviminfo my.viminfo
使用:
;ss
: 保护环境;rs
: 还原环境;m
,即make删除main程序,重新编译.
nmap make :!rm -rf main:wa:make:cw
CMakeLists.txt文件内容, 编译选项详见: https://www.jianshu.com/p/cbd1f2e52542
PROJECT(main)
SET(SRC_LIST server.cpp)
SET(CMAKE_CXX_COMPILER "clang++")
SET(CMAKE_CXX_FLAGS "-std=c++11 -stdlib=libc++ -Werror -Weverything -Wno-deprecated-declarations -Wno-disabled-macro-expansion -Wno-float-equal -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-global-constructors -Wno-exit-time-destructors -Wno-missing-prototypes -Wno-padded -Wno-old-style-cast -Wno-unreachable-code")
SET(CMAKE_EXE_LINKER_FLAGS "-lc++ -lc++abi")
SET(CMAKE_BUILD_TYPE Debug)
ADD_EXECUTABLE(server ${SRC_LIST})
摘自链接:https://blog.csdn.net/Liu_jalon/article/details/88657513
我们经常会遇到再linux vim编辑器中复制粘贴代码时出现格式错乱的问题,这会影响我们工作的效率,下面介绍一种解决这种问题的办法:
运行如下命令,进入 paste 模式::set paste
进入 paste 模式后,按 i 键进入插入模式,然后再粘帖,文本格式不会错乱了。但粘帖后还需要按 进入普通模式并执行如下命令结束 paste 模式::set nopaste
。
" 设置纯文本复制粘贴
map :set pastei
map :set nopaste
vimrc中增加以下:
" 设置快捷键将选中文本块复制至系统剪贴板
vnoremap y "+y
" 设置快捷键将系统剪贴板内容粘贴至 vim
nmap p "+p
以下摘自:https://blog.csdn.net/u014104588/article/details/81071479
引发问题出现的原因是~/.viminfo拥有者为root,因此执行以下命令将~/.viminfo拥有者更改为当前用户。
# 把username改为自己的用户名
sudo chown username ~/.viminfo
安装
以下直接摘自博客:
要使用该功能,系统中必须先安装对应 man。安装 linux 系统函数 man,先下载(https://www.kernel.org/doc/man-pages/download.html ),解压后将 man1/ 至 man8/ 拷贝至 /usr/share/man/,运行 man fork 确认是否安装成功。安装 C++ 标准库 man,先下载(ftp://GCC.gnu.org/pub/GCC/libstdc++/doxygen/ ),选择最新 libstdc+±api-X.X.X.man.tar.bz2,解压后将 man3/ 拷贝至 /usr/share/man/,运行 man std::vector 确认是否安装成功.
https://www.cnblogs.com/lymboy/p/8143569.html, 中直接找到了IP,以免解析不了, http://216.165.129.141/pub/sourceware.org/libstdc++/doxygen/
使用
:Man fork
: 手动输入;man
: 光标所在单词将被传递给 :Man 命令,不用再手工键入.