星期一, 七月 02, 2018

VIM学习笔记 工具栏 (ToolBar)

启用/禁用工具栏

工具栏(ToolBar)是使用图标来调用菜单的图形界面元素。Vim默认设置是显示工具栏的。我们也可以使用以下命令来显示工具栏:

:set guioptions+=T

使用以下命令,则可以隐藏工具栏:

:set guioptions-=T

工具栏选项

通过设置toolbar可以控制工具栏的显示外观,其选项包括:

  • icons  显示工具栏图标
  • text  显示文本
  • tooltips  当光标悬浮图标上时显示提示文字

例如以下命令,将设置工具栏显示按钮图标和提示文字:

:set toolbar=icons,tooltips

Toolbar_MacVim

工具栏按钮

Vim将工具栏视为一种以ToolBar命名的特殊菜单。例如名为ToolBar.New的menu-item,就是在工具栏上的New图标。每一个基本图标都有两个名字,例如New图标可以用ToolBar.New或是ToolBar.builtin00来表示。可以使用:help builtin-tools命令,查看关于基本图标的帮助信息。

help_builtin-tools

新增工具栏按钮

可以使用以下命令,新增工具栏按钮:

:amenu icon=/Users/yyq/.vim/bitmaps/TabNew 1.410 ToolBar.TabNew :tabnew<CR>

  • iconicon=TabNew 用于指定按钮图标的文件名,如果你只给出了图标的文件名,但没有明确指明文件的路径名,那么Vim将会在$VIMRUNTIME/bitmaps目录进行查找;如果你使用bmp格式的图标文件,那么不需要指明bmp后缀名;
  • priority1.410 表示按钮在工具栏上的位置;
  • action:tabnew<CR> 是点击按钮所执行的命令。

可以使用以下命令,新增工具栏分隔符:

amenu 1.400 ToolBar.-sep8- <Nop>

使用以下命令,可以定义鼠标停留在按钮时显示的提示文字:

:tmenu ToolBar.TabNew Open a new tab

可以使用以下命令,移除工具栏按钮的提示信息:

:tunmenu ToolBar.TabNew

移除工具栏按钮

使用以下命令,将列示工具栏上的按钮名称:

:aunmenu ToolBar.<Tab>

Toolbar_Icons_Tab

使用左右方向键,可以选择某个图标项(其中,"|"用于表示分隔符), 按下Enter将从工具栏上移除此按钮,按下Esc则可以取消选择。

Toolbar_Icons_Tab_Item

直接使用以下命令,将会移除工具栏上的所有按钮:

:aunmenu ToolBar

命令小结
:set guioptions+=T显示工具栏
:set guioptions-=T隐藏工具栏
:set toolbar设置工具栏选项
:amenu新增工具栏按钮
:tmenu定义工具栏按钮的提示文字
:tunmenu移除工具栏按钮的提示文字
:aunmenu移除工具栏按钮

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期二, 六月 26, 2018

VIM学习笔记 菜单(Menu)

启用/禁用菜单

使用以下命令,可以显示菜单栏:

:set guioptions+=m

使用以下命令,可以隐藏菜单栏:

:set guioptions-=m

查看菜单映射

本质上,菜单项都是由命令定义的行为。使用以下命令,可以列出所有菜单定义的映射:

:menu

如果只需要显示特定的菜单(注意区分大小写),那么可以使用以下命令:

:menu File

Menu_File

命令执行结果的每一行首个字母指明了这个命令的模式。

而以下命令,则可以列出指定菜单项的内容:

:menu File.Save

定义新菜单

Vim编辑器所使用的菜单是由文件$VIMRUNTIME/menu.vim定义的。

可以使用以下:menu命令,定义新的菜单内容:

:menu [priority] menu-item command-string

menu-item,描述了放置菜单项的路径,比如File.Save表明Save菜单在File菜单下;还可以依次创建子菜单,例如Tabs.Navigation.Next。菜单定义命令示例如下:

:menu 10.340 &File.&Save:w :confirm w

priority,为数字优先级,用于确定放置菜单项的位置。第一个数字10表明在菜单栏上的位置。数字越小越靠近左侧,而数字越大则越靠近右侧;第二个数字340则决定了下拉菜单的位置。数字越小越靠近上部,而数字越大则越靠近下部。如果你在新建菜单命令中没有指定优先级数字,那么默认值为500。你可以使用:help menu-priority帮助命令,查看Vim内置菜单的位置排列。

&,用于指定快捷键,例如&File.&Save可以表明用Alt-F键来选择File菜单,而用S键来选择保存菜单。

使用以下命令,将新建Tabs.Next菜单:

:menu <silent>Tabs.Next <Esc>:tabnext<cr>

<Esc>,用于进入常规模式;<cr>用于执行命令。

<silent>,将屏蔽命令行的输出。

-SEP-,可以在下拉菜单中新建用于间隔菜单项的虚线。必须是以-开头和结尾的唯一名称;同时必须包含命令,例如以下定义中使用的:空命令。

:menu Tabs.-SEP- :

我们还可以使用以下指定模式的菜单定义命令:

  • :menu 常规模式, 可视化模式, 操作待决模式
  • :nmenu 常规模式(Normal mode)
  • :vmenu 可视化模式(Visual mode)
  • :omenu 操作待决模式(Operator-pending mode)
  • :imenu 插入模式(Insert mode)
  • :cmenu 命令行模式(Command-line mode)
  • :amenu 所有模式

菜单实例

如果希望始终显示自己新建的菜单,那么可以在vimrc文件中增加以下代码。请注意:代码不需要包括冒号(:)。


15amenu <silent>Tabs.New :tabnew<cr>amenu Tabs.-SEPT1- :
amenu <silent>Tabs.&Next :tabnext<cr>
amenu <silent>Tabs.&Previous :tabprevious<cr>
amenu Tabs.-SEPT2- :
amenu Tabs.&Close :confirm tabclose<cr>

新建的菜单显示如下:

Menu_Tabs

移除菜单

使用以下命令,可以从菜单中移除指定菜单项:

:[mode]unmenu menu-item

使用以下命令,则会移除所有菜单:

:aunmenu *

命令小结
:set guioptions+=m显示菜单
:set guioptions-=m隐藏菜单
:menu查看/新建菜单定义
:unmenu移除菜单

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期一, 六月 25, 2018

VIM学习笔记 鼠标(Mouse)

启用/禁用鼠标

使用以下命令可以启用鼠标(默认选项):

:set mouse=a

使用以下命令可以禁用鼠标:

:set mouse=""

鼠标选项

在Windows和X Window这两种系统中,使用鼠标的方式是不同的。我们可以定制Vim编辑器,以启用不同的鼠标行为。命令:behave xterm设置使用X Window风格的鼠标行为。而命令:behave mswin则启用Windows风格的鼠标行为。

xterm的鼠标行为Windows的鼠标行为
左键移动光标移动光标
拉动左键在可视化模式下选择文本在选择模式下选中文本
右键选中光标到右键点击处的文本显示弹出菜单
中键在光标处粘贴选中的文本将系统剪切板中的文本粘贴到文件

使用以下命令,可以定义双击之间的最大时间间隔:

:set mousetime=time

其中的时间以毫秒为单位,默认情况下为半秒(500ms)。

使用以下命令,可以设置鼠标的模式为extend,popup,popup_setpos其中之一:

:set mousemodel=mode

在所有模式之下,鼠标左键可以移动光标,拉动左键可以选择文本。在extend模式中,可以使用左键点中起始位置,然后按住Alt键的同时右击结束位置,将选中两点定义的可视化块(visual block)。在popup模式中,右键可以显示弹出菜单。而popup_setpos模式与popup模式相类似,所不同的只是当按下鼠标右键时,光标会移动到鼠标点击处,然后显示弹出菜单。

通过clipboard选项,可以控制Vim如何处理由鼠标选择的文本。使用以下设置,可以将所有鼠标选择的文本放在未命名寄存器中和剪切板寄存器中,这也意味着我们可以将文本粘贴到其他程序中。

