Jade Dungeon

Vim基础

常用设置

set (no)wrap                % 是否换行
set (no)list                % 显示空白字符,`^I`为Tab,`$`为行结束符

多文件操作

编辑远程文件

vim已经包含了netrw插件,直接vim scp://host/path/to/file

找到已经打开文件的窗口

定义了SwitchToBuf()函数,它在所有标签页的窗口中查找指定的文件名,如果找到这样 一个窗口,就跳到此窗口中;否则,它新建一个标签页来打开vimrc文件。 (注:标签页(tab)功能只有在vim 7.0版本以上才支持。)

function! SwitchToBuf(filename)
    "let fullfn = substitute(a:filename, "^\\~/", $HOME . "/", "")
    " find in current tab
    let bufwinnr = bufwinnr(a:filename)
    if bufwinnr != -1
        exec bufwinnr . "wincmd w"
        return
    else
        " find in each tab
        tabfirst
        let tab = 1
        while tab <= tabpagenr("$")
            let bufwinnr = bufwinnr(a:filename)
            if bufwinnr != -1
                exec "normal " . tab . "gt"
                exec bufwinnr . "wincmd w"
                return
            endif
            tabnext
            let tab = tab + 1
        endwhile
        " not exist, new tab
        exec "tabnew " . a:filename
    endif
endfunction

移动和跳转

基本移动

  • 当前行位于屏幕中间:zz
  • 跳回之前修改的地方:Control + o,回到跳来的地方:Control + i

查看操作

十六进制查看

:%!xxd

回到文本模式

:%!xxd -r

比对不同

vimdiff

vimdiff 命令,它可以使用分离模式打开 Vim 并比较两个文件的不同。语法如下:

$ vimdiff [文件1] [文件2]

diffthis

  1. 在分割出多个窗口中,不同窗口中打开不同文件。
  2. 在要对比的窗口中命令模式:diffthis,或在一个窗口中windo diff

也可以直接在一个缓冲区里使用命令:windo diffthis,而不用输入 :diffthis 两次)

要停止比较,使用::diffoff

编辑操作

书签

方法是按Escape键,再按M键,然后输入az中的一个表示书签, 所以最多可以有26个书签。

跳转到书签,按Escape键,再按反引号加标签。

选择

windows下块选择默认是Control + q

命令模式

命令模式下粘贴寄存器的内容,通过CTRL+R加寄存器的名字:

  • 默认寄存器就是CTRL+R"
  • 第一寄存器就是CTRL+R1

保存与版本控制

部分内容另存为

:5,77w>>tmp.txt
  • 5,77表示范围从5行到55行;可以用美元符表示最后一行。
  • w是保存,加上了>>表示是追加而不是覆写。

以root权限保存

:w !sudo tee %

这会直接以 root 方式保存。

按时间回退文件

Vim 会记录文件的更改,你很容易可以回退到之前某个时间。该命令是相当直观的。比如:

:earlier 1m

会把文件回退到 1 分钟以前的状态。

注意,你可以使用下面的命令进行相反的转换:

:later

调用内部命令

表达式求值

在插入模式下:

  1. Control + r
  2. =表达式如:= 2 + 2

会在光标位置加计算结果。

加密

普通模式下通过g?对文件进行ROT13编码。

调用外部命令

在普通模式下:

:<范围>!<命令>

例如:

:!ls -l

通过:r添加命令输出的文本到当前打开的文档中:

:r !ls -l

指定行号

例如,对全文内容进行排序:

:1,$!sort

注意1,美元符表示范围:其中1表示是第一行;美元符表示最后一行。

然后sort命令的结果会替换全文。

指定行数

在普通模式下,先是输入行数,然后两个感叹号!!来调用外部命令。

如,要对当前行开始的两行排序:要先Esc到普通模式,然后2!!sort

用管道连接外部命令

可以使用管道分隔符|把 UNIX 命令连接在一起。

例如,要把缓冲区中内容是由空格分成的多个列。现在要进行多个操作:

  • 取第一列
  • 按升序排序
  • 全转换为大写

那么在普通模式下:

:1,$!awk '{print $1}' | sort | tr [:lower:] [:upper:]

执行当前正编辑的文件

运行当前文件普通模式下:

:!./%
  • :进入command-mode
  • !在shell执行后面的命令
  • ./这个是shell里面执行当前目录下可执行文件的必要前缀
  • %表示当前文件, 会自动扩展为当前文件名

先保存再运行:

:w|!./%

就是先保存再运行:

  • w是保存文件
  • |是命令连接符, 和shell中的管道差不多

%只会扩展为文件名, 不带路径, 所以当前路径:pwd必须是这个文件的路径

quickfix

调用外部命令以后,如果想要仔细查看命令的输出,如编译的错误信息并跳转到对应的行 ,quickfix就很管用了。

  • :cc :显示详细条目信息 ( :help :cc )
  • :cw :如果有条目列表,则打开quickfix窗口 ( :help :cw )
  • :cp :跳到上一个条目 ( :help :cp )
  • :cn :跳到下一个条目 ( :help :cn )
  • :cl :列出所有条目 ( :help :cl )
  • :col :到前一个旧的条目列表 ( :help :col )
  • :cnew:到后一个较新的条目列表 ( :help :cnew )

对于经常用到的命令,最好提供更方便的使用方法,在我的vimrc中的定义:

autocmd FileType c,cpp  map <buffer> <leader><space> :w<cr>:make<cr>
nmap <leader>cn :cn<cr>
nmap <leader>cp :cp<cr>
nmap <leader>cw :cw 10<cr> 

现在使用,<space>(先按,再按空格)就可以编译,使用,cp,cn跳到上一个和下一个 错误,使用,cw来打开一个quickfix窗口。这下顺手多了!

如果你希望跳转到出错的文件时,使用一个分隔的窗口打开,请参阅switchbuf选项的 值。

在vim7中,每个窗口都可以拥有自己的位置列表,这样,你就能够同时打开多个位置列表 了,而quickfix列表在整个vim中只有一个。你可以使用位置列表来显示编译错误信息, 具体命令参阅手册::help location-list以及:help :lmake