兼容

这是一场不停的追逐!


  • Home

  • About

  • Tags

  • Archives

环境变量延迟扩展

Posted on 2016-08-02

延迟扩展

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
@echo off
setlocal enabledelayedexpansion
:: 一般是复合语句的时候需要使用延迟变量

echo =============================================
:: 错误, var不会正确被识别
for /l %%i in (1,1,5) do (
set /a var =%%i
echo %var%
)

echo =============================================
:: 开启环境变量延迟扩展 可以正确使用var
for /l %%i in (1,1,5) do (
set /a var =%%i
echo !var!
)

echo =============================================
:: 错误,找不到var
set var1=test & echo %var1%
:: 正确
set var2=test & echo !var2!

echo =============================================
for /f "tokens=* delims=" %%i in ("Hello world.") do (
set n=%%i
set n=!n:ld.=t!
set n=!n:o w= S!
set n=!n:He=Wi!
echo !n!
)

echo =============================================
set mm=boy
set mm=girl&echo %mm%
set mm=girl&echo !mm!

echo =============================================
set var=abc
for /l %%i in (1 1 5) do (
set var%%i=%%i
echo %var%
echo !var!
)
echo %var1% %var2% %var3% %var4% %var5%
echo !var1! !var2! !var3! !var4! !var5!

echo =============================================
:: 使用变量嵌套变量也可以使用变量延迟
:: call 这里实际是对命令行进行重新组织扩展,先扩展%%b%a%%%里面的%a%,使%a%变成a的值1,再用cal来扩展%b1%
::set a=1&set b1=10
::call,echo %%b%a%%%
set /a a=1,b1=10
Setlocal EnableDelayedExpansion
echo:!b%a%!

echo =============================================
set a=1000
set b=dd
set a%b%=9000
set c=!a%b%!
echo %c%

pause

批处理之for第二篇

Posted on 2016-08-02

for循环语句

for /d 参数 查询目录

for /d %%variable in (set) do command [command-parameters]

  • 主要用于目录搜索, 不会搜索文件
  • 只能搜索指定目录和缺省情况下的当前目录, 不能搜索子目录

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@echo off

echo -------------------------------------------------------
:: 打印c盘目录
for /d %%i in (c:\*) do echo %%i

echo -------------------------------------------------------
:: 打印c盘目录五个字符的目录
for /d %%i in (?????) do echo %%i

echo -------------------------------------------------------
:: 如果路径有空格, 用双引号
for /d %%i in ("c:\Program files\*") do echo %%i

echo ------------------------------------------------------
:: 搜索以w开头的
for /d %%i in (c:\w*) do echo %%i

echo ------------------------------------------------------
:: 搜索以w开头的, 以s结尾的
for /d %%i in (c:\w*s) do echo %%i

echo ------------------------------------------------------
:: 删除当前目录下的文件夹
for /d %%i in (*) do rd /s /q "%%i"
:: 上面的可以写作如下, 测试成功后,把echo 去掉,这时执行命令才会生效,防止出错!
for /d %%i in (*)do echo rd /s /q "%%~fi"

pause

for /r 参数 遍历搜索

for /r [[drive:]path] %%variable IN (set) DO command [command-parameters]

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
echo ------------------------------------------------------
:: set 中的文件名如果含有通配符(?或*),则列举/R 参数指定的目录及其下面的所有子目录中与 set 相符合的
:: 所有文件,无相符文件的目录则不列举。
for /r %%i in (*.txt) do echo %%i

echo ------------------------------------------------------
:: set 中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录),
:: 而不管set 中的指定文件是否存在。这与前面所说的单点(.)枚举目录树是一个道理,
:: 单点代表当前目录,也可视为一个文件。
for /r %%i in (test.txt) do echo %%i
:: test6.txt不存在也枚举出来
for /r %%i in (test6.txt) do echo %%i
echo ------------------------------------------------------
:: 判断是否存在
for /r %%i in (test.txt) do if exist %%i echo %%i