:set clipboard=unnamed

如果设置如下选项,那么可视模式下选择的文本就会被放到系统剪切板中:

:set clipboard=autoselect

隐藏鼠标

在图形界面下编辑时,如果认为鼠标光标的存在会打扰你的工作,可以设置隐藏鼠标光标。

:set mousehide

设置之后,当键盘输入时鼠标光标就会隐藏,而移动光标时鼠标光标就会再度出现。

帮助信息

可以使用以下命令,查看关于鼠标使用的更多帮助信息:

:help mouse

:help mouse-using

:help scroll-mousewheel

命令小结
:set mouse=a启用鼠标
:set mouse=""禁用鼠标
:behave控制鼠标的行为
:set mousetime设置双击时间间隔
:set mousemodel设置鼠标模式
:set mousehide隐藏鼠标

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

星期四, 六月 14, 2018

一座城 一本杂志 一股子生命力

香港,《號外》杂志,创刊四十余载,发行超过五百余期,记录城市生活的生命力......

YYQ (@anthony.yuan) 分享的帖子 ·

星期四, 六月 07, 2018

发现新的眼光

YYQ (@anthony.yuan) 分享的帖子 ·

星期三, 五月 30, 2018

VIM学习笔记-开篇

一直在学,也一直在用Vim。一直遇到问题,也一直在得到答案。慢慢的,Vim成了我最重要的文本编辑器和网页编辑器。

文章溯源

某日在某Blog,下载了一个名为《vi编辑器的学习使用》的文件。打开一看——密密麻麻的文字有一百多页。当时,觉得复杂的可怕。现在,才越来越发现它的价值。每次有所疑问,都能从这个文件中找到解答。每天花十几分钟,阅读几十行,也有不少收获。可问题是,这个文章的排版真是糟糕,命令和文字混在一起,内容也缺乏有条理的组织,阅读起来十分吃力。所以,我在边阅读时也边整理(同时也结合了其他阅读资料),希望能把它以更好的形式展示出来。我将文章按主题分拆为多个章节,并尽量控制每节的信息量,以便读者消化其中的知识;每节中通过文字色彩和字体,将命令、快捷键突出显示出来;在每节结尾,提供一个命令列表,以便回顾文中介绍的重要命令。如果这些文章能对喜欢Vim的朋友有所益处,我将不胜荣幸。

发展历史

1976年,Bill Joy开发了vi,他毕业于伯克利大学,后来共同成立了Sun Microsystems公司并成为了Sun的首席科学家。一开始Bill开发了ex,尔后开发了vi作为 ex的visual interface,也就是说vi允许一次能看到一屏的文本而非一行,所以vi也代表visual editor。

1988年,Bram Moolenaar在Amiga计算机上改进一个叫Stevie的VI版本,他称之为“Vi IMitation”。

1991年11月2日,Vim的首个版本1.14g公开发布。Vim既是开源软件(Opensource),也是慈善软件(Charityware)的概念,你可以自由地使用Vim,但鼓励用户通过ICCF Holland为乌干达的孤儿做出捐助。

1992,随着功能逐渐丰富的1.22版本发布,VIM的名称也想要改成了“Vi IMproved”。相比原始的VI,VIM增加的一项最重要的功能便是多级撤销,VI只支持一级撤销。

