『请更新本站RSS地址』

四 22 2016

今天整理了下Feedly上的订阅,发现不少RSS源已经失效:要么是域名已经失效,要么是RSS托管在FeedSky上导致无法访问,或者博客平台迁移导致的RSS地址变更。删删减减后就只剩下40%。

想来使用新域名也有几个月,以后也就以这个新域名为主了。所以通过RSS订阅内容的各位,更新下RRS地址吧:

https://wu.nerd.moe/?feed=rss2

嗯,已经全站HTTPS了,感谢Let's Encrypt

 

3 responses so far

[VIM]将Caps Lock同时映射成Ctrl和Esc

四 19 2016

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

One response so far

Linux下Telegram的中文输入问题

五 24 2015

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

详细内容可参考Nyaa Wiki依云

 

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,剩下的就是:

2 responses so far

网易云音乐插件 for 深度音乐播放器

四 12 2015

写了个深度音乐播放器的网易云音乐插件,可在Linux下播放用户创建、收藏的歌单,以及私人FM。

功能完善中。

https://github.com/wu-nerd/dmusic-plugin-NeteaseCloudMusic


 

网易云音乐插件(深度音乐播放器)

基于sumary的dmusic-plugin-baidumusic修改而成

使用了NetEaseMusicBox中的网易云音乐API

特性

  • 支持网易账号及手机号登录,支持新浪微博账号及二维码登录
  • 播放创建的歌单、收藏的歌单
  • 支持搜索、添加、删除歌曲
  • 支持搜索、添加、删除歌单
  • 播放私人FM,支持红心、取消红心、删除歌曲
  • 支持每日歌曲推荐
  • 支持从网易获取歌词及封面
  • 在自行添加歌曲id加密代码的情况下可以实现320K,详见

安装方法

  • 安装深度音乐播放器
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

安装完成后恢复原样

  • 安装Requests库及pycrypto库
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

使用

运行深度音乐, 选项设置->附加组件 中启用网易云音乐即可

76 responses so far

由在ZSH运行上条命令展开

三 19 2015

很多时候运行完命令才忘了sudo,那么

  • 方向上键到上一条命令,然后方向左键或home键到命令最左端,添加"sudo ",回车
  • Ctrl-P回到上一条命令,Ctrl-A回到最左端,添加"sudo ",回车
  • sudo !!,回车

很明显第三个是最简单的。
同样很多时候,一条命令的输出太长,需要pipe到less中或者Grep中,那么用alias或者函数会方便很多。可是"!!"没法写入到.zshrc中。

Google相关信息,出现频率最高的是这个命令:fc -nl -1,可以直接在得到历史记录中的上一条命令。

不过有一个问题:当一个命令的前面出现若干空格时,这条命令不会出现在历史记录中,那么这时候fc命令无法返回我们想获得的那条命令。
同时,当上条命令中出现任意alias时,通过fc命令返回上条命令会出现command not found提示,貌似是因为alias默认无法在non-interactive shell中生效。

那么,fc -nl -1两个问题

  1. 上个命令中有alias时无效
  2. 上个命令中最开始有若干空格时无效

先解决问题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解决。

然后就是问题2

解决了问题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

至于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

2 responses so far