
个人主页:小则又沐风
个人专栏:<数据结构>
<竞赛专栏>
<Linux>
座右铭
路虽远,行则将至;事虽难,做则必成
目录
前言:
在之前的文章中我们简单的了解了Linux的指令和有关权限的知识,有了基本的指令作为我们的基础我们就来认识一下Linux的开发工具
今天我们先来了解其中的两个就是yum和vim
yum
我们先来了解一下在Linux下载软件的方式有什么
- 源码下载
软件作者写的 原始代码文件 → 你下载 → 自己编译成可执行程序 → 安装到系统。
这样就是相当于买来的乐高需要你自己来把他组装起来,这样的下载的方式是很困难的
2.软件包的安装
这个安装的方式就是把我们需要下载的东西的自己拷贝到自己的机器上
但是这种的方式麻烦的是一个软件的成功的运行不仅仅需要一个目标的文件,他还有许多的附属文件,还是那个例子在pcl上下载一个模组往往不仅仅是需要下载那个目标的模组.更糟糕的是你自己下载的文件的版本还得是兼容的
在这样的情况下就很容易造成我们在拷贝的时候漏掉一些文件,或者就是版本不同运行不起来
那么这时候就有人问了 有没有一种像应用商店一样的东东把目标文件和附属文件打包到一起直接下载的
有的有的
上面说的下载方式就是我们今天的第一个开发工具就是包管理器
什么是包管理器
包管理器就是我们机器自己佩戴的
包管理器 = Linux 的应用商店 + 软件管家

是不是有一点懂了
下面我们来看看我的机器上的
下载
首先要想用这个东西必须有root的权限 因为这个是直接下载到根目录上的
一个系统下载了一遍所有的用户都能使用(所以你的账户必须有sudo的权限)
sudo yum install 目标的软件
卸载
sudo yum remve [-y] 目标软件
需要注意的是在用这个下载软件的时候我们需要保持联网
vim

vim就是用来编辑文本的高级的工具
下面我们来了解一下这个工具
首先我们vim + 文件
当这个文件存在的时候我们就会进入到这个文件的内容中去
当这个文件不存在的时候我们会创建一个这个文件随后进入到这个文件中

这时候我们来用vim进入到这个文件中去

我们就可以看到这个文件的内容了
下面我们来验证一下这个vim会创建文件

毋庸置疑的是可以创建文件的
那么怎么编辑我们的文件呢?
首先我们需要了解是vim的模式
我们在进入到我们的vim中的时候我们会看到

这里就是代表我们现在处于的模式
在默认处于的是命令的模式
那么在这个模式下我们需要知道的是怎么来移动光标
命令模式下移动光标
- h向左移动光标
- j向下移动光标
- k向上移动光标
- l向右移动光标
- G是直接移动光标到文章的末尾(不是最后一个字符而是最后一行的开头)
- $移动到当前行的末尾
- ^移动到当前行的开头
- gg是移动到开头
- n+G移动到第n行
命令模式下删除文字
- x删除当前光标的文字
- shift+x(X)删除光标左边的文字
- dd直接删除当前这一行
- n+dd删除包括这一行的n行
但是需要补充的是这个dd实际上是剪切所以我们是还可以恢复的
也就是使用我们的粘贴
p就是粘贴 n+p就是粘贴n行
撤销和撤销我们的撤销
然后我们如果想要撤销我们刚才的操作的话我们就可以按u
这样就可以对我们的操作进行撤销了
然后撤销我们的撤销(这有点拗口但是实际上就是u的逆操作)
就是我们的ctrl+r就可以实现了
命令模式下复制
刚才我们知道了p是粘贴的快捷键
那么我们在这个命令模式下进行复制呢?
yy就可以对我们的内日那个进行复制
yy是复制我们当前行的内容
n+yy就是对下面的n行的内容进行复制
插入模式
上面我们介绍了怎么在命令模式下进行简单的操作
下面我们这个插入模式就是我们主要进行编写内容的模式了
怎么进入这个模式呢??
- i从当前光标的位置开始编写
- a从下一个位置开始
- o从下一行开始
总的来说我们进入插入模式的有三种方式就是我们的aio这三个字母
当然我们进入了这个模式怎么退出?
点击esc就直接退出到了我们的命令的模式了
底行模式
这时候就有人问了怎么彻底的退出这个vim呢?
这时候我们就需要进入这个底行模式了
输入冒号(shiift+;)
就可以进入
q就是退出
w是保存
以上就是我们的最常用的三种的模式,但是vim的模式并不是仅仅有这个三种'
下面我们来看看相对常用的两个模式
替换模式
就是我们进入到这个模式之后我们就可以对光标下的内容进行替换
shift+r
进入到这个替换模式后我们就可以对我们已经输入的内容进行替换了
当然在命令模式下也可以这样的操作我们只需要r+替换的字母
V-BOLCK模式
在这个模式下我们可以选取多个目标
主要是利用这个模式进行代码的注释
ctrl+v进入到这个模式下,然后我们通过hjkl移动进行选取区间
然后进入到插入模式输入(这时候我们需要的是shift+i)//退出就可以了
这样就完成了代码的批量的注释了
以上就是常用的六种模式

