今天整理了下Feedly上的订阅,发现不少RSS源已经失效:要么是域名已经失效,要么是RSS托管在FeedSky上导致无法访问,或者博客平台迁移导致的RSS地址变更。删删减减后就只剩下40%。
想来使用新域名也有几个月,以后也就以这个新域名为主了。所以通过RSS订阅内容的各位,更新下RRS地址吧:
https://wu.nerd.moe/?feed=rss2
嗯,已经全站HTTPS了,感谢Let's Encrypt。
今天整理了下Feedly上的订阅,发现不少RSS源已经失效:要么是域名已经失效,要么是RSS托管在FeedSky上导致无法访问,或者博客平台迁移导致的RSS地址变更。删删减减后就只剩下40%。
想来使用新域名也有几个月,以后也就以这个新域名为主了。所以通过RSS订阅内容的各位,更新下RRS地址吧:
https://wu.nerd.moe/?feed=rss2
嗯,已经全站HTTPS了,感谢Let's Encrypt。
Caps Lock算是最不常用按键之一,占着相当好的地理位置。
Esc和Ctrl则是Vim用户(及其他用户)相当常用的按键,却位处于偏远的左上角及左下角。
好在Ctrl是组合按键,Esc是单独按键,那么就可以将Ctrl和Esc同时映射到一个键上,单独按时,响应为Esc,和其他键一起按时响应为Ctrl。
映射到哪个键上呢?当然是位置好又没什么用的Caps Lock了。
Linux:
用super-caps解决。
Super-caps依赖xmodmap和xcape,其中xcape需要手动安装,然后执行super-caps.sh即可。
该脚本有时会失效,重新执行即可。执行前应
setxkbmap -layout us
清除xmodmap的配置(如果是us键位布局的话),
pkill xcape
杀死xcape。
OS X:
用karabiner实现。
首先在System Preferences - Keyboard - Modifier Keys将Caps Lock映射为Ctrl,再在Karabiner中选中
Control_L to Control_L (+ when you type Control_L only, send Escape)
即可。
Windows:
用AutoHotKey实现:
; Author: fwompner gmail com #InstallKeybdHook SetCapsLockState, alwaysoff Capslock:: Send {LControl Down} KeyWait, CapsLock Send {LControl Up} if ( A_PriorKey = "CapsLock" ) { Send {Esc} } return
更多可参考这篇wiki。
update: 2015-08-17
Telegram更新到版本 0.8.51,解决了Fcitx和IBus输入问题,以下内容作废。
--------------------------------------------------------------------
Telegram使用了QT5,而作者未链接platforminputcontexts库,因此无法使用输入法。
根据最新回复,先编译libfcitxplatforminputcontextplugin再编译Telegram应该可以解决fcitx输入问题(我也尝试过编译但没成功),目前作者没有回应。
Arch用户AUR能解决问题。
那么在问题解决之前只能通过一些间接方式使用Telegram(gedit复制粘贴就算了):
1,参照MC中输入中文的解决方法:
安装xclip和xdotool,
#!/bin/bash gdialog --inputbox ' ' 2>&1 | xclip -i -selection clipboard xdotool key "ctrl+v" sleep 0.1 xdotool key Return
将这些代码绑定到某个快捷键,在Telegram界面按下快捷键会弹出一个对话框,输入文字后回车,会自动将内容复制到Telegram会回车回复(如果使用的是默认的回车回复的话)。
KDE用户将第二行替换成
kdialog --inputbox ' ' | xclip -i -selection clipboard
我目前使用的是这种方案,虽然弹出对话框会有一定时延。
Awesome用户:
if c.class and c.class:match('Telegram') then local keys = c:keys() local mykey = awful.key({}, 'Tab', function(c) awful.util.spawn_with_shell("gdialog --inputbox ' ' 2>&1 | xclip -i -selection clipboard && sleep 0.1 && xdotool key ctrl+v && xdotool key Return") end) keys = awful.util.table.join(keys, mykey) c:keys(keys) elseif c.name == 'Add a new entry' then awful.util.spawn_with_shell('sleep 0.05 && fcitx-remote -T', false) end
2,使用Cutegram:
虽然Cutegram也无法直接输入中文,但是因为不像Telegram那样直接编译成二进制文件,因此我们只需要将相应的库文件添加到Cutegram目录就能正常使用。
(我使用的是fcitx,就以fcitx为例吧)首先安装fcitx-frontend-qt5,那么在/usr/lib/i386-linux-gnu/qt5/plugins/platforminputcontexts/(32位)或usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/(64位)目录下会有个libfcitxplatforminputcontextplugin.so(还有个libibusplatforminputcontextplugin.so,应该是给ibus用的,我没测试,都复制过来吧)文件,将其复制到/opt/cutegram/qtplugins/platforminputcontexts目录下(创建软链接会更好),重启Cutegram就可以使用输入法了。
Cutegram使用起来会有各种小问题,偶尔会崩溃。
详细内容参考薄荷
3,剩下的就是:
写了个深度音乐播放器的网易云音乐插件,可在Linux下播放用户创建、收藏的歌单,以及私人FM。
功能完善中。
https://github.com/wu-nerd/dmusic-plugin-NeteaseCloudMusic
基于sumary的dmusic-plugin-baidumusic修改而成
使用了NetEaseMusicBox中的网易云音乐API
sudo apt-add-repository ppa:noobslab/deepin-sc
sudo apt-get update
sudo apt-get install deepin-music-player
这个源有段时间没有更新,因此Ubuntu 15.04可能无法安装。需要修改/etc/apt/sources.list.d
文件夹下noobslab-ubuntu-deepin-sc-vivid.list
文件,将其中的的vivid
修改成utopic
,然后
sudo apt-get update
sudo apt-get install deepin-music-player
安装完成后恢复原样
sudo apt-get install python-pip
sudo pip install requests
sudo pip install pycrypto
对于默认使用Python 3的发行版比如Arch,请安装python2版本的库:
sudo pacman -Ss python2-pip
sudo pip2 install requests
sudo pip2 install pycrypto
git clone https://github.com/wu-nerd/dmusic-plugin-NeteaseCloudMusic.git
cd dmusic-plugin-NeteaseCloudMusic
python2 install.py
运行深度音乐, 选项设置->附加组件 中启用网易云音乐即可
很多时候运行完命令才忘了sudo,那么
很明显第三个是最简单的。
同样很多时候,一条命令的输出太长,需要pipe到less中或者Grep中,那么用alias或者函数会方便很多。可是"!!"没法写入到.zshrc中。
Google相关信息,出现频率最高的是这个命令:fc -nl -1
,可以直接在得到历史记录中的上一条命令。
不过有一个问题:当一个命令的前面出现若干空格时,这条命令不会出现在历史记录中
,那么这时候fc命令无法返回我们想获得的那条命令。
同时,当上条命令中出现任意alias时,通过fc命令返回上条命令会出现command not found
提示,貌似是因为alias默认无法在non-interactive shell中生效。
那么,fc -nl -1
有两个问题:
既然上个命令中有alias无法识别,那么将命令中的alias还原成原始命令,问题即可解决。
zsh中有个函数_expand_alias,其作用是当当前光标所在的word是一个alisa时,会自动将alisa还须成该alias的值,也就是原始的命令。
有函数了,那么还需要个条件来触发函数。
在ZSH中,每一个函数都可以当做一个Widget,通过Widget绑定到某个按键组合从而可以实现对Widget的触发。
那么就这样,
# 新建一个函数 expand_alias_space () { zle _expand_alias zle self-insert } # 新建一个Widget zle -N expand_alias_space # 绑定到空格键 bindkey " " expand_alias_space
效果图:
当命令中只有一个alias时,输入完alias后直接就回车,不输入空格就无法触发Widget,就无法expand alias了。
所以对于Enter
键也同样要绑定Widget,不过这个Widget会略微有所不同。
# 新建一个函数
expand_alias_enter () {
if [[ -z $BUFFER ]]
then
zle clear-screen
else
zle _expand_alias
zle accept-line
fi
}
# 新建一个Widget
zle -N expand_alias_enter
# 绑定到回车键
bindkey "^M" expand_alias_enter
expand_alias_enter
函数首先判断当前输入内容是否为空,如果为空,就帮个忙,把屏幕清一下,如果不为空,就expand alias,然后执行命令。
效果图:
OK,问题1解决。
解决了问题1那问题2就很简单了。
既然部分情况下命令不会被记录到历史中,那么咱来手动记录。
每次回车的时候把当前记录记录下来就可以了吧。
修改expand_alias_enter
函数为:
expand_alias_enter () { if [[ -z $BUFFER ]] then zle clear-screen else zle _expand_alias zle accept-line # 保存当前命令 LAST_COMMAND=$CURRENT_COMMAND CURRENT_COMMAND=$BUFFER fi }
这样上次执行的命令保存在$LAST_COMMAND
中,那么eval $LAST_COMMAND
就可以执行上次命令。
嗯,问题2解决。
其实还是有问题的,如果两条相邻的命令都执行了eval $LAST_COMMAND
,当前命令执行eval $LASZT_COMMAND
,也就是上条命令,而上条命令也执行eval $LAST_COMMAND
,此时$LAST_COMMAND
中保存的还是上条命令,那继续执行上条命令,然后就死循环了:
zsh: job table full or recursion limit exceeded
这个问题解决起来就比较麻烦了。
要消除循环,就要将$LAST_COMMAND
的值替换成具体的命令。
那么就需要在用到了$LAST_COMMAND
的函数中将当前函数中执行过的所有命令都顺序存放在某个buffer中,在执行完函数后,检测下buffer,如果不为空,那么就将其中的值作为本次执行过的命令内容,存放在$CURRENT_COMMAND
中。
这样虽然历史记录中显示的是函数名,但是$CURRENT_COMMAND
中记录的是这个函数对应的所有命令,不包含$LAST_COMMAND
,也就不会出现循环问题。
下面实现一个显示上次执行过的命令的函数:
<pre><code>fun() { # 将本函数要执行的命令赋给BUFFER_FOR_LAST_COMMAND BUFFER_FOR_LAST_COMMAND="echo \[`echo $LAST_COMMAND`\]" # 执行该BUFFER eval $BUFFER_FOR_LAST_COMMAND } </code></pre>
执行完函数后检测变量$BUFFER_FOR_LAST_COMMAND
,如果不为空,将其值赋给$CURRENT_COMMAND
,然后删除变量$BUFFER_FOR_LAST_COMMAND
。
这个过程要在执行完函数后触发,Widgetzle-line-init
可以满足要求。
function zle-line-init { if [ -n "$BUFFER_FOR_LAST_COMMAND" ] then # 如果BUFFER不为空,则将其值作为本次运行的命令 CURRENT_COMMAND=$BUFFER_FOR_LAST_COMMAND eval unset -v $BUFFER_FOR_LAST_COMMAND fi zle reset-prompt } zle -N zle-line-init
效果如图:
至于alias可以用函数实现,就这样。
总感觉第二部分有问题,但又不知道到底什么地方有问题,先就这样,以后再改。
这是第一篇用Markdown写的博文,在马克飞象上完成。界面手感都不错,就是vim模式下切换到普通模式比较麻烦,需要将输入法切换到英文模式才能操作,不方便。用dillinger.io导出。导出后的样式和马克飞象中差太多。
有时间配置vim的Markdown插件,配合fcitx.vim至少可以少按几下Shift,虽然插件有很明示的延时。
感谢依云提供的Widget,当用来执行固定操作时这种方式更合适。
sudo-command-line() { # If current buffer is empth, get the last command [[ -z $BUFFER ]] && zle up-history # If the command not start with sudo [[ $BUFFER != sudo\ * ]] && { typeset -a bufs bufs=(${(z)BUFFER}) # If the first word in BUFFER is an alias, replace is with # it's value if (( $+aliases[$bufs[1]] )); then bufs[1]=$aliases[$bufs[1]] fi bufs=(sudo $bufs) BUFFER=$bufs } zle end-of-line } zle -N sudo-command-line bindkey "\e\e" sudo-command-line