沧歌


起风了,唯有努力生存


Vim 不放弃指南

vim入门

刚学习Linux的时候,就听说了编辑器之神Vim和神之编辑器Emacs,被看起来叼炸天的字符界面吸引,认为自己学会了使用就真是大牛了。 于是乎先尝试了那些全能配置(spf13-vim),然而一个个插件在众所周知的原因下安装极慢,好不容易装完了,在我的渣渣电脑上启动又慢的不行。 花了很多时间,工作却没做多少,遂产生了把Vim彻底抛弃的想法。可惜在服务器上除了Vim真没有太好的解决方案,通过百度谷歌再百度终于整出了一个适合自己的配置。

这篇文章就是整理记录一下自己使用vim的一些经验。 我不算是vim重度使用者,vim对我最大的帮助就是可以在终端里有一个非常顺手的编辑器,类似于我在Windows上必装的软件Notepad++。 所以我在下面的配置算是比较简单轻便,供大家参考。 说点废话:如果写比较大的项目推荐使用vscode,配合新出的remote-ssh插件可以方便的管理编辑服务器上的项目文件,网速好的时候体验和直接编辑本地文件毫无差别。

vim安装

首先我们安装vim-nox这个版本的vim。 使用命令是

sudo apt install vim-nox

比起apt install vim默认安装的vim,这个版本默认支持python3,不用自己编译,后续安装YouCompleteMe会方便很多。

vim基本操作

vim的模式

很多教程都说vim有三种模式,但这里要加上”可视模式”,在这个模式下面可以很方便的用键盘或鼠标选择文本(原谅我不是一个纯键盘党哈哈)。 模式切换方法参考下图。

vim-mode

入门教程vimtutor

在命令行键入vimtutor,即可进入该教程,通过交互操作迅速熟悉vim按键。 作为总(zhuang)结(bi),这里附上一张快捷键图。

vi-vim-cheat-sheet

vim进阶

定制你的vim

大而全的整套解决方案已经有不少,比如 spf13-vimSpaceVim。 我曾经尝试过spf13-vim,但安装比较麻烦(主要原因是国内网络问题),后来就没有再装。

下面是我现在一直使用的一个轻简的方案,只安装了最常用的老牌插件,有需要的可以copy。

如果想进一步定制,建议学习一点 vimscript 知识。 经典教程有Learn Vimscript the Hard Way。 w3cschool 也有中文版

轻简DIY方案

插件airline需要一些特殊符号,所以建议安装针对性修改的字体,比如 consolas-powerline

安装方法很简单,首先在$HOME目录下新建一个文件.vimrc。将下面的内容全部复制进去。 这个配置中我加了很多注释,方便大家学习修改。

set nocompatible              " be iMproved, required
filetype off                  " required

" 启用vundle来管理vim插件 {
    " vundle安装方法:
    " git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim --depth=1
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()
        " 安装插件写在这之后

        " let Vundle manage Vundle, required
        Plugin 'VundleVim/Vundle.vim'
        Plugin 'bling/vim-airline'
        Plugin 'altercation/vim-colors-solarized'
        Plugin 'tomasr/molokai'
        Plugin 'mechatroner/rainbow_csv'

        Plugin 'scrooloose/nerdtree'
        Plugin 'jistr/vim-nerdtree-tabs'  " 多个tab共享一个nerdtree
        " Plugin 'Xuyuanp/nerdtree-git-plugin'

        Plugin 'Valloric/YouCompleteMe'

        " 安装插件写在这之前
    call vundle#end()            " required
    filetype plugin on    " required

    " 常用命令
    " :PluginList       - 查看已经安装的插件
    " :PluginInstall    - 安装插件
    " :PluginUpdate     - 更新插件
    " :PluginSearch     - 搜索插件,例如 :PluginSearch xml就能搜到xml相关的插件
    " :PluginClean      - 删除插件,把安装插件对应行删除,然后执行这个命令即可

    " h: vundle         - 获取帮助

" } vundle的配置到此结束,下面是你自己的配置

set nu!   " 显示行号
syntax on " 代码高亮

set mouse=a         " 启用鼠标
set cursorline      " 突出显示当前行
" set cursorcolumn    " 突出显示当前列


set laststatus=2  "永远显示状态栏
set t_Co=256      "在windows中用xshell连接打开vim可以显示色彩
set background=dark

" 在 vim 的命令模式下输入 :digraph,就可以查看想要的字符,记住字符左边的输入方式。
" 在插入模式下,点击快捷键 Ctrl-k,然后输入上一步你记住的编码,就可以了。

