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

以下は当時の記事で今は動作しないかもしれません。
2019/01/09設定を見直しました

https://nishikawasasaki.hatenablog.com/entry/2019/01/09/Macssh-agentfish_shell(4年ぶり2回目)


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

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 しなくてもよいのでもっと楽になりそうですがひとまずこれで使っています。

LVM つかっていない仮想マシン(virtualbox)のディスクを拡張する

LVM 使わずに作成した virtualbox 仮想マシンのディスクを、 ちょっとずつ必要に応じてサイズ拡張しているといつも手順を忘れるのでメモしておく。

vmdk 形式ではリサイズできないので vdi フォーマットに変換する

ファイルを作成するのでそこそこ時間がかかる

VBoxManage clonehd gentoo-disk1.vmdk gentoo-disk1.vdi --format VDI
作成した vdi ファイルの論理サイズを拡張する

実際にファイルサイズを拡張するわけではないので一瞬でおわる。 MB 単位で指定するので、ここでは 16 GB にしている。

VBoxManage modifyhd gentoo-disk1.vdi --resize 16384
仮想マシンの仮想ディスクを付け替える

新しく作成した vdi 形式のディスクへ付け替える。

f:id:nishikawasasaki:20131219003209p:plain

おなじ SATA ポートで ↓
つけかえる

f:id:nishikawasasaki:20131219003214p:plain

パーティションを拡張する

ディスクは拡張しても OS からわからないので、パーティションを拡張する。 fdisk コマンドで行うが、「拡張」オプションはないので消してから再作成する。

ディスク自体が拡張しているか確認する。

fdisk -l
Disk /dev/sda: 17.2 GB, 17179869184 bytes, 33554432 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2147bbb1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048      206847      102400   83  Linux
/dev/sda2          206848     4401151     2097152   82  Linux swap / Solaris
/dev/sda3         4401152    31457279    13528064   83  Linux

上の状態だと /dev/sda3 が拡張したい領域なので一度消す

fdisk /dev/sda
Command (m for help): d
Partition number (1-4): 3
Partition 3 is deleted

消えている

Command (m for help): p

Disk /dev/sda: 17.2 GB, 17179869184 bytes, 33554432 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2147bbb1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048      206847      102400   83  Linux
/dev/sda2          206848     4401151     2097152   82  Linux swap / Solaris

再作成

Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p
Partition number (1-4, default 3): 3
First sector (4401152-33554431, default 4401152): 
Using default value 4401152
Last sector, +sectors or +size{K,M,G} (4401152-33554431, default 33554431): 
Using default value 33554431
Partition 3 of type Linux and of size 13.9 GiB is set

確認

Command (m for help): p

Disk /dev/sda: 17.2 GB, 17179869184 bytes, 33554432 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2147bbb1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048      206847      102400   83  Linux
/dev/sda2          206848     4401151     2097152   82  Linux swap / Solaris
/dev/sda3         4401152    33554431    14576640   83  Linux

保存して終了

Command (m for help): w
The partition table has been altered!
ファイルサイズを拡張する

パーティションが拡張できたらファイルサイズを拡張して OS に認識させる。

resize2fs /dev/sda3
確認
df -h

設定したサイズに増えていれば完了。

ホストマシンのディスクを圧迫するので不要になった vmdk ファイルを捨てる。

VirtualBox の Gentoo で音を出す

サーバー監視と Emacs 用の Gentoo on VirtualBox でブラウザ起動したら 音を出るようにしていなかったので作業メモです。

基本的には

ALSA - Gentoo Wiki: https://wiki.gentoo.org/wiki/ALSA

を参考にして進めていけば良いです。

何点か補足するのが下記です。

1. ドライバがカーネルに組み込んであるか確認

なにはさておきドライバが無いと音は鳴りませんので、 上記の Gentoo Wiki の

Kernel You need to activate the following kernel options:

Kernel configuration

の部分を参考に設定されているか確認します。 もし Wiki のようになっていなければ設定を変更してカーネルをリビルドしましょう。

# root
genkernel --bootloader=grub --menuconfig all
2. OS 起動時に alsasound を起動する

alsa-utils を emerge したら、単純に

# root
rc-update add alsasound boot

するだけです。忘れてたので……。

3. audio グループに自身のユーザーを追加する

この時点で root ユーザーは alsamixer コマンドで音量設定等出来るはずですが root 以外のユーザーで alsamixer を実行すると

cannot open mixer: No such file or directory audio group

と表示されて失敗してしまいます。

これを解決するためには audio グループに自身の一般ユーザーを追加します。

# root
gpasswd -a 追加するユーザー名 audio

usermod -G するとうっかりしがちなので gpasswd -a の方が良いと思います。

追加後はさらにログアウト・ログインも必要ですので注意。。

4. 確認

あとは alsamixer で音量調整をしながら

speaker-test -t wav -c 2

で音が出ることを確認して完了です。

fish shell と percol で良く利用するディレクトリに飛ぶ

なんとなく fish に移ってみました。

これまでよく使うディレクトリに移動するために zsh + autojump で j として使っていたのですが、 fish のタブ補完では j 入力後にどんな候補があるのか補完してもらえず どうしたものか考えていました。

コマンド履歴の補完は mooz さんの percol

mooz/percol https://github.com/mooz/percol

を使って

bpinto/oh-my-fish https://github.com/bpinto/oh-my-fish

の中にあった percol_select_history を利用することにしました。

じゃあということで fish で percol を使って 良く利用するディレクトリに飛べるよう function を作ってみました。

zsh 用は

percol で z / autojump のようにディレクトリ高速ジャンプ - Slip Ahead Logging http://stillpedant.hatenablog.com/entry/percol-cd-history

にありますのでこれを fish 用に改造して

set CD_HISTORY_FILE $HOME/.cd_history_file # cd 履歴の記録先ファイル
# percol を使って cd 履歴の中からディレクトリを選択
# 過去の訪問回数が多いほど選択候補の上に来る
function percol_cd_history
  sort $CD_HISTORY_FILE | uniq -c | sort -r | sed -e 's/^[ ]*[0-9]*[ ]*//' | percol | read -l percolCDhistory
  if [ $percolCDhistory ]
    # commandline 'cd '
    # commandline -i $percolCDhistory
    echo 'cd' $percolCDhistory
    cd $percolCDhistory
    echo $percolCDhistory
    commandline -f repaint
  else
    commandline ''
  end
end

# キーバインドの追加 ############################################
function fish_user_key_bindings
  bind \cx percol_cd_history
  # 以下他のキーバインド
end

加えて cd 系のコマンドで return する前に

echo $PWD >> $CD_HISTORY_FILE # percol_cd_history 用

してやると、ひとまずやりたいことが出来るようになりました。

cd コマンド実行時に移動先のパスを $CD_HISTORY_FILE へ書き出して保存しています。 cd した後に ls してほしいので

commandline -f repaint

が無いとキーバインドから実行した場合に画面が止まるようでした。

また、上の function では percol で選択するとすぐに cd していますが、 if 文の中のコメントアウトを逆にすると 入力だけしてくれて cd を実行するにはエンターが必要なように変わります。 履歴から補完して入力後に編集する機会が多いのであれば こちらを利用した方が便利なように思います。

    commandline 'cd '
    commandline -i $percolCDhistory
    # echo 'cd' $percolCDhistory
    # cd $percolCDhistory
    # echo $percolCDhistory
    # commandline -f repaint