用户工具

站点工具


语法:gvim

gvim

1. windows gvim

1.1 _vimrc

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

1.2 菜单语言切换为英文

在_vimrc文件末尾加入以下内容

set langmenu=en_US
let $LANG= 'en_US'
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim

1.3 gvim支持中文显示

set fileencodings=utf-8,gbk,gb2312,gb18030
" set termencoding=utf-8
"set fileformats=unix
"set encoding=utf-8

1.4 保持linux操作方式,比如支持Ctrl-V 选择

注释以下行

"source $VIMRUNTIME/mswin.vim

1.5 tab宽度及其它

set expandtab
set shiftwidth=4
set tabstop=4
set noundofile
set cursorline
set cursorcolumn
set nobackup

2. 用法技巧等

2.1 tab转空格

:retab

2.2 显示match匹配行数

:%s/xxx//gn
 
[g] 替换行中出现所有匹配,否则只替换第一个。
[n] 意思是显示匹配数,但是不做实际的替换操作; 如果有g选项的话,则计算所有的匹配数。
[i] 匹配时忽略大小写, set ignorecase在这不起作用
[I] 匹配时不忽略大小写, , set ignorecase在这不起作用

2.3 输入时不自动换行

set textwidth=0

默认情况下,其width值为78。设置为0就相当于关闭这个功能,设置成正值就可以让 vim 在指定长度上折行。

2.4 gvim启动时窗口默认最大化

linux环境,在.vimrc文件中加入以下内容:

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

以上的数值可以根据实际情况再作微调。

如果只是想把gvim窗口设置到合适大小,可以根据情况自行调整lines和columns的大小。

windows环境,在_vimrc文件中加入以下内容:

autocmd GUIEnter * simalt ~x

2.5 gvim窗口初始位置

有时候可能会有调整gvim窗口刚打开时的窗口初始位置,比如固定为左上角,右上角,居中等等,可以通过下面的方式去设置它的初始窗口位置。

# 在.vimrc文件写入如下语句,将gvim窗口放在指定位置, x y 分别为想设置的x轴y轴坐标
:winpos x y

2.6 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

以下是来自于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: >

au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif

2.7 显示当前文件的完整路径

先按下数字键1, 然后再按Ctrl + G

CTRL-G          打印当前文件名

{count}CTRL-G   1CTRL-G 打印当前文件全路径名
                If the count is higher than 1 the current buffer number is also given. 

2.8 vimdiff 忽略空格

https://www.dazhuanlan.com/2019/12/07/5deb081359393/

只需在vimrc文件中加入以下:

set diffopt+=iwhite

或者

if &diff
    set diffopt+=iwhite
endif

或者

if &diff
  map gs :call IwhiteToggle()<CR>
  function! IwhiteToggle()
    if &diffopt =~ 'iwhite'
      set diffopt-=iwhite
    else
      set diffopt+=iwhite
    endif
  endfunction
 endif

或者以下面的命令方式启动比较:

vimdiff -c 'set diffopt+=iwhite'

2.9 批处理命令执行

比如以下的命令

:%s/^\w\+/cc/
:%s/good/bad/

假设是期望依次执行上述语句,可以将其保存到一个临时文件,比如abc.vim, 然后在vim窗口中执行:source abc.vim,即可以把上述命令依次执行,这样可以减少一些人工操作,而又不用使用其它的脚本语言来处理。

2.10 在每行内容前插入行号

:set number 命令可以在 vim 中显示行号,但是如何让 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)/

2.11 表达式替换

比如一个文件内容为:

AAAA
AAAA
AAAA

需要替换为如下样式:

BBBB_1
BBBB_2
BBBB_3

注意看,123分别是行号,可以采用以下命令进行vim替换操作.

:%s@AAAA@\="BBBB_".line(".")@

这里用到的\=,后面就是跟需要的表达式就行。

2.12 iskeyword

参考: https://zhuanlan.zhihu.com/p/115200953

iskeyword, 简写为isk
set iskeyword
set isk

使用 set iskeyword, 显示当前vim word 分词,方便搜索当前word, 不会乱分词。

注意,有的语法加载会修改这个分词,导致使用gvim造成不便。

通过执行verbose set iskeyword, 可以显示是谁修改了iskeyword。

如果发现iskeyword被修改,可以单独再把它修改回来,这样避免后面的不便。

3. 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*$/d     删除只有空白的行
: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
语法/gvim.txt · 最后更改: 2024/07/03 08:09 由 user01

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki