Ruby の Hash でキーが存在しなかった時の初期値を設定する
table = [] table[index] ||= [] table[index] << name
みたいに []
で初期化するようなコードは
table = Hash.new { |hash, key| hash[key] = [] } table[index] << name
という風に .new
に渡すブロック内で値を初期化することができる。
起動時に xmodmap の設定を反映させる
xmodmap でマウスのボタンを入れ替えたんですが、これだけではログイン時に設定が反映されませでんした。
[~/.xinputrc
に読みこむ設定を追加する]
~/.xinputrc
に以下の設定を追加する必要があります。
if [ -f ~/.xmodmap ];then xmodmap ~/.xmodmap fi
これで起動時に設定が反映されるようになりました。
Vim の map() や filter() に渡すラムダ内で v:val や v:key が使用できる
ちょっとした小ネタですが、従来、map()
や filter()
に渡す文字列式の中では v:val
や v: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:val
と v: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}
Ubuntu でマウスのボタンを入れ替える
最近新しいマウスを購入したんですが、サイドに付いてるボタンの配置が以前つかっていたマウスと逆だったので設定を変更しました。
[xmodmap を使って入れ替える]
xmodmap を使うのがよさそうだったのでやってみました。
設定は ~/.xmodmap
ファイルに記述し、今回は入れ替えるボタンが 8
と 9
だったので以下のように設定します。
# ~/.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
という風に書くことが出来ます。