vim 杂项

问:vim 怎样引用环境变量? $HOME, $USER, $PS1之类的?  
答:vim 支持环境变量,直接使用即可,
vim . 字符串连接运算符

例如: 加载当前登录用户vim 配置, 注意它怎样执行一个字符串命令
let file=$HOME . "/.vim/vimrc"
if filereadable(file)
 execute "source ". file

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, 仅供流程参考
----------------------------------------



你可能感兴趣的:(vim)