はじめに
peco
などに利用される .zsh_history
の履歴にはタイムスタンプが押されます。
: 1507713777:0;
みたいなやつです。
これはzplug
の機能によるものなので、zplug
を入れてない人に表示されません。
修正
zplug
によるものではなく、.zshrc
に書いてあるsetopt EXTENDED_HISTORY
によるものです。
で、今回はこのタイムスタンプを消し去りたいと思いました。
何故なら、同じ内容がたくさん書かれていてキモいからという個人的な理由です。
実装
環境
- python 3.6.0
コード
import subprocess
import re
contents = subprocess.check_output('cat .zsh_history', shell=True)
data_list_b = contents.splitlines()
s = r': [0-9]{10}:[0-9];'
data_list = [repr(l).lstrip('b').strip('\'') for l in data_list_b]
result_set = set([re.sub(s, '', d) for d in data_list])
f = open('.zsh_history', 'w')
for r in list(result_set):
if r != '':
p = re.compile(r'\\+')
r = p.sub(r'\\', r)
if r[0] == '\"':
r = r.strip('\"')
f.write(r+'\n')
f.close()
コードはこんな感じです。
.zsh_history
とarrange_zsh_history.py
を同じ階層に置いて、
python arrange_zsh_history.py
を実行すれば.zsh_history
の中身が書き換わります。
コードの説明
このコードは.zsh_history
の中身を取ってきて、内容を編集した上で.zsh_history
に上書きするコードです。
その際に
r': [0-9]{10}:[0-9];'
の正規表現にマッチしたタイムスタンプの文字列を
set([re.sub(s, '', d) for d in data_list])`
によって変換しています。
この時、\n
などバックスラッシュを含めた文字列が\\n
のような形に変換されてしまうので、
p = re.compile(r'\\+')
r = p.sub(r'\\', r)
の処理を行い、任意の数の\
を一つに変換しています。
おわりに
本当は.zsh_history
の中身を取得するのに
contents = open('.zsh_history', 'r')
のようにして取得したかったのですが、上手くいかず(多分エンコーディングのせい??)泣く泣く
contents = subprocess.check_output('cat .zsh_history', shell=True)
のように強引に取得しました。Pythonもっと勉強しなくては...
もし、「こっちの方がいいよ!」「こっちの方がクレバーだぜ!」という意見をくれる方がいらっしゃったらコメントを頂けると助かります。