[Linux开发工具]——vim使用
Linux编辑器——vim的使用
- 一、什么是集成开发环境?
- 二、什么是vim?
- 三、vim的概念
- 四、vim的基本操作
- 五、vim命令模式命令集
- 5.1 移动光标
- 5.2 删除文字
- 5.3 复制粘贴
- 5.4 其他操作
- 六、vim底行模式命令集
- 6.1 首先在命令模式下shift+;进入末行模式。
- 6.2 进行多文本编辑
- 6.3 vim的分屏模式
- 七、简单vim配置
一、什么是集成开发环境?
如vs:
就是整个开发的生命周期,建立项目,写代码,编写代码,编译代码,调试代码,发布项目,这种环境集就是集成开发环境(编写、编译、运行、调试,为一体)。
Linux中指令级别操作:
在linux当中,它的一个一个工具都是各自独立得。
编写代码:vim
编译代码:gcc / g++
调试代码:gdb
维护项目结构自动化编译:make / makefile
二、什么是vim?
vim是一款多模式的编辑器。 vim的前身是vi,vim是vi的升级版本,vim兼容vi中大多数指令集,并且vim还有一些新的特性在里面。
例如:语法高亮,可视化操作不仅可以在终端运行,也可以运行于x window,mac os,windows。
三、vim的概念
vim有很多模式,初学者只需要掌握三个就可以:
正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
末行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+:即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入
:help vim-modes
一共12种模式:six BASIC modes和six ADDIYIONAL modes
打开、关闭、查看、查询、插入、删除、替换、撤销、复制等操作。
补充:vim编写代码,异常退出,或者系统崩溃等问题时,当我们再次打开那个文件,该文件内容就变了。因为我们不正常退出时,vim会将我们上次编写的代码保存在了一个.与原文件同名的.swp的隐藏文件里。
1.可以输入R命令(恢复),也可以输入D命令(删除,删除异常情况下的临时文件)
2.输入:
ls -al 把swp文件删掉
四、vim的基本操作
三种常用模式之间的关系:

vim中的模式很多,当使用者不知道当前所处的模式是处于一种什么样的状态,万能的Esc键,可以将使用者带回命令模式,该模式也可以认为其他任意模式的入口。
打开vim
该目录下如果有test.c文件就会直接打开test.c,没有就会创建一个test.c文件然后打开
vim test.c

打开后就是命令模式:

命令模式下按a/i/o就是插入模式:

命令模式下按shift+;就是底行模式:

