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 命令

请练习一个简单的函数。

function! Min(num1, num2)
"    call confirm("num1=".a:num1,"num2=".a:num2)
    if(a:num1 < a:num2)
        echo a:num1
    else
        echo a:num2
    endif
    return a:num1 < a:num2 ? a:num1 : a:num2
endfunction

source 进内存之后,先设置verbose=15,以便显示出每个要执行的语句,然后用:debug call Min(20,30) 进行调试,用step 命令跟踪

-------------------------------------------------
查找 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 来简化这个操作.

----------------------------------------

vim 调试
----------------------------------------
对于任何一门语言, 调试手段不外乎消息框(或printf类), log 文件, 单步跟踪。
vim 也不例外,
confirm () 可以显示函数内变量的值。 相当于print 语句。 有人把它写成了一个插件叫debug.vim
    可以方便打开关闭调试语句。
log 文件, 把变量值输出到文件中。 也有人写了一个插件叫Decho.vim, 若需要可以用用。
单步跟踪。 vim 内部支持单步调试功能。可以调试function, cmd, autocmd 等。
也支持断点。但是断点只能中断在source script 时,
:debug xxxx 可以进入调试模式

vim -D xxxx 能够调试跟踪最初的过程


set verbose>=12, 可显示每一个运行的函数。
set verbose>=15, 可显示每一个运行的命令。  记录script 的运行过程, 仅供流程参考

------------------------------------------------------------
vim verbose, 先不要set verbose=15, 这样你会不知所措的,或者能看清一部分,
set verbose=12 后令我大吃一惊!, 因为这有了全局感.
设定的越小越有全局感,但到0就全部没有了!
设置合理的verbose 值,了解vim 命令到底发生了什么。
h 'verbose'
h verbose
h :verbose
----------------------------------------------------------------------------------------------------
浏览函数功能。 :function [func name]
----------------------------------------
浏览全局变量的值.可以用let 或 echo 命令显示变量的值。
function 内部变量未加说明,是局部变量。

---------------------------------------
观察局部变量的值。    

--> 程序内嵌 echo 语句, 看信息输出
--> 用confirm 语句, 显示变量的值,相当于 messagebox
---------------------------------------

 

vim 中贪婪和非贪婪匹配

贪婪匹配 .*, 例如 /a.*b

非贪婪匹配 .\{-},  例如:/a.\{-}b

vim 手工折叠. zf 将选中的行折叠起来, 相关命令有zrR, zmM, zc, zo 等。

----------------------------------------
#利用vim 进行批量文件编码格式转换
----------------------------------------
#!/bin/bash
for i in $(ls *.cpp *.c *.h)
do
echo "begin to modify the fileencoding of $i to utf-8"
vim +":set fileencoding=utf-8" +":set fileformat=unix" +":wq" $i
------------------------------------------------------------

用vim 直接打开Man page. 例如

vim -c "Man cmake-commands" 或者

 vim +"Man cmake-commands"


注意写法vim 空格 +"..."格式,+与双引号之间不能有空格. 推荐用-c 更清楚一些.

------------------------------------------------------------
vim 可以查中文,vimgrep 也可以, 但grep 不支持
/[\u4e00-\u9fa5] unicode 编码,收录0x9fa5-0x4e00+1=20902 个汉字
------------------------------------------------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值