miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

.bashrc で PS1 を設定すると履歴表示がずれる件

今の職場は有線 LAN しか使えず、部屋の移動も頻繁に発生するので screen を入れてみたのですが、これが大活躍しています。急に呼ばれて LAN ケーブルを抜いても、また同じ状態から作業を再開できて助かります。前の案件でも複数人でサーバに接続してあれやこれややってたから、マルチセッションとか使ったらもっと効率よかったのになぁ、というのはとりあえず置いておいて。

基本的な使い方については Let's use SCREEN! を参考に、bash での便利設定については iandeth. - 続 screen の使い方 を参考にしたのですが、後者の PS1 を指定すると、bash の履歴表示位置がずれるようになってしまいましたので、そのあたりの解決方法です。


「履歴表示位置がずれる」の具体例ですが、たとえば .bash_history

git status
echo 12345678901234567890

こんな感じになっているとして。Ctrl+P を 1 回押したときは

[user@SERVER tmp]$ echo 12345678901234567890

のように正しく履歴が表示されるのですが、もう一度 Ctrl+P を押すと、前のコマンドの先頭 4 文字(この場合は echo)が残った状態で

[user@SERVER tmp]$ echogit status

のように表示されてしまいます。どうもコマンドの長さがプロンプト("[user@SERVER cwd]$ " の部分)の長さ + 6 文字以上になると、先頭の 4 文字が残ってしまうという現象のようです。(この原因までは調べ切れませんでした。)

.bashrc で

PS1='\033k\033\\[\u@\h \W]\$ '

のように設定しましたが、この'\x033k\x033\\' の 4 文字が怪しいので、この周辺で調べてみると・・・

\[ : begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
\] : end a sequence of non-printing characters

というエスケープシーケンスが使えるようで。'\033k\033\\' の部分は非表示文字なので、これで囲ったほうがよさそうですね。あと \033 は \e ともあらわせるようなので、最終的にこうなりました。

PS1='\[\ek\e\\\][\u@\h \W]\$ '

この状態で .bashrc を読み直すと、履歴の表示位置がずれる問題は解決しました。

どうも screen は zsh と組み合わせて使っている人が多いようで、bash の情報が少ないんですよね。その後探してみると、ちゃんとメジャーなサイトで紹介されていましたので、いちおうリンク。

確かに bash だと sudo しているときにプロンプトが # になって、うまくタイトルが拾えなかったりするのがちょっと気になります。zsh を使えばこれ以外にもいろいろ解決するみたいですけど、bash もぜんぜん使いこなせていないので、zsh に手を出すのはもうちょっと bash に慣れてからにしようかと。