読者です 読者をやめる 読者になる 読者になる

Vim - VimShellでプロンプト名に現在のパスを表示する

vim

標準ではプロンプト名をパス表示にはできない(と思う)

VimShell では以下のプロンプト情報を変更できます。

  • g:vimshell_prompt
    • プロンプト文字列。デフォルトは「vimshell%」
    • たぶん固定文字列のみ
  • g:vimshell_secondary_prompt
    • セカンダリプロンプト文字列。デフォルトは「%%」
    • たぶん固定文字列のみ

この2つは固定文字列です。
それとは別に、上記プロンプト表示前に毎回表示させることのできるものがあります。

  • g:vimshell_user_prompt
    • 左側に表示
    • 関数いけるっぽい
  • g:vimshell_right_prompt
    • 右側に表示
    • 関数いけるっぽい

デフォルトのまま起動するとこうなっています。

vimshell-prompt-path

以下の内容を.vimrcに追加して起動し直すとこうなります。

let g:vimshell_prompt = "% "
let g:vimshell_secondary_prompt = "> "
let g:vimshell_user_prompt = 'getcwd()'
let g:vimshell_right_prompt = '"m9(^Д^)"'

vimshell-prompt-path

g:vimshell_user_prompt には getcwd() を指定したので、パスを移動するたびにこの表示も変わります。
ただ、この「毎回1行何か表示される」というのがちょっとまだ慣れません。
g:vimshell_prompt をパス表示にしたいのですが、たぶんここは固定文字列です。

ドキュメントにも特に記載はなく、ググってもg:vimshell_user_prompt での設定しか見つからなかったのでそういうものかなと思っています。

※追記ここから

この記事出して数分と立たずにドキュメントが更新されました。 変更差分

+Q: I want to change |g:vimshell_prompt| dyanmically.
+
+A: You cannot do it. |g:vimshell_prompt| is fixed string.
+But you can change |g:vimshell_user_prompt| dynamically instead of it.
+

やはりVimShellの思想/仕様的には g:vimshell_user_prompt 使いましょうってことのようです。

※追記ここまで

hookで無理やり変えてしまう

VimShellにはhookが用意されています。
hookを利用して、毎回 g:vimshell_prompt を書き換えてみます。

以下を.vimrcに追加します。

autocmd FileType vimshell call vimshell#hook#add('postexec', 'change_prompt', 'g:my_vimshell_change_prompt')

function! g:my_vimshell_change_prompt(args, context)
  let g:vimshell_prompt = getcwd() . "% "
  call vimshell#set_highlight()
endfunction

VimShellを起動した段階では初期表示のままです。

vimshell-prompt-path

ディレクトリを移動してみます。

vimshell-prompt-path

どうやら期待通りに動いたようです。

ユーザープロンプトの方を消して、最終的には次のような設定になります。 (好みなので消さなくてもいい)

let g:vimshell_prompt = "% "
let g:vimshell_secondary_prompt = "> "

autocmd FileType vimshell call vimshell#hook#add('postexec', 'change_prompt', 'g:my_vimshell_change_prompt')

function! g:my_vimshell_change_prompt(args, context)
  let g:vimshell_prompt = getcwd() . "% "
  call vimshell#set_highlight()
endfunction

この設定ではこのような表示になります。

vimshell-prompt-path

注意

表示文字列とはいえグローバル変数を書き換えているわけなので、副作用が出るかもしれません。

ご利用は自己責任でお願いします。

注意(追記)

公開してから思ったところ。
ハイライトを効かせるために、毎度 vimshell#set_highlight() 読んでいますが、これのせいでsyntax定義がたくさん増えてしまうかも。
プロンプト名のハイライトが効かなくなりますが、vimshell#set_highlight() はやめた方がいいかもしれません。

注意(追記2)

やっぱり、いろいろと弊害もあるみたいです。
http://lingr.com/room/vim/archives/2013/05/10#message-15223719