Life is very short

2015-03-04

PATHから特定のパスを抜く

| 00:12

echo "orig="$PATH
IFS=':' read -a pathes <<< "$PATH"
declare -a tmp_pathes
for path in "${pathes[@]}"
do
  if [ "$path" != "$HOME/.plenv/bin" ]; then
    tmp_pathes=("${tmp_pathes[@]}" "$path")
  fi
done
TMP_PATH=$(printf ":%s" "${tmp_pathes[@]}")
PATH=${TMP_PATH:1:${#TMP_PATH}}

echo "after="$PATH

split
IFS=':' read -a pathes <<< "$PATH"

IFS変数と 'read -a'を使って, 文字列を IFSに指定した文字で分割した

配列変数に格納することができる.


join
TMP_PATH=$(printf ":%s" "${tmp_pathes[@]}")
PATH=${TMP_PATH:1:${#TMP_PATH}}

配列変数の前に joinしたい文字を置き %sとすると(ここでは :%s)とすると

配列の要素がその文字で区切られたものが表示される. ただし一番先頭にも

その区切り文字が現れてしまうので, それは次の行の部分文字列記法により

削除する.


結果

% bash test.sh
orig=/home/syohei/.plenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
after=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

おわりに

文字列置換だけでうまくいけばよかったのだが, 少し試したところ

うまくいかなかったのでこのような方法を取ってしまった.

bashの文字列置換をもっと知る必要がある.

jsonの validation

| 14:34


flycheck

保存時ではありませんが, 常時チェックしたい場合は flycheckがよいでしょう.

jsonlintを事前にインストールしておく必要があります.

 % npm install jsonlint -g

 M-x package-install <ret> flycheck

問題のある行にカーソルを動かすと minibufferにエラーが表示されます.

f:id:syohex:20150304141341p:image


M-x flycheck-list-errorsとするとエラー一覧が見えます.

f:id:syohex:20150304141340p:image


next-error, previous-errorでエラーが発生している場所を移動する

ことができます.


json-pretty-print-buffer

Emacs 24.4より, 追加された整形コマンド json-pretty-print-bufferを利用する.

整形コマンドですが, JSONが invalidだとエラーが minibufferに表示されます.


(add-hook 'after-save-hook 'json-pretty-print-buffer)

f:id:syohex:20150304141214p:image


before-save-hookでなく, after-save-hookなのは, 'Save...'みたいな

メッセージで肝心のエラーが見えなくなってしまう問題を防ぐためです.

(view-echo-area-messages等で見ることはできますが)


Emacs 24.4以上であれば, Emacsのみで使えるのでお手軽です.

整形される分余計といえば余計ですが...


jsonlintのみを使う

無理やりですが, 保存時にエラーがある場合, その内容を popupする

ようにしてみます.


(defun my/json-validate ()
  (let ((file (buffer-file-name)))
    (with-current-buffer (get-buffer-create "*my/jsonlint*")
      (setq buffer-read-only nil)
      (erase-buffer)
      (unless (zerop (process-file "jsonlint" nil t nil file))
        (pop-to-buffer (current-buffer))))))

(defun my/javascript-mode-hook ()
  (when (string-suffix-p ".json" (buffer-file-name))
    (add-hook 'before-save-hook 'my/json-validate)))
(add-hook 'js-mode-hook 'my/javascript-mode-hook)

f:id:syohex:20150304141758p:image


おわりに

本題とはずれてしまうかもしれないですが, パッケージを入れることに抵抗がなければ,

flycheckがよいのではないかと思います. flycheckを保存時だけ適用してみようかと

思いましたが, ベースが非同期なため, 応用するのが難しそうです.

2015-03-03

Use plenv with fish shell

| 12:24

Installation

 % git clone git://github.com/tokuhirom/plenv.git ~/.plenv

Add configuration

Add following configuration to your configuration file(ex ~/.config/fish/config.fish)

set -gx PATH ~/.plenv/bin $PATH
. (plenv init - | psub)

Relaunch fish.

 % exec fish

You can use plenv with fish now.