1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

100行でvim-startifyもどきを作る

Posted at

他の100行シリーズもよろしくお願いします

mhinz/vim-startify

リポジトリREADME内のスクショです。
image.png

vi ファイル名でなく
viのみで
vimを起動した直後の画面をカスタムできるもの。
さらに。セッション機能がある。
前回開いたファイルトップ10とかを表示し、カーソル移動で開けるというもの。

私個人としてはセッション機能いらないので
とにかく起動時の画面を作ってみる。

できたもの

image.png

アスキーアート以外に、自分用にカスタムしたキーマップのチートシートを書いてみました。

私はLSPとかを除きプラグインは自作しているので
vim-airlineに見えるやつもvimrcに書いてます。真似しました。

仕組み

まず起動直後の画面をこんな大胆に変える方法は何かというと
これが全てです。

sil! exe 'e _cheat_cheet_'

起動後にautocmdで、新規バッファを開いているだけです。
ただしこのロゴ用のバッファは修正したくないし、勝手にファイルとして保存してほしくもないので

setl buftype=nofile bufhidden=wipe nobuflisted modifiable

とし、装飾をとっぱらいつつ、右下のファイルタイプを好きな文字にする。

setl nonumber norelativenumber nocursorline nocursorcolumn signcolumn=no
let &filetype = 'Bocchi_The_Rock'

また、INSERTモードなどの編集できるキーを無効にする

    nmap <buffer>i \<Esc>
    nmap <buffer>I \<Esc>
    nmap <buffer>a \<Esc>
    nmap <buffer>A \<Esc>
    nmap <buffer>s \<Esc>

あとはこのロゴ専用にできたバッファに文字を入れて

    cal append('$', self.btr_logo) " アスキーアートを1行ごとに分けた2次元配列文字
    cal append('$', ['',''])
    cal append('$', self.cheat_sheet_win) " チートシートを1行ごとに分けた2次元配列文字

色や装飾をする

    hi BTR ctermfg=218 cterm=bold
    cal matchaddpos('BTR', range(2,9)->map({_,v->[v]}), 999)
    cal matchaddpos('BTR', range(10,17)->map({_,v->[v]}), 999)
    cal matchaddpos('BTR', range(18,21)->map({_,v->[v]}), 999)
    cal matchadd('User_greenfg_blackbg', '[─│╰╯╭╮]', 20)
    cal matchadd('DarkOrange', '\(Window\|Search\|Motion\|Command\)')
    cal matchadd('DarkBlue', '│.\{-,25}|', 19)
    cal matchadd('DarkRed', '(.*)', 18)

最後に、appendした時点で編集されたと見なされるので
以下をつけて、あたかも最初からロゴやチートシートが書いてあったかのような顔をする

    setl nomodifiable nomodified

これらをVimEnterで呼ばれるようにしてやれば良いが
このままでは別のバッファを開いたときなどに、色やboldなどが残ってしまうので
BufReadPreのautocmdでclearmatchesしつつ
そのautocmdが1度のみ呼ばれるようにしたい(バッファ開くたびにclearmatchesでは通常作業に支障)

なので

fu! s:start.move() abort " 一度のみ呼びたいクリア処理
    cal clearmatches()
    cal s:fmode.activate()

    " deactivate
    aug start_vim " 呼ばれたらautocmdを消すので1度しかここに来ない
        au!
    aug END
endf

" only first call
aug start_vim
    au!
    au VimEnter * cal s:start.exe()
    au BufReadPre * cal s:start.move() " スタート画面から変わった時に呼ばれるが
aug END

とする。

全量はこうなる

" ===================================================================
" mhinz/vim-startify
" ===================================================================
" {{{
let s:start = #{}

" ぼっちざろっく{{{
let s:start.btr_logo = [
    \'                                                                                                                                              dN',
    \'                                                                                                              ..                             JMF',
    \'                                                                                                         ..gMMMM%                           JMF',
    \'                                                                                                       .MM9^ .MF                           (MF',
    \'                                                                                              .(,      ("   .M#                  .g,      .MF',
    \'                                        .,  dN                                             gg,,M@          .M#                  .M#!      (M>',
    \'                                        JM} M#             .MNgg.                     .g,  ?M[ 7B         .MMg+gg,.           .MM"        ."',
    \'                                ...gNMN,.Mb MN           .gMM9!                      .(MN,  .=           .MMM9=  ?MN,         (WN,      .MM ',
    \'                   jN-      ..gMMN#!     (Mp(M}       .+MMYMF                    ..kMMWM%               ,M#^       dN.          .WNJ,   JM',
    \'                   MM     .MM9^  dN,                 dNB^ (M%                   ?M"!  ,M\        .,               .M#   .&MMMN,    ?"   M#',
    \'                   MN            .MN#^                    dM:  ..(J-,                 ,B         .TM             .M#   ,M@  .MF',
    \'                   MN.       ..MMBMN_                     dN_.MM@"!?MN.   TMm     .a,                           (M@         MM^',
    \'                   MN.     .MM"  JMb....       ..        dMMM=     .Mb            ?HNgJ..,                   .MM^',
    \'                   dM{          -MMM#7"T""   .dN#TMo       ?      .MM^                 ?!                 +gM#=',
    \'                   (M]         .MN(N#       .M@  .MF              .MM^                                      ~',
    \'                   .MN          ?"""             MM!            .MMD',
    \'                    ?N[                                         7"',
    \'                     TMe',
    \'                      ?MN,',
    \'                        TMNg,'
    \]
