github にアップされているプラグインに関しては問題ないが・・・

ローカルに置いたプラグインも toml で管理できるのかわからなかったのでやってみました。 ソースを読んだりしていけそうだったのでやってみたら動きました。

参考:

swift がシンタックスハイライトされない

さすがにそろそろシンタックスハイライトが欲しいなと思って調べてみたのですが、

以下、NeoBundleの設定です。 余談ですが NeoBundle から dein.vim に乗り換えると闇の力を得られるそうです。

リポジトリを直接指定できないので、手動でディレクトリを掘りましょう。

簡単のため、こんな感じで

$ mkdir ~/.vim/bundle/manual

ディレクトリ名は何でも大丈夫です。

.vimrc に以下を記述します。

NeoBundle 'apple-swift', {'type': 'nosync', 'base': '~/.vim/bundle/manual'} 

今回は apple-swift にしてみました。ここは何でも大丈夫です。 base 以下もお好みで大丈夫です。

base で指定したディレクトリに移動し、cloneします

$ cd ~/.vim/bundle/manual
$ git clone git@github.com:apple/swift.git apple-swift

結構時間かかります。

終わったら以下のコマンドを打ちます。 swift.gitリポジトリからutils/vimだけ取り出します。

$ cd apple-swift
$ git filter-branch --subdirectory-filter utils/vim HEAD

これで Syntax highlight が動きます。

このように、 NeoBundle での設定しか出てきませんでした。 普通に dein.vim を利用するだけであれば、上記に加え、 init.vim

call dein#add('~/.vim/bundle/apple-swift')

で問題なさそうです。しかし toml でローカルのプラグインを 読み込むことってできるのか実証結果が見つかりません。

git filter-branch --subdirectory-filter も調べておいたほうがよさそうです。

git のバージョン履歴を完全に書き換える

  1. リポジトリのファイルからサブフォルダを抽出するには、 以下の情報を指定して git filter-branch を実行します。

    • FOLDER-NAME : 別のリポジトリの作成元にしたい、プロジェクト内のフォルダです。
    • BRANCH-NAME : mastergh-pages などの、現在のプロジェクトのデフォルトブランチです。
        $ git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME  BRANCH-NAME 
        # Filter the specified branch in your directory and remove empty commits
        > Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (89/89)
        > Ref 'refs/heads/BRANCH-NAME' was rewritten
      

      これで、リポジトリにはサブフォルダ内にあったファイルのみが含まれることになります。

filter-branchとは

これは、大量のコミットの書き換えを機械的に行うオプションです。 (filter-branch自体はシェルスクリプトで書かれています。) これを使うとレポジトリの歴史上からコミットされたファイルを完全に抹消することができます!

今回、ファイルを抹消するために filter-branchの–index-filter オプションを使います。

使うシチュエーション

こんな怖いオプションどこで使うのかというと、例えば下記のようなシチュエーションが考えられます。

  • パスワードファイルを間違ってcommitしてしまった or やんごとなき事情により削除したい
  • 巨大なファイルを間違ってcommitしてしまった

github のヘルプはかなりフランクに書いてありますが、たいへんなプログラムのようです。 慎重に行います。

普通なローカルプラグインの読み込み

 dein#local({directory}, [{options}, [{names}]])

dein#local() で自分の書いたプラグインとかをおいてあるディレクトリを指定する _vimrc に以下のように記述する

 ...
 if dein#load_state(s:dein_dir)
     call dein#begin(s:dein_dir)
     ...
     
     call dein#local('~/vim/myplugins', 
                 \ {}, 
                 \ [
                 \   'scrapbox.vim',
                 \ ])
 
     call dein#end()
     call dein#save_state()
 endif

scrapbox.vim というプラグインを読み込んでくれる 第2引数にオプションを指定することも可能

普通に読み込む場合はこのような実証ログを発見することができました。 しかし toml を利用した記事が見当たりません。

探してみる

dein#add({repo}[, {options}])
Initialize a plugin. {repo} is the repository URI or local repository directory path. If {repo} starts with github user name (ex: “Shougo/dein.vim”), dein will install github plugins.

このあたりとか、この辺りのソースを流し読んでみました。 github の時と同様、 repo = でローカルのディレクトリを指定してあげれば大丈夫そうです。

やってみます。以下を dein.toml に追加しました。

# [local] apple-swift-syntax-----
[[plugins]]
repo   = '~/dotfiles/vim_localplugin/apple-swift-syntax'

セーブして再起動させます。

シンタックスハイライトが入った

無事入りました。

shellscript で自動化

github からソースをとってきて filter-branch する過程を shell script にしました。

#!/bin/sh

localplugindir="$HOME/dotfiles/vim_localplugin";
swiftdir="${localplugindir}/apple-swift-syntax";

if [ -e $localplugindir ]; then
  rm -rf $localplugindir
fi

mkdir $localplugindir

cd $localplugindir

if [ -e $swiftdir ]; then
  rm -rf $swiftdir
fi

git clone https://github.com/apple/swift.git $swiftdir
cd $swiftdir
git filter-branch --subdirectory-filter utils/vim HEAD

これで環境が変わってもすぐ復元できそうです。