vim の grep に ag を使う際のオプション

超久しぶりに vim を使ってみようと 0 から設定してました。

Unite -auto-preview grep

したいので、昔ながらに

if executable('ag')
  let g:unite_source_grep_command = 'ag'
  let g:unite_source_grep_default_opts = '--nogroup --nocolor --column'
  let g:unite_source_grep_recursive_opt = ''
endif

してみたんですが、
検索はされてマッチした一覧が表示されても
選択して該当箇所にとぼうとすると失敗して空バッファが開く……。

emacs で ag つかったときもあった〜なんて思いながら
ag のオプションをうたがっていると、
--vimgrep オプションがあったので
unite_source_grep_default_opts の内容を

if executable('ag')
  let g:unite_source_grep_command = 'ag'
  let g:unite_source_grep_default_opts = '--vimgrep'
  let g:unite_source_grep_recursive_opt = ''
endif

とするとちゃんと動くようになりました。

rbindkeys を systemd で起動する

linuxgui 環境で作業をしていて
gtk のキーテーマで一括変更も可能ですが
他の OS みたいにキーバインドをアプリケーションによって
変化させたい時があったのでメモ。

使わせていただくのは

kui/rbindkeys · GitHub - https://github.com/kui/rbindkeys

rbindkeys のインストール

ruby 2.1.5 を rbenv でもなんでも使ってインストールしたら

gem install rbindkeys

してインストール完了。
あとは README.md の Usage のとおり基本的な設定を済ませました。

sudo 設定変更

まず sudo の設定。 rbndkeys は sudo で起動することになりますが、
systemd から起動する際にパスワードが入力できないので
/etc/sudoers.d/ 以下に

  • 起動用 rbindkeys
  • 停止用 killall

を NOPASSWD で設定しておきます。

nishikawasasaki  ALL=(ALL) NOPASSWD:/home/nishikawasasaki/.rbenv/versions/2.1.5/bin/rbindkeys, NOPASSWD:/usr/bin/killall

X 設定追加

rbindkeys 起動時に自ユーザーの x が受付できるように下記設定を
.xinitrc など起動時に呼ばれる場所へ追加しておく。

vi ~/.xinitrc
+ xhost local:0.0

systemd 設定追加

次に、
systemd から起動するために
~/.config/systemd/user 以下に設定を作成します。

vi ~/.config/systemd/user/rbindkeys.service
[Unit]
Description=rbindkeys

[Service]
ExecStart=/usr/bin/sudo /home/nishikawasasaki/.rbenv/versions/2.1.5/bin/rbindkeys -c /home/nishikawasasaki/.rbindkeys.rb /dev/input/event0
ExecStop=/usr/bin/sudo /usr/bin/killall rbindkeys
Restart=always
Environment=DISPLAY=:0.0

[Install]
WantedBy=graphical.target

ここまできたら

systemctl --user enable rbindkeys.service

して有効にして、
~/.rbindkeys.rb を編集したら

systemctl --user restart rbindkeys.service

したりできます。

問題・懸念点

  • ruby まわりの呼び出しをちゃんとする
  • systemd の起動で sudo するのはどうなのか?
    何か他に方法はないのか?
  • WantedBy が適当すぎないか?

Emacs の use-package で ddskk を使おうとしたらカーソルの色変わらなくてワークアラウンドした話

タイトルの通り、use-package を使って ddskk を入れると
(細かい ddskk の設定は ~/.skk にするとして)

(use-package ddskk
  :ensure t
  :defer t
  :bind (("お好きなキーバインド" . skk-mode)))

のようにすると勝手にインストールがされて便利なのだけれど、
このままでは

(setq skk-use-color-cursor t)
(setq skk-cursor-hiragana-color "#d33682")
(setq skk-cursor-latin-color "#4271ae")

で設定されたカーソル色変更が反映されません。

普段は skk-autloads の autoload で
カーソル色変更用の ccc などなどを読み込んでいますが、
↑ で書いた use-package の設定だと読み込まれないからでした。

use-package の設定の方で