"}}}

" cheat sheet {{{
let s:start.cheat_sheet_win = [
    \'       ╭── Window ──────────────────────────────────────────╮           ╭── Search ───────────────────────────────────────╮',
    \'       │ C-n / p    | (buffer tab)(next / prev)             │           │ Space e    | (explorer)                         │',
    \'       │ Space x    | (buffer tab)(close)                   │           │ Space f    | (fzf)(files / projectfiles auto)   │',
    \'       │ C-w v / s  | (window split)(vertical / horizontal) │           │ Space h    | (fzf)(histories)                   │',
    \'       │ ←↑↓→       | (window)(resize)                      │           │ Space b    | (fzf)(buffers)                     │',
    \'       │ C-hjkl     | (window)(forcus)                      │           │ Space m    | (marks)                            │',
    \'       │ Space t/g  | (terminal)/(lazygit)                  │           │ Space s    | (fuzzy search in file / quickfix)  │',
    \'       │ Space z    | (Zen Mode)                            │           │ Space*2 s  | (grep interactive)                 │',
    \'       ╰────────────────────────────────────────────────────╯           │ Space q    | (clear search highlight)           │',
    \'                                                                        ╰─────────────────────────────────────────────────╯',
    \'',
    \'       ╭── Motion ───────────────────────────────────────────╮          ╭── Command ──────────────────────────────────────────╮',
    \'       │ Space v       | (IDE Action Menu)                   │          │ :PlugInstall            | (plugins install)         │',
    \'       │ Space w       | (f-scope toggle)                    │          │ :PlugUnInstall          | (plugins uninstall)       │',
    \'       │ Tab S-Tab     | (jump 5rows)                        │          │ :RunCat [option]        | (running cat)             │',
    \'       │ s             | (easymotion)                        │          │ :RunCatStop             | (running cat stop)        │',
    \'       │ mm            | (mark toggle)                       │          │ :TrainingWheelsProtocol | [option] (training vim)   │',
    \'       │ mn / mp       | (mark next / prev)                  │          ╰─────────────────────────────────────────────────────╯',
    \'       │ mc / mx       | (mark clear file / delete all file) │',
    \'       │ INSERT C-hjkl | (cursor move)                       │',
    \'       │ VISUAL C-jk   | (blok up / down)                    │',
    \'       ╰─────────────────────────────────────────────────────╯',
    \]
" }}}

fu! s:start.exe() abort
    let fopen = execute('ls')->split('\n')->map({_,v -> split(v, '"')[1]})
            \ ->filter({_,v -> v != '[No Name]' && v != '[無名]'})->len()
    if fopen
        cal self.move()
        retu
    endif
    " preview window
    sil! exe 'e _cheat_cheet_'
    setl buftype=nofile bufhidden=wipe nobuflisted modifiable
    setl nonumber norelativenumber nocursorline nocursorcolumn signcolumn=no
    let &filetype = 'Bocchi_The_Rock'
    nmap <buffer>i \<Esc>
    nmap <buffer>I \<Esc>
    nmap <buffer>a \<Esc>
    nmap <buffer>A \<Esc>
    nmap <buffer>s \<Esc>

    " draw
    cal append('$', self.btr_logo)
    cal append('$', ['',''])
    cal append('$', self.cheat_sheet_win)
    hi BTR ctermfg=218 cterm=bold
    cal matchaddpos('BTR', range(2,9)->map({_,v->[v]}), 999)
    cal matchaddpos('BTR', range(10,17)->map({_,v->[v]}), 999)
    cal matchaddpos('BTR', range(18,21)->map({_,v->[v]}), 999)
    cal matchadd('User_greenfg_blackbg', '[─│╰╯╭╮]', 20)
    cal matchadd('DarkOrange', '\(Window\|Search\|Motion\|Command\)')
    cal matchadd('DarkBlue', '│.\{-,25}|', 19)
    cal matchadd('DarkRed', '(.*)', 18)

    " fix
    setl nomodifiable nomodified
endf

fu! s:start.move() abort
    cal clearmatches()
    cal s:fmode.activate()

    " deactivate
    aug start_vim
        au!
    aug END
endf

" only first call
aug start_vim
    au!
    au VimEnter * cal s:start.exe()
    au BufReadPre * cal s:start.move()
aug END
" }}}

ちょっと100行超えました。。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?