Timeline
1988Vim 1.0Vi IMitation on the Amiga
1991Vim 1.14First public release (on Fred Fish disk #591)
1992Vim 1.22Port to Unix
1993Vim 2.0Renamed to Vi IMproved
1994Vim 3.0Multiple buffers and windows
1996Vim 4.0GUI
1998Vim 5.0Syntax coloring and highlighting
2001Vim 6.0Folding, plugins, multi-language
2006Vim 7.0On the fly spell checker, support for tabs
2016Vim 8.0Jobs, Timers, Partial, Packages

功能哲学

Vim起初是为在终端中使用而设计的,但现如今已有多种图形界面提供菜单、工具栏和滚动条。普通用户可以完全无障碍的使用常用的文本编辑功能。而追求编辑效率的程序员,其它经常处理纯文本的人员,Web 开发人员,编写LaTeX文档的研究人员,Unix / Linux 系统管理员,也能找到自己需要的特定高级功能。

多模式编辑 Vim设计在不同的模式下,分别进行文字录入和文字操作。你可在插入模式下,像普通文本编辑器那样输入文字;而退回到常规模式,则可以利用命令和快捷键对文字进行增、删、改等等处理。 为了高效使用Vim,我们必须习惯尽量停留在常规模式:只在必要时进入插入模式以输入文字,然后立刻使用Esc键退换到命令模式,这样双手不用离开键盘就可以继续对个别乃至整篇文本进行下一步操作。

跨平台 Mac上有MacVim,Windows上有GVim, Linux上有Vim。而且,在不同的平台上可以使用相同的命令和插件完成相同的任务。所以,看似陡峭的学习曲线也同时带来更大的持续回报。

可度灵活的可配置性 在Vim生态之中,有大量不同的插件专注于完成不同的任务。比如:格式化代码,自动化备注,整合Git/Github,语法高亮度等等。再配合Vim强大的自定义配置能力,你完全可以按照自己的喜好定制出一个属于你的开发环境。

强大的搜索功能 Vim可以对文本进行及其复杂的查找和替换,包括对正则表达式(regular expressions)和grep的全面支持。

丰富的帮助信息 不提网上浩如烟海的Vim文档,只是内置的在线帮助 “:help” 就已经完整的令人发指!

笔记目录

第一部分 基础知识

第二部分 高阶操作

第三部分 模式详解

第四部分 文字处理

第五部分 图形界面

第六部分 多文件操作

第七部分 自定义系统

第八部分 代码开发

第九部分 正则表达式

第十部分 脚本

星期四, 四月 19, 2018

耳光乐队:满世荒唐言

一个巴掌拍不响 左右开弓打耳光

IMG_0503

耳光乐队,一个自称唱了20年还没出名的乐队;一个自称远离主流的乐队。当然,也是一个自觉不与主流合流的民俗摇滚乐队,一个用“三俗”来毁“三观”的批判者,一个用后现代主义来解构现实的观察者。

面对现实,千人千面,各有各的应对,大多数的大部分人,自然而然地带上面具,熟门熟路地避免感知,拒绝思考,也幸免于随之而来的困惑与迷茫。另外的人,则需要各种鸡零狗碎的心灵鸡汤,让自己听着别人的号子铿锵上路,直到那些伟大的思想变成上吊的绳

仙人指lu为马

IMG_0535

中国人,可以把所有喜剧、悲剧、闹剧都变成段子,变成自怨自艾的无可奈何,变成呲牙咧嘴的机灵乖巧。耳光乐队,则是常规中的异类,段子手中的世外高人。

耳光乐队的音乐,就是耳光乐队的段子,是更有批判价值的段子。

郭德纲说过:“相声要是不搞笑,那就太搞笑了”;赵哥也说过:“摇滚乐要是不批判,那这事就太批判了。”

忠于现实的精妙指摘,豁达张狂的指桑骂槐,没羞没臊的微言大义。没有刻意地表演深刻,也没有曲迎地歌功颂德。借由传统民俗的叙事结构,精心排布的工整对仗,排比重复的文字堆叠。这些刻意为之的结构与节奏,不但增强了表达的重量感,更还原出现实的荒谬感。在同一专辑或同一系列之中,这样一致甚至刻板的结构,更汇聚出愈加强烈的表达效果。

相对而言,另一民俗风格的摇滚乐队--二手玫瑰,则使用更丰富的音乐元素和节奏变换,来更直接更戏剧化地进行表达。

耳光乐队的朴实工整,二手玫瑰的花枝招展,在不同维度,用不同的姿势,进行各自的戏虐、调侃和解构。

耳光乐队用长篇叙事铺陈背景埋下包袱,然后立在原地袖手旁观,等着听者回过神来,自行补全故意留白的话外之音,然后漠然相视,然后哑然一笑。

二手玫瑰,则在第一时间把你拉到同一视角,手把手地点出笑点和痛点。

同样以地方俚语为主要载体的耳光乐队和二手玫瑰,以各自的玩法进行各自的表达,扒开生活的遮羞布,直视皮囊之下无趣的鲜活。

生活就像一盘黑暗料理

IMG_0534

相对于民俗基底的文字,耳光的音乐却是西洋把式的。Funk、说唱、复古迪斯科,甚至有小镇法廊里流行音乐的拼盘。

本土的瓤,外来的皮,这是一重内容与形式的反差。

而另一重反差,则是形制固化的专辑与痛快淋漓的现场的反差。

耳光乐队的现场冲击力是远远超越纸面音乐的。舞台上的耳光,以收放自如的掌控力释放出更巨大的表达能量。乐队的投入程度是极为惊人的,让人感觉乐手比乐迷更需要这样的演出宣泄。指挥场下观众的主唱,撩人的吉他手,性感的键盘。乐器的分贝好像放大了若干倍,乐曲的节奏也好像提速里了干倍。赵哥一定是个资深的球迷,站定了,举手投足就是球员进球后的雕塑般的庆祝动作。

耳光会很实在地从不冷场地唱足2个小时。赵哥会招呼灯光师聚焦在主唱身上,以便让他能看清扇面上还没来及背下来的歌词;赵哥会一边拿着手帕擦汗,一边冲着台下的观众喊话“不用麻烦你们了,我们自己返场”。然后,台下像台上一样嚣张地回应“耳光牛逼,牛逼”!随着赵哥掏出一把又一把折扇,现场也在多重高潮中进入另一次高潮。

艺术男儿裆自强

Enlight13

耳光乐队,既不是径直冲向风车的堂吉柯德,更不是趋炎附势避重就轻的投机者,而是举重若轻消解空洞意义的旁观者和解读者。是大喇叭或者风语者,提醒我们重新回望已然习惯麻木、无从下手、无法言表的荒诞现实。只是,这回望之后的无力感,又要去哪里安放?难道就像狈老板的菊花虽苦,蛋蛋有滋味......

一切的评价都是多余的,就像顶楼马戏团所说:“主唱赵荒唐的扇子,犹如利刃般扎入社会阴暗的私处,以四两拨千斤的功夫,调笑世间百态。民俗但不恶俗。让你笑,然后苦笑。”

星期三, 四月 18, 2018

Finance for Non-Financial Managers

一本定位和结构都非常清晰的财务书。利用简明易懂的平实语言,铺陈了基本和关键的财务知识体系。从经营和运作的角度,深入浅出地讲解了至关重要的财务知识;而不是从专业财务人员记账的操作角度,过于艰深和机械地坠入细节之中。

本书首先强调了财务信息对于企业配置资源和评价业绩的重要性;然后介绍了总账、科目和权责发生制等关键概念;接下来即是此书的核心部分,围绕三大财务报表(资产负债表、利润表和现金流量表),讲解各报表的编制和分析方法。此书后半部分,介绍了成本归集概念,经营策略和年度预算的编制过程,以及各种内部和外部融资的选项。

Finance for Non-Financial Managers TOC

本书利用很大篇幅,详细介绍了三大财务报表(资产负债表、利润表和现金流量表)的各个报表项以及编制方法。报表项也从财务科目的维度,映射到经营业务的角度,以便读者更直观地理解报表项的含义和计算逻辑。

Finance for Non-Financial Managers BS

Finance for Non-Financial Managers PL

其中,现金流量表的间接编制法,是稍显抽象的部分,而且需要考虑现金流量表与资产负债表和损益表之间的联系。

Finance for Non-Financial Managers CF

在Critical Performance Factors (CPF) 部分,也就是我们经常提及的Key Performance Indicators (KPI),此书提炼了若干关键业务指标。这些指标并不完全拘泥于财务角度,也包括了销售相关的绩效指标。针对每个指标,除了说明纸面上的计算逻辑,也解释了其背后的业务意义。本书也提醒读者,除了关注静态的业务指标,也需要从时间的维度上关注指标的变化趋势,并预计未来的发展方向。

Finance for Non-Financial Managers CPM

最后,此书归纳了融资和吸引外部投资的选项,对于初创公司有很大的参考作用。

Finance for Non-Financial Managers Financing

纵观此书,语言简洁,体系清晰,作者成功地将财物与业务融会贯通,非常适合非财务人员通读并理解财务管理的基本概念和核心理念。

请下载此读书笔记完整的MindMpa

星期三, 四月 11, 2018

Photo Post


via Instagram https://ift.tt/2EAko2V

星期五, 四月 06, 2018

星期一, 四月 02, 2018

听他们说爱国主义这回事

民族主义是我们这个时代的乱伦形式,偶像崇拜和精神病症。爱国主义正是它的崇拜对象。显然,我这里所讲的爱国主义,是一种把自己民族凌驾于人性、真理和正义原则之上的态度……对自己民族国家的爱,如果不包括对人类的爱,就不是爱而是偶像崇拜。

--弗洛姆

爱国主义就是让你确信这个国家比所有其他的国家都要出色,只因为你生在这里。

--乔治•肖伯纳

爱国主义是超越于原则之上的对于不动产的一种专横的崇拜。

--乔治•简•纳森

爱国主义是无赖最后的避难所。

——塞缪尔•约翰逊(Samuel Johnson )

除非你把爱国主义从人类中驱逐出去,否则你将永远不会拥有一个宁静的世界。爱国主义是一种有害的、精神错乱的白痴形式。爱国主义就是让你确信这个国家比所有其他的国家都要出色,只因为你生在这里。

——乔治•肖伯纳

爱国主义:一堆随时可以被任何野心家所点燃,去照亮他的名字的易燃垃圾。

——安卜罗斯•皮尔斯

爱国者的责任就是保护国家不受政府侵犯。

——托马斯•潘恩

争你自己的自由就是争国家的自由,争你自己的权利就是争国家的权利。因为自由平等的国家不是一群奴才建造得起来的!

——胡适

星期五, 三月 30, 2018

什么是自由精神

自由的精神就是对自己是否正确不是很有把握的精神。

——哈耶克

星期一, 三月 19, 2018

曼森的心灵鸡汤(高度的)

俯视我,你看到的是一个傻子;仰视我,你看到的是一个神;平视我,你看到了你自己。

很久以前,成为疯子是有意义的。 现在,人人都是疯子。

曼森家族中的许多人都是被家庭抛弃的他们流浪在街头,他们不想去少年管教所我尽我所能,把他们带到我的垃圾场,我告诉他们,这里有爱,没有对错。

在乎究竟他妈的是什么意思?

只要我想,我可以是世界上最危险的男人,但我只想做我自己,从来不想成为别的。

死亡是爱的最好表达。疼痛能教会人很多事情。

查尔斯·曼森(Charles Manson)是20世纪最臭名昭著的杀人犯和邪教首领之一。他和他的追随者们在1969年至1971年之间犯下多宗杀人案,其中包括残忍地捅死当时已怀孕7个月的女演员、导演波兰斯基的妻子莎郎·蒂。1971年,曼森被判处终身监禁。2017年11月19日,曼森在加利福尼亚州的监狱里去世,终年83岁。曼森被称为操纵大师,他有虔诚的追随者和死心塌地的女粉丝,影响力甚至蔓延到音乐和影视等文化领域。哥特摇滚乐队玛丽莲·曼森(Marilyn Manson)其名也取自于他(其名的前半部分,则取自于美女玛丽莲梦露)。

曼森是历史上收到最多信件的因犯。每年,他都能收到至少6万封信。 曼森说自己在戴尔·卡耐基的畅销书《如何赢取友谊与影响他人》中学习了如何操纵别人。 他诱导有感情创伤的女孩,让她们觉得自己是美丽而完美的,一切错误都在她们的父母身上,她们应该放下一切跟随他。

星期三, 六月 14, 2017

VIM学习笔记 脚本-自定义命令 (Script-User Defined Command)

使用脚本语言,可以更灵活地定制编辑器以完成复杂的任务。

自定义命令

Vim编辑器允许定义自己的命令,我们可以像执行内置命令一样来执行我们自己定义的命令。

使用以下:command命令自定义命令:

:command Delete_first :1delete

注意自定义命令的名称,必须以大写字母开头,而且不能包含下划线;如果我们执行:Delete_first自定义命令,那么Vim就会执行:1delete命令,从而删除第一行。

可以使用!来强制重新定义同名的自定义命令:

:command! -nargs=+ Say :echo <args>

用户定义的命令可以指定一系列的参数,参数的个数由-nargs选项在命令行中指定。例如定义Delete_one命令没有参数:

:command Delete_one -nargs=0 1delete

默认情况下-nargs=0,所以可以省略。其他-nargs选项值如下:

-nargs=0没有参数
-nargs=11个参数
-nargs=*任何个数的参数
-nargs=?零个或是一个参数
-nargs=+一个或是更多个参数

在命令定义中,参数是由关键字<args>指定的:

:command -nargs=+ Say :echo "<args>"

输入以下自定义命令:

:Say Hello World

命令的执行结果显示:

Hello World

使用-range选项,可以指定一个范围作为自定义命令的参数。-range选项值如下:

-range允许范围,默认为当前行
-range=%允许范围,默认为当前文件(while file)
-range=count允许范围,单一的数字

当指定范围之后,就可以用关键字<line1>和<line2>得到这个范围的第一行和最后一行。

例如以下定义了SaveIt命令,用于将指定范围的文件写入文件save_file:

:command -range=% SaveIt :<line1>,<line2>write! save_file

关键字<f-args>含有与关键字<args>相同的信息,所不同的是它用于调用函数。例如以下自定义命令:

:command -nargs=* DoIt :call AFunction(<f-args>)

执行自定义命令:

:DoIt a b c

将会传递参数给调用的函数:

:call AFunction("a","b","c")

其他选项和关键字包括:

-count=number指定数量保存在关键字<count>中
-bang指定!修饰符存放在关键字<bang>中
-register指定寄存器,默认为未命名寄存器,寄存器的定义保存在关键字<register>中
-bar其他命令可以用|跟随在此命令之后
-buffer命令仅对当前缓冲区有效

使用以下命令,首先分别创建一个用户自定义命令,然后再将两个命令组合起来。

列示自定义命令

使用以下命令,可以列出用户定义的命令:

:command

command

删除自定义命令

使用以下:delcommand命令,可以删除用户定义的命令:

:delcommand Delete_one

使用以下命令,清除所有的用户定义的命令:

:comclear

Ver: 1.0<上一篇 | 目录 下一篇>

星期一, 六月 12, 2017

VIM学习笔记 脚本-自定义函数 (Script-User Defined Function)

使用脚本语言,可以更灵活地定制编辑器以完成复杂的任务。

定义函数

Vim编辑器允许用户自定义函数,语法如下:

Name,函数名称必须以大写字母开始,并且只可以包含字母、数字和下划线。

arg1-argN,调用函数时需要为命名参数(Named Parameters)赋值。如果不需要任何参数,那么可以将括号()部分置空。最多可以定义20个参数。

keyword,range关键字定义一个范围函数(:function Count_words() range)会针对范围内的每一行重复执行操作;abort关键字指示函数(:function Do_It() abort)会在第一个错误时退出。

下面我们来定义一个函数,用来返回两个数中较小的一个:

函数内部的变量(例如smaller)均为局部变量,除非使用了g:作为前缀。例如在函数外我们定义了变量var,那么在函数内部可以使用g:var来调用。前缀a:的变量均为函数参数。

return 语句用于返回结果并结束函数。return语句之后的所有代码都不会被执行。

如果尝试定义一个已经存在的函数,那么将会收到报错信息。可以使用!来强制重定义同名函数。

:function! Max(num1, num2, num3)

Vim允许在函数中使用“...”来标识个数不定的可变参数(Variadic Parameters)。例如以下代码定义函数至少有2个参数,最多有20个参数:

argnum 计数器,用于记录num1和num2之后的参数个数;

a:num1 变量,用于访问指定的参数;

a:0 变量,用于记录参数总个数;

a:{argnum} 变量,用于访问每一个参数的值,例如a:1或a:2;

以下范围函数实例,将在指定范围行内执行替换操作:

当函数被以下命令调用时,变量a:firstlinea:lastline就会被赋值为这个范围内的第一行和最后一行,然后更新范围内的每一行。你可以使用:help cmdline-ranges命令,查看关于范围操作的更多信息。

:1,$call DeAmperfyAll()

调用函数

可以在表达式中调用函数:

:let tiny = Min(10,20)

还可以使用:call命令来调用函数:

:[range]call {function}([parameters])

列示函数

使用以下命令,可以列出所有用户定义的函数:

:function

使用以下命令,可以查看指定函数的代码:

:function {name}

使用以下命令,可以查看Vim内置函数的使用说明:

:help functions

删除函数

使用以下命令,可以删除指定的函数:

:delfunction {name}

Ver: 1.0<上一篇 | 目录 下一篇>

星期二, 六月 06, 2017

VIM学习笔记 脚本-语句 (Script-Statements)

使用脚本语言,可以更灵活地定制编辑器以完成复杂的任务。

:echo命令

:echo可以显示命令中的参数。

:echo "Hello world"

Hello world

:echo还可以显示变量的值。

:let flag=1
:echo flag

1

使用|可以分隔同一行中的两个命令。

:echo "aa" | echo "bb"

aa
bb

:echon也只显示命令中的参数,但不会输出新行。

:echon "aa" | echon "bb"

aabb

可以通过:echohl命令,使用指定高亮颜色组输出信息。

:echohl ErrorMsg
:echo "A mistake has been make"

A mistake has been make

为了不影响后续:echo命令的显示效果,建议使用以下命令重设高亮显示为None:

:echohl None

使用以下命令,可以查看高亮显示组的颜色定义:

:highlight

在:echo命令中,可以使用以下转义符:

  • \n Newline
  • \r Carriage return
  • \t Tab
  • \123 八进制数字
  • \x123 十六进制数字
  • \u01fc34 Unicode
  • \f Form feed
  • \e Esc
  • \b Backspace
  • \\ 反斜线

判断

if语句的一般形式如下:

只有条件(condition)为真时,if语句块内的语句才会被执行。

if语句还可以包含else子句:

满足条件(condition)时,if语句块内的语句将会被执行;而不满足条件(condition)时,则else语句块内的语句将会被执行。

if-else结构还可以进行多重判断

循环

while命令开始一个循环,并由endwhile命令结束。在条件为真是,循环中的代码将被重复执行。

continue命令回到程序的顶部开始执行下一次循环;而break命令则立刻退出循环。

:execute命令

:execute将执行参数中指定的命令:

:let command = " echo 'Hello world!'"
:execute command

Hello world

Ver: 1.0<上一篇 | 目录 下一篇>

星期三, 五月 24, 2017

VIM学习笔记 脚本-变量和表达式 (Script-Variables and Expressions)

使用脚本语言,可以更灵活地定制编辑器以完成复杂的任务。

定义变量

使用以下命令,可以为变量赋值:

:let {variable}={expression}

Vim中的变量名可以包含字符、数字和下划线,但必须以字符或是下划线开头。

例如使用以下命令,定义变量line_size:

:let line_size=30

使用:echo命令,可以查看变量的内容:

:echo "line_size is"line_size

命令执行以后,Vim将会在屏幕底部显示如下内容:

line_size is 30

变量类型

Vim使用特殊的前缀来指明不同的变量类型:

变量名用途
大写字母,数字,下划线 可以存放在viminfo文件中的变量(如果viminfo选项中含有!标记)
大写字母开头变量可以由:makesession命令保存
小写字母,数字,下划线不会存在任何保存文件中的变量
$environment环境变量
@register文本寄存器
&option选项名字
b:name当前缓冲区的变量
w:name当前窗口的变量
g:name全局变量(用于函数内部表明全局变量)
a:name函数参数
v:nameVim预定义内部变量
l:name当前函数的变量
s:name使用:source载入的脚本
t:name当前标签页的变量

使用以下命令,可以定义环境变量$PAGER,用于指明查看的命令:

:let $PAGER="/usr/local/bin/less"

使用以下命令,可以显示上一次查找的模式:

:echo "Last search was"@/

使用以下任一命令,都可以设置缩进选项:

:let &autoindent=1

:set autoindent

使用以下命令,可以指定当前缓冲区的语法高亮显示:

:let b:current_syntax=c

Vim使用以下内部变量(v:name)存储相关信息:

变量用途
v:count上一次常规模式命令所指定的数量
v:count1与v:count相类似,所不同的是如果没有指定数量则默认值为1
v:errmsg上一次的错误信息
v:warningmsg上一次的警告信息
v:statusmsg上一次的状态信息
v:shell_error上一次Shell命令的结果。如果为0,则命令正常执行;若为非0,则命令失败
v:this_session上一次装入或是保存的文件的命名
v:versionVim编辑器的版本号

以下为不同类型变量的实例:

删除变量

如果要删除一个变量,那么可以使用以下命令:

:unlet[!] {name}

如果试图删除一个不存在的变量,那么Vim就会报错;而如果使用!标记,则不会显示错误信息。

定义常量

数字常量有以下三种:

  • 八进制(Octal Integer):0123
  • 十进制(Simple Integer):123
  • 十六进制(Hexadecimal):0xAC

Vim可以处理多种格式数字的计算:

:echo 10 + 0x0A + 012

字符常量有以下两种:

  • 简单字符串(Simple String):"string"
  • 精确字符串(Literal String):'string'

在双引号包围的字符串内,可以使用反斜线进行转义;而被单引号包围的字符串,则会被原样输出:

命令输出
:echo "\100"@
:echo '\100'\100

算术运算

Vim可以使用以下算术运算符,进行表达式计算:

int+int 
int-int
int*int
int/int
int%int取余
-int取负

逻辑判断

逻辑运算符可以作用于字符串和整数,Vim将自动在这两种数据类型之间进行转换。如果比较成功则返回1,否则返回0。

var == var 等于
var != var不等
var < var小于
var > var大于
var < var小于等于
var >= var大于等于

比较运算符可以进行字符串正则表达式的比较。例如将字符串"word"和表过式"\w*"比较,如果匹配则返回1。

"word"=~"\w*"

字符串的特殊比较包括:

string =~ regexp 匹配的正则表达式
string !~ regexp不匹配的正则表达式
string ==? string字符串相等,忽略大小写
string ==# string字符串相等,大小写敏感
string !=? string字符串不相等,忽略大小写
string !=# string字符串不相等,大小写敏感
string <? string小于,忽略大小写
string <# string小于,大小写必须敏感
string <=? string小于等于,忽略大小写
string <=# string小于等于,大小写敏感
string >? string大于,忽略大小写
string ># string大于,大小写敏感
string >=? string大于等于,忽略大小写
string >=# string大于等于,大小写敏感

由此可见,每一个运算符有三种形式。基本形式(==)对应ignorecase选项;(==?)对应忽略大小写;(==#)则对应大小写敏感。

文件名

当我们输入文件名时,可以使用以下特殊符号:

%当前文件名
#交换文件名(Alternate filename)
<cword>光标下的word
<cWORD>光标下的WORD
<cfile>光标下的文件名
<afile>当执行相关的自动命令(autocommand)正读入或是写入的文件名
<abuf>在一个自动命令中的当前缓冲区标号
<amatch>与<abuf>类似,但是在FileType或Syntax事件中并不是指代文件名,而是文件类型或语法名
<sfile>当前正用于:sourced的文件名

我们可以使用以下修饰符来扩展以上特殊符号的意义。例如:p可以将文件名转换为包括路径的全名。例如光标下的文件名为test.c><cfile>test.c,那么<cfile:p>就是/home/oualline/examples/test.c

修饰符主要包括:

:p将文件名变成全路径文件名。如果使用多个修饰符,那么必须将此修饰符放置在最前面。
:~将绝对路径路径名如/home/oualline/examples/test.c 转变为 用~标记的短文件名如~oualline/examples/test.c
:.转变为现对路径名
:h文件名的头。例如../path/test.c 将转变为 ../path
:t文件名的尾。例如../path/test.c 将转变为 test.c
:r无扩展名的文件名。例如../path/test 将转变为 test
:e扩展名
:s?from?to?将第一次出现的from字符串改变为to字符串
:gs?from?to?将所有的字符串from改变为to字符串

使用以下命令,可以利用:p修饰符显示完整的当前文件名。你可以将命令中的:p换成其他需要测试的修饰符。

:echo expand("%:p")

Ver: 1.0<上一篇 | 目录 下一篇>

星期四, 五月 04, 2017

VIM学习笔记 正则表达式-进阶(Regular Expression Advanced)

范围(Character Ranges)

[]通配符,表示只可以匹配方括号内列表的字符。例如t[aeiou]n将匹配一个小写元音字符,可以找到tan,ten,tin,ton,tun。

在方括号内,可以通过短横线来指明包括字符或数字的范围。例如[0-9]可以匹配0到9中的任一数字。我们还可以组合其他字符,例如[0-9aeiou]可以匹配任意一个数字或是小写的元音字符。

如果需要匹配"-"本身,那么需要使用反斜杠进行转义。例如表达式one[\-]way可以匹配one-way,但不会匹配one way。

范围通配符:
[abc]匹配a,b或是c
[^abc]匹配除abc以处的字符
[a-z]匹配从a到z的所有小写字符
[a-zA-Z]匹配所有大小写字符

排除(Excluding)

^通配符,可以排除指定的字符。

acme[^0-9]匹配所有包含acme,后跟一个非数字字符的行。但不会匹配以acme结尾的行,因为模式中的acme之后必须有一个字符。

^[^a-zA-Z]匹配以非字母开头的行,但不会匹配空行,因为行中必须有一个非字母字符存在。

如果需要匹配"^"本身,那么需要使用反斜杠进行转义。例如表达式2[\^*]4可以匹配2^4和2*4。

重复次数(Repeat Modifiers)

{minimum,maximum}表达式指出一个字符重复的次数。例如表达式a\{3,5}可以匹配3到5个a(aaa,aaaa,aaaaa)。Vim默认是会尽可能多地进行匹配(Matching as much as possible)。在表达式中,最小次数是可以省略的,即默认最小次数为0,所以表达式a\{,5}可以匹配0到5个a。最大次数也是可以省略的,即默认匹配无穷大,所以表达式a\{3,}最少可以匹配3个a,最多个数没有限制。

{number}表达式只指定一个数字,Vim就会精确的匹配相应的次数。例如a\{5}只会精确的匹配5次。

{-minimum,maximum}在数字前增加一个负号(-),那么Vim在查找时就会尽可能少地进行匹配(Matching as little as possible)。例如ab\{-1,3}将只匹配 "abbb"中的"ab"。表达式a\{-3,}可以匹配三个或是更多个a,但尽可能少地进行匹配。而表达式a\{-,5}可以匹配0到5个字符。

RegularExpression_Matching as little as possible

表达式a\{-5}将会精确的匹配5个字符。

重复通配符:
*匹配0次或是多次,尽可能多的匹配
\+匹配1次或是多次,尽可能多的匹配
\=匹配0次或是1次
\{}匹配0次或是多次
\{n}精确匹配n次
\{-n}匹配n次
\{n,m}匹配n次到m次
\{n,}匹配n次到多次
\{,m}匹配0次到m次
\{-n,m}匹配n次到m次,尽可能少的进行匹配
\{-n,}至少匹配n次,尽可能少的进行匹配
\{-,m}匹配到m次,尽可能少的进行匹配
{-}匹配0次到多次,尽可能少的进行匹配

捕获组(Groups)

()用于保证需要组合出现的字符。表达式a\(XY\)*b将会匹配ab, aXYb, aXYXYb, aXYXYXYb。

或操作(Alternation Operator)

|用于查找两个或是多个可能的匹配。例如表达式foo\|bar可以找到foo或是bar。我们可以连接使用多个或运算符,例如表达式Larry\|Moe\|Curly将找到Larry、Moe和Curly。而表达式end\(if\|while\|for\)则可以匹配"endif", "endwhile" 和 "endfor"几个不同的元素组合。

如果希望匹配多次,那么可以组合使用加号和括号运算符。例如表达式/\(foo\|bar\)\+可以匹配 "foo", "foobar", "foofoo", "barfoobar"等等。

特殊字符元素(Special Character Atoms)

\a大小写字母字符 [a-zA-Z]
\A除了a-zA-Z以外的字母字符
\b<BS>
\d数字字符 [0-9]
\D非数字字符 [^0-9]
\e<ESC>
\f由isfname选项定义的文件名字符
\F文件名字符,但是不包含数字
\h单词的头字符(A-Za-z)
\H不是单词的头字符(A-Za-z)
\i由isdent选项定义的字符
\I定义的字符,但是不包括数字
\k由iskeyword选项定义的关键字字符
\K关键字字符,但是不包括数字
\l小字字符 [a-z]
\L非小写字符 [^a-z]
\o八进制数字
\O非八进制数字
\p由isprint选项定义的可打印字符
\P可打印字符,但是不包括数字
\r<CR>
\s空白符<Space>和<Tab> [ ]
\S非空白符 [^ ]
\t<Tab>
\u大写字母字符 [A-Z]
\U非大写字母字符 [^A-Z]
\w单词字符(0-9A-Za-z)
\W非单词字符
\x十六进制数字 [0-9a-fA-F]
\X非十六进制数字 [^0-9a-fA-F]
\~匹配最后指定的字符串

表达式\a匹配任意字符,而表达式\a\a\a则可以匹配任意三个字符。而\a\a\a_则可以匹配任意后带一个下划线的三个字符。

RegularExpression_3CharU

操作符\d可以匹配任意数字;\d\d\d\d则可以匹配任意四个数字(即使其为更长数字串中的一部分)。

RegularExpression_4DigitNumber

如果希望精确匹配四位数字,那么可以使用以下任一命令:

/\<\d\d\d\d\>

/\<\d\{4}\>

RegularExpression_4DigitNumberExact

\u可以匹配任意大写字符;\U则可以匹配任意非大写字符。使用以下命令,可以将整篇文本替换为大写字母:

:%s/.*/\U&/

如果需要找出包含空格的空行,那么可以使用^\s.*$表达式;如果需要找到没有空格的空行,则可以使用\S

\s\+$可以匹配尾部的空格; \+\ze\t则可以匹配Tab制表符之前的空格。(请注意,此表达式开头为空格)

请注意,以上预定义字符是不能内嵌在[]中使用的。例如,表达式[\d\l]是错误的,应使用\(\d\|\l\)表达式匹配数字或小写字符。

预定义字符类(Character Classes)

如果我们想要查找所有大写字符,可以使用表达式[A-Z],或者使用预定义的字符类[:upper:]。使用/[[:upper:]]命令可以匹配所有大写字母;而使用/[[:upper:][:lower:]]命令则可以匹配包括大写和小写字母在内的所有字母。

预定义字符类:
[:alnum:]匹配所有的字符和数字
[:alpha:]匹配所有的字符
[:ascii:]匹配所有的ASCII字符
[:backspace:]匹配退格符<bs>
[:blank:]匹配空格和Tab
[:cntrl:]匹配所有的控制字符
[:digit:]匹配所有的数字
[:escape:]匹配Esc
[:graph:]匹配所打印的字符,不包括空格
[:lower:]匹配所有的小写字符
[:print:]匹配所有的要打印字符,包括空格
[:return:]匹配所有的行末符号(包括<Enter>,<CR>,<NL>)
[:punct:]匹配所有的功能符号
[:space:]匹配所有的空白符
[:tab:]匹配Tab
[:upper:]匹配所有的大写字符
[:xdigit:]匹配十六进制数字

转义符(Escaped Characters )

如果需要查找某些特殊符号(比如美元符号),那么可以使用反斜杠backslash(\)进行转义。例如:表达式\$可以匹配美元符号($),而表达式\^则可以匹配脱字符(^)。需要注意的是,反斜杠backslash(\)本身也是特殊符号,所以需要用两个反斜杠\\来匹配。

帮助信息(Help)

可以使用以下命令,查看关于查找模式的更多帮助信息:

:help pattern

Ver: 1.0<上一篇 | 目录 下一篇>

星期一, 四月 24, 2017

VIM学习笔记 magic选项

magic选项

默认情况下,magic选项是打开的。如果关闭了此选项,那么正则表达式中的许多的特殊字符就失去了他们神奇的魔力,而变成了普通的字符。

我们使用以下只有一行的文件来测试magic选项。先用:%print命令将整个文件打印出来:

Test aaa* aa* a*

然后设置magic选项并且执行替换命令。其中,p标记打印出所改变的行:

:set magic

:1 substitute /a*/b/p

命令的执行结果如下:

bTest aaa* aa* a*

命令只是改变了一行开始的部分。为什么会将Test变为b*Test呢?这是因为*可以匹配0次或是多次,而Test正是以0个a开始的。为什么只是替换了一次呢?这是因为:substitute命令中是改变第一个出现的地方,如果我们使用g标记就可以替换全部的匹配项了。如果希望g标记成为默认设置,那么可以使用:set gdefault命令。

我们撤销刚才的命令并再次执行替换命令:

:undo

:1 substitute /a*/b/pg

命令的执行结果如下:

bTest b*b b*b b*

如果在关闭magic选项的情况下再次执行命令:

:undo

:set nomagic

:1 substitute /a*/b/pg

命令的执行结果如下:

Test aab ab b

smgic命令

:smagic命令,可以在执行替换命令时强制转换*等特殊字符的意义。例如我们执行以下命令:

:smagic /a*/b/pg

命令的执行结果如下:

bTest b*b b*b b*

:snomagic命令,强行关掉magic选项:

:snomagic /a*/b/pg

命令的执行结果如下:

Test aab ab b


命令小结
:set magic打开magic选项
:set nomagic关闭magic选项
:smagic强制使用magic选项
:snomagic强制禁用magic选项

Ver: 1.0<上一篇 | 目录 下一篇>

星期三, 四月 19, 2017

VIM学习笔记 正则表达式-基础(Regular Expression Basic)

Vim使用正则表达式(regular expressions)来进行逻辑查找。正则达式是神秘和简洁的,然而这种强大的功能也必须要以大量的学习才能够习惯和掌握。

一个正则表达式是由一些元素组成的,一个元素可以是一个字符或者是一个特殊字符。

以下表格列示了常用的简单元素:

x字符x
^一行的开始处
$ 一行的结尾处
.任意单个字符
<开始标记
>结尾标记

行首与行尾

^acme,将匹配以acme开始的行。注意:除非出现在模式的开头,否则音调符号^就不是一个代表行开头的通配符,而会代表其他的含义。2^4,将匹配包含"2^4"的所有行。如果要查找以“^”开头的行,则需要使用^^模式。其中第一个^是通配符用于指示一行的开头,而第二个^则是实际的音调符号。如果要指明前导^是一个实际的音调符号而不是表示一行开头的通配符,那么就需要在其前面加一个转义的反斜杠“\”来组成\^acme模式。

RegularExpression_BeginOfLine

acme$,将匹配以acme结尾的行。^acme$,将匹配只包含acme一个单词的行。而^$,则会匹配所有空行。

RegularExpression_EndOfLine

dog.bone,将匹配dog-bone,dog bone,dog/bone,但不会匹配dogbone,因为dog和bone之间并没有分隔符。

RegularExpression_AnySingleChr

要指示任何字符出现的次数,可以同时使用句点和星号(.*),例如dog.*bone将匹配以下字符串(但不会匹配dog在一行而bone在另一行的情况):

dogbone
dog-bone
doggy bone
My dog has a bone

词首与词尾

<用于匹配一个单词的开始。>用于匹配一个单词的结束。也就是说,只要将想要查找的字符串包围其中,就可以实现精确查找。例如在文件中有单词Californian和Unfortunately。如果使用命令/for来查找,那么也会找到这两个单词。

RegularExpression_Partial

如果使用表达式/\<for\>来进行查找,则只会精确的查找到for,而不会出现其他的匹配。

RegularExpression_Exact

匹配次数

星号(*)通配符,作用于其之前的一个元素,表示可以匹配0次或是多次。表达式的贪婪(greedy)特性,将尝试查找尽可能多的匹配项。te*将会匹配te,tee,teee等等。甚至还会匹配t,因为在这里e可以出现0次。

RegularExpression_Asterisk

加号(+)通配符,表示一个字符可以匹配一次或是多次。所以表达式te\+可以匹配te,tee,teee等等。但是不会再匹配t,因为这里e最少要出现一次。

RegularExpression_Plus

等号(=)通配符,表示一个字符匹配0次或是一次。所以表达te\=可以匹配t和te,但是不会匹配tee,因为这个表达式只能匹配不多于两个字符。

RegularExpression_Equal

Ver: 1.0<上一篇 | 目录 下一篇>

星期二, 三月 28, 2017

VIM学习笔记 重复命令(Dot Command)

.(Dot)命令,可以重复上次的修改。而上次的修改,可以是针对单个字符、整行,甚至是整个文件。所以Dot命令,是一个作用范围极广的强大命令。

重复单个命令

假设我们有以下文本:
Line one
Line two
Line three
Line four

如下图所示:.命令重复执行了x命令,用于删除当前光标下的字符:

DotCommand_SingleCommand

以下图例则展示了,.命令如何重复作用于整行之上的删除操作:

DotCommand_dd

重复多个命令组合

假设我们有以下代码:
var foo = 1
var bar = 'a'
var foobar = foo + bar

如下图所示:首先,我们使用A命令进入插入模式并在当前行的末尾增加分号;然后,退回到常规模式;之后,移动到一下行并利用.命令重复插入分号的操作。

DotCommand_A

重复命令与其他命令的组合

假设我们有以下代码:
var foo = "method("+argument1+","+argument2+")";

在以下实例中:我们希望在每个加号前后分别插入空格,以提高代码的可读性。首先,我们使用f命令查找加号;然后,使用s命令将加号替换为“ + ”;随后,退回到常规模式;之后,就可以利用;.命令查找下一个加号并重复执行替换操作。

DotCommand_f

Ver: 1.0<上一篇 | 目录 下一篇>

星期五, 二月 24, 2017

VIM学习笔记 字体(Font)

在Mac系统中,可以在Font Book中查看字体列表;在Linux系统中,可以用命令xlsfonts列出所有可用的字体;在Windows系统中,可以在控制面板中检查字体列表。

更改字体

可以使用:set guifont=*命令,来打开字体选择对话框。

Font_Dialog

可以使用:set guifont=fontname命令,来更改当前使用的字体。

以下为 Linux 风格的字体设置语法。其中:字体名称和尺寸是以空格(Space)分隔的。如果字体名称中含有空格,则需要在空格前面加上一个反斜杠进行转义。

:set guifont=Andale\ Mono\ 11

以下为 Mac 风格的字体设置语法。其中:字体名称和尺寸是以冒号(:)分隔的。字体尺寸以字母h为前缀。如果字体名称中含有空格或逗号,则需要在特殊字符前面加上一个反斜杠进行转义。

:set guifont=Monaco:h11

以下为 Windows 风格的字体设置语法。其中:字体名称和尺寸是以冒号(:)分隔的。字体尺寸以字母h为前缀。如果字体名称中含有空格,则可以用下划线(_)来代替。

:set guifont=Andale_Mono:h11

为了提高字体设置的适用范围,可以在命令中用逗号分隔多个字体,如果Vim没有在系统中找到第一个字体,则会自动寻找字体列表中的后续字体。

:set guifont=Droid\ Sans\ Mono:h10,Consolas:h11:cANSI

字体设置实例

你可以将以下代码添加到vimrc配置文件之中,并设置为自己喜欢的字体:

Ver: 1.0<上一篇 | 目录 下一篇>

星期五, 二月 17, 2017

VIM学习笔记 语法高亮 (Syntax Highlight)

语法高亮,将使用不同的颜色来显示不同的语法元素,可以体现文档的结构,帮助发现排布错误,以提高文本编辑和代码开发的效率。

查看语法高亮设定

我们可以使用:highlight命令,查看当前的语法高亮设定。

highlight

修改语法高亮设定

可以使用以下命令修改语法高亮显示:

:highlight group definition

其中group是指语法元素,例如:

  • Cursor,光标下的字符
  • Directory,目录名称
  • ErrorMsg,在最底行显示的错误信息
  • IncSearch,增量(Incremental)查找的匹配结果
  • ModeMsg,在左下角显示的模式名称
  • MoreMsg,显示更多信息时的提示
  • Visual,在可视化模式下被选中的文本

使用以下命令,可以查看关于group的帮助信息:

:help group-name

definition是指具体定义。例如以下命令,将定义黄底黑字的终端:

:highlight Normal ctermfg=black ctermbg=yellow

在命令中没有指定的参数,将保持其原有的定义。例如以下命令,将背景定义为白色,而前景颜色不变:

:highlight Normal\ ctermbg=white

Vim识别三种不同的终端:term,黑白终端;cterm,彩色终端;gui,Gvim窗口。

term,可以定义其字体显示为:bold、underline、reverse、italic或standout。例如以下命令,用逗号来组合使用这些属性:

:highlight Keyword term=reverse,bold

cterm,可以用ctermfg设置前景色;用ctermbg设置背景色。例如以下命令,定义蓝底红字并使用下划线来显示注释:

:highlight Comment cterm=underline ctermfg=red ctermbg=blue

gui,可以使用选项gui=attribute,来定义图形窗口下语法元素的显示属性。选项guifgguibg,用来定义了前景色和背景色。推荐使用的颜色包括:black, brown, grey, blue, green, cyan, magenta, yellow, white。

为了保持各平台下的一致性,我们应该使用十六进制颜色代码来指定颜色。例如使用以下命令,一次定义几种终端下的配色:

:highlight Error term=reverse cterm=blod ctermfg=#00afff ctermbg=#a8a8a8

使用以下命令,可以查看关于highlight的帮助信息:

:help highlight

查看配色

利用Colorizer插件可以直观的显示#rgb, #rgba, #rrggbb, #rrgbbaa, rgb(...), rgba(...)等等形式的配色。

plugin_Colorizer

Ver: 1.0<上一篇 | 目录 下一篇>

星期一, 一月 23, 2017

星期三, 一月 18, 2017

VIM学习笔记 行号(Line Number)

绝对行号

可以用以下命令显示绝对行号(Absolute Line Number):

:set number

LineNumber_AbsoluteNumber

可以用以下命令隐藏绝对行号:

:set nonumber

相对行号

可以用以下命令显示相对行号(Relative Line Number):

:set relativenumber

LineNumber_RelativeNumber

可以用以下命令隐藏相对行号:

:set norelativenumber

如果我们使用以下命令,同时显示绝对行号和相对行号,那么Vim将显示当前行的绝对行号,而其他行则显示相对行号:

:set number

:set relativenumber

LineNumber_BothNumber

在Vim中,很多命令都可以使用数字前缀。例如,命令10j既是向下移动10行;命令>2j则可以缩进当前行以及其下2行。通过显示相对行号,你就可以清楚地看到命令所覆盖的范围。如果仅仅显示绝对行号,那么就需要你手动计算行之间的距离。

行号显示效果

行号默认右对齐显示在每行的左侧,占据4个空格的空间:其中3个空间用于显示行号,另1个空格作为于文本的间隔。当行数超过999时,行号显示区域将自动进行扩展。可以通过以下命令,改变行号所占用的空间(其中n为空间大小):

:set numberwidth=n

使用以下命令,可以定制行号(LineNr)的显示效果:

:highlight LineNr guibg=#1874cd ctermbg=#1874cd

使用以下命令,则可以定制当前行号(CursorLineNr)的显示效果:

:highlight CursorLineNr guifg=#050505

命令小结
:set number显示绝对行号
:set nonumber隐藏绝对行号
:set relativenumber显示相对行号
:set norelativenumber隐藏相对行号
:set numberwidth=n设置行号显示宽度

Ver: 1.0<上一篇 | 目录 下一篇>

星期四, 一月 12, 2017

我不喜欢八面玲珑、世故圆滑的人。喜欢略显笨拙、非常努力的人。
--山本耀司

星期三, 一月 11, 2017

世上只有两类悲剧:一种是求而不得;一种是得偿所求。
In this world there are only two tragedies. One is not getting what one wants and the other is getting it.
--Oscar Wilde

星期一, 十二月 19, 2016

VIM学习笔记 大小写转换(Tilde)

转换字符大小写

命令~可以改变字母的大小写。如果当前光标下的字母为小写,那么点击~可以将该字母转换为大写。同理如果当前光标下的字母为大写,那么点击~则可以将该字母转换为小写。

tildeop选项可以控制命令~的行为。默认设置下,只会对单个字符进行大小转换。

:set notildeop

如果设置了tildeop选项,那么命令就会变为~motion的模式:

:set tildeop

例如,在下面的句子中:

this is a test

我们将光标放在第一个t上并执行~ft命令,则结果为:

THIS IS A Test

命令使得当前光标以后第一个t和光标间的字符全部转换为大写,如果这个句子中还有小写字符,那么这个命令还可以执行第二次,直到句子中的字符全部为大写为止。

可以指定转换字符的个数和方向。例如命令3~l是从当前字符开始向右3个字符进行大小写的转换。

命令g~3w可以转换当前光标开始之后的3个单词;而命令g~iw则可以转换当前inner word;而命令g~$则可以转换从当前位置到行尾的所有字符。

命令g~g~g~~可以转换整行的大小写。而且并不依赖于tildeop选项的设置。

在可视化模式下,可以使用u命令,将选中的字母转换为小写;也可以使用U命令,将选中的字母转换为大写。

gUUgUgU命令,都可以将整行字符转换为大写。如果指定了数字参数,例如3gUU则可对指定行数进行转换。

相对应的guugugu命令,则是用于将整行字符转化为小写。

首字母大写

选中文本,然后进入命令行模式并使用以下命令,可以将选中的文本转换为首字母大写(title case / initial capitals)。

:s/\<\(\w\)\(\w*\)\>/\u\1\L\2/g

Title_Case

命令小结
~转换字符大小写
u将选中的字母转换为小写
U将选中的字母转换为大写
:set notildeop设置大小写转换命令的行为仅针对单个字符
:set tildeop设置大小写转换命令的行为类似于操作符

Ver: 1.0<上一篇 | 目录 下一篇>

星期四, 十二月 15, 2016

VIM学习笔记 文本对象(Text Objects)

在Vim中,相比针对单个字符进行操作,对于单词、句子和段落等更大范围的文本对象(text-objects )执行命令则更有效率。Vim的命令结构示例如下:

[number]<command>[text object or motion]

其中:number是指命令作用在几个文本对象之上。比如3个单词;command是指执行的具体命令。比如删除或复制;text object or motion是指具体的文本对象。比如单词、句子或段落。

文本对象的类型

  • iw …inner word
  • aw …a word
  • iW …inner WORD
  • aW …a WORD
  • is …inner sentence
  • as …a sentence
  • ip …inner paragraph
  • ap …a paragraph
  • it …inner tag
  • at …a tag
  • i( or i) …inner block
  • a( or a) …a block
  • i< or i> …inner block
  • a< or a> …a block
  • i{ or i} …inner block
  • a{ or a} …a block
  • i[ or i] …inner block
  • a[ or a] …a block
  • i" …inner block
  • a" …a block
  • i` …inner block
  • a` …a block

文本对象的作用范围

iw表示inner word。如果键入viw命令,那么首先v将进入选择模式,然后iw将选中当前单词。

aw表示a word,它不但会选中当前单词,还会包含当前单词之后的空格。

以下实例中的红色 [ ] 表示作用范围:

iwThis is a [test] sentence.
awThis is a [test ]sentence.
iWThis is a […test…] sentence.
aWThis is a […test… ]sentence.
is…sentence. [This is a sentence.] This…
as…sentence. [This is a sentence. ]This…
ipEnd of previous paragraph.

[This is a paragraph. It has two sentences.]

The next.
apEnd of previous paragraph.

[This is a paragraph. It has two sentences.

]The next.
i( or i)1 * ([2 + 3])
a( or a)1 * [(2 + 3)]
i< or i>The <[tag]>
a< or i>The [<tag>]
i{ or i}some {[ code block ]}
a{ or a}some [{ code block }]
i[ or i]some [[ code block ]]
a[ or a]some [[ code block ]]
i"The "[best]"
a"The[ “best”]
i`The `[best]`
a`The[ `best`]

文本对象的应用实例

使用ci)命令,可以删除括号内的所有内容,但保留括号本身。而ca)命令,则可以删除括号内的所有内容,以及括号本身。