for /l 参数 建立索引

for /l %%variable in (start,step,end) do command [command-parameters]

该语句中(start,step,end)表示以增量或者递减形式从开始到结束的一个数字序列
因此,(1,1,5)将产生序列1 2 3 4 5,(5,-1,1) 将产生序列5 4 3 2 1

例子:

1
2
3
4
5
6
echo ------------------------------------------------------
for /l %%i in (1,3,10) do echo %%i

echo ------------------------------------------------------
:: for /l %%i in (1,1,5) do start cmd
for /l %%i in (1,1,5) do md %%i

Untitled

Posted on 2016-06-27

c++ 格式化输出总结

Posted on 2016-05-26

可使用的格式

原始格式的备份与恢复

1
2
3
4
5
// 备份
std::ostream::fmtflags flags = std::cout.flags();

// 恢复
std::cout.flags(flags);

存在的格式

flags: 新的格式设置, 可以通过下面的进行组合得到.

Constant Explanation
dec 10进制表示整数, std::dec
oct 8进制表示整数, std::oct
hex 16进制表示整数, std::hex
basefield 用于dec,oct,hex or 0. 是个关于进制的掩码, 用于记录当前是哪个进制
left 左对齐, 用填充字符填充右边, std::left
right 右对齐, 用填充字符填充右边, std::right
internal 内部对齐,用填充字符填充内部指定的点, std::internal
adjustfield 用于left,right和internal. 同basefield
scientific 使用科学计数法表示小数, 或进制计数法(如果与fixed联合使用), std::scientific
fixed 使用普通定点格式表示小数, std::fixed
floatfield 用于scientific, fixed, (scientific,fixed)和0. 同basefield
boolalpha 将bool类型以true或false输出,而不是0或1, std::boolalpha
showbase 为整数添加一个表示其进制的前缀, std::showbase
showpoint 在浮点数中强制插入小数点, std::showpoint
showpos 在正数前面加入+, 只对十进制有效, std::showpos
skipws 忽略前导空格, 主要用于输入流, std::skipws
unitbuf 在每次插入后清空输出缓存, std::unitbuf
uppercase 对于十六进制和科学计数法里的字符, 以大写输出, std::uppercase

格式的使用

bool 变量的输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
// 输出true or false
std::cout << std::boolalpha
<< "boolalpha true: " << true << '\n'
<< "boolalpha false: " << false << '\n';
// 输出0 or 1
std::cout << std::noboolalpha
<< "noboolalpha true: " << true << '\n'
<< "noboolalpha false: " << false << '\n';
// booalpha parse
bool b1, b2;
std::istringstream is("true false");
is >> std::boolalpha >> b1 >> b2;
std::cout << '\"' << is.str() << "\" parsed as " << b1 << ' ' << b2 << '\n';

输出为:

1
2
3
4
5
boolalpha true: true
boolalpha false: false
noboolalpha true: 1
noboolalpha false: 0
"true false" parsed as 1 0

进制的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 输出指定进制的整数
std::cout<<"无前导: "<<'\n'<<std::noshowbase
<< "The number 42 in octal: " << std::oct << 42 << '\n'
<< "The number 42 in decimal: " << std::dec << 42 << '\n'
<< "The number 42 in hex: " << std::hex << 42 << '\n';

// 添加进制的前导
std::cout << "有前导" <<'\n'<<std::showbase
<< "The number 42 in octal: " << std::oct << 42 << '\n'
<< "The number 42 in decimal: " << std::dec << 42 << '\n'
<< "The number 42 in hex: " << std::hex << 42 << '\n';

// 通过掩码设置进制
std::cout << "掩码操作进制显示" << std::endl;
int num = 150;
std::cout.setf(std::cout.oct, std::cout.basefield);
std::cout.setf(std::cout.showbase);
std::cout << num << '\n';

std::cout.setf (std::cout.dec , std::cout.basefield);
std::cout.setf (std::cout.showbase);
std::cout << num << '\n';

std::cout.setf(std::cout.hex, std::cout.basefield);
std::cout.setf(std::cout.showbase);
std::cout << num << '\n';

输出为:

1
2
3
4
5
6
7
8
9
10
11
12
无前导:
The number 42 in octal: 52
The number 42 in decimal: 42
The number 42 in hex: 2a
有前导
The number 42 in octal: 052
The number 42 in decimal: 42
The number 42 in hex: 0x2a
掩码操作进制显示
0226
150
0x96

对齐操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 对齐
std::cout << "===============对齐与填充操作=======================" << std::endl;
std::cout << "Left fill:\n" << std::left << std::setfill('*')
<< std::setw(12) << -1.23 << '\n'
<< std::setw(12) << std::showpos << 1.23 << '\n'
<< std::setw(12) << std::dec << std::noshowpos <<std::showbase << 42 << '\n'
<< std::setw(12) << std::dec << std::showpos << std::showbase << 42 << '\n'
<< std::setw(12) << std::hex << std::showbase << 42 << '\n' <<'\n';

std::cout << "Internal fill:\n" << std::internal
<< std::setw(12) << -1.23 << '\n'
<< std::setw(12) << std::showpos << 1.23 << '\n'
<< std::setw(12) << std::dec << std::noshowpos << std::showbase << 42 << '\n'
<< std::setw(12) << std::dec << std::showpos << std::showbase << 42 << '\n'
<< std::setw(12) << std::hex << std::showbase<< 42 << '\n'<< '\n';

std::cout << "Right fill:\n" << std::right
<< std::setw(12) << -1.23 << '\n'
<< std::setw(12) << std::showpos << 1.23 << '\n'
<< std::setw(12) << std::dec << std::noshowpos << std::showbase << 42 << '\n'
<< std::setw(12) << std::dec << std::showpos << std::showbase << 42 << '\n'
<< std::setw(12) << std::hex << std::showbase << 42 << '\n'<< '\n';

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
===============对齐与填充操作=======================
Left fill:
-1.23*******
+1.23*******
42**********
+42*********
0x2a********

Internal fill:
-*******1.23
+*******1.23
**********42
+*********42
0x********2a

Right fill:
*******-1.23
*******+1.23
**********42
*********+42
********0x2a

浮点型的控制输出

  • 用浮点表示的输出中,setprecision(n)表示有效位数.
  • 用定点表示的输出中,setprecision(n)表示小数位数, 与fixed配合.
  • 用指数形式输出时,setprecision(n)表示小数位数, 与scientific配合.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int originPrecision = std::cout.precision();
std::cout << "===========================================================" << std::endl;
std::cout << "精度使用, 初始精度: "<<originPrecision << std::endl;
std::cout <<std::setprecision(4) <<12.345678 <<std::endl ; // 12.35 rounded!
std::cout <<std::setprecision(10) <<12.345678 <<std::endl ; // 12.345678 其实内部发生了 rounded, 而结果正好进位, 与原值相同

std::cout << "===========================================================" << std::endl;
std::cout << "小数的表示形式的使用" << std::endl;
std::cout << "当前精度: "<<std::cout.precision() << std::endl;
double f = 101 / 6.0 ;
std::cout << "小数的表现形式:" << std::endl;
std::cout <<"定点小数:"<<std::fixed << f <<std::endl ;
std::cout <<"科学计数法:"<<std::scientific <<f <<std::endl ;
std::cout <<"上一次设置的形式:"<<f*10 << std::endl;

std::cout << "===========================================================" << std::endl;
std::cout << "表现形式恢复为默认值, 这时候精度就表示小数的有效位数" << std::endl;
std::cout.unsetf(std::ostream::floatfield);
std::cout << "当前有效位数: "<<std::cout.precision() << std::endl;
std::cout << f <<std::endl ;

std::cout << "===========================================================" << std::endl;
std::cout << "恢复为初始精度:"<<std::setprecision(originPrecision) << std::endl;
std::cout << "当前精度: "<<std::cout.precision() << std::endl;

std::cout << "===========================================================" << std::endl;
std::cout << "显示十进制浮点" << std::endl;
std::cout << "不显示浮点:"<<12.0 << std::endl;
std::cout << "显示浮点:"<< std::showpoint<<10.0 << std::endl;
std::cout << "不显示浮点:"<< std::noshowpoint<<10.0 << std::endl;

输出为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
===========================================================
精度使用, 初始精度: 6
12.35
12.345678
===========================================================
小数的表示形式的使用
当前精度: 10
小数的表现形式:
定点小数:16.8333333333
科学计数法:1.6833333333e+001
上一次设置的形式:1.6833333333e+002
===========================================================
表现形式恢复为默认值, 这时候精度就表示小数的有效位数
当前有效位数: 10
16.83333333
===========================================================
恢复为初始精度:
当前精度: 6
===========================================================
显示十进制浮点
不显示浮点:12
显示浮点:10.0000
不显示浮点:10

输出指针地址

1
2
3
4
5
6
7
8
9
int a = 10;
std::cout << "基本数据类型地址:" << static_cast<void*>(&a) << std::endl;

std::string str = "hello!";
std::cout << "string类型首地址:"<< static_cast<void*>(&str) << std::endl;

char* strc = const_cast<char*>(str.c_str());
std::cout << "string里面存放内容的地址:"<< static_cast<void*>(strc) << std::endl;
std::cout << "string里面存放内容的地址:"<< static_cast<void*>(const_cast<char*>(str.c_str())) << std::endl;

输出为:

1
2
3
4
基本数据类型地址:0x62fe00
string类型首地址:0x62fde0
string里面存放内容的地址:0x62fdf0
string里面存放内容的地址:0x62fdf0

其他

后续完善

bash中PS1的设置

Posted on 2016-05-25 | Edited on 2016-08-12

目的

装逼

过程

通过man

1
$ man bash

打开bash的帮助页后, 通过 /PS1 找到具体的可配置项.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
PROMPTING
When executing interactively, bash displays the primary prompt PS1 when it is ready to read a command, and the secondary prompt PS2 when it needs more input to complete a command.
Bash allows these prompt strings to be customized by inserting a number of backslash-escaped special characters that are decoded as follows:
\a an ASCII bell character (07)
\d the date in "Weekday Month Date" format (e.g., "Tue May 26")
\D{format}
the format is passed to strftime(3) and the result is inserted into the prompt string; an empty format results in a locale-specific time representation. The braces
are required
\e an ASCII escape character (033)
\h the hostname up to the first `.'(主机名,非完整的)
\H the hostname(完整的主机名)
\j the number of jobs currently managed by the shell
\l the basename of the shell's terminal device name
\n newline(换行)
\r carriage return
\s the name of the shell, the basename of $0 (the portion following the final slash)
\t the current time in 24-hour HH:MM:SS format
\T the current time in 12-hour HH:MM:SS format
\@ the current time in 12-hour am/pm format
\A the current time in 24-hour HH:MM format<和上面三个都是指示时间的>
\u the username of the current user(用户名)
\v the version of bash (e.g., 2.00)
\V the release of bash, version + patch level (e.g., 2.00.0)
\w the current working directory, with $HOME abbreviated with a tilde (uses the value of the PROMPT_DIRTRIM variable)(完整的工作目录)
\W the basename of the current working directory, with $HOME abbreviated with a
tilde(只会列出最后一个目录)
\! the history number of this command
\# the command number of this command
\$ if the effective UID is 0, a #, otherwise a $(提示符)
\nnn the character corresponding to the octal number nnn
\\ a backslash
\[ begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
\] end a sequence of non-printing characters

颜色配置

可以通过设置PS1可以使提示符为彩色, 设置的格式为: \[\e[F;Bm\], F为字体颜色, B为背景色, 颜色编号如下表格; 通过\[\e[0m\]关闭颜色输出; 当B为1时,将显示加亮加粗的文字.

前景 背景 颜色
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色
代码 意义
0 OFF
1 高亮显示
4 underline
5 闪烁
7 反白显示
8 不可见

例子

1
PS1="[\[\e[32;1m\]\u\[\e[m\]\[\e[1;36m\]@\[\e[m\]\[\e[1;35m\]\A\[\e[m\]]->[\[\e[1;33m\]\w\[\e[m\]]\$ "

将颜色代码去掉, 剩下的为: PS1="[\u@\A]->[\w]\$", \u代表用户名, @代表本身,\A代表一个HH:MM格式的时间, \w代表一个完整的路径,\$代表提示符, 其他的就是时间.

其他

自己慢慢测吧!

Bash 里面提示 git状态

1
2
3
4
$ cd /usr/share/git/completion
$ cp git-completion.bash ~/.oh-my-bash/git-completion.bash
$ cp git-prompt.sh ~/.oh-my-bash/git-prompt.sh
$ cd ~

编辑.bashrc, 添加以下内容:

1
2
3
4
5
source ~/.oh-my-bash/git-completion.bash
source ~/.oh-my-bash/git-prompt.sh

# PS1修改为如下:
PS1='[\[\e[1;32m\]\u\[\e[m\]\[\e[1;36m\]@\[\e[m\]\[\e[1;35m\]\A\[\e[m\]]->[\[\e[1;33m\]\w\[\e[m\]\[\e[1;32m\]$(__git_ps1 " (%s)")\[\e[m\]]\$ '

具体的使用步骤在git-completion.bash 和 git-prompt.sh的开始处找到.

Atom默认对markdown的支持

Posted on 2016-05-21

自动完成markdown语法标记

代码段-code

输入c + Enter

粗体-bold

输入b + Enter

斜体-italic

输入i + Enter

链接-link

输入l + Enter

图片-img

输入im + Enter

表格-table

输入ta + Enter

todo-list

输入t + Enter

自动补齐二次单词输入

在第二次输入时,单词可以自动识别与补齐,回车即可完成输入

内置markdown即时预览插件

编辑markdown文档时,使用快捷键ctrl + shift + m即可在窗口右侧打开atom内置的markdown-preview即时预览

Markdown语法问题

Posted on 2016-05-21

markdown 语法高亮

增强型markdown语法,比如代码段可以语法高亮
使用三个“`” 符号包围起来并写上语言类型即可使用语法高亮:

json

代码截图:

效果:

1
2
3
4
5
6
7
8
9
10
{
"state": {
"code": 10200, //code状态码
"msg": "ok" //状态描述
},
"data": {
"team_num": 13, //队伍数
"position": "海珠区新港中路" //位置
}
}

amWiki对javascript代码片段做了再次增强,可以点击代码块右上角隐藏/显示注释
当注释处于隐藏状态时不会被复制,比较适合模拟返回json数据的接口时直接拷贝(json不允许注释)

javascript

代码截图:

效果:

1
2
3
4
5
6
7
8
9
10
11
12
//发送验证码
function cd(num) {
$('#code').val(num + '秒后可重发');
setTimeout(function() {
if (num - 1 >= 0) {
cd(num - 1);
} else {
$('#code').removeClass('bg-gray').prop('disabled', false).val('重新发送验证码');
}
},
1000);
}

Html

代码截图:

效果:

1
2
3
4
5
<body>
<div class="loading"><img src="/assets/images/loading.gif"></div>
<header>some text</header>
</body>
<script type="text/javascript" src="/assets/js/jquery-2.1.4.min.js"></script>

css

代码截图:

效果:

1
2
3
html,body{display:block;width:100%;height:100%;min-width:320px;}
a,img{-webkit-touch-callout:none;}
input[type="button"],input[type="submit"],input[type="reset"],textarea{-webkit-appearance:none;}

php

代码截图:

效果:

1
2
3
4
5
6
7
8
9
10
private function addQuestData($data, $filing_id)
{
$quest_num = $data['status'] == 10 ? 1 : 2;
$where = [
['user_filing_id', '=', $filing_id],
['project_id', '=', $data['project_id']],
['mobile','=', $data['mobile']],
['quest_num', '=', $quest_num]
];
}

sql

代码截图:

效果:

1
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber

java

代码截图:

效果:

1
2
3
4
5
6
7
8
9
10
public class Test {
public static void main(String args[]) {
int x = 10;
while( x < 20 ) {
System.out.print("value of x : " + x );
x++;
System.out.print("\n");
}
}
}

Markdown快速入门

Posted on 2016-05-21

Markdown 快速开始

简介

Markdown是为那些需要经常码字或者进行文字排版的、对码字手速和排版顺畅度有要求的人群设计的,他们希望用键盘把文字内容啪啪啪地打出来后就已经排版好了,最好从头到尾都不要使用鼠标。
这些人包括经常需要写文档的码农、博客写手、网站小编、出版业人士等等。
Markdown的语法简洁明了、学习容易,得到了许多著名网络平台的支持,例如代码托管平台Github、博客平台WordPress等等。

语法快速入门

标题

在行首插入1到6个#,对应1到6阶标题

# 这是 H1
## 这是 H2
### 这是 H3
#### 这是 H4
##### 这是 H5
###### 这是 H6

这是 H1

这是 H2

这是 H3

这是 H4

这是 H5
这是 H6

修辞和强调

使用星号和底线来标记需要强调的区段

**加粗**
__加粗__
*斜体*
_斜体_

加粗
加粗
斜体
_斜体_

列表

无序列表使用星号、加号和减号来做为列表的项目标记

* Candy.
* Gum.
+ Booze.
* Booze. 长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本  
这里是断行-文本长文本长文本长文本  
这里是断行-文本长文本长文本长文本
- Booze.
  + 嵌套
  * 嵌套
  • Candy.
  • Gum.
  • Booze.
  • Booze. 长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本长文本
    这里是断行-文本长文本长文本长文本
    这里是断行-文本长文本长文本长文本
  • Booze.
    • 嵌套
    • 嵌套

有序的列表则是使用一般的数字接着一个英文句点作为项目标记

1. Red
50. Green
1000. Blue
  1. Red
  2. Green
  3. Blue

链接

在方括号后面用圆括号接上链接

