【缺失的一课3】

编辑器vim

Posted by Kody Black on January 3, 2023

计算机教育中缺失的一课笔记

编辑器 (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 (例子文件)。 尝试着先完全自己做,但是在你卡住的时候可以查看上面 章节。

  1. Gdd, ggdd 删除第一行和最后一行
  2. 格式化最后一个元素的宏 (寄存器 e)
    跳转到有 <name> 的行 qe^r"f>s": "<ESC>f<C"<ESC>q
  3. 格式化一个人的宏
    跳转到有 <person> 的行 qpS{<ESC>j@eA,<ESC>j@ejS},<ESC>q
  4. 格式化一个人然后转到另外一个人的宏
    跳转到有 <person> 的行qq@pjq
  5. 执行宏到文件尾 999@q
  6. 手动移除最后的 , 然后加上 [ 和 ] 分隔符