(use-package ddskk
  :ensure t
  :defer t
  :bind (("お好きなキーバインド" . skk-mode))
  :init (require 'ccc))

としてやればひとまず解決。
use-package の commands を使えばよいのかもしれません?

またやりそうなのでメモしておきます。。

emacs のカラーテーマをつくった

黒い背景だとノート PC 電池節約のためにバックライトを暗くすると見にくいので明い背景のカラーテーマを作ってみた。名前適当すぎて変えたい。

nishikawasasaki/ns-milk-theme https://github.com/nishikawasasaki/ns-milk-theme

淡い色にしたら結局見にくかった……

Mac の ssh-agent と fish shell

インフルエンザが周囲で大流行、最前線です。

Mac で fish shell を使っていると、linuxssh-agent 用に書いた設定でエラーが発生。 どうも Mac では SSH_AUTH_SOCK の場所が違うみたい。

探してみるとどうやら

/private/var/folders/fw/

にあるようなので、その時作られていた

/private/var/folders/fw/_tkなんとかかんとか/T/ssh/agent

SSH_AUTH_SOCK に設定するように暫定設定。 _tk なんとかの部分はもし変わるようなら対応しよう。

# ssh-agent
set agentPID (ps gxww | grep "ssh-agent]*\$" | awk '{print $1}') | head -1
set agentSOCK (/bin/ls -t /private/var/folders/fw/_tkなんとかかんとか/T/ssh*/agent*|head -1)
if test "$agentPID" = "" -o "$agentSOCK" = ""
    set -e SSH_AUTH_SOCK
    set -e SSH_AGENT_PID
    eval (ssh-agent)
    ssh-add
else
    set --export SSH_AGENT_PID $agentPID
    set --export SSH_AUTH_SOCK $agentSOCK
    # if [ `ssh-add -l` = "" ]; then
    #     ssh-add < /dev/null
    # fi
end

linux 用と Mac 用の切り分けが必要なので

~/.config/fish/config.fish

の中で

# 環境毎の設定読み込み ##########################################
switch (uname)
  case Darwin
    . $HOME/.config/fish/config_mac.fish
  case Linux
    . $HOME/.config/fish/config_gentoo.fish
end

なんてしてます。

Mac のディレクトリ、何がなんでどうなってるのかあんまり知らないなぁ……

JAX-RS を Jersey と Jackson 使ってやるなら

1/22 はカレーの日です!

Jersey そのままで JSON の出力をすると int でも引用符に囲まれた文字列の "0" になるし、要素が 1 つの時リストじゃなくなるしと残念なので、Jackson を使う。

Jackson のバージョン違いや設定方法の変更の影響でググるととにかくたくさん情報が出てくるのだけれど、いまの時点ではとにかく Jackson2 を使うため pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.2.3</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.2.3</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.2.3</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.2.3</version>
</dependency>

と書けば web.xml さわらなくても Jackson が使えて、Jersey の JSON 出力も Jackson 利用に変わるので設定すっきり。

mykie.el が便利です

いまさら感もありますが mykie.el がとても便利です。

yuutayamada/mykie-el · GitHub - https://github.com/yuutayamada/mykie-el

状況に応じてキーをアサインできるこちらを利用することで、今までできなかった便利なキー設定が可能です。

まずはこちら。

(global-set-key (kbd "C-;")
                '(lambda ()
                   (interactive)
                   (mykie
                    :default            'helm-my
                    :region             'helm-occur
                    :region-handle-flag 'copy)))

普段は C-; で helm を起動しますが、リージョンのある場合は helm-occur を起動します。yank するだけですぐにリージョンの内容で helm-occur ができて便利ですね。

次はこちら。

(global-set-key (kbd "o")
                '(lambda ()
                   (interactive)
                   (mykie
                    :default 'self-insert-command
                    :region 'occur-by-moccur
                    :region&C-u 'moccur-grep-find
                    :region-handle-flag 'copy)))

普段はそのまま o を入力しますが、リージョンのある場合は occur-by-moccur を起動します。C-u o とした場合は moccur-grep-find が起動します。yank するだけでリージョン内容からものが探せて便利ですね。

最後にこちら。

(global-set-key (kbd "r")
                '(lambda ()
                   (interactive)
                   (mykie
                    :default 'self-insert-command
                    :region '(progn
                               (deactivate-mark)
                               (anzu-query-replace))
                    :region&C-u 'anzu-query-replace
                    :region-handle-flag 'copy)))

普段はそのまま r を入力しますが、リージョンのある場合はバッファ全体に対して anzu-query-replace を実行します。C-u o するとリージョン内での anzu-query-replace となります。yank するだけでリージョン内容をすぐに探せて便利ですね。

mykie.el とは直接関係ないのですが、query-replace に最初から置換対象を渡して起動できると、一度 yank しなくてもよいのでもっと楽になりそうですがひとまずこれで使っています。