Learning Vim

    技术2026-08-30  7

    vim + filename          打开文件并将光标置于最后一行 vim +n filename         打开文件并将光标置于第n行行首 vim +/pattern filename  打开文件并将光标置于匹配模式pattern的第一个串处

    :f              可以查看当前文件名  

    :!pwd           可以查看当前目录

    /\<abc\>        可以实现精确匹配

    Ctrl+n/Ctrl+p   可以实现单词自动补齐

    Ctrl+a/Ctrl+x   可以实现数字加1/减1

    Ctrl+o/Ctrl+i   执行向后/向前跳转

    gd 跳转到光标处的局部变量的定义处,并将此关键字高亮 (如果对全局变量则会跳转至所在函数对其的第一次引用处) gD 对于局部变量同'gd';对于全局变量,跳转到定义处,并将此关键字高亮 gf 打开光标处的字符串指定的文件 (会在 path中寻找 --->:set path ) ga 获取光标处字符的ASCII码(8,10,16进制) [i 快速察看光标所在位置的变量的定义 [d 快速察看光标所在位置的宏的定义 [{ 跳转到光标所在程序块的开头 ]} 跳转到光标所在程序块的结尾

    Q: 如何改变分割窗口的大小 -----------------------------------------------------------

    nmap    w=  :resize +3<CR> nmap    w-  :resize -3<CR> nmap    w,  :vertical resize -3<CR> nmap    w.  :vertical resize +3<CR>

    Q: 搜索字符串之正则表达式 ----------------------------------------------------------- 搜索字符串用的是正规表达式(Regular expression),其中许多字符都有特殊含义: /        取消后面所跟字符的特殊含义。比如 /[vim/] 匹配字符串“[vim]” []       匹配其中之一。比如 [vim] 匹配字母“v”、“i”或者“m”,[a-zA-Z] 匹配任意字母 [^]      匹配非其中之一。比如 [^vim] 匹配除字母“v”、“i”和“m”之外的所有字符 .        匹配任意字符 *        匹配前一字符大于等于零遍。比如 vi*m 匹配“vm”、“vim”、“viim”…… /+       匹配前一字符大于等于一遍。比如 vi/+m 匹配“vim”、“viim”、“viiim”…… /?       匹配前一字符零遍或者一遍。比如 vi/?m 匹配“vm”或者“vim” ^        匹配行首。例如 /^hello 查找出现在行首的单词 hello $        匹配行末。例如 /hello$ 查找出现在行末的单词 hello /(/)     括住某段正规表达式 /数字    重复匹配前面某段括住的表达式。例如 /(hello/).*/1 匹配一个开始和末尾都是“hello”,中间是任意字符串的字符串 对于替换字符串,可以用“&”代表整个搜索字符串,或者用“/数字”代表搜索字符串中的某段括住的表达式。 举一个复杂的例子,把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以 有下列写法: :%s/abc/(.*/)xyz/xyz/1abc/g :%s//(abc/)/(.*/)/(xyz/)//3/2/1/g 其它关于正规表达式搜索替换的更详细准确的说明请看 :help pattern 。

    Q: 高级删除操作 ----------------------------------------------------------- (1) 删除包含/不包含指定内容的行

    可以用":help g"获得g命令的详细帮助. g命令的格式为:     [range]global/{pattern}/{command} global命令在[range]指定的文本范围内(缺省为整个文件)查找{pattern},然后对匹配到的行执行命令{command},如果希望对没匹配上的行执行命令,则使用global!或vglobal命令。

        :g/pattern/d

        :g!/pattern/d     :v/pattern/d

    PS: 如果用sed,可以执行 sed '/pattern/d' file.txt

    (2) 删除DOS格式的回车^M,这里^M的输入方法是Ctrl-V Ctrl-M :%s/^M$//g

    (3) 删除行尾空白

    :%s= *$==  

    (4) 删除文件中所有的空行 :%g/^$/d :g/^/s*$/d (5) 删除文件中所有的重复行 :g/s*^$/d :g//%(^/1$/n/)/@<=/(.*/)$/d :g/^/(.*/)$/n/1$/d :%s/^(.*)n1/1$/ (本博按:删除无字符行应用:g/^$/d 删除有一些空格的行应用 :g/^/s*$/d 表示以空格开头(/s)若干个的行) :%s/<!--_.{-}-->// 删除多行注释 :%s/^.{-}pdf/new.pdf/ 只是删除第一个pdf :g!/^dd/d 删除不含字符串'dd'的行 :v/^dd/d 同上 (译释:v == g!,就是不匹配!) :g/str1/,/str2/d 删除所有第一个含str1到第一个含str2之间的行

    Q: 批量复制/文件间复制 ----------------------------------------------------------- (1) 命令行模式下输入   :5,10 co 12 (2) 标签   光标移到起始行,输入ma   光标移到结束行,输入mb   光标移到粘贴行,输入mc   然后 :'a,'b co 'c   把 co 改成 m 就成剪切了 (3) 文件间 也可以把大量的代码保存到一个文件,然后在另一个文件里打开需要拷贝的代码。    文件一:     光标移到起始行,输入ma     光标移到结束行,输入mb     然后:'a, 'b w filename 文件二:     光标移到需要赋值的行,输入:     :r filename Q: 批量文件查找与替换 -----------------------------------------------------------

    args * argdo %s/<old_word>/<new_word>/ge | update For Example: args *.c argdo %s/old/new/ge | update argdo %s/OLD/NEW/ge | update argdo %s/Old/New/ge | update args *.c argdo %s/old/new/ge | argdo %s/OLD/NEW/ge | argdo %s/Old/New/ge | update :bufdo %s/old/new/ge | %s/Old/New/ge | %s/OLD/NEW/ge | update

    查找类似DP1,DP25,DP382等等的字符串,并替换成DP

    %s/DP\d\+/DP/g

    参考资料

    1. Vim学习笔记4: Vim高级命令

    2. vi使用详解

    3. vim 使用技巧

    4. 使用vim分割窗口时如何改变窗口的尺寸

    5.vim 全局替换命令及正则表达式

    最新回复(0)