2012年3月26日月曜日

[vim] 今日はvim pluginを作ってみようと思って、社内で使うためのcodepaste.vimってのを作った。

背景


社内で使っているソース共有サービス?Codepasteというのがある。
Codepaste.netとかGistとやってることは全く同じ。
それを社内用に使えるようになっている。
使い方も同じで、ブラウザのフォームから、
コードをポストして、URLを共有する感じ。

コピペするのがめんどいからvimで選択したものを、
Codepasteにポストするプラグインをつくろうと思った。

やったこと


似たようなの探してみると、あった。

Gistを便利に扱えるvimscript、「Gist.vim」書いた。

やりたいと思っていたこと、そのまんまだw.
まぁ、1から自分でvim plugin書いたことなかったし、
このGist.vimを参考にしながら、
社内のCodepasteポスト用のプラグインを書いてみた。

できたもの


ソースは以下。

kokukuma/codepaste-vim

Gist.vimの場合、ポストしたものを編集したり、
今までポストしたものの一覧を表示したりといろいろやっていたが、
社内で使っているものに関して、そんなに機能必要ないしポストするだけにした。

使い方①
ファイルを開いた状態で
:Codepaste
とすると、現在開いているファイルの内容が
Codepasteにポストされ、URLが表示される。

使い方②
ビジュアルモードで選択した状態で、
:Codepaste
とすると、選択した範囲が、Codepasteにポストされ、
URLが表示される。


できてみると、Gist.vimの劣化コピーみたいになってしまった。
ま、次がんばろう次。


ToDo

○ データ量が多くなると送れなくなる。。
後で調査する。

① IRCへポスト
どうせURLコピーした後IRCに貼り付けるんだから、
コマンド叩いたらIRCにポストするまで勝手にやってもらいたい。

② ヘルプ
今まで書いたことなかったが、今回はちゃんとしたヘルプ書こうと思う。

③ clipboardに保存
プラグインの実装としては簡単そうだが、
そもそもVM上のlinuxとホストのWindows間でクリップボード共有してないから、
まずそっちをやらないと。。

2012年3月20日火曜日

[vim] unite.vimのfilter周りがちょっとわかった気がする。

bzr-logの複数リビジョン対応のときに、unite.vimのfilter周りを調べた。
今回の修正で、bzr-logでマークした複数のリビジョンに対して、
actionであるbzr-deltaを実行できるようになった。

今まで、uniteのデフォ機能で、マークしたものに対して一度にアクションを実行することはできたが、
それでは、選択した複数のリビジョンで同じファイルを修正していた場合、実行したbzr-deltaの結果として、
同じファイルができてしまう。

今回filter(converter)を追加して、candidatesの中に同じファイルパスを指すものがあった場合、
それを1つにまとめ、bzr-deltaのアクション(vimdiff)の引数を修正するようにした。
通常のfilterはsource毎に呼び出されるようだったので、
sourceに設定するのではなくuniteバッファに設定するunite#set_profileを使ってfilterを設定した。
これなら、すべての候補が出力されてからfilterが実行されるので、
かぶってる候補をまとめることができた。

unite.vimでできることが広がった気がする。

kokukuma / vim-unite-bzr

[vim] NERDTreeのメニューにbzr-log をつける。

nerdtreeのメニューにbzr-logメニューを付けた。
これを実行すると、ファイルを指定してbzr-logを実行する。

uniteのソース実行するときに引数渡すやり方がわからなかったので、
もう無理やり。global変数定義して引き渡した。
コマンドもハードコーディングだし、なんかもう、ひどい。

https://gist.github.com/2133012

とりあえず、~/.vim/nerdtree_plugin/ におけば動くはず。
あと、unite-bzr入れれば。

kokukuma / vim-unite-bzr

2012年3月4日日曜日

[vim] NERDTreeのメニューにvimdiffオプションをつける。

diffとりやすくなるかなって思って、
NERDTreeのメニューにvimdiffをつけてみた。

下記、スクリプトを、「nerdtree/nerdtree_plugin/diff_menu.vim」に保存すれば、使えるようになると思う。
NERDTreeでファイル選択中に、「m」でメニューを開くと、
vimdiffが追加 されている。
実行すると、現在開いているファイルと、選択したファイルのdiffをとる。



" ============================================================================
" File:        vimdiff_menu.vim
"
" ============================================================================
if exists("g:loaded_nerdtree_vimdiff_menu")
    finish
endif
let g:loaded_nerdtree_vimdiff_menu = 1
    
call NERDTreeAddMenuItem({'text': '(v)imdiff with current node', 'shortcut': 'v', 'callback': 'NERDTreeDiffNode'})

" FUNCTION: NERDTreeDiffNode() 
function! NERDTreeDiffNode()
    let currentNode = g:NERDTreeFileNode.GetSelected()
    let confirmed = 1

    if currentNode.path.isDirectory 
        let choice =input("Diff with the current node\n" .
                         \ "==========================================================\n" .
                         \ "STOP! Cannot diff with directory\n" .
                         \ "" . currentNode.path.str() . ": ")
        let confirmed = 0
    endif

    if confirmed
        try
            execute "wincmd p"
            execute "vertical diffsplit " currentNode.path.str()
        catch /^NERDTree/
            call s:echoWarning("Could not diff") 
        endtry
    else
        call s:echo("diff aborted")     
    endif

endfunction

[vim] NERDTreeをもっと使いやすくするための設定

背景

NERDTreeは便利だけど、ファイル編集中はじゃま。
なので、NERDTree実行用のスクリプトを書いてみた。
結構便利だ。前にやった「引数なしでvimを実行したときNERDTreeを実行する」設定も修正した。

この辺のアイディアを参考にさせていただいた。
NERDTreeのウィンドウを必要なときだけ見せる。

機能

主な機能はこんな感じ。
① 「Ctrl+e」で、NERDTreeを実行する。
② もう一度「Ctrl+e」で、NERDTreeの表示/非表示を繰り返す。

以下を、vimrcに書き込むと使える。

" 引数なしで実行したとき、NERDTreeを実行する
let file_name = expand("%:p")
if has('vim_starting') &&  file_name == ""
    autocmd VimEnter * call ExecuteNERDTree()
endif

" カーソルが外れているときは自動的にnerdtreeを隠す
function! ExecuteNERDTree()
    "b:nerdstatus = 1 : NERDTree 表示中
    "b:nerdstatus = 2 : NERDTree 非表示中

    if !exists('g:nerdstatus')
        execute 'NERDTree ./'
        let g:windowWidth = winwidth(winnr())
        let g:nerdtreebuf = bufnr('')
        let g:nerdstatus = 1 

    elseif g:nerdstatus == 1 
        execute 'wincmd t'
        execute 'vertical resize' 0 
        execute 'wincmd p'
        let g:nerdstatus = 2 
    elseif g:nerdstatus == 2 
        execute 'wincmd t'
        execute 'vertical resize' g:windowWidth
        let g:nerdstatus = 1 

    endif
endfunction
noremap  ::call ExecuteNERDTree()