1.messages
使用echo
可以打印出变量的名字,echom
同样也是打印命令,但是使用messages
查看的话,只有echom
的内容才会显示。
把echo
的内容添加到vimrc
里面,再每次启动vim的时候,会看到像下面的信息:
1 2 3 |
laixintao@Jarvis2:~$ vim hello xintao Press ENTER or type command to continue |
2.使用set设置变量值
set
的用法是:
:set <name>
或者:set no<name>
设置布尔类型的值:set <name>!
直接将原来的值设置为相反的值。:set <name>?
查看变量的值:set <name>=<value>
用来设置非布尔类型的值
3.键位映射
使用map <key> <action>
映射键位,特别的,nmap对应normal模式的映射,vmap对应visual mode的映射,imap对应Insert mode的映射。
如果<action>
里面还有别的映射,vim会继续解释。这也许很有用,但实际上是很evil的,例如下面这个映射
1 |
:nmap dd Ojddk |
本意是使用新的一行替代旧的一行,但是在解释的时候,遇到dd,又会使用这个命令自身进行解释,所以“无限递归”了。
所有的map
命令都有对应的noremap
命令,即noremap
, nnoremap
, vnoremap
, 和 inoremap
,推荐在任何情况下,都使用nore来代替map命令,完全避免嵌套。
键位一共就那么多,总会不够用,所以设置一个<leader>
会是一个不错的选择。
1 |
:let mapleader = "," "我习惯用逗号作为leader |
然后就可以使用 :map <leader>- dd
这样子设置映射了。这个映射的意思是,先按下逗号,再按下-,会删除本行(dd)。
vimrc
是我们要经常编辑的文件,所以设置两个命令可以快速编辑和应用vimrc文件是个好主意。
1 2 |
:nnoremap <leader>ev :vsplit $MYVIMRC<cr> :nnoremap <leader>sv :source $MYVIMRC<cr> |
肌肉记忆。推荐一个比较快速的方法:inoremap jk <esc>
也就是说,在Insert Mode下按下jk
会退出到Normal Mode。因为jk两个键在你最常用的地方,两个手指分开按会很快,如果在Normal Mode下面按错了也没关系,不会有任何影响。
一开始你可能会不适应,依然使用<esc>
键退出。推荐设置新map的时候,删除旧的,强迫自己肌肉记忆。inoremap <esc> <nop>
你会很快习惯的!如果觉得自己老是用导航键,删除他们,强迫自己用hjkl
。
4.缩写
缩写(abbreviation)是一个非常实用的功能。试一下
1 |
:iabbrev adn and |
然后去Insert模式输入You adn me
会发现adn被替换成了and。
这个功能实现的原理是,每当用户输入non-keyword,vim就会将在iabbrev设置过的缩写替换掉。什么是keyword呢?使用set: iskeyword?
可以查看。基本上常用字符,字母数字和下划线,都是keyword。
另外一个比较实用的地方,以前我翻译文章,都要在末尾留下原文链接,版权信息,但是用iabbrev就不需要每次都输入了。
1 2 |
:iabbrev @@ steve@stevelosh.com :iabbrev ccopy Copyright 2013 Steve Losh, all rights reserved. |
为什么不实用inoremap呢?因为map会在输入之后立即生效,那么我们就打不出来原来的字符了,iabbrev会在被替换字符是单词的状况下才替换。而且map是针对键位按照顺序依次按下生效的,iabbrev针对的是印到屏幕上的单词,这里要理解。
好了,说了这么说map了,接下来玩个大的吧:
1 |
:nnoremap <leader>" viw<esc>a"<esc>bi"<esc>lel |
设置之后,回到vim,按下你的<leader>"
看看发生了什么。是不是很强大?如果看不懂的话,答案在这里。
lel中的第一个l我觉得不需要从,直接e不就到单词末尾了吗?
这个命令是将光标所在的单词加上引号,最后的lel是将光标移动到单词第一个字母上(l),然后移动到单词最后一个字母(e),移动到单词最后一个引号上(l),方便继续编辑。
对啊,就是这样啊. 你最后还是要移动到单词末尾,el就行,lel不是多此一举吗?
我试过这两种方式,结果都是一样的, 也试过手动输入,真是没看出什么差别.
仅仅因为是别人这么写吗?!
对不起,看成最后一个l了。第一个删掉确实是没有问题的,不过严格来说,符号应该不属于第一个单词,能稍微增加一些健壮性。
哦.对了
1. 你邮件回复模板的称呼写错了,应该是我不是你
2. 提交评论经常出现”评论以及提交过了,有重复”
如果是我收到这样的留言和回复我是很开心的,这表明留言的人有认真看博文,还费心指出了我的错误.
嗯,谢谢。评论模板具体是那一句话?能贴一下整句话吗?
评论框的问题我也很头疼,不会PHP代码没法下手优化,而且这个评论是同步垃圾检查的,导致每次评论相应速度都很慢,一直想优化成异步的。
嗯, 谢谢。
模板的称呼具体是哪个地方,可以贴出来整句话吗?评论框的bug我暂时改不了,我不会PHP代码。而且这个评论框的垃圾检查是同步的,导致每次发送评论都会很慢,一直很头疼,早就想换成异步的了。
laixintao, 您好!
2017年6月15日您曾在《VimScript学习笔记(1):基本映射及常用功能》这篇文章留言:
哦.对了 1. 你邮件回复模板的称呼写错了,应该是我不是你 2. 提交评论经常出现”评论以及提交过了,有重复” 如果是我收到这样的留言和回复我是很开心的,这表明留言的人有认真看博文,还费心指出了我的错误.
laixintao在2017年6月15日对您回复说:
嗯,谢谢。评论模板具体是那一句话?能贴一下整句话吗? 评论框的问题我也很头疼,不会PHP代码没法下手优化,而且这个评论是同步垃圾检查的,导致每次评论相应速度都很慢,一直想优化成异步的。
嘿,还真是呢,因为测试的时候我的名字一直是laixintao,所以错了我也不知道…… 现在好了吧?
Pingback: 推荐一个快速在Github打开当前代码行的Vim插件 – [email protected]
使用set: keyword?可以查看 这个是什么意思呢?
sorry, 这里写错了,应该是
:set iskeyword?
. 已经在原文改正。意思是您在 Vim 程序里面,按下
:
可以进入到命令模式里面,即光标在屏幕的最下方,然后依次输入set iskeyword?
,回车,就可以看到 Vim 将哪一些正则表达式作为 keyword 啦。