底行模式按
w(保存当前文件)
wq(存盘,并且退出)
q!(不存盘,强制退出vim)
插入模式:
i, I 进入输入模式(Insert mode):
i 为【从目前光标所在处输入】, I 为【在目前所在行的第一个非空格符处开始输入】。
a, A 进入输入模式(Insert mode):
a 为【从目前光标所在的下一个字符处开始输入】, A 为【从光标所在行的最后一个字符处开始输入】。
o, O 进入输入模式(Insert mode):
这是英文字母 o 的大小写。o 为【在目前光标所在的下一行处输入新的一行】; O 为在目前光标所在处的上一行输入新的一行!
五、vim命令模式命令集
5.1 移动光标
在命令模式下,对光标进行上下左右移动,这里指代都是小写:上移k,下移j,左移h,右移l,都是移动一格。 当然我们也可以使用键盘右侧的上下左右,但是键盘离手就慢了,字母移动的光标可能对我们操作更加方便。
行内移动左移一个字符:h 右移一个字符:l移动到下一个单词的开头:w移动到上一个单词的开头:b移动到当前单词的结尾:e移动到行首:shift+^移动到行尾:shift+$替换模式:shift+r跨行移动下移一行:j上移一行:k移动到文件末尾:G移动到文件开头:gg移动到第n行:nG移动到屏幕顶部:H移动到屏幕中间:M移动到屏幕底部:L向前翻页:Ctrl+f向后翻页:Ctrl+b向前翻半页:Ctrl+u向后翻半页:Ctrl+d查找移动 查找word并移动到第一个匹配处:/word移动到下一个匹配处:n移动到上一个匹配处:N查找光标所在单词并移动到第一个匹配处:*查找光标所在单词并移动到上一个匹配处:#查找匹配的括号并移动到对应位置:%高亮要查找的函数名:shift+3=#,按n的意思是下一个查找到的函数/字符串名
5.2 删除文字
删除文字每按一次删除光标所在位置的一个字符:x指定删除所在位置后面(包括自己在内的)#个字符 : #x大写的X,每按一次可以删除光标所在位置前面的一个字符:X#X表示删除光标所在的位置前面的#个字符:#X删除光标所在行:dd从光标所在位置,向后面删除#行:#dd
5.3 复制粘贴
将光标所在之处到字尾的字符复制到缓冲区:yw复制#个字符到缓冲区:#yw复制光标所在行到缓冲区:yy拷贝从光标所在行往下数#行文字:#yy粘贴缓冲区内容到光标所在行:p
5.4 其他操作
替换替换光标所在位置的字符:r替换光标所在之处的字符,知道按下ESC键停止:R撤销上一次操作如果您误执行一个命令,可以马上按下u撤销上一个操作,多次按u可以多次撤销:u撤销的恢复,对于错误撤销可以执行对撤销操作的撤销:crtl+r更改更改光标所在处的字到字尾处:cw表示可以更改光标所在位往后的#个字符:c#w跳至到指定的行列举处光标所在行的行号:crtl+g移动光标至文章的第#行的行首:#G
六、vim底行模式命令集
6.1 首先在命令模式下shift+;进入末行模式。
保存并退出vim保存文件:w退出 Vim 编辑器:q保存文件并退出 Vim 编辑器:wq强制退出 Vim 编辑器,不保存修改:q!列出行号显示行号:set nu隐藏行号:set nonu搜索相关字符关键字向下搜索 word 这个字符串:/word向上搜索 word 这个字符串:?word重复上一次的搜索 :n修改字符内容替换当前行第一个 old 为 new :s/old/new替换当前行所有的 old 为 new :s/old/new/g替换整个文件中所有的 old 为 new :%s/old/new/g
在这里输入指令需要注意的是:%s///g第一个/后面输入的是想要修改的字符,第二个/后面输入的是新的字符
6.2 进行多文本编辑
进入底行模式shift + ;,输入vs后面加想要打开的文件名称
注意:vs后跟的文件名在该目录下不存在,vim会默认帮你创建该文件,该文件若是没有进行内容编写保存,文件会销毁
如果你的电脑屏幕足够大,可以创建多个文件进行编辑。
在vim进行多个文件编辑的时候,底行模式退回命令模式输入Ctrl + ww可以进行文件之间进行切换,通过光标所在的位置来判断你所在文件的位置。
保存退出的时候,退出的是光标所在的文件,并不会说一下子退出vim,直到退出最后一个文件才会真正退出vim
6.3 vim的分屏模式
先要进入底行模式才能输入分屏命令
sp:水平分屏
vsp:垂直分屏
ctrl+ww:多屏之间切换
qall:退出所有屏,以此内推有:wall、wqall
vim -o aa.txt bb.txt:进入的时候就进行分屏(o水平;O垂直)
补充
批量化注释:
1,ctrl+v
2.hjkl区域选择,j
3.shift+i=l
4.//
5. Esc
批量化去注释:
1.ctrl+v
2…hjkl区域选择
3.d
七、简单vim配置
vim在启动文件的时候会读取当前用户工作目录下的特定的配置文件
cd ~(进入自己账号的家目录)
ls -al(查看是否有配置文件.vimrc,没有就新建touch .vimrc)
因为我的是配置好得,是一个软连接文件

