目次[非表示]
Zshの最大の弱点を克服する
自分にとってのZshの最大の弱点は、ヒストリーファイルが取り扱いにくいことでした。アスキー以外の文字列がアレなので。日本語のファイル名がアレでコレでソレ。眺めてみるとわかると思います。以下で、それが解決できます。
使い方:新規にターミナル(端末)を開きます。CTRL+ALT+T
zshhist.py を ~/bin にコピー、実行属性も。
#ヘルプ
zshhist.py を ~/bin にコピーします。実行属性もつけるといいです。
zshhist.py -h
#引数は2つ シンプルzshhist.py -h
export export zsh history file to UTF-8 text.
import transform UTF-8 text to zsh history format.
出力結果を > でファイル(エディタで編集)にするなり、パイプでコマンド処理するなりするといいと思います。
エディターより、編集したいパターンをPerl/awkなどのテキスト処理に強いコマンドで処理したほうが再利用もあるだろうし合理的かとも思います。
#例示1)エクスポートする。utf-8形式で日本語の文字化けのない扱いやすいファイルにする
zshhist.py export
ががーと .zsh_history の"変な文字"になった日本語が綺麗になります。
#UTF-8にして、エディターで開いて(必要なら編集保存)
この作業している最中は、bashに切り替えておいたほうがいいかも。履歴が変わっていく。
例示1) utf-8形式で日本語の文字化けのない扱いやすいファイルにする。
zshhist.py export > /tmp/zsh_utf-8.txt && atom /tmp/zsh_utf-8.txt
次いで、import してみればいいかと。
オリジナルヒストリーファイルは事前保存しておいてください。
ががーと .zsh_history の"変な文字"になった日本語が綺麗になります。
#UTF-8にして、エディターで開いて(必要なら編集保存)
この作業している最中は、bashに切り替えておいたほうがいいかも。履歴が変わっていく。
例示1) utf-8形式で日本語の文字化けのない扱いやすいファイルにする。
zshhist.py export > /tmp/zsh_utf-8.txt && atom /tmp/zsh_utf-8.txt
次いで、import してみればいいかと。
オリジナルヒストリーファイルは事前保存しておいてください。
例示2) export した日本語ファイル名などの入ったファイルをエディターなりperl なりで編集したとする。編集後ファイルを書き戻してヒストリーとして使う。インポートする。
例示2) export した日本語ファイル名などの入ったファイルをエディターなりperl なりで編集したとする。例示1のコマンド形式。
編集後ファイル: zsh_utf-8_20170617_1835.txt
zsh形式にする。
zshhist.py import < zsh_utf-8_20170617_1835.txt > .zsh_history.new (Z)
このNewを既存の .zsh_history をバックアップの上、上書きする。
例示3) bash からの移行、あるいは、bash と zsh のヒストリーをマージする。bashからzshへの移行にも使えるし、両方使っていてたまにマージしたい場合も有能。
bash to zsh のハードルはZshのUTF-8問題だけなので、それさえクリアできれば自力であとの処理はできる人は大半だと思いますが、git に限らずbash to zsh は多数ありますが、以下に示すツールがいいかと。
流れはこれだけ。
Bash history to Zsh history = zsh 形式のbash_history (B)と
上の(Z)をマージすればいいです。マージしたものをzsh形式にします。しました。
手順
1) utf-8の(B)+(Z)を作る (BZが完成)
2) (BZ)を.zsh ヒストリ形式にコンバート
zshhist.py import < (BZ).txt > .zsh_history (BZ_hitory)
3) この(BZ_hitory=いつものzshヒストリーです。日本語バケバケです。それがOK。読めたらおかしいのです) を本番の ~/.zsh_history に上書きして完成。
バックアップは事前にとってください。
生ソース:gist(github)のリンクが自動で貼られるはずです。この埋め込みしたのはじめてなので。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
# | |
# This is how I used it: | |
# $ cat ~/.bash_history | bash-history-to-zsh-history >> ~/.zsh_history | |
import sys | |
def main(): | |
timestamp = None | |
for line in sys.stdin.readlines(): | |
line = line.rstrip('\n') | |
if line.startswith('#') and timestamp is None: | |
t = line[1:] | |
if t.isdigit(): | |
timestamp = t | |
continue | |
elif timestamp: | |
sys.stdout.write(': %s:0;%s\n' % (timestamp, line)) | |
timestamp = None | |
if __name__ == '__main__': | |
main() |
このツールを使えば、bash のヒストリーを一括編集加工して、Zshにもっていったりが楽ですね。英語だけに限ればZsh-Bash間のツールは多く見つかりました。ここのところ(日本語などの部分)が難しかったんです。はい。
Emacsな方は「Emacs で Zsh の ヒストリファイルを閲覧・編集する」が参考になると思います。