下面就是配置我们的vim了
• 在⽬录/etc/下⾯,有个名为vimrc的⽂件,这是系统中公共的vim配置⽂件,对所有⽤⼾都有 效。 • ⽽在每个⽤⼾的主⽬录下,都可以⾃⼰建⽴私有的配置⽂件,命名为:".vimrc"。例如,/root ⽬录下,通常已经存在⼀个.vimrc⽂件,如果不存在,则创建之。

可以看到我的是配置好的vim他是有代码的补全的功能什么的
怎么配置vim的话可以在网上查找一些相关你的版本的插件然后拷贝到你的vim的配置文件中
- 创建一个.vimrc文件
- 然后在网上查找你想要的插件然后粘贴到这个文件中
- 保存
我是centos的机器如果你的也是的话你可以使用我的
"""""""""""""""""""""""""" vim-plug 插件管理器
" PlugInstall 安装插件
" PlugUpgrade 更新 vim-plug 自身
call plug#begin('~/.vim/bundle')
Plug 'Valloric/YouCompleteMe'
Plug 'bling/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'morhetz/gruvbox'
Plug 'octol/vim-cpp-enhanced-highlight'
Plug 'SirVer/ultisnips'
Plug 'tpope/vim-surround'
Plug 'flazz/vim-colorschemes'
Plug 'scrooloose/nerdtree'
Plug 'python-mode/python-mode'
Plug 'scrooloose/nerdcommenter'
Plug 'Yggdroot/LeaderF'
Plug 'cpiger/NeoDebug'
Plug 'ryanoasis/vim-devicons'
Plug 'autozimu/LanguageClient-neovim', {
\ 'branch': 'next',
\ 'do': 'bash install.sh',
\ }
Plug 'fatih/vim-go'
call plug#end()
"""""""""""""""""""""""""" 主题
" colorscheme atom
" colorscheme molokai
colorscheme luna-term
" 以下为 gruvbox 主题专用
" colorscheme gruvbox
" let g:gruvbox_contrast_light="light"
" let g:gruvbox_contrast_dark="hard"
" let g:gruvbox_improved_warnings=1
"""""""""""""""""""""""""" 零碎配置
set hlsearch
let mapleader = ";"
set nu
behave mswin
syntax on
set si
set ai
set nowritebackup
set backspace=indent,eol,start
set expandtab
set tabstop=2
set softtabstop=2
set shiftwidth=2
set fileencodings=utf-8,gbk,cp936,cp950,latin1
set encoding=utf-8
set ruler
set showcmd
set incsearch
set ruler
set foldmethod=marker
filetype plugin on
" 不吱吱叫
set noeb vb t_vb=
set cursorline
" 文件修改之后自动载入
set autoread
" 在上下移动光标时,光标的上方或下方至少会保留显示的行数
set scrolloff=5
" 左下角不显示当前vim模式
set noshowmode
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif
"""""""""""""""""""""""""" airline 彩色状态栏/标签页
" 这几个是挑选的还不错的几个 airline 主题
" let g:airline_theme="ravenpower"
" let g:airline_theme="minimalist"
" let g:airline_theme="kolor"
" let g:airline_theme="jellybeans"
" let g:airline_theme="distinguished"
" let g:airline_theme="base16_google"
let g:airline_theme="behelit"
set helplang=cn
set ambiwidth=double
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#buffer_nr_show = 1
" 关闭状态显示空白符号计数
let g:airline#extensions#whitespace#enabled = 0
let g:airline#extensions#whitespace#symbol = '!'
" 设置consolas字体
set guifont=Consolas\ for\ Powerline\ FixedD:h11
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
" unicode symbols
let g:airline_left_sep = '?'
let g:airline_left_sep = '?'
let g:airline_right_sep = '?'
let g:airline_right_sep = '?'
let g:airline_symbols.crypt = '??'
let g:airline_symbols.linenr = '?'
let g:airline_symbols.linenr = '?'
let g:airline_symbols.linenr = '?'
let g:airline_symbols.linenr = '?'
let g:airline_symbols.maxlinenr = ''
let g:airline_symbols.maxlinenr = '?'
let g:airline_symbols.branch = '?'
let g:airline_symbols.paste = 'ρ'
let g:airline_symbols.paste = '?'
let g:airline_symbols.paste = '∥'
let g:airline_symbols.spell = '?'
let g:airline_symbols.notexists = '?'
let g:airline_symbols.whitespace = 'Ξ'
" powerline symbols
let g:airline_left_sep = '?'
let g:airline_left_alt_sep = '?'
let g:airline_right_sep = '?'
let g:airline_right_alt_sep = '?'
let g:airline_symbols.branch = '?'
let g:airline_symbols.readonly = '?'
let g:airline_symbols.linenr = '?'
" let g:airline_symbols.maxlinenr = '?'
let g:airline_symbols.maxlinenr = ''
" old vim-powerline symbols
let g:airline_left_sep = '?'
let g:airline_left_alt_sep = '?'
let g:airline_right_sep = '?'
let g:airline_right_alt_sep = '?'
let g:airline_symbols.branch = '?'
let g:airline_symbols.readonly = '?'
" let g:airline_symbols.linenr = '?'
let g:airline_symbols.linenr = ''
"""""""""""""""""""""""""" 代码折叠
set foldenable
" 折叠方法
" manual 手工折叠
" indent 使用缩进表示折叠
" expr 使用表达式定义折叠
" syntax 使用语法定义折叠
" diff 对没有更改的文本进行折叠
" marker 使用标记进行折叠, 默认标记是 {{{ 和 }}}
set foldmethod=indent
set foldlevel=99
" 代码折叠自定义快捷键 zz
let g:FoldMethod = 0
fun! ToggleFold()
if g:FoldMethod == 0
exe "normal! zM"
let g:FoldMethod = 1
else
exe "normal! zR"
let g:FoldMethod = 0
endif
endfun
"""""""""""""""""""""""""" 快速运行
func! Compile()
exec "w"
if &filetype == 'c'
exec "!gcc -g % -o %< && ./%<"
elseif &filetype == 'cpp'
exec "!g++ -g % -o %< && ./%<"
elseif &filetype == 'cc'
exec "!g++ -g % -o %< && ./%<"
elseif &filetype == 'python'
exec "!python %"
elseif &filetype == 'sh'
exec "!sh %"
endif
endfunc
"""""""""""""""""""""""""" YouCompleteMe
set completeopt=longest,menu
autocmd InsertLeave * if pumvisible() == 0|pclose|endif
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>"
let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
let g:ycm_confirm_extra_conf = 0
"let g:ycm_key_invoke_completion='<C-j>'
let g:ycm_error_symbol = 'E>'
let g:ycm_warning_symbol = 'W>'
" 使用 NerdFont 中的图标表示错误和警告
" let g:ycm_error_symbol = '?'
" let g:ycm_warning_symbol = '?'
let g:ycm_enable_diagnostic_signs = 1
let g:ycm_enable_diagnostic_highlighting = 1
let g:ycm_collect_identifiers_from_comments_and_strings = 0
let g:ycm_complete_in_comments = 1
let g:ycm_complete_in_strings = 1
let g:ycm_min_num_of_chars_for_completion = 2
let g:ycm_python_binary_path = 'python'
let g:ycm_semantic_triggers = {
\ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'],
\ 'cs,lua,javascript': ['re!\w{2}'],
\}
"""""""""""""""""""""""""" Tagbar(函数列表)
let g:tagbar_ctags_bin='/usr/bin/ctags'
let g:tagbar_width=20
let g:tagbar_left=1
let g:tagbar_sort = 0
"""""""""""""""""""""""""" NERDTree(文件列表)
let g:NERDTreeWinPos="right"
let g:NERDTreeWinSize=20
"""""""""""""""""""""""""" CtrlP(快速查找文件)
" let g:ctrlp_working_path_mode='a'
"""""""""""""""""""""""""" cpp-enhanced-highlight(c++ 语法高亮)
" 高亮类,成员函数,标准库和模板
let g:cpp_class_scope_highlight = 1
let g:cpp_member_variable_highlight = 1
let g:cpp_concepts_highlight = 1
let g:cpp_experimental_simple_template_highlight = 1
" 文件较大时使用下面的设置高亮模板速度较快,但会有一些小错误
let g:cpp_experimental_template_highlight = 1
"""""""""""""""""""""""""" UltiSnips(代码模板)
let g:UltiSnipsExpandTrigger="<C-j>"
let g:UltiSnipsListSnippets="<C-e>"
let g:UltiSnipsJumpForwardTrigger="<C-j>"
let g:UltiSnipsJumpBackwardTrgger="<C-k>"
"""""""""""""""""""""""""" LeaderF
let g:Lf_WindowHeight = 0.30
"""""""""""""""""""""""""" cquery
let g:LanguageClient_serverCommands = {
\ 'cpp': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
\ 'cxx': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
\ 'hpp': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
\ 'cc': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
\ 'c': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
\ 'h': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
\ }
let g:LanguageClient_loadSettings = 1
let g:LanguageClient_settingsPath = '/tmp/cquery/settings.json'
" 关闭 cquery 的诊断信息, 使用 Ycm 的足矣
let g:LanguageClient_diagnosticsEnable=0
" 指定项目的根目录标记.
let g:LanguageClient_rootMarkers = ['.root', '.svn', '.git']
""""""""""""""""""""""" PyMode
let g:pymode_lint_cwindow = 0
let g:pymode_lint_ignore = ["E305", "E501", "E302", "E391", "W391", "W605",]
""""""""""""""""""""""" 按键映射和快捷键提示
" 跳转到定义
nnoremap <c-k> :YcmCompleter GoToDefinitionElseDeclaration<CR>
" 返回到跳转前的位置
nnoremap <c-l> <c-o>
" 切换鼠标状态
function! MouseToggle()
if &mouse ==# ""
set mouse=a
else
set mouse=
endif
endfunction
" 切换绝对行号和相对行号
function! NumToggle()
if &relativenumber ==# "norelativenumber"
set relativenumber
else
set norelativenumber
endif
endfunction
function GuideEsc()
unmap a
unmap s
unmap d
unmap f
unmap g
unmap w
unmap q
unmap <esc>
echo ""
endfunction
function Terminal()
sp
terminal
endfunction
function MenuA()
echo "[a] 跳转定义 [s] 查找引用 [d] 重命名 [f] 修正错误 [g] 函数签名 [q] 取消"
nnoremap <silent><nowait> a :call GuideEsc()<cr>:call LanguageClient_textDocument_definition()<CR>
nnoremap <silent><nowait> s :call GuideEsc()<cr>:call LanguageClient_textDocument_references()<CR>:lopen<CR>:lopen<CR>
nnoremap <silent><nowait> d :call GuideEsc()<cr>:call LanguageClient_textDocument_rename()<CR>
nnoremap <silent><nowait> f :call GuideEsc()<cr>:YcmCompleter FixIt<CR>
nnoremap <silent><nowait> g :call GuideEsc()<cr>:call LanguageClient_textDocument_hover()<CR>
nnoremap <silent><nowait> w <nop>
nnoremap <silent><nowait> q :call GuideEsc()<cr>
nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
endfunction
function MenuS()
echo "[a] 查找函数 [s] 打开文件 [d] buffer查找 [f] 最近文件 [q] 取消"
nnoremap <silent><nowait> a :call GuideEsc()<cr>:LeaderfFunction<cr>
nnoremap <silent><nowait> s :call GuideEsc()<cr>:LeaderfFile<cr>
nnoremap <silent><nowait> d :call GuideEsc()<cr>:LeaderfBuffer<cr>
nnoremap <silent><nowait> f :call GuideEsc()<cr>:LeaderfMru<cr>
nnoremap <silent><nowait> g <nop>
nnoremap <silent><nowait> w <nop>
nnoremap <silent><nowait> q :call GuideEsc()<cr>
nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
endfunction
function MenuD()
echo "[a] 编译运行 [s] 编译检查 [q] 取消"
nnoremap <silent><nowait> a :call GuideEsc()<cr>:call Compile()<cr>
nnoremap <silent><nowait> s :call GuideEsc()<cr>:YcmDiags<CR>
nnoremap <silent><nowait> d <nop>
nnoremap <silent><nowait> f <nop>
nnoremap <silent><nowait> g <nop>
nnoremap <silent><nowait> w <nop>
endfunction
function MenuF()
echo "[a] 函数列表 [s] 文件列表 [d] .h/.c [f] 标签页 [q] 取消"
nnoremap <silent><nowait> a :call GuideEsc()<cr>:TagbarToggle<cr>
nnoremap <silent><nowait> s :call GuideEsc()<cr>:NERDTreeToggle<cr>
nnoremap <silent><nowait> d :call GuideEsc()<cr>:AT<cr>
nnoremap <nowait> f :call GuideEsc()<cr>:tabe
nnoremap <silent><nowait> g <nop>
nnoremap <silent><nowait> w <nop>
nnoremap <silent><nowait> q :call GuideEsc()<cr>
nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
endfunction
function MenuWA()
echo "[a] 切换鼠标 [s] 切换粘贴 [d] 切换行号 [f] 不可见字符 [q] 取消"
nnoremap <silent><nowait> a :call GuideEsc()<cr>:call MouseToggle()<cr>
nnoremap <silent><nowait> s :call GuideEsc()<cr>:set paste!<cr>
nnoremap <silent><nowait> d :call GuideEsc()<cr>:call NumToggle()<cr>
nnoremap <silent><nowait> f :call GuideEsc()<cr>:set list!<cr>
nnoremap <silent><nowait> g <nop>
nnoremap <silent><nowait> w <nop>
nnoremap <silent><nowait> q :call GuideEsc()<cr>
nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
endfunction
function MenuWS()
echo "[a] 文档注释 [s] 折叠/展开 [q] 取消"
nnoremap <silent><nowait> a :call GuideEsc()<cr>:Dox<cr><esc>
nnoremap <silent><nowait> s :call GuideEsc()<cr>:call ToggleFold()<cr>
nnoremap <silent><nowait> d <nop>
nnoremap <silent><nowait> f <nop>
nnoremap <silent><nowait> g <nop>
nnoremap <silent><nowait> w <nop>
nnoremap <silent><nowait> q :call GuideEsc()<cr>
nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
" TODO 快速注释和格式整理
endfunction
function MenuW()
echo "[a] 切换选项 [s] 代码格式 [q] 取消"
nnoremap <silent><nowait> a :call GuideEsc()<cr>:call MenuWA()<cr>
nnoremap <silent><nowait> s :call GuideEsc()<cr>:call MenuWS()<cr>
nnoremap <silent><nowait> d <nop>
nnoremap <silent><nowait> f <nop>
nnoremap <silent><nowait> g <nop>
nnoremap <silent><nowait> w <nop>
nnoremap <silent><nowait> q :call GuideEsc()<cr>
nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
endfunction
function GuideMapTopMenu()
nnoremap <silent><nowait> a :call MenuA()<cr>
nnoremap <silent><nowait> s :call MenuS()<cr>
nnoremap <silent><nowait> d :call MenuD()<cr>
nnoremap <silent><nowait> f :call MenuF()<cr>
nnoremap <silent><nowait> t :call Terminal()<cr>
nnoremap <silent><nowait> g <nop>
nnoremap <silent><nowait> w :call MenuW()<cr>
nnoremap <silent><nowait> q :call GuideEsc()<cr>
nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
endfunction
nnoremap <silent><nowait> <space> :call GuideEntry()<cr>
function GuideEntry()
" 1. 重新映射相关快捷键到 space
call GuideMapTopMenu()
" 2. 打印菜单
echo "[a] 语义 [s] 查找 [d] 调试 [f] 窗口 [w] 其他 [q] 取消 [t] 终端"
endfunction
""" 其他
" 调整窗口移动
nnoremap H <C-w>h
nnoremap J <C-w>j
nnoremap K <C-w>k
nnoremap L <C-w>l
" 快速保存
inoremap jk <esc>:w<cr>
nnoremap <esc> :w<cr>
inoremap <esc> <esc>:w<cr>
" 快速缩进
vnoremap < <gv
vnoremap > >gv
总结
以上就是今天的内容了,之后会继续讲解开发工具的使用
谢谢大家的观看!!!