计算机教育中缺失的一课笔记
编辑器 (Vim)
先记录一些在命令行里面直接使用的快捷键
- ctrl + w 往回删除一个单词,光标放在最末尾
- ctrl + u 删除光标以前的字符
- ctrl + k 删除光标以后的字符
- ctrl + a 移动光标至的字符头
- ctrl + e 移动光标至的字符尾
- ctrl + l 清屏
vim用法记录
单词w,单词头b,单词尾e,句首0,句首^,句末$
改变c,单个替换s,下行插入o,上行插入O,句首插入I,句末插入A
操作 | 解释 |
---|---|
. | 可以用来重复上一次的操作 |
:s/foo/bar/g | 将当前行中的每个“foo”更改为“bar”。 |
:%s/foo/bar/g | 将所有行中的每个“foo”更改为“bar”。 |
:5,12s/foo/bar/g | 将从第5行到第12行(含)的所有行的每个“foo”更改为“bar”。 |
:’a,’bs/foo/bar/g | 将从标记a到标记b的所有行的每个“foo”更改为“bar” |
:’<,’>s/foo/bar/g | 使用可视模式时,将选择中所有行的每个’foo’更改为’bar’。 |
:.,$s/foo/bar/g | 将当前行(.)到最后一行($)的所有行的每个“foo”更改为“bar”。 |
:.,+2s/foo/bar/g | 将当前行(.)和下两行(+2)的每个“foo”更改为“bar”。 |
:g/^baz/s/foo/bar/g | 将每行中以“baz”开头的每个“foo”更改为“bar”。 |
分屏操作主要是使用Ctrl+w+后面的操作 | |
whjkl | 切换窗口 |
+-= | 调整窗口大小 |
sv | 横/竖屏打开当前文件 |
今晚研究了以下vim的高级用法,下面主要记录以下试了的插件
vim-easy-align
配置如下:
nmap ga <Plug>(EasyAlign)
xmap ga <Plug>(EasyAlign)
使用方法:
v模式下,选择要对齐的文本,输入ga
-
默认向左对齐,比如按照空格对齐 *
\* -
向右对齐
\* -
居中对齐
\* 如果遇到其他字符比如 , = 啥的,都把空格替换为对应的即可 *可以换成数字,对应后面的第几个字符,*就是全部都指定
syntastic
用来检查语法的,需要配合本地的语法检查插件,比如对于shell的shellcheck,效果挺好的。
不过我最后删掉了,因为这个对于c和python的效果不大好感觉,一会儿有有一会儿无,不知道是不是我自己的问题。
调了一会儿想清楚了,vscode不香吗?有的东西还是用vscode舒服呀。
下面是一个推荐的配置:
Plug 'scrooloose/syntastic'
" 启用syntastic插件
let g:syntastic_enable_signs=1
let g:syntastic_error_symbol='✗'
let g:syntastic_warning_symbol='⚠'
let g:syntastic_style_error_symbol = 'E'
let g:syntastic_style_warning_symbol = 'W'
" 在底部状态栏中显示syntastic信息
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
" 当文件被保存时自动检查语法
autocmd BufWritePre * SyntasticCheck
vim-snippets和ultisnips
用来自动补全代码的,两个配合使用,tab自动补全,配置如下:
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
貌似自己还可以配置,但是看起来应该很麻烦
fzf.vim
fzf的vim插件,前提是安装了fzf(git方式安装)
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
nmap <C-p> :Files<CR>
nmap <C-e> :Buffers<CR>
let g:fzf_action = { 'ctrl-e': 'edit' }
rainbow_parentheses.vim
用来把vim里面的括号变成彩色
Plug 'kien/rainbow_parentheses.vim'
let g:rbpt_colorpairs = [
\ ['brown', 'RoyalBlue3'],
\ ['Darkblue', 'SeaGreen3'],
\ ['darkgray', 'DarkOrchid3'],
\ ['darkgreen', 'firebrick3'],
\ ['darkcyan', 'RoyalBlue3'],
\ ['darkred', 'SeaGreen3'],
\ ['darkmagenta', 'DarkOrchid3'],
\ ['brown', 'firebrick3'],
\ ['gray', 'RoyalBlue3'],
\ ['black', 'SeaGreen3'],
\ ['darkmagenta', 'DarkOrchid3'],
\ ['Darkblue', 'firebrick3'],
\ ['darkgreen', 'RoyalBlue3'],
\ ['darkcyan', 'SeaGreen3'],
\ ['darkred', 'DarkOrchid3'],
\ ['red', 'firebrick3'],
\ ]
let g:rbpt_max = 16
let g:rbpt_loadcmd_toggle = 0
au VimEnter * RainbowParenthesesToggle
au Syntax * RainbowParenthesesLoadRound
au Syntax * RainbowParenthesesLoadSquare
au Syntax * RainbowParenthesesLoadBraces
youcompleteme
重量级插件,感觉是最有用的了,让我能够用vim写代码~~~
我的环境是Ubuntu18.04,原本是vim8.0,是配不上这个插件的,所以安装过程比较复杂。
# 更新vim到最新版
sudo add-apt-repository ppa:jonathonf/vim
sudo apt install vim
# 下载youcompleteme
# 我是直接用vim-plug下载的,即在~/.vimrc中添加
Plug 'ycm-core/YouCompleteMe'
# 然后 :PlugInstall
# 也可以直接git下载到~/.vim/plugged/YouCompleteMe
# 下载后并不能成功安装,因为环境不满足,只能手动安装
# python版本要求要3.8以上,下载python3.8
sudo apt-get install python3.8 python3.8-dev
# 顺手下了pip3.8
sudo apt-get install pip3.8
python3.8 -m pip install --upgrade pip
# 使用python3.8运行安装脚本
# 先尝试
/usr/bin/python3.8 ~/.vim/plugged/YouCompleteMe/install.py
# 提示用运行如下文件
/usr/bin/python3.8 ~/.vim/plugged/YouCompleteMe/third_party/ycmd/build.py --verbose
# 第一次失败,发现需要cmake(因为apt仓库里面的版本也不够,所以要手动安装cmake)
# 放到一个专门放软件的文件夹
wget https://github.com/Kitware/CMake/releases/download/v3.14.0/cmake-3.14.0-Linux-x86_64.tar.gz
tar xzf cmake-3.14.0-Linux-x86_64.tar.gz
# 解压了就可以直接用了,但是要先设置个环境变量
# 在自己终端的配置文件中添加如下(或者直接修改PATH)
export PATH=/home/kody/Software_deb/cmake-3.14.0-Linux-x86_64/bin:$PATH
# cmake就可以用了
cmake --version
# 再次尝试
/usr/bin/python3.8 ~/.vim/plugged/YouCompleteMe/third_party/ycmd/build.py --verbose
# 继续失败,发现还需要g++的版本也不够
# 这个可以直接下载
sudo apt-get install g++-8
# 配置以下update-alternatives,修改了默认的gcc和g++
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 700 --slave /usr/bin/g++ g++ /usr/bin/g++-7
# 再次尝试成功安装
/usr/bin/python3.8 ~/.vim/plugged/YouCompleteMe/third_party/ycmd/build.py --verbose
配置也比较复杂,自己看情况配置~
以下配置主要用来实现各种自动补全
Plug 'ycm-core/YouCompleteMe'
"YouCompleteMe Configure
"设置自动补全时的选项,longest表示优先选择匹配字符串最长的补全,menu表示使用菜单显示补
set completeopt=longest,menu
"离开插入模式后自动关闭预览窗口
autocmd InsertLeave * if pumvisible() == 0|pclose|endif
"回车即选中当前项
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>"
"上下键的行为
inoremap <expr> <Down> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <Up> pumvisible() ? "\<C-p>" : "\<Up>"
"youcompleteme 默认tab s-tab 和自动补全冲突
let g:ycm_key_list_select_completion = ['<Down>']
let g:ycm_key_list_previous_completion = ['<Up>']
"设置从tags文件收集标识符,以用于自动补全
let g:ycm_collect_identifiers_from_tags_files=1
"设置自动补全所需的最少字符数
let g:ycm_min_num_of_chars_for_completion=2
let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项
let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全
"F5键用于强制编译并进行诊断
nnoremap <F5> :YcmForceCompileAndDiagnostics<CR>
"设置<leader><leader>快捷键用于自动补全
inoremap <leader><leader> <C-x><C-o>
"在注释输入中也能补全
let g:ycm_complete_in_comments = 1
"在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
"注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
let g:clang_user_options='|| exit 0'
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳转到定义处
"改一下那个框框的颜色
highlight PMenu ctermfg=0 ctermbg=15 guifg=black guibg=darkgrey
highlight PMenuSel ctermfg=15 ctermbg=8 guifg=darkgrey guibg=black
它还可以配置.ycm_extra_conf.py用来检查语法,懒得搞了,还是vscode香哈哈哈,vim主要为了有时候的方便。
习题解答
用 Vim 宏将 XML 转换到 JSON (例子文件)。 尝试着先完全自己做,但是在你卡住的时候可以查看上面 宏 章节。
- Gdd, ggdd 删除第一行和最后一行
- 格式化最后一个元素的宏 (寄存器 e)
跳转到有<name>
的行qe^r"f>s": "<ESC>f<C"<ESC>q
- 格式化一个人的宏
跳转到有<person>
的行qpS{<ESC>j@eA,<ESC>j@ejS},<ESC>q
- 格式化一个人然后转到另外一个人的宏
跳转到有<person>
的行qq@pjq
- 执行宏到文件尾
999@q
- 手动移除最后的 , 然后加上 [ 和 ] 分隔符