" 设置一个 tab 显示出来是多少个空格的长度,默认8
set tabstop=4
" 这个设置表示缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进。
set expandtab
" 表示在编辑模式的时候按退格键的时候退回缩进的长度,简单的说就是去掉自动缩进产生的空格,当
" set expandtab 的时候如果你不设置这个选项的时候,你必须一格一格的往前删除,
" 如果设置了这个选项的话,就可以一次就往前删除指定个数的空格
set softtabstop=4
" 表示当缩进的时候,每一级的缩进长度
set shiftwidth=4

" Show invisible characters
set listchars=eol:¬,tab:>-,trail:~,extends:>,precedes:<
set list

" Theme, color settings {
    "colorscheme solarized
    colorscheme molokai
    " colorscheme desert

    "  solarized theme
    let g:solarized_termtrans=1
    let g:solarized_contrast="normal"
    let g:solarized_visibility="normal"

    " monokai原始背景色
    let g:molokai_original = 1

    " 让空白字符的颜色不显眼
    " 非可见字符 eol extends precedes 是由 NonText 高亮组来控制显示颜色的
    hi NonText ctermfg=235 " 239
    " nbsp tab trail 是由 SpecialKey 高亮组来定义颜色的
    hi SpecialKey ctermfg=235 " 239
" }

" airline {
    " 打开tabline功能,方便查看Buffer和切换,这个功能比较不错"
    " 我还省去了minibufexpl插件,因为我习惯在1个Tab下用多个buffer"
    let g:airline#extensions#tabline#enabled = 1
    let g:airline#extensions#tabline#buffer_nr_show = 1
    " 这个是安装字体后 必须设置此项
    " let g:airline_powerline_fonts = 1   
" }

" nerdtree etc {
    " 在终端启动vim时,共享NERDTree
    " let g:nerdtree_tabs_open_on_console_startup=1
    " 显示书签列表
    " let NERDTreeShowBookmarks=1
" }

