@ka2n

Technology and beer

fish shellでzの結果をpecoって爆速でディレクトリ移動する

qiita.com

のfish shell版

z.shはfishermanでインストールできるものを使う。-> GitHub - fisherman/z: Pure-fish z directory jumping https://github.com/rupa/zを直接使うプラグインがあったけど、z -lの出力がstdout/stderrに出力されなかったので使えなかった。

fisher z

関数は元記事のものをだいたいそのまま

# ~/.config/fish/config.fish
function peco_z
  set -l query (commandline)

  if test -n $query
    set peco_flags --query "$query"
  end

  z -l | peco $peco_flags | awk '{ print $2 }' | read recent
  if [ $recent ]
      cd $recent
      commandline -r ''
      commandline -f repaint
  end
end

function fish_user_key_bindings
  bind \x1b peco_z # Ctrl-[にバインドする
end 

*1

bindする時に\c[と指定したかったのだけど、Unexpected end of string, square brackets do not matchと怒られたのでfishの別のプラグインを参考に設定。ターミナルの時点でシーケンスじゃなくて\x1bで送られてくるからかな?

使ってみるとghqに比べて少しだけ時間がかかるので、もう少し早く動くz.sh実装があればそっちに移行したい(あるいは作るか)。

*1:Jan 9, 2017 22:12 コマンドを呼び出す前の入力値をpecoに渡すように更新

最近使った項目をアプリケーションごとに設定する(Xcodeとか)

macOSのTIPSです。 基本的に最近使った項目は使わないので、システム環境設定で0にしているのだけど特定のアプリケーションでだけあると便利な場合がある。

そういった場合はターミナルで

$ defaults write <bundleID> NSRecentDocumentLimit 5

という感じで好きなアプリケーションのbundleIDを指定してあげると特定のアプリケーションだけ設定を変更できるようだ。 Xcodeでは起動時のプロジェクト一覧の表示数を変更できた。めでたしめでたし。

シェルスクリプトの変数が空だったら指定の値にする時のTips

シェルスクリプトで変数が空の場合にだけ代入することができる便利な機能がある。

${variable:=value}

$variableが空の場合のみvalueが値に入ります。

しかし、実際に入力してみるとcommand not foundになる。

bash-4.3$ ${variable:=value}
bash: value: command not found

これはなぜかというと、変数への代入と同時にシェルに対してその値を返すから。 valueという文字をシェルが実行しようとする。

こういう場合は

bash-4.3$ : ${variable:=value}

:で返り値を無視してやればよいようだ。

related: シェル変数の定義状況に応じて任意の値を返す方法 - Qiita