Julia - プロンプトを変える

この記事は Qiita に 2018/08/15 に投稿したものです。2020/3/26 移行しました。

Julia v1.0 への移行作業のために v0.7 と v1.0 を行ったり来たりしているのですが、色々と動作確認しているうちにどっちのバージョンを使っているのか失念することが度々あったため下図のようにプロンプトにバージョン番号を入れてみました。

今回はこのようなプロンプトの変更方法を紹介します。

f:id:goropikarikun:20181110180722p:plain

目次

環境

$ julia -e "using InteractiveUtils; versioninfo()"
Julia Version 1.0.0
Commit 5d4eaca0c9 (2018-08-08 20:58 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Core(TM) i5-4460T CPU @ 1.90GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.0 (ORCJIT, haswell)
Environment:
  JULIA_SHELL = /bin/bash
  JULIA_EDITOR = nvim

本文とは関係ありませんが、 Julia v1.0 より versioninfoInteractiveUtils に移ったのでスクリプト中に versioninfo を入れる時は using InteractiveUtils するのをお忘れなきよう。これを知らなかったせいで AppVeyor で幾度となくエラー吐かれました。 REPLを使う時は勝手に import されるので気にする必要はありません。

OhMyREPL

プロンプトを変える一番簡単な方法は OhMyREPL.jl を使うことでしょう。

using Pkg
Pkg.add("OhMyREPL")

startup.jl に下記を追加

using OhMyREPL
OhMyREPL.input_prompt!("I love Julia>", :magenta)

f:id:goropikarikun:20181110180807p:plain

OhMyREPL を使わない方法

OhMyREPL 使う方法は簡単ですが、若干 Julia の起動が遅くなるのでプロンプトを変えたいだけの人は startup.jl に下記を追加すると良いでしょう。 こちらの場合だと Shell mode と help mode も変更できます。

import REPL
atreplinit() do repl
    if !isdefined(repl, :interface)
        repl.interface = REPL.setup_interface(repl)
    end
    # prompt
    Base.active_repl.interface.modes[1].prompt = "julia-$(VERSION)> "
    Base.active_repl.interface.modes[1].prompt_prefix = get(Base.text_colors, :cyan, "\e[32m")

    # shell mode
    Base.active_repl.interface.modes[2].prompt = string(split(ENV["JULIA_SHELL"], '/')[end], "> ")
    Base.active_repl.interface.modes[2].prompt_prefix = get(Base.text_colors, :reverse, "\e[31m")

    # help mode
    Base.active_repl.interface.modes[3].prompt = "help???> "
    Base.active_repl.interface.modes[3].prompt_prefix = get(Base.text_colors, :red, "\e[33m")
end

f:id:goropikarikun:20181110180825p:plain

package mode もこの調子で変更できると思ったのですが、startup.jl 中に書くとエラーが出てうまく行きませんでした。Julia 起動後に直接打つと変わるんですけど。対処方法は私にはわかりません。

Base.active_repl.interface.modes[6].prompt = () -> "(pkg mode)> "
Base.active_repl.interface.modes[6].prompt_prefix = get(Base.text_colors, :light_magenta, "\e[34m")

f:id:goropikarikun:20181110180852p:plain

注意

上記のいずれの方法を使った場合でも、パッケージの install や build をすると下記のようなエラーが出ることがあるので注意。

┌ Error: Error building `GR`: 
│ ERROR: LoadError: ArgumentError: Package REPL not found in current path:
│ - Run `Pkg.add("REPL")` to install the REPL package.

現状の回避策は julia --startup-file=no で Julia を起動すること。Julia v1.0.1 では修正される模様。

参考