Vim 分别提供了排序函数 sort()
、uniq()
和排序命令 :sort
。机遇这两种方式,可以在 Vim 内对文本进行高效的排序。
下面分两部分详细说明下这两种方式的使用方法。
:sort
命令的用法格式如下:
:[range]sor[t][!] [b][f][i][n][o][r][u][x] [/{pattern}/]
[range]
值得是一个范围,:sort
命令会基于这个范围进行排序,当未制定范围时,会对整个文档进行排序。关于 [range]
的常用方法有下面几种:
我们看到 sor[t]
最后一个字母 t
被方括号包围,表示该字母可以省略,即更简单地执行 :sor
命令。
在 :sort
命令紧接其后的感叹号 !
表示是否进行反向排序,不带感叹号则是正向排序,带上则反之。
在 :sort
命令紧接其后的第一个参数为可选参数,包括 b
, f
, i
, n
, o
, r
, u
, x
。首先,需要了解选项 n
f
x
o
b
之间是互斥的,也就是说不可以同时使用这些选项,换句话说。前面的这个五个选项可以和 i
r
u
这三项组合使用。下面分别说下这些参数的意义:
n
则排序基于每行的第一个十进制数 (在 {pattern}
匹配之后或之内)。数值包含前导的 ‘-‘。f
则排序基于每行的第一个浮点数。浮点值相当于在文本( {pattern}
匹配的之后或之内) 上调用 str2float() 函数的结果。仅当 Vim 编译时加入浮点数支持时该标志位才有效。x
则排序基于每行的第一个十六进制数 (在 {pattern}
匹配之后或之内)。忽略该数值前的 “0x” 或 “0X”。但包含前导的 ‘-‘。o
则排序基于每行的第一个八进制数 (在 {pattern}
匹配之后或之内)。b
则排序基于每行的第一个二进制数 (在 {pattern}
匹配之后或之内)。u
(u 代表 unique 唯一) 则只保留完全相同的行的第一行 (如果同时带 i
,忽略大小写的区别)。没有这个标志位,完全相同的行的序列会按照它们原来的顺序被保留下来。
注意: 行首和行尾的的空白差异会影响唯一性的判定。Vim 提供两个排序相关的函数 sort()
和 uniq()
,sort()
这个函数的用法如下:
sort({list} [, {func} [, {dict}]])
给定一个 List 经过排序后,返回一个结果,同样也是 List。sort()
这一函数第二个参数可以接受如下几种情况:
1
或者 i
: 表示忽略大小写。n
:按照数值排序,即使用 strtod()
解析 List 内的元素,字符串、列表、字典和函数引用均视作 0。f
:按照浮点数值来排序,要求给定的 List 每一个选项都是浮点数。Funcref
变量。这个变量表示的是一个函数,则调用该函数来比较项目,该函数会使用两个项目作为参数,根据返回值确定两个项目关系。 0 表示相等,1 或者更高,表示第一个排在第二个之后,-1 或更小代表第一个排在第二个之前。本文将系统地介绍如何配置 SpaceVim,配置 SpaceVim 主要包括以下几个内容:
原先,在老版本的 SpaceVim 中,默认的配置文件是 init.vim。在 init.vim 文件内,我们可以通过 let g:spacevim_*
这样的语句来设置 SpaceVim 选项。而在新版的 SpaceVim 中,我们采用了 toml 作为默认配置文件,如果不熟悉 toml 语法的,可以先阅读一下 toml 的基本语法,当然不读也没关系,
toml 已经是最简单的配置文件格式了。
所有的 SpaceVim 选项配置在一个字典里,key 为原先的选项名去除 g:spacevim_
前缀:
g:spacevim_enable_guicolors -> enable_guicolors
这一选项的值可为 true 或者 false,于是,写入配置即为:
[options]
enable_guicolors = false
一些其他选项,有的值是数字,有的是字符串,字符串的格式和 vim script 类似,可以用单引号,也可以用双引号,比如:
[options]
enable_guicolors = false
snippet_engine = "neosnippet"
statusline_separator = 'arrow'
sidebar_width = 30
SpaceVim 内置了很多模块,每一个模块由一些插件和相关配置组成,用于提供一些特定的功能,比如提供模糊搜索的模块, 提供版本控制的模块,以及提供语言开发支持的语言模块。 启用或者禁用模块,需要遵循一定的语法结构,并且配到 layers 列表内,比如我现在需要启用 shell 模块,设置模块选项 default_position 和 default_height, 这两个选项分别控制这 shell 窗口打开位置和高度:
[[layers]]
name = "shell"
default_position = "top"
default_height = 30
如果要禁用一个模块,需要增添一个选项 enable, 并赋值 false,默认这个是 true。比如,我需要禁用 shell 模块, 可以这么写, 禁用模块时,除了 enable 这选项,其他选项可写可不写,因为已经不会生效。当然如果为了快速启用/禁用模块, 可以保持其他选项不变。
[[layers]]
name = "shell"
enable = false
自定义插件配置语法和模块有点类似,将需要配置的插件,配置进 custom_plugins 列表。比如,我需要添加 2 个插件, 可以参考以下语法:
[[custom_plugins]]
name = "lilydjwg/colorizer"
merged = 0
[[custom_plugins]]
name = "tpope/vim-scriptease"
merged = 0
on_cmd = "Scriptnames"
大家可以看到,在添加自定义插件时,我们支持很多选项,这归功于 dein, dein 支持多种选项。
最后,我们来说下,如果添加自定义配置,和自定义快捷键。在使用 toml 配置 SpaceVim 时,我们提供了两个选项,位于 [options] 下: bootstrap_before 和 bootstrap_after, 这两个选项接受一个字符串最为值,该字符串值得是一个 vim 方法名。顾名思义,你可以通过这 两个选项定义两个 vim 方法,分别在载入配置时,和 vim 启动后被调用,在方法内,你可以加入一些 vim 脚本,比如快捷键, 比如插件的选项。 比如,在配置文件内加入如下内容:
[options]
enable_guicolors = false
snippet_engine = "neosnippet"
statusline_separator = 'arrow'
sidebar_width = 30
bootstrap_before = "myspacevim#before"
bootstrap_after = "myspacevim#after"
新建 ~/.SpaceVim.d/autoload/myspacevim.vim, 加入内容:
function! myspacevim#before() abort
let g:neomake_enabled_c_makers = ['clang']
nnoremap jk <esc>
endf
function! myspacevim#after() abort
endf
在上述这个方法内部,目前只定义了一个变量和快捷键,用户可以添加一些其他的 vim 脚本,比如定制一些 autocmd
augroup MySpaceVim
au!
autocmd FileType markdown setlocal nowrap
augroup END
也是应大多数人要求,更新的这篇文字,仓促之下,有很多内容可能还不完整,如果有什么疑问,欢迎留言。
Ruby支持的数据类型包括基本的Number、String、Ranges、Symbols,以及true、false和nil这几个特殊值,同时还有两种重要的数据结构——Array和Hash。
1、整型(Integer)
整型分两种,如果在31位以内(四字节),那为Fixnum实例。如果超过,即为Bignum实例。
整数范围从 -230 到 230-1 或 -262 到 262-1。在这个范围内的整数是类 Fixnum 的对象,在这个范围外的整数存储在类 Bignum 的对象中。
您可以在整数前使用一个可选的前导符号,一个可选的基础指标(0 对应 octal,0x 对应 hex,0b 对应 binary),后跟一串数字。下划线字符在数字字符串中被忽略。
您可以获取一个 ASCII 字符或一个用问号标记的转义序列的整数值。
实例
123 # Fixnum 十进制
1_234 # Fixnum 带有下划线的十进制
-500 # 负的 Fixnum
0377 # 八进制
0xff # 十六进制
0b1011 # 二进制
?a # 'a' 的字符编码
?\n # 换行符(0x0a)的编码
12345678901234567890 # Bignum
#整型 Integer 以下是一些整型字面量
#字面量(literal):代码中能见到的值,数值,bool值,字符串等都叫字面量
#如以下的0,1_000_000,0xa等
a1=0
#带千分符的整型
a2=1_000_000
#其它进制的表示
a3=0xa
puts a1,a2
puts a3
#puts print 都是向控制台打印字符,其中puts带回车换行符
=begin
这是注释,称作:嵌入式文档注释
类似C#中的/**/
=end
浮点型
Ruby 支持浮点数。它们是带有小数的数字。浮点数是类 Float 的对象,且可以是下列中任意一个。
实例
123.4 # 浮点值
1.0e6 # 科学记数法
4E20 # 不是必需的
4e+20 # 指数前的符号
#浮点型
f1=0.0
f2=2.1
f3=1000000.1
puts f3
算术操作
加减乘除操作符:+-*/
;指数操作符为**
指数不必是整数,例如
#指数算术
puts 2**(1/4)#1与4的商为0,然后2的0次方为1
puts 16**(1/4.0)#1与4.0的商为0.25(四分之一),然后开四次方根
字符串类型
Ruby 字符串简单地说是一个 8 位字节序列,它们是类 String 的对象。
双引号标记的字符串允许替换和使用反斜线符号,单引号标记的字符串不允许替换,且只允许使用 \\
和 \'
两个反斜线符号。
实例
#!/usr/bin/ruby -w
puts 'escape using "\\"';
puts 'That\'s right';
实例
#!/usr/bin/ruby -w
puts 'escape using "\\"';
puts 'That\'s right';
这将产生以下结果:
escape using "\"
That's right
您可以使用序列 #{ expr }
替换任意 Ruby 表达式的值为一个字符串。在这里,expr 可以是任意的 Ruby 表达式。
#!/usr/bin/ruby -w
puts "Multiplication Value : #{24*60*60}";
这将产生以下结果:
Multiplication Value : 86400
#!/usr/bin/ruby -w
name="Ruby"
puts name
puts "#{name+",ok"}"
输出结果为:
Ruby
Ruby,ok
反斜线符号
下表列出了 Ruby 支持的反斜线符号:
符号 | 表示的字符 |
---|---|
\n | 换行符 (0x0a) |
\r | 回车符 (0x0d) |
\f | 换页符 (0x0c) |
退格键 | (0x08) |
\a | 报警符 Bell (0x07) |
\e | 转义符 (0x1b) |
\s | 空格符 (0x20) |
\nnn | 八进制表示法 (n 是 0-7) |
\xnn | 十六进制表示法 (n 是 0-9、a-f 或 A-F) |
\cx, \C-x | Control-x |
\M-x | Meta-x (c | 0x80) |
\M-\C-x | Meta-Control-x |
\x | 字符 x |
如需了解更多有关 Ruby 字符串的细节,请查看 Ruby 字符串(String)。
数组
数组字面量通过[]中以逗号分隔定义,且支持range定义。
(1)数组通过[]索引访问 (2)通过赋值操作插入、删除、替换元素 (3)通过+,-号进行合并和删除元素,且集合做为新集合出现 (4)通过«号向原数据追加元素 (5)通过*号重复数组元素 (6)通过|和&符号做并集和交集操作(注意顺序)
实例
#!/usr/bin/ruby
ary = [ "fred", 10, 3.14, "This is a string", "last element", ]
ary.each do |i|
puts i
end
运行实例 »
这将产生以下结果:
fred
10
3.14
This is a string
last element
如需了解更多有关 Ruby 数组的细节,请查看 Ruby 数组(Array)。
哈希类型
Ruby 哈希是在大括号内放置一系列键/值对,键和值之间使用逗号和序列 => 分隔。尾部的逗号会被忽略。
实例
#!/usr/bin/ruby
hsh = colors = { "red" => 0xf00, "green" => 0x0f0, "blue" => 0x00f }
hsh.each do |key, value|
print key, " is ", value, "\n"
end
运行实例 »
这将产生以下结果:
green is 240
red is 3840
blue is 15
如需了解更多有关 Ruby 哈希的细节,请查看 Ruby 哈希(Hash)。
范围类型
一个范围表示一个区间。 范围是通过设置一个开始值和一个结束值来表示。范围可使用 s..e 和 s…e 来构造,或者通过 Range.new 来构造。
使用 .. 构造的范围从开始值运行到结束值(包含结束值)。使用 … 构造的范围从开始值运行到结束值(不包含结束值)。当作为一个迭代器使用时,范围会返回序列中的每个值。
范围 (1..5) 意味着它包含值 1, 2, 3, 4, 5,范围 (1…5) 意味着它包含值 1, 2, 3, 4 。
实例
#!/usr/bin/ruby
(10..15).each do |n|
print n, ' '
end
这将产生以下结果:
10 11 12 13 14 15
让我们编写一个简单的 Ruby 程序。所有的 Ruby 文件扩展名都是 .rb。所以,把下面的源代码放在 test.rb 文件中。 实例
#!/usr/bin/ruby -w
puts "Hello, Ruby!";
在这里,假设您的 /usr/bin 目录下已经有可用的 Ruby 解释器。现在,尝试运行这个程序,如下所示:
$ ruby test.rb
这将会产生下面的结果:
Hello, Ruby!
您已经看到了一个简单的 Ruby 程序,现在让我们看看一些 Ruby 语法相关的基本概念:
在 Ruby 代码中的空白字符,如空格和制表符一般会被忽略,除非当它们出现在字符串中时才不会被忽略。然而,有时候它们用于解释模棱两可的语句。当启用 -w 选项时,这种解释会产生警告。
实例:
a + b 被解释为 a+b (这是一个局部变量)
a +b 被解释为 a(+b) (这是一个方法调用)
Ruby 把分号和换行符解释为语句的结尾。但是,如果 Ruby 在行尾遇到运算符,比如 +、- 或反斜杠,它们表示一个语句的延续。
标识符是变量、常量和方法的名称。Ruby 标识符是大小写敏感的。这意味着 Ram 和 RAM 在 Ruby 中是两个不同的标识符。
Ruby 标识符的名称可以包含字母、数字和下划线字符( _ )。
下表列出了 Ruby 中的保留字。这些保留字不能作为常量或变量的名称。但是,它们可以作为方法名。
BEGIN do next then
END else nil true
alias elsif not undef
and end or unless
begin ensure redo until
break false rescue when
case for retry while
class if return while
def in self __FILE__
defined? module super __LINE__
“Here Document” 是指建立多行字符串。在 « 之后,您可以指定一个字符串或标识符来终止字符串,且当前行之后直到终止符为止的所有行是字符串的值。
如果终止符用引号括起,引号的类型决定了面向行的字符串类型。请注意« 和终止符之间必须没有空格。
下面是不同的实例:
#!/usr/bin/ruby -w
# -*- coding : utf-8 -*-
print <<EOF
这是第一种方式创建here document 。
多行字符串。
EOF
print <<"EOF"; # 与上面相同
这是第二种方式创建here document 。
多行字符串。
EOF
print <<`EOC` # 执行命令
echo hi there
echo lo there
EOC
print <<"foo", <<"bar" # 您可以把它们进行堆叠
I said foo.
foo
I said bar.
bar
这将产生以下结果:
This is the first way of creating
her document ie. multiple line string.
This is the second way of creating
her document ie. multiple line string.
hi there
lo there
I said foo.
I said bar.
语法
BEGIN {
code
}
声明 code 会在程序运行之前被调用。
实例
#!/usr/bin/ruby
puts "This is main Ruby Program"
BEGIN {
puts "Initializing Ruby Program"
}
这将产生以下结果:
Initializing Ruby Program
This is main Ruby Program
语法
END {
code
}
声明 code 会在程序的结尾被调用。
实例
#!/usr/bin/ruby
puts "This is main Ruby Program"
END {
puts "Terminating Ruby Program"
}
BEGIN {
puts "Initializing Ruby Program"
}
这将产生以下结果:
Initializing Ruby Program
This is main Ruby Program
Terminating Ruby Program
注释会对 Ruby 解释器隐藏一行,或者一行的一部分,或者若干行。您可以在行首使用字符( # ):
# 我是注释,请忽略我。
或者,注释可以跟着语句或表达式的同一行的后面:
name = "Madisetti" # 这也是注释
您可以注释多行,如下所示:
# 这是注释。
# 这也是注释。
# 这也是注释。
# 这还是注释。
下面是另一种形式。这种块注释会对解释器隐藏 =begin/=end 之间的行:
=begin
这是注释。
这也是注释。
这也是注释。
这还是注释。
=end
一直想再多接触一些脚本语言,之前写了一段时间 python 和 lua,感觉都非常不错。之所以要再学习 Ruby, 主要是看到 Ruby 的一些语法上的灵活性。
Ruby 支持代码块、修饰符等这些在其他语言里似乎都没有,最简单的示例:
#!/usr/bin/ruby
$debug=1
puts "debug\n" if $debug
新建了一个 Ruby 的笔记仓库,用来记录 Ruby 学习资料。
https://github.com/wsdjeg/ruby-tutorial-cn
经常使用 markdown 进行中文写作,包括但不限于写一些文档。对于中文排版目前没有非常好的检查工具。 因此做了 chinese_linter.vim 这个插件,目的在于提示中文文档中一些常见的排版错误。
在编辑中文文档时,使用如下命令即可检查,错误信息将被展示在 Vim 的 location list 窗口
:CheckChinese
目前支持如下错误代码:
错误代码 | 描述 |
---|---|
E001 | 中文字符后存在英文标点 |
E002 | 中英文之间没有空格 |
E003 | 中文与数字之间没有空格 |
E004 | 中文标点之后存在空格 |
E005 | 行尾含有空格 |
该插件才开始做,目前仅仅实现了以上五种规范检查,后面会添加更多的规范检查,欢迎尝试。
目前这个项目发布在 github 上面,如果有熟悉 Vim 脚本的同学,也欢迎参与,感谢!