endif
-------------------------------------------------
vim 内置变量
$VIM, --> 用来定位vim 的用户文件,例如.vimrc, 重新赋值: let $VIM=...
$VIMRUNTIME--> 用来定位各种支持文件,例如帮助文档的位置。$VIMRUNTIME/doc/help.txt, 重新赋值: let $VIMRUNTIME=...
runtimepath -> 这是一个查找目录列表for runtime file, 类似于bash 中的path, 更改 set runtimepath=...
可见$VIM, $VIMRUNTIIMEPATH 是个变量, 而runtimepath 是个选项.
这些变量你可以不用设置,vim 会按一定规则确定设置它们。
例如,如果环境变量已经设置了,它会首先被vim选用。
否则,vim 会在安装目录固定位置去查找关键文件,来设置这些变量。
在runtimepath 下,存放自己的plugin 文件
用 echo $VIM, echo $VIMRUNTIME 显示变量
用 echo &runtimepath 显示选项, set runtimepath= 来修改
-------------------------------------------------
vim " 解决consle输出乱码
language messages zh_CN.utf-8
language messages POSIX
-------------------------------------------------
vim debug 模式
vim 重新加载一个script , 查看script 全局变量生成过程, 已经解决,用source 命令
vim 调试一个函数,已经解决,用call 命令
-------------------------------------------------
查找 vim 中的高亮文字字。
vim 中的高亮字大部分是关键字, 有时候我们记不住名字了,可以到它的script 中去查一下。
命令:
scripename 查看加载了script
vimgrep 匹配查找 指定文字
-------------------------------------------------
vim 不用:w 来保存文件,直接切换到其它缓冲区。
例子: :hide b1
-------------------------------------------------
用vim 删除特殊字符。
例如从网络上copy 的代码, 里面包含看不见的0xa0 空白字符。 需要删除。
答:
用visual 模式选中该字符,copy 到无名寄存器。
用%s/ / / 方式完全替换即可。
--------------------------------------------------------------------------------
vim 正则表达式举例
--------------------------------------------------------------------------------
/<\@<=[^>]*>\@= : search for tag contents, ignoring chevrons
查找XML标记的内容,忽略尖括号
像“\@<=”、“\@=”、“\<”、“\>”、“\zs”、“\ze”这类的元字符,
并不匹配任何实际字符,它们只是用来检查匹配是否存在。正则表达式在进行匹配时,需要满足它们所规定的条件。
因为它们不匹配实际字符,所以称它们为匹配零长度的元字符。
“\<”和“\>”匹配单词的开始和结束。
“\zs”和“\ze”表示匹配的开始和结束。
“\@<=”要求前面的元字符刚好出现在它后面的匹配模式之前。它只是用来检查这个条件,它前面的元字符并不会包含在匹配结果中。
“\@=”匹配它前面的元字符,但匹配长度为0。也就是说, 它只检查前面的元字符是否存在,并不把前面的元字符包含在匹配结果中。
在它后面出现的元字符,将在与它前面的元字符相同的位置被匹配。
注意,此处所指元字符,是字符和控制字符的统称。 而有时候又专指控制字符。
举例:
foo/(bar/)\@= 解释:匹配foo bar必须要存在,但不在匹配结果中
所以匹配foolbar单词中的foo,但不会匹配fool。因为 bar 没有存在
foo/(bar/)\@=foo不匹配任何东西,因为它要求在foobar的b字母开始的位置上匹配foo,这显然是不可能的。
<\@<=[^>]*>\@= 解释: \@<= 表示 < 必须刚好在 [^>]* 之前 ,,但匹配不包含<
\@= 表示 > 必须存在,但> 不在匹配内容中
这个结果完全等价于: <\zs[^>]\ze>
如下:
[hjj@hjj ~]$ cat 1.txt
abc_123 ab_12 df_3
abc_1234 abcd_23
abc_12 a_2
问题1:把最后一个_ 改为#,
答1:可以用如下方法: %s/\(.*\)_/\1#/
说明:\(.*\)_将会贪婪匹配到最后一个_.
问题2: 把1.txt 中第2次出现的_改为#
答2: %s/\%(\(_\).\{-}\)\{1}\zs\1/#/
说明:\%(\) 为 无计数分组, 若采用计数分组,则后面\1应改为\2
\{-} 为非贪婪匹配, \{N} 为精确匹配N次
\zs 为从此开始。 此句的关键在于此, 把前面匹配到的都作废,从此处开始匹配。
----------------------------------------
当打开vim 发现别的控制台占用该文件时,怎样发现是哪个控制台被占用
lsof -c vim
可以看到vim 占用了哪个控制台,打开了什么文件
----------------------------------------
--------------------------------------------------------------------------------
vimgrep 怎样在当前目录所有cpp文件中查找带空格字符. 答: vimgrep /ha ha ha/ *.cpp
vim 块选, 然后敲入:!wc, 将会由外部程序计算出行数,单词数,字符数显示于屏幕上,甚好!
--------------------------------------------------------------------------------
tags 文件怎样包含头文件的声明?
ctags -R 确实没有包含头文件声明,也不需要。
但是, 为系统头文件生成tags, 我们需要函数声明.
网上搜到的用下面的命令生成系统头文件tags, 做为一个参考吧
ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --fields=+S -R -f ~/.vim/systags /usr/include /usr/local/include
其关键是
-I __THROW。忽略-I后面写出来的符号。为了不让__THROW干扰ctags.
--c-kinds=+p 为函数原型的声明也生成tag。就是它了。
--langmap=c:+.h表示.h视为c文件而不是c++文件。
-R : recurse
-f : 输出文件名称
记不住那么长,以下为为C头文件添加函数原型tag.
ctags --langmap=c:+.h --c-kinds=+p .
------------------------------------------------------------
为vim 添加系统剪切板
------------------------------------------------------------
控制台 vim 一直用不了系统剪切板,调各种选项都没用。所以羡慕gvim
后来才发现,是缺少Xorg库.
sudo apt-get install xorg-dev
./configure --with-features=huge
解决问题。
"* "+ 是copy, cut paste 寄存器,与外部沟通的桥梁,一个出,一个入,它们会智能选择的。
至此,比windows 的剪切板又强了一些。
vim 中,鼠标中键是个paste 键, firefox 中,鼠标中键又是个copy键
加了剪切板就是爽,再也不苦蹩了.
还有一台机器是centos , 当然要乘胜拿下。
看了看与xorg 有关的, 好像都安装了,但xterm_clipboard 还是没有出现。
后来看了一下配置,终于搞明白了. 需要一个开发库提供头文件。安装下面依赖即可
yum install libXmu-devel.x86_64
搞定, 从此全部告别无clip 时代。
------------------------------------------------------------
学了一招, vim 中读文件路径到寄存器
------------------------------------------------------------
我们知道,用cd %:p:h 可以转换目录到当前文件所在的目录.
进一步:
用echo expand("%:p:h") 可以显示当前文件所在的目录.
用 let @*=expand("%:p:h") 可以将目录存储到系统剪切板.
也有人将它写成了script, 用一个命令叫CopyPath 来简化这个操作.
----------------------------------------
浏览函数功能。
:function [func name]
----------------------------------------
浏览全局变量的值
----------------------------------------
可以用let 或 echo 命令显示变量的值。
function 内部变量未加说明,是局部变量。
function! Add(val1, val2)
let res = a:val1 + a:val2
return res
endf
若用g:res, 则为全局变量, 执行后,用echo 或 let 可观察
----------------------------------------
观察局部变量的值。
--> 程序内嵌 echo 语句, 看信息输出
--> 用confirm 语句, 显示变量的值,相当于 messagebox
运行script 时设置断点 --> 不能设置 (unfortunitely)
vim 调试
----------------------------------------
对于任何一门语言, 调试手段不外乎消息框(或printf类), log 文件, 单步跟踪。
vim 也不例外,
confirm () 可以显示函数内变量的值。 相当于print 语句。 有人把它写成了一个插件叫debug.vim
可以方便打开关闭调试语句。
log 文件, 把变量值输出到文件中。 也有人写了一个插件叫Decho.vim, 若需要可以用用。
单步跟踪。 vim 内部支持单步调试功能。可以调试function, cmd, autocmd 等。
也支持断点。但是断点只能中断在source script 时,
而不能实时调试。实时运行难道就不能中断,不能实时调试了吗?
set verbose>=12, 可显示每一个运行的函数。
set verbose>=15, 可显示每一个运行的命令。
----------------------------------------
记录script 的运行过程, --> set verbose = 15 or higher, 仅供流程参考
----------------------------------------