ci(

在某个开括号上,点击%键,光标将可以自动移动到相对应的闭括号上。通过与编辑命令组合,c%可以实现与ca)相同的功能。使用%命令,必须将光标放在括号之上;而使用a)命令,则光标可以在括号之上或括号内的任何位置。而且%命令,也是无法实现用i)命令效果的。

ca

使用cit命令,你甚至不用将光标移动到Tag之内,就可以快速修改其中的内容。

cit

使用ci"命令,可以快速修改当前行内第一个双引号其中的内容。

cidq

使用ci'命令,可以快速修改当前行内第一个单引号其中的内容。

cisq

Ver: 1.1<上一篇 | 目录 下一篇>

星期一, 十月 10, 2016

VIM学习笔记 运行外部命令(shell)

执行单个命令

使用:!命令,可以运行一个外部系统命令。例如,以下命令将打开终端窗口,并在其中显示当前日期:

:!date

使用:!!命令,可以重新执行最近一次运行过的命令。

使用!!命令,可以运行外部命令并将输出结果做为当前行的内容。例如,输入!!date命令,将会把date命令的输出结果插入到文件中,当前行中的原有内容将会被覆盖。

执行多个命令

使用:shell命令,不需要退出Vim,就可以进入命令终端执行一个或多个Shell命令。在终端中使用exit命令,则可以退回到Vim。

命令小结
:!运行外部命令
:!!重新执行最近一次运行过的命令
!!运行外部命令并将输出结果做为当前行的内容
:shell打开shell终端

Ver: 1.0<上一篇 | 目录 下一篇>

星期一, 七月 25, 2016

星期四, 七月 07, 2016

虫数据在线中文识别 chongdata ocr

网站的界面非常简洁,只需上传图片,然后点击“提交”按钮,随即开始在网站后台识别内容,很快就会自动显示识别结果。

如下图所示,即使混合了简体中文、繁体中文以及英语的内容,也能够很好地进行识别。

星期日, 二月 28, 2016

WEAK/STRONG

People cry, not because they’re weak, It’s because they’ve been strong for too long.
--Johnny Depp