打开.vimrc,就可以在里面配置各自效果
配置是个体力活,为了不这么麻烦,我教大家一种方法:
该方法目前只支持 Centos7 x86_64.
安装方法::
在 shell 中执行指令(想在哪个用户下让vim配置生效, 就在哪个用户下执行这个指令. 强烈 “不推荐” 直接在 root 下执行):
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
需要按照提示输入 root 密码. 您的 root 密码不会被上传, 请放心输入.
注意:curl指令需要安装(sudo yum install curl)
卸载方法:
在安装了 VimForCpp 的用户下执行:
bash ~/.VimForCpp/uninstall.sh
打开.vimrc,看看里面的配置
"""""""""""""""""""""""""" vim-plug 插件管理器2 " PlugInstall 安装插件3 " PlugUpgrade 更新 vim-plug 自身4 call plug#begin('~/.vim/bundle')5 Plug 'Valloric/YouCompleteMe'6 Plug 'bling/vim-airline'7 Plug 'vim-airline/vim-airline-themes'8 Plug 'morhetz/gruvbox'9 Plug 'octol/vim-cpp-enhanced-highlight'10 Plug 'SirVer/ultisnips'11 Plug 'tpope/vim-surround'12 Plug 'flazz/vim-colorschemes'13 Plug 'scrooloose/nerdtree'14 Plug 'python-mode/python-mode'15 Plug 'scrooloose/nerdcommenter'16 Plug 'Yggdroot/LeaderF'17 Plug 'cpiger/NeoDebug'18 Plug 'ryanoasis/vim-devicons'19 Plug 'autozimu/LanguageClient-neovim', {20 \ 'branch': 'next',21 \ 'do': 'bash install.sh',22 \ }23 Plug 'fatih/vim-go'24 call plug#end()25 26 27 """""""""""""""""""""""""" 主题28 " colorscheme atom29 " colorscheme molokai30 colorscheme luna-term31 32 " 以下为 gruvbox 主题专用 33 " colorscheme gruvbox34 " let g:gruvbox_contrast_light="light" 35 " let g:gruvbox_contrast_dark="hard"36 " let g:gruvbox_improved_warnings=137 38 39 """""""""""""""""""""""""" 零碎配置40 set hlsearch41 let mapleader = ";" 42 set nu43 behave mswin44 syntax on45 set si46 set ai 47 set nowritebackup48 set backspace=indent,eol,start49 set expandtab50 set tabstop=251 set softtabstop=252 set shiftwidth=253 set fileencodings=utf-8,gbk,cp936,cp950,latin154 set encoding=utf-855 set ruler56 set showcmd57 set incsearch58 set ruler59 set foldmethod=marker60 filetype plugin on61 " 不吱吱叫62 set noeb vb t_vb=63 set cursorline64 " 文件修改之后自动载入65 set autoread66 " 在上下移动光标时,光标的上方或下方至少会保留显示的行数67 set scrolloff=568 " 左下角不显示当前vim模式69 set noshowmode70 71 if has("autocmd")72 au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif 73 endif74 75 76 """""""""""""""""""""""""" airline 彩色状态栏/标签页77 " 这几个是挑选的还不错的几个 airline 主题78 " let g:airline_theme="ravenpower"79 " let g:airline_theme="minimalist"80 " let g:airline_theme="kolor"81 " let g:airline_theme="jellybeans"82 " let g:airline_theme="distinguished"83 " let g:airline_theme="base16_google"84 let g:airline_theme="behelit"85 86 set helplang=cn87 set ambiwidth=double88 let g:airline_powerline_fonts = 189 let g:airline#extensions#tabline#enabled = 190 let g:airline#extensions#tabline#buffer_nr_show = 191 " 关闭状态显示空白符号计数92 let g:airline#extensions#whitespace#enabled = 093 let g:airline#extensions#whitespace#symbol = '!'94 " 设置consolas字体95 set guifont=Consolas\ for\ Powerline\ FixedD:h1196 if !exists('g:airline_symbols')97 let g:airline_symbols = {}98 endif99 " unicode symbols
100 let g:airline_left_sep = '»'
101 let g:airline_left_sep = '▶'
102 let g:airline_right_sep = '«'
103 let g:airline_right_sep = '◀'
104 let g:airline_symbols.crypt = '🔒'
105 let g:airline_symbols.linenr = '☰'
106 let g:airline_symbols.linenr = '␊'
107 let g:airline_symbols.linenr = ''
108 let g:airline_symbols.linenr = '¶'
109 let g:airline_symbols.maxlinenr = ''
110 let g:airline_symbols.maxlinenr = '㏑'
111 let g:airline_symbols.branch = '⎇'
112 let g:airline_symbols.paste = 'ρ'
113 let g:airline_symbols.paste = 'Þ'
114 let g:airline_symbols.paste = '∥'
115 let g:airline_symbols.spell = 'Ꞩ'
116 let g:airline_symbols.notexists = '∄'
117 let g:airline_symbols.whitespace = 'Ξ'
118
119 " powerline symbols
120 let g:airline_left_sep = ''
121 let g:airline_left_alt_sep = ''
122 let g:airline_right_sep = ''
123 let g:airline_right_alt_sep = ''
124 let g:airline_symbols.branch = ''
125 let g:airline_symbols.readonly = ''
126 let g:airline_symbols.linenr = '☰'
127 " let g:airline_symbols.maxlinenr = ''
128 let g:airline_symbols.maxlinenr = ''
129
130 " old vim-powerline symbols
131 let g:airline_left_sep = '⮀'
132 let g:airline_left_alt_sep = '⮁'
133 let g:airline_right_sep = '⮂'
134 let g:airline_right_alt_sep = '⮃'
135 let g:airline_symbols.branch = '⭠'
136 let g:airline_symbols.readonly = '⭤'
137 " let g:airline_symbols.linenr = '⭡'
138 let g:airline_symbols.linenr = ''
139
140
141 """""""""""""""""""""""""" 代码折叠
142 set foldenable
143 " 折叠方法
144 " manual 手工折叠
145 " indent 使用缩进表示折叠
146 " expr 使用表达式定义折叠
147 " syntax 使用语法定义折叠
148 " diff 对没有更改的文本进行折叠
149 " marker 使用标记进行折叠, 默认标记是 {{{ 和 }}}
150 set foldmethod=indent
151 set foldlevel=99
152 " 代码折叠自定义快捷键 zz
153 let g:FoldMethod = 0
154 fun! ToggleFold()
155 if g:FoldMethod == 0
156 exe "normal! zM"
157 let g:FoldMethod = 1
158 else
159 exe "normal! zR"
160 let g:FoldMethod = 0
161 endif
162 endfun
163
164
165 """""""""""""""""""""""""" 快速运行
166 func! Compile()
167 exec "w"
168 if &filetype == 'c'
169 exec "!gcc -g % -o %< && ./%<"
170 elseif &filetype == 'cpp'
171 exec "!g++ -g % -o %< && ./%<"
172 elseif &filetype == 'cc'
173 exec "!g++ -g % -o %< && ./%<"
174 elseif &filetype == 'python'
175 exec "!python %"
176 elseif &filetype == 'sh'
177 exec "!sh %"
178 endif
179 endfunc
180
181
182 """""""""""""""""""""""""" YouCompleteMe
183 set completeopt=longest,menu
184 autocmd InsertLeave * if pumvisible() == 0|pclose|endif
185 inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>"
186
187 let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
188 let g:ycm_confirm_extra_conf = 0
189 "let g:ycm_key_invoke_completion='<C-j>'
190 let g:ycm_error_symbol = 'E>'
191 let g:ycm_warning_symbol = 'W>'
192 " 使用 NerdFont 中的图标表示错误和警告
193 " let g:ycm_error_symbol = ''
194 " let g:ycm_warning_symbol = '卵'
195 let g:ycm_enable_diagnostic_signs = 1
196 let g:ycm_enable_diagnostic_highlighting = 1
197 let g:ycm_collect_identifiers_from_comments_and_strings = 0
198 let g:ycm_complete_in_comments = 1
199 let g:ycm_complete_in_strings = 1
200 let g:ycm_min_num_of_chars_for_completion = 2
201 let g:ycm_python_binary_path = 'python'
202 let g:ycm_semantic_triggers = {
203 \ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'],
204 \ 'cs,lua,javascript': ['re!\w{2}'],
205 \}
206
207
208 """""""""""""""""""""""""" Tagbar(函数列表)
209 let g:tagbar_ctags_bin='/usr/bin/ctags'
210 let g:tagbar_width=20
211 let g:tagbar_left=1
212 let g:tagbar_sort = 0
213
214
215 """""""""""""""""""""""""" NERDTree(文件列表)
216 let g:NERDTreeWinPos="right"
217 let g:NERDTreeWinSize=20
218
219
220 """""""""""""""""""""""""" CtrlP(快速查找文件)
221 " let g:ctrlp_working_path_mode='a'
222
223
224 """""""""""""""""""""""""" cpp-enhanced-highlight(c++ 语法高亮)
225 " 高亮类,成员函数,标准库和模板
226 let g:cpp_class_scope_highlight = 1
227 let g:cpp_member_variable_highlight = 1
228 let g:cpp_concepts_highlight = 1
229 let g:cpp_experimental_simple_template_highlight = 1
230 " 文件较大时使用下面的设置高亮模板速度较快,但会有一些小错误
231 let g:cpp_experimental_template_highlight = 1
232
233
234 """""""""""""""""""""""""" UltiSnips(代码模板)
235 let g:UltiSnipsExpandTrigger="<C-j>"
236 let g:UltiSnipsListSnippets="<C-e>"
237 let g:UltiSnipsJumpForwardTrigger="<C-j>"
238 let g:UltiSnipsJumpBackwardTrgger="<C-k>"
239
240
241 """""""""""""""""""""""""" LeaderF
242 let g:Lf_WindowHeight = 0.30
243
244
245 """""""""""""""""""""""""" cquery
246 let g:LanguageClient_serverCommands = {
247 \ 'cpp': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
248 \ 'cxx': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
249 \ 'hpp': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
250 \ 'cc': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
251 \ 'c': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
252 \ 'h': ['~/.VimForCpp/cquery/bin/cquery', '--log-file=/tmp/cquery/cq.log'],
253 \ }
254
255 let g:LanguageClient_loadSettings = 1
256 let g:LanguageClient_settingsPath = '/tmp/cquery/settings.json'
257
258 " 关闭 cquery 的诊断信息, 使用 Ycm 的足矣
259 let g:LanguageClient_diagnosticsEnable=0
260
261 " 指定项目的根目录标记.
262 let g:LanguageClient_rootMarkers = ['.root', '.svn', '.git']
263
264
265 """"""""""""""""""""""" PyMode
266 let g:pymode_lint_cwindow = 0
267 let g:pymode_lint_ignore = ["E305", "E501", "E302", "E391", "W391", "W605",]
268
269
270 """"""""""""""""""""""" 按键映射和快捷键提示
271 " 跳转到定义
272 nnoremap <c-k> :YcmCompleter GoToDefinitionElseDeclaration<CR>
273 " 返回到跳转前的位置
274 nnoremap <c-l> <c-o>
275
276 " 切换鼠标状态
277 function! MouseToggle()
278 if &mouse ==# ""
279 set mouse=a
280 else
281 set mouse=
282 endif
283 endfunction
284
285 " 切换绝对行号和相对行号
286 function! NumToggle()
287 if &relativenumber ==# "norelativenumber"
288 set relativenumber
289 else
290 set norelativenumber
291 endif
292 endfunction
293
294 function GuideEsc()
295 unmap a
296 unmap s
297 unmap d
298 unmap f
299 unmap g
300 unmap w
301 unmap q
302 unmap <esc>
303 echo ""
304 endfunction
305 function Terminal()
306 sp
307 terminal
308 endfunction
309
310 function MenuA()
311 echo "[a] 跳转定义 [s] 查找引用 [d] 重命名 [f] 修正错误 [g] 函数签名 [q] 取消"
312 nnoremap <silent><nowait> a :call GuideEsc()<cr>:call LanguageClient_textDocument_definition()<CR>
313 nnoremap <silent><nowait> s :call GuideEsc()<cr>:call LanguageClient_textDocument_references()<CR>:lopen<CR>:lopen<CR>
314 nnoremap <silent><nowait> d :call GuideEsc()<cr>:call LanguageClient_textDocument_rename()<CR>
315 nnoremap <silent><nowait> f :call GuideEsc()<cr>:YcmCompleter FixIt<CR>
316 nnoremap <silent><nowait> g :call GuideEsc()<cr>:call LanguageClient_textDocument_hover()<CR>
317 nnoremap <silent><nowait> w <nop>
318 nnoremap <silent><nowait> q :call GuideEsc()<cr>
319 nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
320 endfunction
321
322 function MenuS()
323 echo "[a] 查找函数 [s] 打开文件 [d] buffer查找 [f] 最近文件 [q] 取消"
324 nnoremap <silent><nowait> a :call GuideEsc()<cr>:LeaderfFunction<cr>
325 nnoremap <silent><nowait> s :call GuideEsc()<cr>:LeaderfFile<cr>
326 nnoremap <silent><nowait> d :call GuideEsc()<cr>:LeaderfBuffer<cr>
327 nnoremap <silent><nowait> f :call GuideEsc()<cr>:LeaderfMru<cr>
328 nnoremap <silent><nowait> g <nop>
329 nnoremap <silent><nowait> w <nop>
330 nnoremap <silent><nowait> q :call GuideEsc()<cr>
331 nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
332 endfunction
333
334 function MenuD()
335 echo "[a] 编译运行 [s] 编译检查 [q] 取消"
336 nnoremap <silent><nowait> a :call GuideEsc()<cr>:call Compile()<cr>
337 nnoremap <silent><nowait> s :call GuideEsc()<cr>:YcmDiags<CR>
338 nnoremap <silent><nowait> d <nop>
339 nnoremap <silent><nowait> f <nop>
340 nnoremap <silent><nowait> g <nop>
341 nnoremap <silent><nowait> w <nop>
342 endfunction
343
344 function MenuF()
345 echo "[a] 函数列表 [s] 文件列表 [d] .h/.c [f] 标签页 [q] 取消"
346 nnoremap <silent><nowait> a :call GuideEsc()<cr>:TagbarToggle<cr>
347 nnoremap <silent><nowait> s :call GuideEsc()<cr>:NERDTreeToggle<cr>
348 nnoremap <silent><nowait> d :call GuideEsc()<cr>:AT<cr>
349 nnoremap <nowait> f :call GuideEsc()<cr>:tabe
350 nnoremap <silent><nowait> g <nop>
351 nnoremap <silent><nowait> w <nop>
352 nnoremap <silent><nowait> q :call GuideEsc()<cr>
353 nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
354 endfunction
355
356 function MenuWA()
357 echo "[a] 切换鼠标 [s] 切换粘贴 [d] 切换行号 [f] 不可见字符 [q] 取消"
358 nnoremap <silent><nowait> a :call GuideEsc()<cr>:call MouseToggle()<cr>
359 nnoremap <silent><nowait> s :call GuideEsc()<cr>:set paste!<cr>
360 nnoremap <silent><nowait> d :call GuideEsc()<cr>:call NumToggle()<cr>
361 nnoremap <silent><nowait> f :call GuideEsc()<cr>:set list!<cr>
362 nnoremap <silent><nowait> g <nop>
363 nnoremap <silent><nowait> w <nop>
364 nnoremap <silent><nowait> q :call GuideEsc()<cr>
365 nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
366 endfunction
367
368 function MenuWS()
369 echo "[a] 文档注释 [s] 折叠/展开 [q] 取消"
370 nnoremap <silent><nowait> a :call GuideEsc()<cr>:Dox<cr><esc>
371 nnoremap <silent><nowait> s :call GuideEsc()<cr>:call ToggleFold()<cr>
372 nnoremap <silent><nowait> d <nop>
373 nnoremap <silent><nowait> f <nop>
374 nnoremap <silent><nowait> g <nop>
375 nnoremap <silent><nowait> w <nop>
376 nnoremap <silent><nowait> q :call GuideEsc()<cr>
377 nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
378 " TODO 快速注释和格式整理
379 endfunction
380
381 function MenuW()
382 echo "[a] 切换选项 [s] 代码格式 [q] 取消"
383 nnoremap <silent><nowait> a :call GuideEsc()<cr>:call MenuWA()<cr>
384 nnoremap <silent><nowait> s :call GuideEsc()<cr>:call MenuWS()<cr>
385 nnoremap <silent><nowait> d <nop>
386 nnoremap <silent><nowait> f <nop>
387 nnoremap <silent><nowait> g <nop>
388 nnoremap <silent><nowait> w <nop>
389 nnoremap <silent><nowait> q :call GuideEsc()<cr>
390 nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
391 endfunction
392
393 function GuideMapTopMenu()
394 nnoremap <silent><nowait> a :call MenuA()<cr>
395 nnoremap <silent><nowait> s :call MenuS()<cr>
396 nnoremap <silent><nowait> d :call MenuD()<cr>
397 nnoremap <silent><nowait> f :call MenuF()<cr>
398 nnoremap <silent><nowait> t :call Terminal()<cr>
399 nnoremap <silent><nowait> g <nop>
400 nnoremap <silent><nowait> w :call MenuW()<cr>
401 nnoremap <silent><nowait> q :call GuideEsc()<cr>
402 nnoremap <silent><nowait> <esc> :call GuideEsc()<cr>
403 endfunction
404
405 nnoremap <silent><nowait> <space> :call GuideEntry()<cr>
406 function GuideEntry()
407 " 1. 重新映射相关快捷键到 space
408 call GuideMapTopMenu()
409 " 2. 打印菜单
410 echo "[a] 语义 [s] 查找 [d] 调试 [f] 窗口 [w] 其他 [q] 取消 [t] 终端"
411 endfunction
412
413
414 """ 其他
415 " 调整窗口移动
416 nnoremap H <C-w>h
417 nnoremap J <C-w>j
418 nnoremap K <C-w>k
419 nnoremap L <C-w>l
420 " 快速保存
421 inoremap jk <esc>:w<cr>
422 nnoremap <esc> :w<cr>
423 inoremap <esc> <esc>:w<cr>
424 " 快速缩进
425 vnoremap < <gv
426 vnoremap > >gv
相关文章:
[Linux开发工具]——vim使用
Linux编辑器——vim的使用 一、什么是集成开发环境?二、什么是vim?三、vim的概念四、vim的基本操作五、vim命令模式命令集5.1 移动光标5.2 删除文字5.3 复制粘贴5.4 其他操作 六、vim底行模式命令集6.1 首先在命令模式下shift;进入末行模式。…...
【教学类-43-11】 20231231 3*3宫格数独提取单元格坐标数字的通用模板(做成2*2=4套、3*2=6套)
背景需求: 1、以前做单元格填充,都是制作N个分开的单元格 (表格8) 2、这次做五宫格数独的Word模板,我图方便,就只用了一个大表格,第六行第六列隐藏框线,看上去就是分开的ÿ…...
Spring Boot日志:从Logger到@Slf4j的探秘
写在前面 Hello大家好,今日是2024年的第一天,祝大家元旦快乐🎉 2024第一篇文章从SpringBoot日志开始 文章目录 一、前言二、日志有什么用?三、日志怎么用?四、自定义日志打印💬 常见日志框架说明4.1 在程序…...
英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置
英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置 1 GTM与ADC的接口2 GTM与VADC的连接2.1 VADC 到 GTM 的连接2.1.1 简要介绍2.1.2 应用举例2.2 EVADC到 GTM的连接2.2.1 应用举例3 总结本文介绍实现GTM与VADC的连接性的相关寄存器配置。 1 GTM与ADC的接口 由英…...
【基础】【Python网络爬虫】【6.数据持久化】Excel、Json、Csv 数据保存(附大量案例代码)(建议收藏)
Python网络爬虫基础 数据持久化(数据保存)1. Excel创建数据表批量数据写入读取表格数据案例 - 豆瓣保存 Excel案例 - 网易新闻Excel保存 2. Json数据序列化和反序列化中文指定案例 - 豆瓣保存Json案例 - Json保存 3. Csv写入csv列表数据案例 - 豆瓣列表保…...
王道考研计算机网络——应用层
如何为用户提供服务? CS/P2P 提高域名解析的速度:local name server高速缓存:直接地址映射/低级的域名服务器的地址 本机也有告诉缓存:本机开机的时候从本地域名服务器当中下载域名和地址的对应数据库,放到本地的高…...
Android MVVM 写法
前言 Model:负责数据逻辑 View:负责视图逻辑 ViewModel:负责业务逻辑 持有关系: 1、ViewModel 持有 View 2、ViewModel 持有 Model 3、Model 持有 ViewModel 辅助工具:DataBinding 执行流程:View &g…...
LeetCode 热题 100——283. 移动零
283. 移动零 提示 简单 2.3K 相关企业 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,…...
neovim调试xv6-riscv过程中索引不到对应头文件问题
大家好,我叫徐锦桐,个人博客地址为www.xujintong.com,github地址为https://github.com/jintongxu。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。 和这篇文章neovim调试linux内核过程中索…...
轻量应用服务器与云服务器CVM对比——腾讯云
腾讯云轻量服务器和云服务器CVM该怎么选?不差钱选云服务器CVM,追求性价比选择轻量应用服务器,轻量真优惠呀,活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年,540元三…...
骑砍战团MOD开发(31)-游戏AI控制
一.骑砍单机模式下AI控制 骑砍战团中野外战斗,训练场中小兵和地方小兵的行为统称为场景AI. 骑砍大地图中敌军追踪和遭遇追击统称为大地图AI. 二.骑砍场景AI 骑砍引擎通过header_mission_templates,py定制AI常量控制小兵位置,动作和朝向.可实现自定义阵型和攻击动作。 # Agen…...
flutter学习-day21-使用permission_handler进行系统权限的申请和操作
文章目录 1. 介绍2. 环境准备2-1. Android2-2. iOS 3. 使用 1. 介绍 在大多数操作系统上,权限不是在安装时才授予应用程序的。相反,开发人员必须在应用程序运行时请求用户的许可。在 flutter 开发中,则需要一个跨平台(iOS, Android)的 API 来…...
虹科方案丨L2进阶L3,数据采集如何助力自动驾驶
来源:康谋自动驾驶 虹科方案丨L2进阶L3,数据采集如何助力自动驾驶 原文链接:https://mp.weixin.qq.com/s/qhWy11x_-b5VmBt86r4OdQ 欢迎关注虹科,为您提供最新资讯! 12月14日,宝马集团宣布,搭载…...
Kubernetes 学习总结(42)—— Kubernetes 之 pod 健康检查详解
Kubernetes 入门 回想 2017 年刚开始接触 Kubernetes 时,碰到 Pod一直起不来的情况,就开始抓瞎。后来渐渐地掌握了一些排查方法之后,这种情况才得以缓解。随着时间推移,又碰到了问题。有一天在部署某个 springboot 微服务时&…...
【后端】Docker学习笔记
文章目录 Docker一、Docker安装(Linux)二、Docker概念三、Docker常用命令四、数据卷五、自定义镜像六、网络七、DockerCompose Docker Docker是一个开源平台,主要基于Go语言构建,它使开发者能够将应用程序及其依赖项打包到一个轻…...
UE5.1_Gameplay Debugger启用
UE5.1_Gameplay Debugger启用 重点问题: Gamplay Debugger启用不知道? Apostrophe、Tilde键不知道是哪个? Gameplay调试程序 | 虚幻引擎文档 (unrealengine.com) Gameplay Debugger...
【论文阅读+复现】SparseCtrl: Adding Sparse Controls to Text-to-Video Diffusion Models
SparseCtrl:在文本到视频扩散模型中添加稀疏控制。 (AnimateDiff V3,官方版AnimateDiffControlNet,效果很丝滑) code:GitHub - guoyww/AnimateDiff: Official implementation of AnimateDiff. paper:htt…...
速盾cdn:ddos防护手段
速盾CDN采用多种手段来进行DDoS防护,以确保网络和网站的正常运行。以下是速盾CDN可能采用的一些主要DDoS防护手段: 实时监测和分析: 速盾CDN实时监测网络流量,通过分析流量模式来检测异常行为,以迅速发现潜在的DDoS攻击…...
STL——queue容器
1.queue基本概念 概念:queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。 队列容器允许从一端新增元素,从另一端移除元素。 队列中只有队头和队尾才可以被外界使用,因此队列不允许…...
gitLab页面打tag操作步骤
作者:moical 链接:gitLab页面打tag简单使用 - 掘金 (juejin.cn) 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ---------------------------------------------------------------------…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
