起動時に xmodmap の設定を反映させる

xmodmap でマウスのボタンを入れ替えたんですが、これだけではログイン時に設定が反映されませでんした。

[~/.xinputrc に読みこむ設定を追加する]

~/.xinputrc に以下の設定を追加する必要があります。

if [ -f ~/.xmodmap ];then
  xmodmap ~/.xmodmap
fi

これで起動時に設定が反映されるようになりました。

Vim の map() や filter() に渡すラムダ内で v:val や v:key が使用できる

ちょっとした小ネタですが、従来、map()filter() に渡す文字列式の中では v:valv:key を使用することが出来ます。

echo map([1, 2, 3], "v:val + v:val")
" => [2, 4, 6]

echo filter({ "mami" : 1, "mado" : 2, "homu" }, 'v:key =~ ''^m''')
" => {'mado': 2, 'mami': 1}

この v:valv:key ですが、ラムダ内でも参照することが出来ます。

echo map([1, 2, 3], { -> v:val + v:val })
" => [2, 4, 6]

echo filter({ "mami" : 1, "mado" : 2, "homu" : 3 }, { -> v:key =~ '^m' })
" => {'mado': 2, 'mami': 1}

文字列リテラル内で正規表現を記述する場合、少し難読化してしまうので、こういう風に利用すると読みやすくなりますね。

Ruby の正規表現でパスをいい感じに記述する

例えば、Ruby正規表現内でパスを含む際に

/^\/path\/to\/hoge.*/

みたいに書くことがあると思います。 この時にパスの /\/ という風にエスケープして記述する必要があります。

[%r を使う]

こういう時に %r を使うと綺麗に書くことが出来ます。

%r{^/path/to/hoge.*}

便利。
ちなみにこれは Rubocop さんに怒られて知りました。

Ubuntu でマウスのボタンを入れ替える

最近新しいマウスを購入したんですが、サイドに付いてるボタンの配置が以前つかっていたマウスと逆だったので設定を変更しました。

[xmodmap を使って入れ替える]

xmodmap を使うのがよさそうだったのでやってみました。
設定は ~/.xmodmap ファイルに記述し、今回は入れ替えるボタンが 89 だったので以下のように設定します。

# ~/.xmodmap
pointer = 1 2 3 4 5 7 6 9 8 10 11 12 13

このファイルを作成したあとに

$ xmodmap ~/.xmodmap

と、することで設定が反映されます。

Vim 8.0 で追加された関数 json_decode()/json_encode()

Vim 8.0 では JSON 形式のデータを扱う機能が追加されました。

[注意]

Vim のヘルプを日本語翻訳してるvimdoc-jaですが、まだ最新版の Vim のヘルプに追従しておらず jsondecode()jsonencode() と表記されていますが、正しくは json_decode()json_encode() になります。 他にも最新版のヘルプに追従されてない表記があるので、最新版の機能などを使う際は :help json_decode()@en のように英語版のヘルプを参照するとよいです。

[使い方]

json_encode({expr})Vim script の値を渡して JSON 形式の文字列に変換し、json_decode({string})JSON 形式の文字列を Vim script の値に変換します。

let s:data = {
\   "size" : 3,
\   "chars" : [
\       "homu",
\       "mami",
\       "mada"
\   ]
\}

let s:json = json_encode(s:data)

echo s:json
" => {"chars":["homu","mami","mada"],"size":3}

echo type(s:json) == v:t_string
" => 1

echo json_decode(s:json)
" => {'chars': ['homu', 'mami', 'mada'], 'size': 3}

Vim 8.0 で追加された定数 v:t_TYPE

Vim 8.0 では新しく type() が返す値が v:t_xxx のような定数として追加されました。

v:t_bool     Value of Boolean type
v:t_channel  Value of Channel type
v:t_dict     Value of Dictionary type
v:t_float    Value of Float type
v:t_func     Value of Funcref type
v:t_job      Value of Job type
v:t_list     Value of List type
v:t_none     Value of None type
v:t_number   Value of Number typ
v:t_string   Value of String type

これにより

if type(value) == type("")
    return value . value
endif

if type(value) == v:t_string
    return value . value
endif

という風に書くことが出来ます。