rcmdnk's blog

対話的な学び: アクティブ・ラーニングの1つのキーポイント (教育フォーラム)

Vimの設定ファイル.vimrcはいわゆるdotfilesレポジトリで管理していて 色々な所で共通な物を使っています。

Vimでは dein を使ってプラグインを管理していますが、結構たくさんのプラグインを使っているので 最初に全て用意するのに結構時間がかかります。

1回やれば済むので良いのですが、 新しい環境でパッパと色々とやっていきたい時に、dotfiles導入後でも しばらくプラグインなしでもいいから素早く色々編集していきたいときがあります。

もしくは環境によってはHOMEにあまり色々置きたくないとか。 そういった時に.vimrcを直接編集しなくても deinを使ったり使わなかったりするように出来る設定について。

deinの自動インストール

最初はdeinそのものが入っていないので、自分でgit cloneするなりして 取ってくる必要がありますが、 .vimrcの先頭の方で以下の様な事をすれば もしdeinがない場合に自動的にインストールすることが出来ます。

.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let s:dein_dir = s:vimdir . '/dein'
let s:dein_github = s:dein_dir . '/repos/github.com'
let s:dein_repo_name = 'Shougo/dein.vim'
let s:dein_repo_dir = s:dein_github . '/' . s:dein_repo_name

" Check dein has been installed or not.
if !isdirectory(s:dein_repo_dir)
  let s:git = system("which git")
  if strlen(s:git) != 0
    echo 'dein is not installed, install now '
    let s:dein_repo = 'https://github.com/' . s:dein_repo_name
    echo 'git clone ' . s:dein_repo . ' ' . s:dein_repo_dir
    call system('git clone ' . s:dein_repo . ' ' . s:dein_repo_dir)
  endif
endif

これの作業を含めてdeinがインストールされてなかった場合に 外の設定ファイルや対話的な決定で deinを使うかどうか決めたい、ということ。

deinの制御設定

取り敢えず.vimrcは以下の様な感じになっています。

.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
" Flags
let s:use_dein = 1

" Prepare .vim dir
let s:vimdir = $HOME . '/.vim'
if has('vim_starting')
  if ! isdirectory(s:vimdir)
    call system('mkdir ' . s:vimdir)
  endif
endif

" dein
let s:dein_enabled  = 0
if v:version >= 704 && s:use_dein && !filereadable(expand("~/.vim_no_dein"))
  let s:git = system("which git")
  if strlen(s:git) != 0
    " Set dein paths
    let s:dein_dir = s:vimdir . '/dein'
    let s:dein_github = s:dein_dir . '/repos/github.com'
    let s:dein_repo_name = 'Shougo/dein.vim'
    let s:dein_repo_dir = s:dein_github . '/' . s:dein_repo_name

    " Check dein has been installed or not.
    if !isdirectory(s:dein_repo_dir)
      let s:is_clone = confirm("Prepare dein?", "Yes\nNo", 2)
      if s:is_clone == 1
        let s:dein_enabled = 1
        echo 'dein is not installed, install now '
        let s:dein_repo = 'https://github.com/' . s:dein_repo_name
        echo 'git clone ' . s:dein_repo . ' ' . s:dein_repo_dir
        call system('git clone ' . s:dein_repo . ' ' . s:dein_repo_dir)
      endif
    else
      let s:dein_enabled = 1
    endif
  endif
endif

" Begin plugin part
if s:dein_enabled
  let &runtimepath = &runtimepath . ',' . s:dein_repo_dir

  " Check cache
  if dein#load_state(s:dein_dir)
    call dein#begin(s:dein_dir)

    call dein#add('Shougo/dein.vim')
    call dein#add('Shougo/unite.vim')
    ...
    ...

    call dein#end()

    call dein#save_state()
  endif

  " }}} dein end

  " Installation check.
  if dein#check_install()
    call dein#install()
  endif
endif

" Plugin settings
if s:dein_enabled && dein#tap('unite.vim')
  ...
  ...
fi
...
...

" Other settings
...
...

最初のs:use_deinはこれを0にしたら常に使わない様になります。

次の部分では.vimディレクトリが無ければ作るという作業。

" dein以下ではまず

  • Vimのバージョンが7.4以上(deinの要請)
  • s:use_deinが1
  • ~/.vim_no_deinファイルが無い

という条件を見ています。 s:use_deinはテスト的なこと以外では通常変えないので、 環境によって使いたくない場合はHOMEディレクトリに~/.vim_no_deinというファイルを 作るとdeinを使わないようになる様にしています。

次にdeinではgitを使うのでシステムでgitが使えるかどうかをチェック。

その後はdeinのディレクトリやらレポジトリ情報を入れて、 ローカルにまだインストールされてない場合、

let s:is_clone = confirm("Prepare dein?", "Yes\nNo", 2)

を呼んで対話的にインストールするかどうか聞いています。 confirmについて詳しくは下記参照。

これでyを選択すればインストールするし、nもしくはENTERを押せば そのままインストールせずに他の設定だけ読み込みます。

新しい環境で取り敢えずdotfilesはインストールしたものの、 色々Vimでパッパと書き換えたい時にはまずはこれでdeinをインストールせずに 使っていきます。

deinがインストールされてるかここでインストールすることを選ぶと s:dein_enabledを1にして以下でdeinの設定を使っていくことになります。

まずはプラグインを入れていく設定を書いて、 その後で各プラグインについてPlugin settings以下で設定しています。

confirm()について

今回導入した所なのでちょっと詳しく。 実は今まではHOMEに.vim_deinというファイルがある場合 deinを使う、という形にしてたんですが 1 使うことのが多いのでわざわざ毎回余計なファイルを用意するのは面倒だな、 ということでconfirmを導入して 一時的にdeinのインストールを回避できる様にしました。

confirm()は 第一引数が表示されるメッセージで第二引数が選択肢になります。

選択肢は\nで区切って、最初のものから1, 2, 3…と番号がふられていき、 選択した時にその番号が関数の返り値として帰ってきます。 選択肢を選ぶ際には各項目の先頭の文字が選択肢の文字となって

Prepare dein?
(Y)es, [N]o:

こんな感じの表示になり、Y/yを押せば1が、 N/nを押せば2が帰って来て関数が終了します。 大文字小文字の区別はありません。 もし選択肢の先頭の文字が被るなどして違う文字を指定したい場合には

confirm("test", "aaa\na&bc", 1)

の様に使いたい文字の前に&を置くとその文字が選択肢として指定されます。

test
[a]aa, a(b)c:

こんな感じ。

第三引数がデフォルトの返り値で、なにも文字を押さずにENTERを押した時に 返す値になります。 ヘルプを見るとデフォルト値を設定しない場合は0にしてください、とあるのですが、 0にしておいてENTERを押すと0を返すだけなのでちょっと注意が必要です。 (バグ?) この値がない場合はデフォルト値1になります。 また、デフォルト値のところの選択肢の文字がが[]で囲まれて(上だと2の[N]の方)他は ()で囲まれる様になります。

もう一つ第4引数もあってメッセージのタイプ(GenericとかErrorとか) を選択するものですが余り使うことはないので省略。

詳しくは

:help confirm()

:help confirmと括弧を省略するとconfirmというコマンドの項目に飛んでしまうのでちょっと注意。

Sponsored Links
Sponsored Links

« suでrootになれなくなった話 AutoHotkeyでファイルをIncludeしたりリンクだったりした場合のWorkingDir, ScriptDirそしてLineFileについて »

}