用户工具

站点工具


语法:gvim

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
语法:gvim [2024/01/13 10:52] – 移除 - 外部编辑 (Unknown date) 127.0.0.1语法:gvim [2024/07/03 08:09] (当前版本) – [2.1 tab转空格] user01
行 1: 行 1:
 +====== gvim ======
  
 +
 +
 +
 +
 +===== - windows gvim =====
 +
 +
 +==== - _vimrc ====
 +<code vim>
 +set nocompatible
 +source $VIMRUNTIME/vimrc_example.vim
 +"source $VIMRUNTIME/mswin.vim
 +"behave mswin
 +set encoding=utf-8
 +
 +set tabstop=4
 +set shiftwidth=4
 +set expandtab
 +set autoindent
 +
 +</code>
 +
 +==== - 菜单语言切换为英文 ====
 +在_vimrc文件末尾加入以下内容
 +<code vim>
 +set langmenu=en_US
 +let $LANG= 'en_US'
 +source $VIMRUNTIME/delmenu.vim
 +source $VIMRUNTIME/menu.vim
 +</code>
 +
 +
 +
 +
 +==== - gvim支持中文显示 ====
 +<code vim>
 +set fileencodings=utf-8,gbk,gb2312,gb18030
 +" set termencoding=utf-8
 +"set fileformats=unix
 +"set encoding=utf-8
 +</code>
 +
 +==== - 保持linux操作方式,比如支持Ctrl-V 选择 ====
 +注释以下行
 +<code vim>
 +"source $VIMRUNTIME/mswin.vim
 +</code>
 +
 +==== - tab宽度及其它 ====
 +<code vim>
 +set expandtab
 +set shiftwidth=4
 +set tabstop=4
 +set noundofile
 +set cursorline
 +set cursorcolumn
 +set nobackup
 +</code>
 +
 +===== - 用法技巧等 =====
 +==== - tab转空格 ====
 +<code>
 +:retab
 +</code>
 +
 +==== - 显示match匹配行数 ====
 +<code vim>
 +:%s/xxx//gn
 +
 +[g] 替换行中出现所有匹配,否则只替换第一个。
 +[n] 意思是显示匹配数,但是不做实际的替换操作; 如果有g选项的话,则计算所有的匹配数。
 +[i] 匹配时忽略大小写, set ignorecase在这不起作用
 +[I] 匹配时不忽略大小写, , set ignorecase在这不起作用
 +</code>
 +
 +==== - 输入时不自动换行 ====
 +<code vim>
 +set textwidth=0
 +</code>
 +默认情况下,其width值为78。设置为0就相当于关闭这个功能,设置成正值就可以让 vim 在指定长度上折行。
 +
 +==== - gvim启动时窗口默认最大化 ====
 +
 +linux环境,在.vimrc文件中加入以下内容:
 +
 +<code vim>
 +if has("gui_running")
 +  " GUI is running or is about to start.
 +  " Maximize gvim window (for an alternative on Windows, see simalt below).
 +  set lines=999 columns=999
 +else
 +  " This is console Vim.
 +  if exists("+lines")
 +    set lines=50
 +  endif
 +  if exists("+columns")
 +    set columns=100
 +  endif
 +endif
 +</code>
 +以上的数值可以根据实际情况再作微调。
 +
 +如果只是想把gvim窗口设置到合适大小,可以根据情况自行调整lines和columns的大小。
 +
 +windows环境,在_vimrc文件中加入以下内容:
 +<code vim>
 +autocmd GUIEnter * simalt ~x
 +</code>
 +
 +
 +
 +==== - gvim窗口初始位置 ====
 +有时候可能会有调整gvim窗口刚打开时的窗口初始位置,比如固定为左上角,右上角,居中等等,可以通过下面的方式去设置它的初始窗口位置。
 +<code vim>
 +# 在.vimrc文件写入如下语句,将gvim窗口放在指定位置, x y 分别为想设置的x轴y轴坐标
 +:winpos x y
 +</code>
 +
 +
 +==== - vim打开文件时回到上次浏览位置 ====
 +
 +<code vim>
 +"remember last update or view postion"
 + " Only do this part when compiled with support for autocommands
 + if has("autocmd")
 + " When editing a file, always jump to the last cursor position
 + autocmd BufReadPost *
 + \ if line("'\"") > 0 && line ("'\"") <= line("$") |
 + \ exe "normal g'\"" |
 + \ endif
 + endif
 +</code>
 +
 +
 +以下是来自于gvim help '" last-position-jump \\
 +This autocommand jumps to the last known position in a file just after opening it, if the '" mark is set: >
 +<code vim>
 +au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
 +</code>
 +==== - 显示当前文件的完整路径 ====
 +先按下数字键1, 然后再按Ctrl + G
 +<code>
 +CTRL-G          打印当前文件名
 +
 +{count}CTRL-G   1CTRL-G 打印当前文件全路径名
 +                If the count is higher than 1 the current buffer number is also given. 
 +</code>
 +==== - vimdiff 忽略空格 ====
 +
 +https://www.dazhuanlan.com/2019/12/07/5deb081359393/
 +
 +只需在vimrc文件中加入以下:
 +<code vim>
 +set diffopt+=iwhite
 +</code>
 +或者
 +<code vim>
 +if &diff
 +    set diffopt+=iwhite
 +endif
 +</code>
 +
 +或者
 +<code vim>
 +if &diff
 +  map gs :call IwhiteToggle()<CR>
 +  function! IwhiteToggle()
 +    if &diffopt =~ 'iwhite'
 +      set diffopt-=iwhite
 +    else
 +      set diffopt+=iwhite
 +    endif
 +  endfunction
 + endif
 +</code>
 +
 +或者以下面的命令方式启动比较:
 +<code bash>
 +vimdiff -c 'set diffopt+=iwhite'
 +</code>
 +
 +
 +
 +==== - 批处理命令执行 ====
 +比如以下的命令
 +<code vim>
 +:%s/^\w\+/cc/
 +:%s/good/bad/
 +</code>
 +
 +假设是期望依次执行上述语句,可以将其保存到一个临时文件,比如abc.vim, 然后在vim窗口中执行'':source abc.vim'',即可以把上述命令依次执行,这样可以减少一些人工操作,而又不用使用其它的脚本语言来处理。
 +
 +
 +==== - 在每行内容前插入行号 ====
 +
 +:set number 命令可以在 vim 中显示行号,但是如何让 vim 在真正的文件中添加行号呢? 比如说当你要打印代码的时候,或者将代码粘贴到网上的时候,在代码中添加行号会更利于浏览,废话说了这么多,其实只要一行命令就可以搞定。
 +
 +<code vim>
 +" ===== 正向顺序
 +:g/^/exe ":s/^/" . line(".")
 +
 +" ====== 反向顺序, 行中的70为首行号,可以根据情况自行修改。
 +:g/^/exe ":s/^/" . 70-line(".")
 +
 +
 +
 +" ===== 也可以加入printf, 修改行号占用的宽度,比如占用4位宽,这样显得比较对齐。
 +:g/^/exe ":s/^/" . printf("%4d ", line("."))
 +
 +
 +" ===== 选中范围行首插入行号, 行号后面再补一个空号,   下面g前面有空格和无空格都可以
 +:'<,'>g//exe ":s/^/" . line(".") . " "
 +:'<,'> g//exe ":s/^/" . line(".") . " "
 +
 +" ===== 10行到30行首插入行号, 行号后面再补一个空号,  下面g前面必须要加入空格
 +:10,30 g//exe ":s/^/" . line(".") . " "
 +
 +
 +" ===== 语法解释: 匹配到^的每一行都执行 exe :s/^/xxx/, 其中xxx是line() 或者printf计算后的字符。
 +
 +
 + ========= 以下这种方式也可以,显得好像更简单一些
 +:%s/^/\=printf('%04d',line('.'))/
 +:%s/^/\=printf('%04d',300 - line('.'))/
 +:%s/^/\=printf('%04d',line('.') - 20)/
 +</code>
 +
 +
 +==== - 表达式替换 ====
 +比如一个文件内容为:
 +<code>
 +AAAA
 +AAAA
 +AAAA
 +</code>
 +需要替换为如下样式:
 +<code>
 +BBBB_1
 +BBBB_2
 +BBBB_3
 +</code>
 +注意看,123分别是行号,可以采用以下命令进行vim替换操作.
 +<code>
 +:%s@AAAA@\="BBBB_".line(".")@
 +</code>
 +
 +这里用到的\=,后面就是跟需要的表达式就行。
 +
 +
 +==== - iskeyword ====
 +参考: https://zhuanlan.zhihu.com/p/115200953
 +
 +<code vim>
 +iskeyword, 简写为isk
 +set iskeyword
 +set isk
 +</code>
 +
 +使用 ''set iskeyword'', 显示当前vim word 分词,方便搜索当前word, 不会乱分词。
 +
 +注意,有的语法加载会修改这个分词,导致使用gvim造成不便。
 +
 +通过执行''verbose set iskeyword'', 可以显示是谁修改了iskeyword。
 +
 +如果发现iskeyword被修改,可以单独再把它修改回来,这样避免后面的不便。
 +
 +===== - vim正则表达式 =====
 +
 +
 +<code vim>
 +Vim中的正则表达式
 +
 +. 匹配任意一个字符
 +[abc] 匹配方括号中的任意一个字符。可以使用-表示字符范围, 如[a-z0-9]匹配小写字母和阿拉伯数字
 +[^abc] 在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符
 +\d 匹配阿拉伯数字,等同于[0-9]
 +\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
 +\x 匹配十六进制数字,等同于[0-9A-Fa-f]
 +\X 匹配十六进制数字,等同于[^0-9A-Fa-f]
 +\w 匹配单词字母,等同于[0-9A-Za-z_]
 +\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
 +\t 匹配<TAB>字符
 +\s 匹配空白字符,等同于[ \t]
 +\S 匹配非空白字符,等同于[^ \t]
 +\a 所有的字母字符. 等同于[a-zA-Z]
 +\l 小写字母 [a-z]
 +\L 非小写字母 [^a-z]
 +\u 大写字母 [A-Z]
 +\U 非大写字母 [^A-Z]
 +
 +表示数量的元字符
 +* 匹配0-任意个
 +\+ 匹配1-任意个
 +\? 匹配0-1个
 +\{n,m} 匹配n-m个
 +\{n} 匹配n个
 +\{n,} 匹配n-任意个
 +\{,m} 匹配0-m个
 +\_. 匹配包含换行在内的所有字符
 +\{-} 表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好   --- 非贪婪匹配
 +\= 匹配一个可有可无的项
 +\_s 匹配空格或断行
 +\_[]
 +\* 匹配 * 字符
 +\. 匹配 . 字符
 +\/ 匹配 / 字符
 +\\ 匹配 \ 字符
 +\[ 匹配 [ 字符
 +
 +表示位置的符号
 +$ 匹配行尾
 +^ 匹配行首
 +\< 匹配单词词首
 +\> 匹配单词词尾
 +
 +替换变量
 +在正规表达式中使用 和 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 和 中的内容
 +
 +懒惰模式
 +\{-n,m} 与\{n,m}一样,尽可能少次数地重复
 +\{-} 匹配它前面的项一次或0次, 尽可能地少
 +\| "或"操作符
 +\& 并列
 +
 +函数式
 +:s/替换字符串/\=函数式
 +在函数式中可以使用 submatch(1)、submatch(2) 等来引用 \1、\2 等的内容,而submatch(0)可以引用匹配的整个内容
 +
 +与Perl正则表达式的区别
 +
 +Vim语法 Perl语法 含义
 +\+             1- 任意个
 +\?       ?       0-1 个
 +\{n,m}   {n,m}   n-m 个
 +和   (和)     分组
 +
 +例如:
 +1,去掉所有的行尾空 格:“:%s/\s\+$//”。“%”表示在整个文件范围内进行替换,“\s”表示空白字符(空格和制表符),“\+”对前面的字符匹配一次或多次(越 多越好),“___FCKpd___0rdquo;匹配行尾(使用“\___FCKpd___0rdquo;表示单纯的 “___FCKpd___0rdquo;字符);被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志。这个还是比较简单的。 (/<Space><Tab>)
 +2,去掉所有的空白 行:“:%s/\s∗\n\+/\r/”。这回多了“”、“”、“\n”、“\r”和 “*”。“*”代表对前面的字符(此处为“\s”)匹配零次或多次(越多越好;使用“\*”表示单纯的“*”字符),“\n”代表换行符,“\r”代表回 车符,“”和“”对表达式进行分组,使其被视作一个不可分割的整体。因此,这个表达式的完整意义是,把连续的换行符(包含换行符前面可能有的连续 空白字符)替换成为一个单个的换行符。唯一很特殊的地方是,在模式中使用的是“\n”,而被替换的内容中却不能使用“\n”,而只能使用“\r”。原因是 历史造成的,详情如果有兴趣的话可以查看“:help NL-used-for-Nul”。
 +3,去掉所有的“//”注 释:“:%s!\ s*//.*!!”。首先可以注意到,这儿分隔符改用了“!”,原因是在模式或字符串部分使用了“/”字符,不换用其他分隔符的话就得在每次使用“/”字 符本身时写成“\/”,上面的命令得写成“:%s/\s*\/\/.*//”,可读性较低。命令本身倒是相当简单,用过正则表达式的人估计都知道“.”匹 配表示除换行符之外的任何字符吧。
 +4,去掉所有的“”注 释:“:%s!\s*/\*\_.\{-}\*/\s*! !g”。这个略有点复杂了,用到了几个不太常用的 Vim 正则表达式特性。“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的 字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“intmain()”这样的表达式在替换之后仍然是合法 的。
 +
 +:g/^\s*$/    删除只有空白的行
 +:s/\w\+\s\+\w\+/\2\t\1    将 data1 data2 修改为 data2 data1
 +:%s/\w\+, \w\+/\2 \1/     将 Doe, John 修改为 John Doe
 +:%s/\<id\>/\=line("."   将各行的 id 字符串替换为行号
 +:%s/\<\w\+/\=(line(".")-10) .".". submatch(1)
 +将每行开头的单词替换为(行号-10).单词的格式,如第11行的word替换成1. word
 +排序 :/OB/+1,$!sort
 +</code>

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki