HABIT IS POWER

习惯就是力量

0%

需求

把Mac升级到了Sierra,发现我的git无法ssh登录了,一开始还以为是服务器的问题,因为问题的现象很像:
发现 Gitlab 的一个权限问题中描述的那样,要求我输入密码;

不过后面突然想到今天升级了系统,所以加上了Sierra关键字又搜索了下,发现了同类中人:

Unable to ssh without password after installing Sierra

苹果系统升级到sierra后,ssh远程证书免密码登录出错了

解决方案

上面两个帖子里的办法没有能解决我的问题,我最终的解决方案是:

在Sierra系统下重新生成id_rsa和id_rsa.pub,重新设置服务端的id_rsa.pub证书

一个小问题

一开始我生成的证书没有命名为默认的名字:id_rsa,会出现这个错误:
github提示Permission denied (publickey),如何才能解决?

这个问题其实好解决,两个方案:

需求

把AVAudioPCMBuffer转换层CMSampleBufferRef,同理也可以从AudioBufferList加上AudioStreamBasicDescription转换成CMSampleBufferRef

实现代码

实现代码如下:

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

- (CMSampleBufferRef)createAudioSampleBufferFrom:(AVAudioPCMBuffer *) pcmBuffer {
AudioBufferList *audioBufferList = [pcmBuffer mutableAudioBufferList];
AudioStreamBasicDescription asbd = *pcmBuffer.format.streamDescription;

CMSampleBufferRef sampleBuffer = NULL;
CMFormatDescriptionRef format = NULL;

OSStatus error = CMAudioFormatDescriptionCreate(kCFAllocatorDefault, &asbd, 0, NULL, 0, NULL, NULL, &format);
if (error != noErr) {
return nil;
}

CMSampleTimingInfo timing = { CMTimeMake(1, asbd.mSampleRate), kCMTimeZero, kCMTimeInvalid };
error = CMSampleBufferCreate(kCFAllocatorDefault,
NULL, false, NULL, NULL, format,
pcmBuffer.frameLength,
1, &timing, 0, NULL, &sampleBuffer);
if (error != noErr) {
CFRelease(format);
NSLog(@"CMSampleBufferCreate returned error: %d", (int)error);
return nil;
}

error = CMSampleBufferSetDataBufferFromAudioBufferList(sampleBuffer, kCFAllocatorDefault, kCFAllocatorDefault, 0, audioBufferList);
if (error != noErr) {
CFRelease(format);
NSLog(@"CMSampleBufferSetDataBufferFromAudioBufferList returned error: %d", (int)error);
return nil;
}

CFRelease(format);
return sampleBuffer;
}

内存释放

生成的CMSampleBufferRef引用计数为1,记得释放,类似:

1
2
3
4
5
6
7

CMSampleBufferRef sampleBuffer = [self createAudioSampleBufferFrom:pcmBuffer];

// do somthing with sampleBuffer

CFRelease(sampleBuffer);

AudioBufferList

关于AudioBufferList,需要说的是PCM中的双通道,对应到AudioBufferList就是mNumberBuffers

假定存在

AudioBufferList *ioData = …
AudioStreamBasicDescription asbd = …

如果ioData->mNumberBuffers为2,那么有以下几个推导:

  • 1、ioData->mBuffers[0]有数据外,ioData->mBuffers[1]也有数据;
  • 2、跟AudioBufferList对应的asbd->mChannelsPerFrame == 2
  • 3、还要补充一点的是,asbd.mChannelsPerFrame == 2的时候,asbd.mBytesPerFrame并不会包含2个channel的数据
1
2
3
4

asbd.mBytesPerFrame = asbd.mBitsPerChannel/8; // 正确
asbd.mBytesPerFrame = asbd.mBitsPerChannel/8 * mChannelsPerFrame; // 错误

参考文档

CMSampleBuffer
iOS 音频采集 AudioBufferList转CMSampleBufferRef
CMSampleBufferSetDataBufferFromAudioBufferList returning -12731
osstatus

需求

编译iOS版本的SRS librtmp

编译步骤

1、使用SRS的configure 生成单独的librtmp工程

1
./configure --export-librtmp-single=<path>

2、创建iOS空工程,并复制srs-librtmp src目录下的文件到新工程的vendor/srs-librtmp目录下

3、从SRS的srs目录中把srs_auto_headers.hpp文件也复制到新工程的vendor/srs-librtmp目录下

4、配置Header Search Paths,把librtmp的代码目录加入配置

1
2
3
4
5
./srs-librtmp/vendor/srs-librtmp
./srs-librtmp/vendor/srs-librtmp/core
./srs-librtmp/vendor/srs-librtmp/kernel
./srs-librtmp/vendor/srs-librtmp/libs
./srs-librtmp/vendor/srs-librtmp/protocol

5、C++ Language Dialect 配置为 GNU++98

6、C++ Standard Library 配置为 libstdc++(GNU C++ standard library)

7、在main.m中添加测试代码

1
2
3
4
5
6
7
8
9
10
11
#include "srs_librtmp.hpp"

srs_rtmp_t rtmp;

printf("Example for srs-librtmp\n");
printf("SRS(ossrs) client librtmp library.\n");
printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision());

rtmp = srs_rtmp_create("rtmp://ossrs.net/live/livestream");
srs_human_trace("create rtmp success");
srs_rtmp_destroy(rtmp);

8、编译正常,完成。

参考文档

SRS提供的librtmp

需求

1、在Mac下编译SRS的RTMP服务器

2、用OBS往我们自己搭建的服务器上推流

3、用RTMP播放器(比如VLC),观看服务器上RTMP流

取代码

官方git仓库已经不维护了:https://github.com/ossrs/srs

我使用的是官方推荐的第一个fork:https://github.com/smartdu/srs

由于代码比较大,挂个代理git clone成功率会高很多,这里顺便推荐下神器:proxychains4

编译参考文档

https://github.com/ossrs/srs/wiki/v1_CN_SampleRTMP

  • PS.
    如果之前用不同的配置编译过,那么可以这样子清理下:
1
2
3
cd trunk
make clean
rm -f Makefile

编译

用configure脚本来生成Makefile

1
2
3
4
5
6
7
8
9
10
cd ./srs/trunk

# 看下配置的选项

./configure -h

# 指定Mac编译,并关闭其他option
./configure --osx --without-ssl --without-hls --without-hds --without-dvr --without-nginx --without-http-callback --without-http-server --without-stream-caster --without-http-api --without-ffmpeg --without-transcode --without-ingest --without-stat --without-librtmp

make

一切顺利的话,编译通过,会得到了./objs/srs这个可执行文件

运行SRS服务器

srs.conf

由于Mac系统的限制,运行SRS的话需要把./conf/srs.conf中的并发数修改下,我修改成100:

1
2
#srs.conf中的这一行需要修改下:
max_connections 100;

rtmp服务器跑起来

1
2
3
4
5
6
7
./objs/srs -c ./conf/srs.conf

#跑起来后要留意下log,配置存在错误的话,srs进程会关闭掉
tail -f ./objs/srs.log

#检查下srs进程是否正常运行
ps aux | grep srs

推流

直接使用OBS或者其他RTMP推流工具,填写下:

1
2
URL:rtmp://10.0.0.54/live
流密钥:livestream

看RTMP流视频

直接用VLC打开这个地址就可以了:

1
rtmp://10.0.0.54/live/livestream

小结

到此Mac上最精简的SRS算是编译通过,且能正常跑起来了~

需求

通过CocoaPods使用VideoCore,出现编译错误:

1
'type_half.inl' file not found

解决方案

I solved this problem by change the search path setting in Pods project. Just remove all “”${PODS_ROOT}/Headers/Private” in “Header Search Paths”

记得选着Pod工程下的VideoCore这个Target进行配置,这个不是最优的方案,但是算是比较简单的方案。

参考文档

GLM Include Error #209

需求

我在react还是0.x版本的时候,走过一遍react的Getting Started,目前虽然已经写了一些代码,但是完完整整的Hello World倒是没写过,所以决定补下这篇Hello World教程,并做一些相关知识的入门介绍。

参考内容

如果你能看得懂react官网的介绍,其实也没必要看我这篇转述的教程。

React官方 Getting Started

CDN静态文件(为什么不用Facebook的CDN大家都懂的)

Package Management

最简单的Hello World

单个静态文件,并使用CDN直接引用react.js、react-dom.js以及browser.min.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello React!</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world! @eden</h1>,
document.getElementById('example')
);
</script>
</body>
</html>

React + npm + webpack

1. 创建一个目录hello-react

之后的命令行操作都是在这个目录下进行的。

2. npm init一个package.json文件,全部使用默认即可

1
npm init

3. 配置npm依赖

这里的webpack我并没有使用全局安装,下面的步骤会用到

1
npm install --save react react-dom babel-preset-react babel-loader babel-core webpack

4. 在hello.html和hello.js中写代码

hello.html

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello React!</title>
<!-- No need for Babel! -->
</head>
<body>
<div id="example"></div>
<script src="bundle.js"></script>
</body>
</html>

hello.js

1
2
3
4
5
6
7
8
// hello.js
var React = require('react');
var ReactDOM = require('react-dom');

ReactDOM.render(
<h1>Hello, world! I'm eden</h1>,
document.getElementById('example')
);

5. 用webpack生成bundle.js

创建并配置babel:.babelrc

1
{ "presets": ["react"] }

webpack打包,使用本地目录下的webpack,而不是全局的

1
./node_modules/webpack/bin/webpack.js hello.js bundle.js --module-bind 'js=babel-loader'

这样我们就在hello-react的根目录下得到了下面这几个文件和目录:

1
2
3
4
5
6
./.babelrc
./bundle.js
./hello.html
./main.js
./node_modules
./package.json

6. OK了

直接用浏览器打开./hello.html就是我们想要的用npm和webpack打包出来的,最简单的react hello worl

webpack配置

上面我们使用了webpack的命令行进行打包,其实用npm配合webpack会更方便,同时我们也调整下我们的目录结构,把hello.js放到src目录下,并把打包生成的bundle.js,以及hello.html放到build目录下。

添加一个webpack.config.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var path = require('path');

var config = {
entry: [
path.resolve(__dirname, 'src/hello.js')
],
output: {
path: path.resolve(__dirname, 'build'),
filename: 'bundle.js',
},
module: {
loaders: [{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel',
query: {}
}]
}
};

module.exports = config;

修改下package.json添加一个build的script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"name": "hello-react",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack"
},
"author": "",
"license": "ISC",
"dependencies": {
"babel-core": "^6.8.0",
"babel-loader": "^6.2.4",
"babel-preset-react": "^6.5.0",
"react": "^15.0.2",
"react-dom": "^15.0.2",
"webpack": "^1.13.0"
}
}

通过npm来执行webpack打包

1
npm run-script build

这样我们就在hello-react的根目录下得到了下面这几个文件和目录:

1
2
3
4
5
6
./.babelrc
./build/bundle.js
./build/hello.html
./package.json
./src/hello.js
./webpack.config.js

好了,可以通过打开hello.html来查看下我们的成果了

webpack 小结

再往后,你可能就需要用webpack-dev-server来自动刷新页面,这个本文就不具体介绍了,因为webpack可以做的事情非常多,大家慢慢去发现吧 :)

这里贴下在上面的步骤之后配置webpack-dev-server的方法:

1
npm install --save webpack-dev-server

webpack.config.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var path = require('path');

var config = {
entry: [
'webpack/hot/dev-server',
'webpack-dev-server/client?http://localhost:8080',
path.resolve(__dirname, 'src/hello.js')
],
output: {
path: path.resolve(__dirname, 'build'),
filename: 'bundle.js',
},
module: {
loaders: [{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel',
query: {}
}]
}
};

module.exports = config;

package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"name": "hello-react",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"dev": "webpack-dev-server --devtool eval --progress --colors --hot --content-base build"
},
"author": "",
"license": "ISC",
"dependencies": {
"babel-core": "^6.8.0",
"babel-loader": "^6.2.4",
"babel-preset-react": "^6.5.0",
"react": "^15.0.2",
"react-dom": "^15.0.2",
"webpack": "^1.13.0",
"webpack-dev-server": "^1.14.1"
}
}

执行脚本:

1
npm run-script dev

然后你就可以在浏览器上用http://127.0.0.1:8080/hello.html自动刷新你的修改了

关键字说明

babel

webpack

babel 6 教程

疑问

CSS下有时候为了偷懒,会把#CCCCCC写成#CCC,这个其实就是自动补齐,CSS下会复制每个C变成CC;

那么同样的逻辑下iOS是什么效果呢?

解答

因为SDK并没有提供HEX参数的UIColor构造函数,所以实际上就是看代码怎么写的

如果按照比较常用的方式是什么样的呢?

How can I create a UIColor from a hex string?

1
2
3
4
5
6
7
8
// Assumes input like "#00FF00" (#RRGGBB).
+ (UIColor *)colorFromHexString:(NSString *)hexString {
unsigned rgbValue = 0;
NSScanner *scanner = [NSScanner scannerWithString:hexString];
[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&rgbValue];
return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0];
}

根据这个代码,实际的效果会是这样:

1
#CCC 会被解释成 #000CCC,而不是像CSS中所期望的#CCCCCC

参考文章:

Web colors

需求

之前没太留意node的安装版本,各种手动安装,今天突然发现node怎么又变成了0.10的版本,nvm,npm,node版本都怪怪的。

在代码洁癖的驱动下,准备清理这个恶劣的开发环境,清理后的目标是:

  • 用brew来安装nvm,并管理nvm的升级
  • 用nvm来安装node.js,并管理node.js的升级

卸载老版本的node和nvm

卸载node

  • 如果是从brew安装的, 运行brew uninstall node
  • 删除~/目录下所有node和node_modules
  • 删除/usr/local/lib中的所有node和node_modules
  • 删除/usr/local/lib中的所有node和node_modules的文件夹
  • 在/usr/local/bin中, 删除所有node的可执行文件(node和npm)

手动删除文件,整理成脚本是这个样子:

1
2
3
4
5
6
sudo rm -rf ~/.npm
sudo rm -rf ~/node_modules
sudo rm -rf ~/.node-gyp
sudo rm /usr/local/bin/node
sudo rm /usr/local/bin/npm
sudo rm /usr/local/lib/dtrace/node.d

参考文章: 如何删除node.js?

卸载.nvm

我之前是手动安装的nvm,nvm的目录结构比较简单,删除这三个就可以了

1
2
3
rm -rf ~/.nvm
rm -rf ~/.npm
rm -rf ~/.bower

还需要删除下.bash_profile文件中的配置(用brew安装后还需要重新加上,但不太一样)

1
2
3
# vim .bash_profile
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

参考文章: How to uninstall nvm? #298

清理干净后的确认

重启终端后,挨个测试几个命令应该都是找不到,才算是正确的:

1
2
3
nvm
node
npm

重新安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 使用brew安装nvm
brew install nvm

# vim .bash_profile后增加下面这两行
export NVM_DIR="$HOME/.nvm"
source $(brew --prefix nvm)/nvm.sh

# 使用nvm安装node.js
nvm install node

# 校验
$ nvm --version
0.31.0
$ node -v
v5.7.1
$ npm -v
3.6.0
$ nvm list
-> v5.7.1
default -> node (-> v5.7.1)
node -> stable (-> v5.7.1) (default)
stable -> 5.7 (-> v5.7.1) (default)
iojs -> N/A (default)

好了,世界清净了 :)

参考文章:

Node.js 安裝與版本切換教學 (for MAC)

Mac上使用brew安装nvm来支持多版本的Nodejs

需求

需求来自Github的一条公告:

GitHub Pages now faster and simpler with Jekyll 3.0

1
Starting May 1st, 2016, GitHub Pages will only support kramdown, Jekyll's default Markdown engine.

GitHub宣布从 2016 年 5 月 1 日起,GitHub Pages 将只支持 kramdown 作为唯一的 Markdown 引擎,而我之前使用的rdiscount需要做迁移。

迁移

升级本地Jekyll到3.0方便调试

1
$ gem install jekyll

_config.yml

老的配置文件

1
2
3
4
5
6
7
8
9
10
markdown: rdiscount
highlighter: pygments
permalink: /:year/:month/:day/:title.html
name: "HABIT IS POWER"

author: "linyehui"
atom-baseurl: "http://linyehui.github.io"
disqus: "linyehui"

navigations:

更新后的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
markdown: kramdown
kramdown:
input: GFM
highlighter: rouge
permalink: /:year/:month/:day/:title.html
name: "HABIT IS POWER"

author: "linyehui"
atom-baseurl: "http://linyehui.github.io"
disqus: "linyehui"

navigations:

升级后的格式问题

升级之后,最大的问题就是换行问题,再有就是代码格式问题

换行问题

这个麻烦一点,找了下,没办法从配置上修改,只好用正则表达式全局搜索替换

连续两行#开头的话中间加一个空行

1
2
(#.+\s)(^#)
$1\n$2

行末尾两个空格替换成一个空行

1
2
(  $)
$1\n

代码格式

我涉及到的代码格式主要是这几种,代码块的左```之后跟的字符串写法换一下就好了

1
2
3
4
5
6
7
8
9
object-c
objc

C++
cpp

c#
csharp

参考文档

配置入门

说在前面的几点提示

  • 1、不推荐使用图形化配置工具,直接修改配置文件是最靠谱的

  • 2、配置文件在~/Library/Rime这个目录下

  • 3、不要直接修改配置文件,使用.custom.yaml的扩展配置来自定义自己的配置

配置文件说明

注意下面的文件,都是对默认文件的自定义,所有文件名中都有”.custom”

1
2
3
4
5
6
squirrel.custom.yaml ,自定义皮肤;  

default.custom.yaml ,设定备选词数量,定义输入方案;

luna_pinyin_simp.custom.yaml ,定义扩充词库、加载符号库、模糊拼音。明月拼音·简化字输入方案配置文件,明月拼音对应的文件是 luna_pinyin.custom.yaml;

还原默认配置文件

万一你不听劝,还是修改来默认的配置文件,而且改坏来,那么有个简单的方法可以还原:

1
把~/Library/Rime目录删除,然后点击下“重新部署”,会自动生成默认配置。

切换到简体输入

1
2
Ctrl+~
选择“朙月拼音.简化字”

切换全角和半角

1
2
3
shift+空格

也可以使用Ctrl+~进行切换,不过就要多进行一次选择操作

squirrel.custom.yaml

指定程序的名称(比如 Safari 浏览器的程序名称 com.apple.Safari ),通过在「应用程序」里选中 app 图标,鼠标右键选择「显示包内容」,然后找到包内文件夹里的「Info.plist」文件,找到其中 Bundle identifier 属性,对应的就是指定程序名称了。

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
patch:
style:
horizontal: true
font_point: 32
color_scheme: starcraft
horizontal : true # 候选词横排
font_face" : "苹方-简 细体" # 字体名称
app_options:
com.alfredapp.Alfred:
ascii_mode: true
com.runningwithcrayons.Alfred-2:
ascii_mode: true
com.blacktree.Quicksilver:
ascii_mode: true
com.apple.Terminal:
ascii_mode: true
no_inline: true
com.googlecode.iterm2:
ascii_mode: true
org.vim.MacVim:
ascii_mode: true
no_inline: true
com.apple.dt.Xcode:
ascii_mode: true
com.apple.spotlight:
ascii_mode: true
com.apple.finder:
ascii_mode: true
com.sublimetext.3:
ascii_mode: true

luna_pinyin.custom.yaml

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# luna_pinyin.custom.yaml
#
# 【朙月拼音】模糊音定製模板
# 佛振配製 :-)
#
# 位置:
# ~/.config/ibus/rime (Linux)
# ~/Library/Rime (Mac OS)
# %APPDATA%\Rime (Windows)
#
# 於重新部署後生效
#

patch:
'speller/algebra':
- erase/^xx$/ # 第一行保留

# 模糊音定義
# 需要哪組就刪去行首的 # 號,單雙向任選
- derive/^([zcs])h/$1/ # zh, ch, sh => z, c, s
- derive/^([zcs])([^h])/$1h$2/ # z, c, s => zh, ch, sh

#- derive/^n/l/ # n => l
#- derive/^l/n/ # l => n

# 這兩組一般是單向的
- derive/^r/l/ # r => l

#- derive/^ren/yin/ # ren => yin, reng => ying
#- derive/^r/y/ # r => y

# 下面 hu <=> f 這組寫法複雜一些,分情況討論
#- derive/^hu$/fu/ # hu => fu
#- derive/^hong$/feng/ # hong => feng
#- derive/^hu([in])$/fe$1/ # hui => fei, hun => fen
#- derive/^hu([ao])/f$1/ # hua => fa, ...

#- derive/^fu$/hu/ # fu => hu
#- derive/^feng$/hong/ # feng => hong
#- derive/^fe([in])$/hu$1/ # fei => hui, fen => hun
#- derive/^f([ao])/hu$1/ # fa => hua, ...

# 韻母部份
#- derive/^([bpmf])eng$/$1ong/ # meng = mong, ...
- derive/([eia])n$/$1ng/ # en => eng, in => ing, an => ang
- derive/([eia])ng$/$1n/ # eng => en, ing => in, ang => an

# 樣例足夠了,其他請自己總結……

# 反模糊音?
# 誰說方言沒有普通話精確、有模糊音,就能有反模糊音。
# 示例爲分尖團的中原官話:
#- derive/^ji$/zii/ # 在設計者安排下鳩佔鵲巢,尖音i只好雙寫了
#- derive/^qi$/cii/
#- derive/^xi$/sii/
#- derive/^ji/zi/
#- derive/^qi/ci/
#- derive/^xi/si/
#- derive/^ju/zv/
#- derive/^qu/cv/
#- derive/^xu/sv/
# 韻母部份,只能從大面上覆蓋
#- derive/^([bpm])o$/$1eh/ # bo => beh, ...
#- derive/(^|[dtnlgkhzcs]h?)e$/$1eh/ # ge => geh, se => sheh, ...
#- derive/^([gkh])uo$/$1ue/ # guo => gue, ...
#- derive/^([gkh])e$/$1uo/ # he => huo, ...
#- derive/([uv])e$/$1o/ # jue => juo, lve => lvo, ...
#- derive/^fei$/fi/ # fei => fi
#- derive/^wei$/vi/ # wei => vi
#- derive/^([nl])ei$/$1ui/ # nei => nui, lei => lui
#- derive/^([nlzcs])un$/$1vn/ # lun => lvn, zun => zvn, ...
#- derive/^([nlzcs])ong$/$1iong/ # long => liong, song => siong, ...
# 這個辦法雖從拼寫上做出了區分,然而受詞典制約,候選字仍是混的。
# 只有真正的方音輸入方案纔能做到!但「反模糊音」這個玩法快速而有效!

# 模糊音定義先於簡拼定義,方可令簡拼支持以上模糊音
- abbrev/^([a-z]).+$/$1/ # 簡拼(首字母)
- abbrev/^([zcs]h).+$/$1/ # 簡拼(zh, ch, sh)

# 以下是一組容錯拼寫,《漢語拼音》方案以前者爲正
- derive/^([nl])ve$/$1ue/ # nve = nue, lve = lue
- derive/^([jqxy])u/$1v/ # ju = jv,
- derive/un$/uen/ # gun = guen,
- derive/ui$/uei/ # gui = guei,
- derive/iu$/iou/ # jiu = jiou,

# 自動糾正一些常見的按鍵錯誤
- derive/([aeiou])ng$/$1gn/ # dagn => dang
- derive/([dtngkhrzcs])o(u|ng)$/$1o/ # zho => zhong|zhou
- derive/ong$/on/ # zhonguo => zhong guo
- derive/ao$/oa/ # hoa => hao
- derive/([iu])a(o|ng?)$/a$1$2/ # tain => tian

# 分尖團後 v => ü 的改寫條件也要相應地擴充:
#'translator/preedit_format':
# - "xform/([nljqxyzcs])v/$1ü/"

全部使用英文符号

默认输入中括号,出来的是花式的括号,有点不太习惯,从官方下载这个文档alternative.yaml放到配置目录,然后修改下luna_pinyin.custom.yaml

1
2
3
4
# luna_pinyin.custom.yaml

patch:
'punctuator/import_preset': alternative

这样就能直接用”[]”输出”[]”了