" F1 - F5 Key settings {
    " can type :help on my own, thanks.  Protect your fat fingers from the evils of <F1>
    noremap <F1> <Esc>"
    " Toggle NERDTree
    noremap <F2> :NERDTreeMirrorToggle<CR>

    " F3 显示可打印字符开关
    function! HideNumberInfo()
        set list!
        set number!
    endfunc
    nnoremap <F3>  :call HideNumberInfo()<CR>
    " :exec ':set list! list? :set number! number?'<CR>
    " F4 换行开关
    function ToggleWrap()
      if &wrap
        echo "Wrap OFF"
        setlocal nowrap
        set virtualedit=all
        silent! nunmap <buffer> <Up>
        silent! nunmap <buffer> <Down>
        silent! nunmap <buffer> <Home>
        silent! nunmap <buffer> <End>
        silent! iunmap <buffer> <Up>
        silent! iunmap <buffer> <Down>
        silent! iunmap <buffer> <Home>
        silent! iunmap <buffer> <End>
      else
        echo "Wrap ON"
        setlocal wrap linebreak nolist
        set virtualedit=
        setlocal display+=lastline
        noremap  <buffer> <silent> <Up>   gk
        noremap  <buffer> <silent> <Down> gj
        noremap  <buffer> <silent> <Home> g<Home>
        noremap  <buffer> <silent> <End>  g<End>
        inoremap <buffer> <silent> <Up>   <C-o>gk
        inoremap <buffer> <silent> <Down> <C-o>gj
        inoremap <buffer> <silent> <Home> <C-o>g<Home>
        inoremap <buffer> <silent> <End>  <C-o>g<End>
      endif
    endfunction
    nnoremap <F4> :call ToggleWrap()<CR>

    " F6 语法开关,关闭语法可以加快大文件的展示
    nnoremap <F6> :exec exists('syntax_on') ? 'syn off' : 'syn on'<CR>

    set pastetoggle=<F5>            "    when in insert mode, press <F5> to go to
                                    "    paste mode, where you can paste mass data
                                    "    that won't be autoindented

    " disbale paste mode when leaving insert mode
    au InsertLeave * set nopaste

    " F5 set paste问题已解决, 粘贴代码前不需要按F5了
    " F5 粘贴模式paste_mode开关,用于有格式的代码粘贴
    " Automatically set paste mode in Vim when pasting in insert mode
    function! XTermPasteBegin()
      set pastetoggle=<Esc>[201~
      set paste
      return ""
    endfunction
    inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
" }

然后,就如注释里所说的,首先安装插件管理器Vundle

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim --depth=1

之后用vim命令打开vim,忽视报错信息,输入:PluginInstall安装插件。 如果遇到网络问题安装失败,重启再安装一次即可。

之后,编译安装补全插件YouCompleteMe。 注意这里没有C/C++补全支持,如需要建议参考YCM官网

sudo apt install build-essential cmake  # 安装编译所需组件
cd ~/.vim/bundle/YouCompleteMe/
python3 install.py  # 编译安装YouCompleteMe

至此安装结束,效果如图

vim-screenshot

琐碎的知识点

文件编码

以指定的编码打开某文件,如打开windows中以ANSI保存的文件

vim file.txt -c "e ++enc=GB18030"

vim中的操作:

:set fileencoding               " 显示文件编码格式
:set fileencoding=utf-8   " 文件编码转换,如将一个文件转换成utf-8格式
:set fileformat?                   "  查看文件格式
:set fileformat=unix         " 设置文件格式为 unix,即以`LF`换行

代码缩进

缩进单行代码是两个大于号>>,回缩是两个小于号<<

如果想要缩进很多行代码的话就按照下面做

:10,100>      " 第10行至第100行缩进
:20,80<        " 第20行至第80行反缩进

还可以这样

1  //在这里按下'v'进入可视模式(shift + v 可以直接选中行)
111111 //光标移动到这里,再按一次大于号'>'缩进一次,按'6>'缩进六次,按'<'回缩。以下同理

function helo{ //将光标移动到'{',在按下'%',光标将会移动到匹配的括号
//这里省略1000行
} //光标会移动到这里,再按一次大于号'>'就可以缩进

// 可视模式中选中代码块,按`=`号可以自动缩进。

复制粘贴

在vim中复制粘贴直接用vim命令即可,这里说说如何使用鼠标 (mouse选项必须设置,见上配置文件)。

用鼠标在可视模式中复制/粘贴:

  1. 在文本的第一个字符上按住鼠标左键,移动鼠标到文本的最后一个字符,然后释放左键。这会启动可视模式并高亮选择区域。(在第一个字符上单击鼠标左键,在文本的最后一个字符单击右键,效果相同)
  2. y 抽出可视文本到无名寄存器里。
  3. 在要插入的位置上按鼠标左键。
  4. 按鼠标中键(滚轮)。(效果同输入P)

那么如何在终端和其他应用之间复制粘贴呢? 先按住shift键(这样可以将操作直接发送给终端而不是vim),选中要复制的部分,然后单击右键,在菜单中选择复制。 复制前先关闭行号和空白字符显示,这个在上述配置文件中已经绑定了快捷键<F3>

那要是需要复制的文本超过终端显示的行数呢? 这我也没找到办法,我遇到这种情况都是先用cat命令将文件内容输出到终端,再复制。 如果你有更好的办法请评论留言^_^。

在vim里,粘贴代码之前最好进入粘贴模式set paste,这样就会关闭自动缩进。 将代码粘贴进去之后再关闭粘贴模式set nopaste。 这个在上述配置文件中已经绑定了快捷键<F5>

切换查看buffers

注意在vim中buffer和tab不是一个概念。功能类似浏览器标签页的是buffer (在上述配置方案中显示在最上方)。 使用 :bn, :bp, :b #, :b name, 和 ctrl-6 可以在buffer之间切换. 我喜欢 ctrl-6这个快捷建。 还有#ctrl-6 ,可以切换到编号为#的buffer。使用 :ls列出所有buffers, 此外还有插件MiniBufExplBufExplorer可供选择。

参考资料

  • wklken/k-vim https://github.com/wklken/k-vim
  • 在Vim中查看文件编码和文件编码转换 - 简书 https://www.jianshu.com/p/36286fa7a9ed
  • Vim Tab Madness. Buffers vs Tabs - Josh Davis https://joshldavis.com/2014/04/05/vim-tab-madness-buffers-vs-tabs/
最近的文章

充分利用服务器加速机器学习研究

作为一个机器学习/深度学习 用户,PC已经不能满足你的计算需求,使用远程服务器又感觉诸多不便。直接给服务器安装一个图形界面也是一个可行的办法。但这种交互方式对网速要求很高,占用资源也较多,很多服务器上都没有安装。此文旨在提供一个解决方案地图,讨论的都是没有图形界面的情况。技能树如图:针对上图提出的各个技能,这里整理了一下我学习时看的网络资源。环境管理Anaconda提供了机器学习一整套环境,...…

machine-learning linux继续阅读
更早的文章

双调排序的并行实现

双调排序是比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU、FPGA来计算。当要排序的数的个数不是2的幂时,处理时较为困难。本文介绍了一种非padding的解决方案。算法实现目标给出分成m段的n个浮点数,输入数据已按段号有序,但每段内部无序。用C/C++ 编写一个分段双调排序(Bitonic sort)函数,对每一段内部的浮点数进行排序,但不要改变段间的位置。接口方式:voi...…

algorithm c parallel继续阅读