这是一个[链接显示文本](http://www.baidu.com "链接title文本")

这是一个链接显示文本

图片

图片的语法和链接很像

![alt文本](amWiki/images/logo.png "Title")

alt文本

代码

使用反引号 ` 来标记代码区段

我是`code`,`<div>division</div>`

我是code,<div>division</div>

如果要建立一个已经格式化好的代码区块,只要每行都缩进 4 个空格或是一个 tab 就可以了

var name = 'Candy'

表格

使用竖线分割内容,且同时使用“—”与“:”指定对齐方式

| Header01 | Header02 | Header03
| -------- | :------: | ---:
| 默认 | 居中 | 右
Header01 Header02 Header03
默认 居中 右

引用

只需要在文本前加入 > 这种尖括号(大于号)即可

>这里是一段引用

这里是一段引用

分割线

只需要三个 - 号

---

换行

只需要两个以上的空格然后回车

我是首行  
我换行了

我是首行
我换行了

html

可以直接在文档里书写 HTML,不需要额外标注这是 HTML

<div>division</div>
division

更多

研究markdown语法详细细节

  • 创始人 John Gruber 的 Markdown 语法说明
  • Markdown 中文版语法说明

Markdown编辑器众多

在线网页编辑器

MaHua、 简书、马克飞象、Dillinger、StackEdit

全平台编辑器

Atom、SublimeText、CmdMarkdown、小书匠编辑器

Windows平台编辑器

MarkdownPad

OSX平台编辑器

Mou、MacDown、Byword

Linux平台编辑器

ReText、UberWriter

Vim脚本之列表类型

Posted on 2016-05-21

复合数据类型之列表

  • 列表是事物的有序集合, 这里是事物是各种类型的值,甚至是混合项目.
  • 列表是引用类型, 就如同java中的对象一样.
  • 在必要的时候可以使用copy() 和 deepcopy()

建立列表

1
2
3
4
5
6
" 建立空列表
let alist = []
" 建立一个字符串列表
let strlist = ['app', 'root', 'qml']
" 多维列表
let nestlist = [[11, 12], [21, 22], [33, 43]]

列表索引

索引从0开始; 索引可以为负数, -1表示最后一个项目.

1
2
3
4
5
6
7
let item = strlist[0] " 得到第一个项目
let item = strlist[2] " 得到第三个项目
let item = nestlist[1][1] " 22
let last = strlist[-1]

echo get(strlist, 0)
echo get(strlist, 4, 'none') " 如果要找的索引超过范围,则返回none

列表切片

通过指定首末俩个索引, 获取列表的一部分.

1
2
3
4
5
6
7
8
9
10
11
12
let testlist = [1, 2, 4, 'one', 'three']

let shortlist = testlist[2 : -1] " [4, 'one', 'three']

" 如果首索引省略,则为0; 末索引省略为-1;
let endlist = testlist[3:] " ['one', 'three']
let shortlist = testlist[2:3] " [4, 'one']
let otherlist = mylist[:] " 复制列表

" 如果末索引大于等于列表的长度, 使用长度减1
let mylist = [4, 6, 8, 9]
echo mylist[2: 9] "[8, 9]

列表解包

将列表中的值存入变量.

1
2
3
4
5
6
let [var1, var2, var3] = mylist

" 相当于
let var1 = mylist[0]
let var2 = mylist[1]
let var3 = mylist[2:]

列表修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
" 用 add() 函数添加item
let alist = []
call add(alist, 'foo')
call add(alist, 'bar')
echo alist

" 用 '+' 添加item
let alist = ['user', 'password']
let alist += ['name', 'other']
echo alist

" 用extend() 扩展
let alist = ['one']
call extend(alist, ['two', 'three'])
echo alist
" ['one', 'two', 'three']

" 注意: 如果上面的用add()扩展,效果就不一样
let alist = ['one']
call add(alist, ['two', 'three'])
echo alist
" ['one', ['two', 'three']]

" 删除项目
let i = remove(alist, 3)
unlet alist[3]
let l = remove(alist, 3, -1)
unlet alist[3: ]
call filter(list, 'v:val !~ "x"') " 删除有x的项目

" 改变顺序
call sort(alist)
call reverse(alist)

注意: add()的第二个参数是作为单个项目被加入的.

列表的循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
let alist = ['one', 'two', 'three']
for n in alist
echo n
endfor

" 如果需要循环长度为给定次数的列表,range可以建立这样的列表:
for a in range(3)
echo a
endfor

" range() 产生的列表的第一个项目为0, 最后一个项目比列表的长度小1
" 也可以指定其他参数, 如初始值, 最大值, 步进(正负均可)
for a in range(8, 4, -2)
echo a " 8 6 4
endfor

for line in getline(1, 20)
if line =~ "Date: "
echo matchstr(line, 'Data: \zs.*')
endif
endfor

相关函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let r = call(funcname, list)   " 调用带参数列表的函数
if empty(list) " 检查 list 是否为空
let l = len(list) " list 项目的数量
let big = max(list) " list 项目的最大值
let small = min(list) " list 项目的最小值
let xs = count(list, 'x') " 计算 list 里 'x' 出现的次数
let i = index(list, 'x') " list 第一个 'x' 的位置
let lines = getline(1, 10) " 得到缓冲区十行文本行
call append('$', lines) " 附加若干文本行到缓冲区尾部
let list = split("a b c") " 用字符串中的项目建立列表
let string = join(list, ', ') " 用 list 项目构造字符串
let s = string(list) " list 的字符串表示
call map(list, '">> " . v:val') " 在每个项目前加上 ">> "

" 不要忘记组合使用不同功能可以简化任务。例如,要计算列表中所有数值的总和: >
exe 'let sum = ' . join(nrlist, '+')

更多

更多请:h List

Vim脚本之字典类型

Posted on 2016-05-21

复合类型之字典

  • 和其他语言一样, 字典保存键值对; 可以通过键, 快速找到值; 字典里的键值对是无序存储的.
  • 字典是引用对象,在传递时, 需要不想改变原对象,最好使用copy(), 传递拷贝.
  • 字典的键必须是字符串, 其中’04’ 和 04 是不同的字符串, 后面会转换为 ‘4’;
  • 值可以是任何表达式;

建立字典

1
2
3
4
5
let dic_test = {'one': 'ding', 'two': 'liu', 'three': 'jiang'}
echo dic_test['one']

" 空字典
let empty_dic = {}

字典与列表的转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
" 可以得到键列表
for key in keys(dic_test)
echo key
endfor

" keys() 返回的键列表是没有顺序的,可以用sort进行排序
for key in sort(keys(dic_test))
echo key
endfor

" values()可以获取值得列表
for value in valus(dic_test)
echo value
endfor

" items() 获取key,value的列表[[key1, val1], [key2, val2], ...]
for [key, value] in items(dic_test)
echo key . ' ' . value
endfor

字典同一

  • 字典也是引用类型, 需要用copy() 和 deepcopy()构造字典的备份, 否则赋值等产生的结果会引用同一对象.
1
2
3
4
let onedict = ['a': 1, 'b': 2]
let twodict = onedict
let twodict['a'] = 11
echo onedict.a " 11

字典修改

  • 要修改字典已经存在的项目或增加新的项目,用let:
1
2
let dict[4] = 'four'
let dict['one'] = item
  • 字典里面删除项目用remove() 或unlet:
1
2
3
let i = remove(dict, 'aaa')
unlet dict.aaaa
unlet dict['aaa']
  • 字典合并
1
call extend(adict, bdict)

这使得adict得到扩展, 加入所有的bdict项目; 对于重复的键, adict项目会被覆盖;可选的第三个参数可以该百年此点.

  • 字典里面删除多个项目可以用filter():
1
2
call filter(dict, 'v:val =~ "x"')
" 删除dict中所有不匹配"x"的item.

字典函数

  • 简单的取值
1
2
3
4
5
6
" 取值的方法
echo dic_test['one']

echo dic_test.one
" 则只能用于由ASCII字母,数字和下划线组成的键, 此方法也可以用于赋值
let dic_test.four = 'wang'
  • 定义函数并将它的引用放在字典中
1
2
3
4
5
6
function dic_test.translate(line) dict
return join(map(split(a:line), 'get(self, v:val, "???")'))
endfunction

echo dic_test.translate('three one five two')
" 输出: jiang ding ??? liu

join() 函数与split()函数相反, 它合并单词, 中间放分隔符; 经常使用split(), map(), join() 对单词组成的行进行过滤.

字典相关函数

1
2
3
4
5
6
7
8
if has_key(dict, 'foo')        " 如果 dict 有带 "foo" 键的项目则为真
if empty(dict) " 如果 dict 为空则为真
let l = len(dict) " dict 项目的数量
let big = max(dict) " dict 项目的最大值
let small = min(dict) " dict 项目的最小值
let xs = count(dict, 'x') " 统计 dict 里 'x' 出现的数目
let s = string(dict) " dict 的字符串表示
call map(dict, '">> " . v:val') " 在每个项目前加上 ">> "

更多详细内容请: :h Dictionary

1…456

DaSea

Fucking Code!

51 posts
25 tags
GitHub
© 2018 DaSea
Powered by Hexo v3.7.1
|
Theme — NexT.Gemini v6.3.0