Skip to content

Commit

Permalink
First commit
Browse files Browse the repository at this point in the history
  • Loading branch information
hankei6km committed Feb 16, 2018
0 parents commit 9a577ad
Show file tree
Hide file tree
Showing 8 changed files with 390 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
doc/tags*
9 changes: 9 additions & 0 deletions LICENSE.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
MIT License

Copyright (c) 2018 hankei6km

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
54 changes: 54 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# starttig

starttig is vim plug-in to support starting [tig](http://jonas.nitro.dk/tig/) from vim. it's enable options/refs input completion and suppress hit-enter prompt.

## Requirements

* vim
* tig

## Installation

* Install startig like as general vim plug-ins

## Usage

start `tig`

```vim
:Stig
```

start `tig` with `topic/foo`

```vim
:Stig topic/foo
```

start `tig blame` with current edit file

```vim
:Stig blame
```

## Customize

Change command name.

```vim
call starttig#SetTigCmdName("Tig")
```

Set default options (it's enable when passed options is blanked).

```vim
call starttig#SetTigBlankedOpt(["--all"])
```
(Acceptable opttions is '--all' and '--topo-oroder' only yet)


## License

Copyright (c) 2018 hankei6km

Licensed under the MIT License. See LICENSE.txt in the project root.
53 changes: 53 additions & 0 deletions README_ja.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# starttig

starttig は、 Vim からの [tig](http://jonas.nitro.dk/tig/) 開始をサポートするVimプラグインです。tig のオプション等の補完やコマンド終了後の hit-enter プロンプトを抑止します。

## Requirements

* vim
* tig

## Installation

* 一般的な Vim スクリプトと同じようにインストールできます。

## Usage

`tig` を開始.

```vim
:Stig
```

`tig``topic/foo` を付加して開始.

```vim
:Stig topic/foo
```

編集中のファイルで `tig blame` を開始.

```vim
:Stig blame
```

## Customize

コマンド名を変更する.

```vim
call starttig#SetTigCmdName("Tig")
```

デフォルト(オプション無しのときの)のオプションをセットする

```vim
call starttig#SetTigBlankedOpt(["--all"])
```
(現状では、指定できるのは `--all``--topo-order` のみです).

## License

Copyright (c) 2018 hankei6km

Licensed under the MIT License. See LICENSE.txt in the project root.
189 changes: 189 additions & 0 deletions autoload/starttig.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
" starttig.vim - start tig.
" Version: 0.1.0
" Author: hankei6km
" License: Licensed under the MIT License. See LICENSE.txt in the project root.

" tigを開始するコマンド名.
let s:StartTigCmdName = "Stig"

" tig開始時にオプションが指定されていなかったときの
" 代替オプション.
let s:StartTigBlankedOpt = []

" tigを開始するコマンド名のsetter.
" @param cmdName[in] {String} コマンド名.
function starttig#SetTigCmdName(cmdName) " {{{
let s:StartTigCmdName = a:cmdName
endfunction " }}}

" tigを開始するコマンド名のgetter.
" @return コマンド名.
function starttig#GetTigCmdName() " {{{
return s:StartTigCmdName
endfunction " }}}

" 代替オプションのsetter.
" @param opt[in] {List} オプションのリスト.
" 現状、指定できるのは"--all"と"--topo-order"
function starttig#SetTigBlankedOpt(opt) " {{{
for item in a:opt
if item !=# "--all" && item !=# "--topo-order"
echoerr "invalid option:" . item
return
endif
endfor
let s:StartTigBlankedOpt = a:opt
endfunction " }}}

" 代替オプションのgetter.
" @return 代替オプション.
function starttig#GetTigBlankedOpt() " {{{
return s:StartTigBlankedOpt
endfunction " }}}


" tigのオプション等補完用定義. {{{
let s:tig_opt_words1 = ["-h", "-v"]
let s:tig_opt_words2 = ["--abbrev-commit",
\ "--abbrev=",
\ "--after=",
\ "--all",
\ "--all-match",
\ "--author=",
\ "--before=",
\ "--committer=",
\ "--date-order",
\ "--grep=",
\ "--help",
\ "--max-age=",
\ "--max-count=",
\ "--min-age=",
\ "--name-only",
\ "--name-status",
\ "--no-merges",
\ "--not",
\ "--pretty=",
\ "--relative-date",
\ "--root",
\ "--since=",
\ "--topo-order",
\ "--until=",
\ "--version"]
let s:tig_cmd_words = ["blame", "show", "status"]
" }}}

" gitの補完用定義. {{{
let s:git_refs_words = ["FETCH_HEAD", "HEAD", "ORIG_HEAD"]
" }}}

" カスタム補完関数.
" @return 改行区切りの補完候補文字列.
" @param A[in] {String} カスタム補完の引数(補完対象).
" @param L[in] {String} カスタム補完の引数(コマンド行全体).
" @param P[in] {Number} カスタム補完の引数(カーソル位置).
function! starttig#TigComplete(A, L, P) " {{{
" 戻り値は関数内では List として扱う(扱いやすいので).
let l:ret = []

if !empty(matchstr(a:A, "^0")) "「Tig -」でTabだとAが0になる?
" tigのオプションをセットする.
let l:ret = s:tig_opt_words1

elseif !empty(matchstr(a:A, "^--"))
" tigのオプションをセットする.
let l:ret = s:tig_opt_words2

else
" tig のコマンド(verb)をセットする.
let l:ret = s:tig_cmd_words

" ブランチなどをセットする.
" gitでshow-refが使えるのが前提となっているので、
" あまりよくないかも.
let l:tmp = split(system("git show-ref"), "\n")
if empty(matchstr(a:A, "^refs"))
" show-ref の結果を整形する.
let l:pat = "^[^ ]\\+ refs/[^/]\\+/"
let l:sub = ""
else
" refsで始まっていたら整形内容を変える.
let l:pat = "^[^ ]\\+ refs/"
let l:sub = "refs/"
endif
if v:shell_error == 0
call extend(l:ret, s:git_refs_words)
for item in l:tmp
call add(l:ret, substitute(item, l:pat , l:sub, ""))
endfor
endif
endif

" ファイル名補完用.
" とくに文脈は考慮しないで常に一覧を追加.
" 「Tig -」でTabだと-でなく0になるので、正しく補完できない.
" 他にもクオートが扱えないとかいろいろあるが、
" vimから実行するときは % を使うことが多そうなので、
" ということにしておく.
call extend(l:ret, split(glob(a:A . "*"), "\n"))

" 改行区切りの文字列にして返す.
return join(l:ret, "\n")
endfunction " }}}

" tigの実行.
" param[in] ... {List} tigへ渡すオプション等.
function! starttig#StartTig(...) " {{{
" tigを実行す方法(コマンド)の決定.
" (基本的にはhit-enterプロンプトを出さない)
let l:tc = "silent !tig"

" オプションなどによりtigを実行する方法を変更.
let l:opts = copy(a:000)
let l:len = len(l:opts)
if l:len == 0 && len(s:StartTigBlankedOpt) > 0
" オプション無しだが代替オプションがあったので、差し替え.
let l:opts = copy(s:StartTigBlankedOpt)
let l:len = len(l:opts)
endif
if l:len > 0 && (l:opts[0] ==# "-h" || l:opts[0] ==# "-v" || l:opts[0] ==# "--help")
" ヘルプメッセージなどの表示なので、
" hit-enter プロンプトありでtigを実行.
let l:tc = "!tig"

elseif l:len == 1 && l:opts[0] ==# "blame"
let l:curfn = expand("%")
if l:curfn != ""
" 編集中のファイルがあったので
" blameの指定に使う.
call add(l:opts, shellescape("+" . line("."))) " 表示位置.
call add(l:opts, "--")
call add(l:opts, shellescape(l:curfn)) " ファイル名.
else
" blameのみ指定でエラーになるので、
" hit-enter プロンプトありでtigを実行.
let l:tc = "!tig"
endif
endif

" tigを実行する.
execute l:tc . " " . join(l:opts, " ")

" 戻り値から後処理を決める.
if v:shell_error == 0
redraw!
else
if !empty(matchstr(l:tc, "^silent "))
" silentだが戻り値があったので hit-enter を
" 表示させるようにしてみる.
" コマンドからの表示が前回の表示にくっついて
" しまうのと、echoコマンドがあることを前提に
" しているので、正しい?方法があれば置き換える.
execute "!echo shell returned " . v:shell_error
else
redraw!
endif
endif

endfunction " }}}

" vim:set ts=8 sw=2 sts=2 et fdm=marker:
28 changes: 28 additions & 0 deletions doc/starttig.jax
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
*starttig.txt* Vimからのtig開始をサポート.

Version: 0.1.0
Author: hankei6km
License: Licensed under the MIT License. See LICENSE.txt in the project root.

概要 *starttig-intro*

*starttig* は、 Vim からの tig(http://jonas.nitro.dk/tig/) 開始をサポートする
Vimプラグインです。tig のオプション等の補完やコマンド終了後の hit-enter プロン
プトを抑止します。


コマンド *starttig-commands*

*:Stig*
:Stig tig を開始します( NOTE Vim のカレントディレクトリが
git ディレクトリでないとエラーになります)。

:Stig {options} tig を開始します。{options} は tig のオプションや
サブコマンドとして tig へ渡されます。

:Stig blame tig blame を開始します。編集中ファイルがあれば、
表示行とファイル名が tig へ渡されます( NOTE blameの
後にオプションを指定すると、:Stig {options} と同じ
ように振る舞います)。

vim:tw=78:ts=8:ft=help:norl:
26 changes: 26 additions & 0 deletions doc/starttig.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
*starttig.txt* starttig to support start tig on vim.

Version: 0.1.0
Author: hankei6km
License: Licensed under the MIT License. See LICENSE.txt in the project root.


Overview *starttig-intro*

*starttig* is vim plug-in to support starting tig from vim. it's enable options/refs input completion and suppress hit-enter prompt.

Command *starttig-commands*

*:Stig*
:Stig To start tig ( NOTE Error occurs when vim current
directory is not git directory).

:Stig {options} To start tig. {options} passed to tig as options/
sub-command.

:Stig blame To start tig blame. pass file-name current edited
to tig blame. ( Note Specifty options after blame,
behaves as :Stig {options}

vim:tw=78:ts=8:ft=help:norl:

30 changes: 30 additions & 0 deletions plugin/starttig.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
" starttig.vim - start tig.
" Version: 0.1.0
" Author: hankei6km
" License: Licensed under the MIT License. See LICENSE.txt in the project root.

" tigを開始するためのコマンド定義. {{{
function! s:StartTigCmdDef()
" コマンド定義文字列.
" バッファ別に挙動を変えるときは"-buffer "も
" 追加すること.
let l:cmddefstr = "command! " .
\"-complete=custom,starttig#TigComplete ".
\"-nargs=* " .
\" " . starttig#GetTigCmdName() . " " .
\" call starttig#StartTig(<f-args>)"
execute l:cmddefstr
endfunction " }}}

" コマンド定義用autocmd定義. {{{
" vimが開始されたときに一括で定義する.
" 現状では外部からコマンド名を定義できるくらいで
" あまり意味はないが、いずれバッファのディレクトリが
" gitリポジトリかで定義するしないを変更するかも
" しれないのでとりあえず定義.
augroup StartTigCmdDef
autocmd!
autocmd VimEnter * call s:StartTigCmdDef()
augroup END "}}}

" vim:set ts=8 sw=2 sts=2 et fdm=marker:

0 comments on commit 9a577ad

Please sign in to comment.