diff options
author | Vasil Zlatanov <vasil.zlatanov@gmail.com> | 2015-08-18 01:54:42 +0200 |
---|---|---|
committer | Vasil Zlatanov <vasil.zlatanov@gmail.com> | 2015-08-18 01:54:42 +0200 |
commit | e26958b154d0457c1019bc48a5ff0ed637cf3eac (patch) | |
tree | d11a37bb0e2a6916b3ffb421aab9cf68e5f3bba6 /Editor/vim/autoload | |
parent | 9d56811c86e81cbc70f03cde70e5a62378c187ef (diff) | |
download | dotfiles-e26958b154d0457c1019bc48a5ff0ed637cf3eac.tar.gz dotfiles-e26958b154d0457c1019bc48a5ff0ed637cf3eac.tar.bz2 dotfiles-e26958b154d0457c1019bc48a5ff0ed637cf3eac.zip |
update vim
Diffstat (limited to 'Editor/vim/autoload')
-rw-r--r-- | Editor/vim/autoload/DrawIt.vim | 2921 | ||||
-rw-r--r-- | Editor/vim/autoload/goyo.vim | 383 | ||||
-rw-r--r-- | Editor/vim/autoload/pathogen.vim | 344 |
3 files changed, 3648 insertions, 0 deletions
diff --git a/Editor/vim/autoload/DrawIt.vim b/Editor/vim/autoload/DrawIt.vim new file mode 100644 index 0000000..89f6ad5 --- /dev/null +++ b/Editor/vim/autoload/DrawIt.vim @@ -0,0 +1,2921 @@ +" DrawIt.vim: a simple way to draw things in Vim +" +" Maintainer: Charles E. Campbell +" Authors: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz> - NOSPAM +" Sylvain Viart (molo@multimania.com) +" Version: 13 +" Date: Nov 25, 2013 +" +" Quick Setup: {{{1 +" tar -oxvf DrawIt.tar +" Should put DrawItPlugin.vim in your .vim/plugin directory, +" put DrawIt.vim in your .vim/autoload directory +" put DrawIt.txt in your .vim/doc directory. +" Then, use \di to start DrawIt, +" \ds to stop Drawit, and +" draw by simply moving about using the cursor keys. +" +" You may also use visual-block mode to select endpoints and +" draw lines, arrows, and ellipses. +" +" Copyright: Copyright (C) 1999-2012 Charles E. Campbell {{{1 +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" DrawIt.vim is provided *as is* and comes with no warranty +" of any kind, either expressed or implied. By using this +" plugin, you agree that in no event will the copyright +" holder be liable for any damages resulting from the use +" of this software. +" +" Required: THIS SCRIPT REQUIRES VIM 7.0 (or later) {{{1 +" GetLatestVimScripts: 40 1 :AutoInstall: DrawIt.vim +" GetLatestVimScripts: 1066 1 cecutil.vim +" +" Woe to her who is rebellious and polluted, the oppressing {{{1 +" city! She didn't obey the voice. She didn't receive correction. +" She didn't trust in Yahweh. She didn't draw near to her God. (Zeph 3:1,2 WEB) + +" --------------------------------------------------------------------- +" Load Once: {{{1 +if &cp || exists("g:loaded_DrawIt") + finish +endif +let g:loaded_DrawIt= "v13" +if v:version < 700 + echohl WarningMsg + echo "***warning*** this version of DrawIt needs vim 7.0" + echohl Normal + finish +endif +let s:keepcpo= &cpo +set cpo&vim +scriptencoding utf-8 + +" --------------------------------------------------------------------- +" Script Variables: {{{1 +if !exists("g:drawit_xstrlen") + if exists("g:Align_xstrlen") + let g:drawit_xstrlen= g:Align_xstrlen + elseif exists("g:netrw_xstrlen") + let g:drawit_xstrlen= g:netrw_xstrlen + elseif &enc == "latin1" || !has("multi_byte") + let g:drawit_xstrlen= 0 + else + let g:drawit_xstrlen= 1 + endif +endif +if !exists("g:drawit_mode") + let g:drawit_mode= 'N' " other options: =S (single-line utf-*,cp437) or =D (double-line utf-*,cp437) +endif +if !exists("s:saveposn_count") + let s:saveposn_count= 0 +endif +"DechoTabOn + +" ===================================================================== +" DrawIt Functions: (by Charles E. Campbell) {{{1 +" ===================================================================== + +" --------------------------------------------------------------------- +" DrawIt#DrawItStart: this function maps the cursor keys, sets up default {{{2 +" drawing characters, and makes some settings +fun! DrawIt#DrawItStart(...) +" call Dfunc("DrawItStart()") + + if a:0 > 0 + if exists("b:di_gfxchr") && b:di_gfxchr && (a:1 == 'S' || a:1 == 's') + DIsngl + elseif exists("b:di_gfxchr") && b:di_gfxchr && (a:1 == 'D' || a:1 == 'd') + DIdbl + elseif !exists("g:drawit_mode") + let g:drawit_mode= 'N' + endif + endif + + " DrawItStart: report on [DrawIt] mode {{{3 + if exists("b:dodrawit") && b:dodrawit == 1 + " already in DrawIt mode + echo "[DrawIt] (already on, use ".((exists("mapleader") && mapleader != "")? mapleader : '\')."ds to stop)" +" call Dret("DrawItStart") + return + endif + let b:dodrawit= 1 + + " indicate in DrawIt mode + echo "[DrawIt]" + + " DrawItStart: turn on mouse {{{3 + if !exists("b:drawit_keep_mouse") + let b:drawit_keep_mouse= &mouse + endif + setl mouse=a + + " DrawItStart: set up DrawIt commands {{{3 + com! -nargs=1 -range SetBrush <line1>,<line2>call DrawIt#SetBrush(<q-args>) + com! -count Canvas call s:Spacer(line("."),line(".") + <count> - 1,0) + + " DrawItStart: set up default drawing characters {{{3 + if !exists("b:di_vert") |let b:di_vert = "|" |endif + if !exists("b:di_horiz") |let b:di_horiz = "-" |endif + if !exists("b:di_plus") |let b:di_plus = "+" |endif + if !exists("b:di_upright")|let b:di_upright = "/" |endif " same as downleft + if !exists("b:di_upleft") |let b:di_upleft = "\\"|endif " same as downright + if !exists("b:di_cross") |let b:di_cross = "X" |endif + if !exists("b:di_ellipse")|let b:di_ellipse = '*' |endif + + let b:di_gfxchr= 1 + if &enc == 'utf-8' || &enc == 'utf-16' || &enc == "ucs-4" + " Box drawing characters using unicode + " │ ─ ┌ ┐ └ ┘ ┬ ┴ ├ ┤ ┼ ╱ ╲ ╳ + " ║ ═ ╔ ╗ ╚ ╝ ╦ ╩ ╠ ╣ ╬ +" call Decho("box drawing characters using unicode") + if !exists("b:di_Svert") |let b:di_Svert = '│' |endif + if !exists("b:di_Dvert") |let b:di_Dvert = '║' |endif + if !exists("b:di_Shoriz") |let b:di_Shoriz = '─' |endif + if !exists("b:di_Dhoriz") |let b:di_Dhoriz = '═' |endif + if !exists("b:di_Sulcorn") |let b:di_Sulcorn = '┌' |endif + if !exists("b:di_Dulcorn") |let b:di_Dulcorn = '╔' |endif + if !exists("b:di_Surcorn") |let b:di_Surcorn = '┐' |endif + if !exists("b:di_Durcorn") |let b:di_Durcorn = '╗' |endif + if !exists("b:di_Sllcorn") |let b:di_Sllcorn = '└' |endif + if !exists("b:di_Dllcorn") |let b:di_Dllcorn = '╚' |endif + if !exists("b:di_Slrcorn") |let b:di_Slrcorn = '┘' |endif + if !exists("b:di_Dlrcorn") |let b:di_Dlrcorn = '╝' |endif + if !exists("b:di_Splus") |let b:di_Splus = '┼' |endif + if !exists("b:di_Dplus") |let b:di_Dplus = '╬' |endif + if !exists("b:di_Sdnplus") |let b:di_Sdnplus = '┬' |endif + if !exists("b:di_Ddnplus") |let b:di_Ddnplus = '╦' |endif + if !exists("b:di_Supplus") |let b:di_Supplus = '┴' |endif + if !exists("b:di_Dupplus") |let b:di_Dupplus = '╩' |endif + if !exists("b:di_Slplus") |let b:di_Slplus = '┤' |endif + if !exists("b:di_Dlplus") |let b:di_Dlplus = '╣' |endif + if !exists("b:di_Srplus") |let b:di_Srplus = '├' |endif + if !exists("b:di_Drplus") |let b:di_Drplus = '╠' |endif + if !exists("b:di_Supright")|let b:di_Supright= "╱" |endif " same as Sdownleft + if !exists("b:di_Supleft") |let b:di_Supleft = "╲" |endif " same as Sdownright + if !exists("b:di_Scross") |let b:di_Scross = "╳" |endif + + " Mixed Single-Double unicode box drawing characters + " ╞ ╟ ╡ ╢ ╤ ╥ ╧ ╪ ╫ + if !exists("b:di_DhSd") |let b:di_DhSd = '╤' |endif + if !exists("b:di_DhSu") |let b:di_DhSu = '╧' |endif + if !exists("b:di_DuSl") |let b:di_DuSl = '╢' |endif + if !exists("b:di_DuSlr") |let b:di_DuSlr= '╫' |endif + if !exists("b:di_DuSr") |let b:di_DuSr = '╟' |endif + if !exists("b:di_ShDd") |let b:di_ShDd = '╥' |endif + if !exists("b:di_ShDu") |let b:di_ShDu = '╨' |endif + if !exists("b:di_SuDl") |let b:di_SuDl = '╡' |endif + if !exists("b:di_SuDlr") |let b:di_SuDlr= '╪' |endif + if !exists("b:di_SdDh") |let b:di_SdDh = '╤' |endif + if !exists("b:di_SuDh") |let b:di_SuDh = '╧' |endif + if !exists("b:di_SuDr") |let b:di_SuDr = '╞' |endif + + " Mixed Single-Double unicode box drawing corner characters + " ╒ ╓ ╕ ╖ ╘ ╙ ╛ ╜ + if !exists("b:di_cSdDr")| let b:di_cSdDr= '╒'| endif + if !exists("b:di_cDdSr")| let b:di_cDdSr= '╓'| endif + if !exists("b:di_cDlSd")| let b:di_cDlSd= '╕'| endif + if !exists("b:di_cSlDd")| let b:di_cSlDd= '╖'| endif + if !exists("b:di_cDrSu")| let b:di_cDrSu= '╘'| endif + if !exists("b:di_cSrDu")| let b:di_cSrDu= '╙'| endif + if !exists("b:di_cDlSu")| let b:di_cDlSu= '╛'| endif + if !exists("b:di_cSlDu")| let b:di_cSlDu= '╜'| endif + + elseif &enc == 'cp437' + " Box drawing characters using cp437 (dos) +" call Decho("box drawing characters using cp437") + if !exists("b:di_Svert") |let b:di_Svert = nr2char(179) |endif " │ + if !exists("b:di_Dvert") |let b:di_Dvert = nr2char(186) |endif " ║ + if !exists("b:di_Shoriz") |let b:di_Shoriz = nr2char(196) |endif " ─ + if !exists("b:di_Dhoriz") |let b:di_Dhoriz = nr2char(205) |endif " ═ + if !exists("b:di_Sulcorn") |let b:di_Sulcorn = nr2char(218) |endif " ┌ + if !exists("b:di_Dulcorn") |let b:di_Dulcorn = nr2char(201) |endif " ╔ + if !exists("b:di_Surcorn") |let b:di_Surcorn = nr2char(191) |endif " ┐ + if !exists("b:di_Durcorn") |let b:di_Durcorn = nr2char(187) |endif " ╗ + if !exists("b:di_Sllcorn") |let b:di_Sllcorn = nr2char(192) |endif " └ + if !exists("b:di_Dllcorn") |let b:di_Dllcorn = nr2char(200) |endif " ╚ + if !exists("b:di_Slrcorn") |let b:di_Slrcorn = nr2char(217) |endif " ┘ + if !exists("b:di_Dlrcorn") |let b:di_Dlrcorn = nr2char(188) |endif " ╝ + if !exists("b:di_Splus") |let b:di_Splus = nr2char(197) |endif " ┼ + if !exists("b:di_Dplus") |let b:di_Dplus = nr2char(206) |endif " ╬ + if !exists("b:di_Sdnplus") |let b:di_Sdnplus = nr2char(194) |endif " ┬ + if !exists("b:di_Ddnplus") |let b:di_Ddnplus = nr2char(203) |endif " ╦ + if !exists("b:di_Supplus") |let b:di_Supplus = nr2char(193) |endif " ┴ + if !exists("b:di_Dupplus") |let b:di_Dupplus = nr2char(202) |endif " ╩ + if !exists("b:di_Slplus") |let b:di_Slplus = nr2char(180) |endif " ┤ + if !exists("b:di_Dlplus") |let b:di_Dlplus = nr2char(185) |endif " ╣ + if !exists("b:di_Srplus") |let b:di_Srplus = nr2char(195) |endif " ├ + if !exists("b:di_Drplus") |let b:di_Drplus = nr2char(204) |endif " ╠ + if !exists("b:di_Supright")|let b:di_Supright= '/' |endif " ╱ + if !exists("b:di_Supleft") |let b:di_Supleft = '\' |endif " ╲ + if !exists("b:di_Scross") |let b:di_Scross = 'X' |endif " ╳ + + " Mixed Single-Double cp437 box drawing characters + if !exists("b:di_DhSd") |let b:di_DhSd = nr2char(209)|endif " ╤ + if !exists("b:di_DhSu") |let b:di_DhSu = nr2char(207)|endif " ╧ + if !exists("b:di_DuSl") |let b:di_DuSl = nr2char(182)|endif " ╢ + if !exists("b:di_DuSlr") |let b:di_DuSlr= nr2char(215)|endif " ╫ + if !exists("b:di_DuSr") |let b:di_DuSr = nr2char(199)|endif " ╟ + if !exists("b:di_ShDd") |let b:di_ShDd = nr2char(210)|endif " ╥ + if !exists("b:di_ShDu") |let b:di_ShDu = nr2char(208)|endif " ╨ + if !exists("b:di_SuDl") |let b:di_SuDl = nr2char(181)|endif " ╡ + if !exists("b:di_SuDlr") |let b:di_SuDlr= nr2char(216)|endif " ╪ + if !exists("b:di_SdDh") |let b:di_SdDh = nr2char(209)|endif " ╤ + if !exists("b:di_SuDh") |let b:di_SuDh = nr2char(207)|endif " ╧ + if !exists("b:di_SuDr") |let b:di_SuDr = nr2char(198)|endif " ╞ + + " Mixed Single-Double cp437 box drawing corner characters + if !exists("b:di_cSdDr")| let b:di_cSdDr= nr2char(213)| endif " ╒ + if !exists("b:di_cDdSr")| let b:di_cDdSr= nr2char(214)| endif " ╓ + if !exists("b:di_cDlSd")| let b:di_cDlSd= nr2char(184)| endif " ╕ + if !exists("b:di_cSlDd")| let b:di_cSlDd= nr2char(183)| endif " ╖ + if !exists("b:di_cDrSu")| let b:di_cDrSu= nr2char(212)| endif " ╘ + if !exists("b:di_cSrDu")| let b:di_cSrDu= nr2char(211)| endif " ╙ + if !exists("b:di_cDlSu")| let b:di_cDlSu= nr2char(190)| endif " ╛ + if !exists("b:di_cSlDu")| let b:di_cSlDu= nr2char(189)| endif " ╜ + + else +" call Decho("regular box drawing characters only") + let b:di_gfxchr = 0 + endif + + " set up initial DrawIt behavior (as opposed to erase behavior) + let b:di_erase = 0 + + call s:DrawItSaveUserSettings() + + " DrawItStart: save and unmap user maps {{{3 + let b:lastdir = 1 + if exists("mapleader") + let usermaplead = mapleader + else + let usermaplead = "\\" + endif + call SaveUserMaps("bn","","><^v","DrawIt") + call SaveUserMaps("bv",usermaplead,"abceflsy","DrawIt") + call SaveUserMaps("bn","","<c-v>","DrawIt") + call SaveUserMaps("bn",usermaplead,"h><v^","DrawIt") + call SaveUserMaps("bn","","<left>","DrawIt") + call SaveUserMaps("bn","","<right>","DrawIt") + call SaveUserMaps("bn","","<up>","DrawIt") + call SaveUserMaps("bn","","<down>","DrawIt") + call SaveUserMaps("bn","","<left>","DrawIt") + call SaveUserMaps("bn","","<s-right>","DrawIt") + call SaveUserMaps("bn","","<s-up>","DrawIt") + call SaveUserMaps("bn","","<s-down>","DrawIt") + call SaveUserMaps("bn","","<space>","DrawIt") + call SaveUserMaps("bn","","<home>","DrawIt") + call SaveUserMaps("bn","","<end>","DrawIt") + call SaveUserMaps("bn","","<pageup>","DrawIt") + call SaveUserMaps("bn","","<pagedown>","DrawIt") + call SaveUserMaps("bn","","<c-leftdrag>","DrawIt") + call SaveUserMaps("bn","","<c-leftmouse>","DrawIt") + call SaveUserMaps("bn","","<c-leftrelease>","DrawIt") + call SaveUserMaps("bn","","<leftdrag>","DrawIt") + call SaveUserMaps("bn","","<leftmouse>","DrawIt") + call SaveUserMaps("bn","","<middlemouse>","DrawIt") + call SaveUserMaps("bn","","<rightmouse>","DrawIt") + call SaveUserMaps("bn","","<s-leftdrag>","DrawIt") + call SaveUserMaps("bn","","<s-leftmouse>","DrawIt") + call SaveUserMaps("bn","","<s-leftrelease>","DrawIt") + call SaveUserMaps("bv","","<c-leftmouse>","DrawIt") + call SaveUserMaps("bv","","<leftmouse>","DrawIt") + call SaveUserMaps("bv","","<middlemouse>","DrawIt") + call SaveUserMaps("bv","","<rightmouse>","DrawIt") + call SaveUserMaps("bv","","<s-leftmouse>","DrawIt") + call SaveUserMaps("bn",usermaplead,":pa","DrawIt") + call SaveUserMaps("bn",usermaplead,":pb","DrawIt") + call SaveUserMaps("bn",usermaplead,":pc","DrawIt") + call SaveUserMaps("bn",usermaplead,":pd","DrawIt") + call SaveUserMaps("bn",usermaplead,":pe","DrawIt") + call SaveUserMaps("bn",usermaplead,":pf","DrawIt") + call SaveUserMaps("bn",usermaplead,":pg","DrawIt") + call SaveUserMaps("bn",usermaplead,":ph","DrawIt") + call SaveUserMaps("bn",usermaplead,":pi","DrawIt") + call SaveUserMaps("bn",usermaplead,":pj","DrawIt") + call SaveUserMaps("bn",usermaplead,":pk","DrawIt") + call SaveUserMaps("bn",usermaplead,":pl","DrawIt") + call SaveUserMaps("bn",usermaplead,":pm","DrawIt") + call SaveUserMaps("bn",usermaplead,":pn","DrawIt") + call SaveUserMaps("bn",usermaplead,":po","DrawIt") + call SaveUserMaps("bn",usermaplead,":pp","DrawIt") + call SaveUserMaps("bn",usermaplead,":pq","DrawIt") + call SaveUserMaps("bn",usermaplead,":pr","DrawIt") + call SaveUserMaps("bn",usermaplead,":ps","DrawIt") + call SaveUserMaps("bn",usermaplead,":pt","DrawIt") + call SaveUserMaps("bn",usermaplead,":pu","DrawIt") + call SaveUserMaps("bn",usermaplead,":pv","DrawIt") + call SaveUserMaps("bn",usermaplead,":pw","DrawIt") + call SaveUserMaps("bn",usermaplead,":px","DrawIt") + call SaveUserMaps("bn",usermaplead,":py","DrawIt") + call SaveUserMaps("bn",usermaplead,":pz","DrawIt") + call SaveUserMaps("bn",usermaplead,":ra","DrawIt") + call SaveUserMaps("bn",usermaplead,":rb","DrawIt") + call SaveUserMaps("bn",usermaplead,":rc","DrawIt") + call SaveUserMaps("bn",usermaplead,":rd","DrawIt") + call SaveUserMaps("bn",usermaplead,":re","DrawIt") + call SaveUserMaps("bn",usermaplead,":rf","DrawIt") + call SaveUserMaps("bn",usermaplead,":rg","DrawIt") + call SaveUserMaps("bn",usermaplead,":rh","DrawIt") + call SaveUserMaps("bn",usermaplead,":ri","DrawIt") + call SaveUserMaps("bn",usermaplead,":rj","DrawIt") + call SaveUserMaps("bn",usermaplead,":rk","DrawIt") + call SaveUserMaps("bn",usermaplead,":rl","DrawIt") + call SaveUserMaps("bn",usermaplead,":rm","DrawIt") + call SaveUserMaps("bn",usermaplead,":rn","DrawIt") + call SaveUserMaps("bn",usermaplead,":ro","DrawIt") + call SaveUserMaps("bn",usermaplead,":rp","DrawIt") + call SaveUserMaps("bn",usermaplead,":rq","DrawIt") + call SaveUserMaps("bn",usermaplead,":rr","DrawIt") + call SaveUserMaps("bn",usermaplead,":rs","DrawIt") + call SaveUserMaps("bn",usermaplead,":rt","DrawIt") + call SaveUserMaps("bn",usermaplead,":ru","DrawIt") + call SaveUserMaps("bn",usermaplead,":rv","DrawIt") + call SaveUserMaps("bn",usermaplead,":rw","DrawIt") + call SaveUserMaps("bn",usermaplead,":rx","DrawIt") + call SaveUserMaps("bn",usermaplead,":ry","DrawIt") + call SaveUserMaps("bn",usermaplead,":rz","DrawIt") + if exists("g:drawit_insertmode") && g:drawit_insertmode + call SaveUserMaps("bi","","<left>","DrawIt") + call SaveUserMaps("bi","","<right>","DrawIt") + call SaveUserMaps("bi","","<up>","DrawIt") + call SaveUserMaps("bi","","<down>","DrawIt") + call SaveUserMaps("bi","","<left>","DrawIt") + call SaveUserMaps("bi","","<s-right>","DrawIt") + call SaveUserMaps("bi","","<s-up>","DrawIt") + call SaveUserMaps("bi","","<s-down>","DrawIt") + call SaveUserMaps("bi","","<home>","DrawIt") + call SaveUserMaps("bi","","<end>","DrawIt") + call SaveUserMaps("bi","","<pageup>","DrawIt") + call SaveUserMaps("bi","","<pagedown>","DrawIt") + call SaveUserMaps("bi","","<leftmouse>","DrawIt") + endif + call SaveUserMaps("bn","",":\<c-v>","DrawIt") + + " DrawItStart: DrawIt maps (Charles Campbell) {{{3 + nmap <silent> <buffer> <script> <left> :set lz<CR>:silent! call <SID>DrawLeft()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <right> :set lz<CR>:silent! call <SID>DrawRight()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <up> :set lz<CR>:silent! call <SID>DrawUp()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <down> :set lz<CR>:silent! call <SID>DrawDown()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <s-left> :set lz<CR>:silent! call <SID>MoveLeft()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <s-right> :set lz<CR>:silent! call <SID>MoveRight()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <s-up> :set lz<CR>:silent! call <SID>MoveUp()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <s-down> :set lz<CR>:silent! call <SID>MoveDown()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <space> :set lz<CR>:silent! call <SID>DrawErase()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> > :set lz<CR>:silent! call <SID>DrawSpace('>',1)<CR>:set nolz<CR> + nmap <silent> <buffer> <script> < :set lz<CR>:silent! call <SID>DrawSpace('<',2)<CR>:set nolz<CR> + nmap <silent> <buffer> <script> ^ :set lz<CR>:silent! call <SID>DrawSpace('^',3)<CR>:set nolz<CR> + nmap <silent> <buffer> <script> v :set lz<CR>:silent! call <SID>DrawSpace('v',4)<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <home> :set lz<CR>:silent! call <SID>DrawSlantUpLeft()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <end> :set lz<CR>:silent! call <SID>DrawSlantDownLeft()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <pageup> :set lz<CR>:silent! call <SID>DrawSlantUpRight()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <pagedown> :set lz<CR>:silent! call <SID>DrawSlantDownRight()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <Leader>> :set lz<CR>:silent! call <SID>DrawFatRArrow()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <Leader>< :set lz<CR>:silent! call <SID>DrawFatLArrow()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <Leader>^ :set lz<CR>:silent! call <SID>DrawFatUArrow()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <Leader>v :set lz<CR>:silent! call <SID>DrawFatDArrow()<CR>:set nolz<CR> + nmap <silent> <buffer> <script> <Leader>f :call <SID>Flood()<cr> + + " DrawItStart: Set up insertmode maps {{{3 + if exists("g:drawit_insertmode") && g:drawit_insertmode + imap <silent> <buffer> <script> <left> <Esc><left>a + imap <silent> <buffer> <script> <right> <Esc><right>a + imap <silent> <buffer> <script> <up> <Esc><up>a + imap <silent> <buffer> <script> <down> <Esc><down>a + imap <silent> <buffer> <script> <left> <Esc><left>a + imap <silent> <buffer> <script> <s-right> <Esc><s-right>a + imap <silent> <buffer> <script> <s-up> <Esc><s-up>a + imap <silent> <buffer> <script> <s-down> <Esc><s-down>a + imap <silent> <buffer> <script> <home> <Esc><home>a + imap <silent> <buffer> <script> <end> <Esc><end>a + imap <silent> <buffer> <script> <pageup> <Esc><pageup>a + imap <silent> <buffer> <script> <pagedown> <Esc><pagedown>a + endif + + " DrawItStart: set up drawing mode mappings (Sylvain Viart) {{{3 + nnoremap <silent> <buffer> <script> <c-v> :call <SID>LeftStart()<CR><c-v> + vmap <silent> <buffer> <script> <Leader>a :<c-u>call <SID>CallBox('Arrow')<CR> + vmap <silent> <buffer> <script> <Leader>b :<c-u>call <SID>CallBox('DrawBox')<cr> + nmap <buffer> <script> <Leader>c :call <SID>Canvas()<cr> + vmap <silent> <buffer> <script> <Leader>l :<c-u>call <SID>CallBox('DrawPlainLine')<CR> + vmap <silent> <buffer> <script> <Leader>s :<c-u>call <SID>Spacer(line("'<"), line("'>"),0)<cr> + + " DrawItStart: set up drawing mode mappings (Charles Campbell) {{{3 + " \pa ... \pz : blanks are transparent + " \ra ... \rz : blanks copy over + vmap <buffer> <silent> <Leader>e :<c-u>call <SID>CallBox('DrawEllipse')<CR> + + let allreg= "abcdefghijklmnopqrstuvwxyz" + while strlen(allreg) > 0 + let ireg= strpart(allreg,0,1) + exe "nmap <silent> <buffer> <Leader>p".ireg.' :<c-u>set lz<cr>:silent! call <SID>PutBlock("'.ireg.'",0)<cr>:set nolz<cr>' + exe "nmap <silent> <buffer> <Leader>r".ireg.' :<c-u>set lz<cr>:silent! call <SID>PutBlock("'.ireg.'",1)<cr>:set nolz<cr>' + let allreg= strpart(allreg,1) + endwhile + + " DrawItStart: mouse maps (Sylvain Viart) {{{3 + " start visual-block with leftmouse + nnoremap <silent> <buffer> <script> <leftmouse> <leftmouse>:call <SID>LeftStart()<CR><c-v> + vnoremap <silent> <buffer> <script> <rightmouse> <leftmouse>:<c-u>call <SID>RightStart(1)<cr> + vnoremap <silent> <buffer> <script> <middlemouse> <leftmouse>:<c-u>call <SID>RightStart(0)<cr> + vnoremap <silent> <buffer> <script> <c-leftmouse> <leftmouse>:<c-u>call <SID>CLeftStart()<cr> + + " DrawItStart: mouse maps (Charles Campbell) {{{3 + " Draw with current brush + nnoremap <silent> <buffer> <script> <s-leftmouse> <leftmouse>:call <SID>SLeftStart()<CR><c-v> + nnoremap <silent> <buffer> <script> <c-leftmouse> <leftmouse>:call <SID>CLeftStart()<CR><c-v> + + " DrawItStart: Menu support {{{3 + if has("gui_running") && has("menu") && &go =~# 'm' + exe 'menu '.g:DrChipTopLvlMenu.'DrawIt.Stop\ \ DrawIt<tab>\\ds <Leader>ds' + exe 'menu '.g:DrChipTopLvlMenu.'DrawIt.Toggle\ Erase\ Mode<tab><space> <space>' + exe 'menu '.g:DrChipTopLvlMenu.'DrawIt.Draw\ Arrow<tab>\\a <Leader>a' + exe 'menu '.g:DrChipTopLvlMenu.'DrawIt.Draw\ Box<tab>\\b <Leader>b' + exe 'menu '.g:DrChipTopLvlMenu.'DrawIt.Make\ Blank\ Zone<tab>\\c <Leader>c' + exe 'menu '.g:DrChipTopLvlMenu.'DrawIt.Draw\ Ellipse<tab>\\e <Leader>e' + exe 'menu '.g:DrChipTopLvlMenu.'DrawIt.Draw\ Flood<tab>\\e <Leader>f' + exe 'menu '.g:DrChipTopLvlMenu.'DrawIt.Draw\ Line<tab>\\l <Leader>l' + exe 'menu '.g:DrChipTopLvlMenu.'DrawIt.Append\ Blanks<tab>\\s <Leader>s' + exe 'silent! unmenu '.g:DrChipTopLvlMenu.'DrawIt.Start\ DrawIt' + endif +" call Dret("DrawItStart") +endfun + +" --------------------------------------------------------------------- +" DrawIt#DrawItStop: this function unmaps the cursor keys and restores settings {{{2 +fun! DrawIt#DrawItStop() +" call Dfunc("DrawItStop()") + + " DrawItStop: report on [DrawIt off] mode {{{3 + if !exists("b:dodrawit") + echo "[DrawIt off]" +" call Dret("DrawItStop") + return + endif + + " DrawItStop: restore mouse {{{3 + if exists("b:drawit_keep_mouse") + let &mouse= b:drawit_keep_mouse + unlet b:drawit_keep_mouse + endif + unlet b:dodrawit + echo "[DrawIt off]" + + if exists("b:drawit_canvas_used") + " DrawItStop: clean up trailing white space {{{3 + call s:SavePosn() + silent! %s/\s\+$//e + unlet b:drawit_canvas_used + call s:RestorePosn() + endif + + " DrawItStop: remove drawit commands {{{3 + delc SetBrush + + " DrawItStop: insure that erase mode is off {{{3 + " (thanks go to Gary Johnson for this) + if b:di_erase == 1 + call s:DrawErase() + endif + + " DrawItStop: restore user map(s), if any {{{3 + call RestoreUserMaps("DrawIt") + + call s:DrawItRestoreUserSettings() + + " DrawItStop: DrChip menu support: {{{3 + if has("gui_running") && has("menu") && &go =~# 'm' + exe 'menu '.g:DrChipTopLvlMenu.'DrawIt.Start\ DrawIt<tab>\\di <Leader>di' + exe 'unmenu '.g:DrChipTopLvlMenu.'DrawIt.Stop\ \ DrawIt' + exe 'unmenu '.g:DrChipTopLvlMenu.'DrawIt.Toggle\ Erase\ Mode' + exe 'unmenu '.g:DrChipTopLvlMenu.'DrawIt.Draw\ Arrow' + exe 'unmenu '.g:DrChipTopLvlMenu.'DrawIt.Draw\ Box' + exe 'unmenu '.g:DrChipTopLvlMenu.'DrawIt.Draw\ Ellipse' + exe 'unmenu '.g:DrChipTopLvlMenu.'DrawIt.Draw\ Flood' + exe 'unmenu '.g:DrChipTopLvlMenu.'DrawIt.Draw\ Line' + exe 'unmenu '.g:DrChipTopLvlMenu.'DrawIt.Make\ Blank\ Zone' + exe 'unmenu '.g:DrChipTopLvlMenu.'DrawIt.Append\ Blanks' + endif +" call Dret("DrawItStop") +endfun + +" --------------------------------------------------------------------- +" s:DrawItSaveUserSettings: saves user settings, changes them to be safe for DrawIt {{{2 +" Use s:DrawItRestoreUserSettings() to restore. +fun! s:DrawItSaveUserSettings() +" call Dfunc("s:DrawItSaveUserSettings()") + " save user settings + let b:di_aikeep = &l:ai + let b:di_cedit = &cedit + let b:di_cinkeep = &l:cin + let b:di_cpokeep = &l:cpo + let b:di_etkeep = &l:et + let b:di_fokeep = &l:fo + let b:di_gdkeep = &l:gd + let b:di_gokeep = &l:go + let b:di_magickeep = &l:magic + let b:di_remapkeep = &l:remap + let b:di_repkeep = &l:report + let b:di_sikeep = &l:si + let b:di_stakeep = &l:sta + let b:di_vekeep = &l:ve + + " change user settings to something safe for DrawIt + setl cpo&vim + setl nocin noai nosi nogd sta et ve=all report=10000 + setl go-=aA + setl fo-=a + setl remap magic + set cedit& +" call Dret("s:DrawItSaveUserSettings") +endfun + +" --------------------------------------------------------------------- +" s:DrawItRestoreUserSettings: restore user settings {{{2 +fun! s:DrawItRestoreUserSettings() +" call Dfunc("s:DrawItRestoreUserSettings()") + + " restore user's settings + let &l:ai = b:di_aikeep + let &l:cin = b:di_cinkeep + let &l:cpo = b:di_cpokeep + let &l:et = b:di_etkeep + let &l:fo = b:di_fokeep + let &l:gd = b:di_gdkeep + let &l:go = b:di_gokeep + let &l:magic = b:di_magickeep + let &l:remap = b:di_remapkeep + let &l:report = b:di_repkeep + let &l:si = b:di_sikeep + let &l:sta = b:di_stakeep + let &l:ve = b:di_vekeep + unlet b:di_aikeep + unlet b:di_cinkeep + unlet b:di_cpokeep + unlet b:di_etkeep + unlet b:di_fokeep + unlet b:di_gdkeep + unlet b:di_gokeep + unlet b:di_magickeep + unlet b:di_remapkeep + unlet b:di_repkeep + unlet b:di_sikeep + unlet b:di_stakeep + unlet b:di_vekeep +" call Dret("s:DrawItRestoreUserSettings") +endfun + +" --------------------------------------------------------------------- +" DrawIt#SetMode: sets normal, single, double drawing mode, and ensures that DrawIt mode is on {{{2 +fun! DrawIt#SetMode(mode) +" call Dfunc("DrawIt#SetMode(mode=".a:mode.")") + if &enc == 'utf-8' || &enc == 'cp437' || &enc == 'utf-16' || &enc == 'ucs-4' + let b:di_gfxchr= 1 + else + let b:di_gfxchr= 0 + endif + if b:di_gfxchr == 0 + let g:drawit_mode= 'N' + elseif &enc != 'utf-8' && &enc != 'cp437' && &enc != 'utf-16' && &enc != 'ucs-4' + let g:drawit_mode = 'N' + let b:di_gfxchr = 0 + elseif a:mode =~ '^[sS]$' + let g:drawit_mode= 'S' + elseif a:mode =~ '^[dD]$' + let g:drawit_mode= 'D' + else + let g:drawit_mode = 'N' + let b:di_gfxchr = 0 + endif + if !exists("b:dodrawit") || b:dodrawit == 0 + call DrawIt#DrawItStart() + endif +" call Dret("DrawIt#SetMode") +endfun + +" --------------------------------------------------------------------- +" SetDrawIt: this function allows one to change the drawing characters {{{2 +fun! SetDrawIt(di_vert,di_horiz,di_plus,di_upleft,di_upright,di_cross,di_ellipse) +" call Dfunc("SetDrawIt(vert<".a:di_vert."> horiz<".a:di_horiz."> plus<".a:di_plus."> upleft<".a:di_upleft."> upright<".a:di_upright."> cross<".a:di_cross."> ellipse<".a:di_ellipse.">)") + let b:di_vert = a:di_vert + let b:di_horiz = a:di_horiz + let b:di_plus = a:di_plus + let b:di_upleft = a:di_upleft + let b:di_upright = a:di_upright + let b:di_cross = a:di_cross + let b:di_ellipse = a:di_ellipse +" call Dret("SetDrawIt") +endfun + +" ===================================================================== +" s:DrawLeft: {{{2 +fun! s:DrawLeft() +" call Dfunc("s:DrawLeft()") + let curline = getline(".") + let curcol = virtcol(".") + let b:lastdir = 2 + let keepatat = @@ +" call Decho("curcol#".curcol." curline<".curline.">") + + if curcol > 0 + norm! vy + let curchar= @@ +" call Decho("curchar<".curchar.">") +" let curchar = strpart(curline,curcol-1,1) + + " step1: Replace + " step2: Move and Replace + let step= 1 + while step <= 2 +" call Decho("step#".step) + + if step == 2 + if curcol < 2 + break + endif +" call Decho("move and replace: curchar<".curchar."> mode<".g:drawit_mode.">") + call s:MoveLeft() + norm! vy + let curchar= @@ +" call Decho("curchar<".curchar.">") + else +" call Decho("replace: curchar<".curchar."> mode<".g:drawit_mode.">") + endif + + if s:IsDrawItH(curchar) + if g:drawit_mode == 'S' + exe "norm! r".b:di_Splus + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dplus + else + exe "norm! r".b:di_plus + endif + + else + + if g:drawit_mode == 'S' + exe "norm! r".b:di_Shoriz + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dhoriz + else + exe "norm! r".b:di_horiz + endif + + endif + let step= step + 1 + endwhile + + norm! l + call s:DrawCorner() + norm! h + call s:DrawCorner() + endif + let @@= keepatat +" call Dret("s:DrawLeft") +endfun + +" --------------------------------------------------------------------- +" s:DrawRight: {{{2 +fun! s:DrawRight() +" call Dfunc("s:DrawRight()") + let curline = getline(".") + let curcol = virtcol(".") + let b:lastdir = 1 + let keepatat = @@ + norm! vy + let curchar= @@ +" call Decho("curchar<".curchar.">") + + " replace + if curcol == virtcol("$") + if g:drawit_mode == 'S' + exe "norm! a".b:di_Shoriz."\<Esc>" + elseif g:drawit_mode == 'D' + exe "norm! a".b:di_Dhoriz."\<Esc>" + else + exe "norm! a".b:di_horiz."\<Esc>" + endif + else + if s:IsDrawItH(curchar) + if g:drawit_mode == 'S' + exe "norm! r".b:di_Splus + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dplus + else + exe "norm! r".b:di_plus + endif + else + if g:drawit_mode == 'S' + exe "norm! r".b:di_Shoriz + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dhoriz + else + exe "norm! r".b:di_horiz + endif + endif + endif + + " move and replace + call s:MoveRight() + if curcol == virtcol("$") + if g:drawit_mode == 'S' + exe "norm! i".b:di_Shoriz."\<Esc>" + elseif g:drawit_mode == 'D' + exe "norm! i".b:di_Dhoriz."\<Esc>" + else + exe "norm! i".b:di_horiz."\<Esc>" + endif + else + norm! vy + let curchar= @@ +" call Decho("curchar<".curchar.">") + if s:IsDrawItH(curchar) + if g:drawit_mode == 'S' + exe "norm! r".b:di_Splus + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dplus + else + exe "norm! r".b:di_plus + endif + else + if g:drawit_mode == 'S' + exe "norm! r".b:di_Shoriz + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dhoriz + else + exe "norm! r".b:di_horiz + endif + endif + endif + + norm! h + call s:DrawCorner() + norm! l + call s:DrawCorner() + + let @@= keepatat +" call Dret("s:DrawRight") +endfun + +" --------------------------------------------------------------------- +" s:DrawUp: {{{2 +fun! s:DrawUp() +" call Dfunc("s:DrawUp()") + let curline = getline(".") + let curcol = virtcol(".") + let b:lastdir = 3 + let keepatat = @@ + norm! vy + let curchar = @@ +" call Decho("curchar<".curchar.">") + + " replace + if curcol == 1 && virtcol("$") == 1 +" call Decho("case curcol#".curcol."==virtcol($): insert") + if g:drawit_mode == 'S' + exe "norm! i".b:di_Svert."\<Esc>" + elseif g:drawit_mode == 'D' + exe "norm! i".b:di_Dvert."\<Esc>" + else + exe "norm! i".b:di_vert."\<Esc>" + endif + else +" call Decho("case curcol#".curcol."!=virtcol($) curchar<".curchar.">: replace") + if s:IsDrawItV(curchar) + if g:drawit_mode == 'S' + exe "norm! r".b:di_Splus + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dplus + else + exe "norm! r".b:di_plus + endif + else + if g:drawit_mode == 'S' + exe "norm! r".b:di_Svert + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dvert + else + exe "norm! r".b:di_vert + endif + endif + endif + + " move and replace/insert + call s:MoveUp() + let curline= getline(".") +" let curchar= strpart(curline,curcol-1,1) + norm! vy + let curchar= @@ + + if curcol == 1 && virtcol("$") == 1 + if g:drawit_mode == 'S' + exe "norm! i".b:di_Svert."\<Esc>" + elseif g:drawit_mode == 'D' + exe "norm! i".b:di_Dvert."\<Esc>" + else + exe "norm! i".b:di_vert."\<Esc>" + endif + elseif s:IsDrawItV(curchar) + if g:drawit_mode == 'S' + exe "norm! r".b:di_Splus + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dplus + else + exe "norm! r".b:di_plus + endif + else + if g:drawit_mode == 'S' + exe "norm! r".b:di_Svert + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dvert + else + exe "norm! r".b:di_vert + endif + + endif + + norm! j + call s:DrawCorner() + norm! k + call s:DrawCorner() + + let @@= keepatat +" call Dret("s:DrawUp") +endfun + +" --------------------------------------------------------------------- +" s:DrawDown: {{{2 +fun! s:DrawDown() +" call Dfunc("s:DrawDown()") + let curline = getline(".") + let curcol = virtcol(".") + let keepatat = @@ + norm! vy + let curchar = @@ +" call Decho("curchar<".curchar.">") + let b:lastdir = 4 + + " replace + if curcol == 1 && virtcol("$") == 1 +" call Decho("curcol=".curcol." $=1" + if g:drawit_mode == 'S' + exe "norm! i".b:di_Svert."\<Esc>" + elseif g:drawit_mode == 'D' + exe "norm! i".b:di_Dvert."\<Esc>" + else + exe "norm! i".b:di_vert."\<Esc>" + endif + else + norm! vy + let curchar= @@ +" call Decho("curchar<".curchar.">") + if s:IsDrawItV(curchar) + if g:drawit_mode == 'S' + exe "norm! r".b:di_Splus + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dplus + else + exe "norm! r".b:di_plus + endif + else + if g:drawit_mode == 'S' + exe "norm! r".b:di_Svert + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dvert + else + exe "norm! r".b:di_vert + endif + endif + endif + + " move and replace/insert + call s:MoveDown() + let curline= getline(".") + norm! vy + let curchar= @@ +" call Decho("curchar<".curchar.">") + if curcol == 1 && virtcol("$") == 1 + if g:drawit_mode == 'S' + exe "norm! i".b:di_Svert."\<Esc>" + elseif g:drawit_mode == 'D' + exe "norm! i".b:di_Dvert."\<Esc>" + else + exe "norm! i".b:di_vert."\<Esc>" + endif + elseif s:IsDrawItV(curchar) + if g:drawit_mode == 'S' + exe "norm! r".b:di_Splus + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dplus + else + exe "norm! r".b:di_plus + endif + else + if g:drawit_mode == 'S' + exe "norm! r".b:di_Svert + elseif g:drawit_mode == 'D' + exe "norm! r".b:di_Dvert + else + exe "norm! r".b:di_vert + endif + + endif + + norm! k + call s:DrawCorner() + norm! j + call s:DrawCorner() + + let @@= keepatat +" call Dret("s:DrawDown") +endfun + +" --------------------------------------------------------------------- +" s:DrawCorner: change a ┼ or a ╬ into an appropriate corner {{{2 +fun! s:DrawCorner() +" call Dfunc("s:DrawCorner()") + let keepatat= @@ + norm! vy + let ctr= @@ + if ctr != b:di_Splus && ctr != b:di_Dplus + let @@= keepatat +" call Dret("s:DrawCorner : ctr<".ctr."> (quick return)") + return + endif + + " cleft: Grab a copy of the character to the left of the cursor + if virtcol(".") > 1 + norm! hvyl + let cleft= @@ + else + let cleft= " " + endif + + " cright: Grab a copy of the character to the right of the cursor + if virtcol(".") < virtcol("$") + norm! lvyh + let cright= @@ + else + let cright= " " + endif + + " cup: Grab a copy of the character above the cursor + if line(".") > 1 + norm! kvyj + let cup= @@ + else + let cup= " " + endif + + " cdown: Grab a copy of the character below the cursor + if line(".") < line("$") + norm! jvyk + let cdown= @@ + else + let cdown= " " + endif +" call Decho("ctr<".ctr."> cup<".cup."> cright<".cright."> cdown<".cdown."> cleft<".cleft.">") + " - MIXED SINGLE-DOUBLE CORNERS ---------------------------------------- + " ┼═ ╬═ ╒═ + " │ │ │ + if !s:IsDnS(cup) + \ && s:IsLeftD(cright) + \ && s:IsUpS(cdown) + \ && !s:IsRightD(cleft) + exe "norm! r".b:di_cSdDr + + " ┼─ ╬─ ╓─ + " ║ ║ ║ + elseif !s:IsDnD(cup) + \ && s:IsLeftS(cright) + \ && s:IsUpD(cdown) + \ && !s:IsRightS(cleft) + exe "norm! r".b:di_cDdSr + + " ═┼ ═╬ ═╕ + " │ │ │ + elseif !s:IsDnS(cup) + \ && !s:IsLeftD(cright) + \ && s:IsUpS(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_cDlSd + + " ─┼ ─╬ ─╖ + " ║ ║ ║ + elseif !s:IsDnD(cup) + \ && !s:IsLeftS(cright) + \ && s:IsUpD(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_cSlDd + + " │ │ │ + " ┼═ ╬═ ╘═ + elseif s:IsDnS(cup) + \ && s:IsLeftD(cright) + \ && !s:IsUpS(cdown) + \ && !s:IsRightD(cleft) + exe "norm! r".b:di_cDrSu + + " ║ ║ ║ + " ┼─ ╬─ ╙─ + elseif s:IsDnD(cup) + \ && s:IsLeftS(cright) + \ && !s:IsUpD(cdown) + \ && !s:IsRightS(cleft) + exe "norm! r".b:di_cSrDu + + " │ │ │ + " ═┼ ═╬ ═╛ + elseif s:IsDnS(cup) + \ && !s:IsLeftD(cright) + \ && !s:IsUpS(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_cDlSu + + " ║ ║ ║ + " ─┼ ─╬ ─╜ + elseif s:IsDnD(cup) + \ && !s:IsLeftS(cright) + \ && !s:IsUpD(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_cSlDu + + " - SINGLE LINE -------------------------------------------------------- + elseif ctr == b:di_Splus + " ─┼ ─┐ + " │ │ + if !s:IsDnS(cup) + \ && !s:IsLeftS(cright) + \ && s:IsUpS(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_Surcorn + + " ┼─ ┌─ + " │ │ + elseif !s:IsDnS(cup) + \ && s:IsLeftS(cright) + \ && s:IsUpS(cdown) + \ && !s:IsRightS(cleft) + exe "norm! r".b:di_Sulcorn + + " │ │ + " ─┼ ─┘ + elseif s:IsDnS(cup) + \ && !s:IsLeftS(cright) + \ && !s:IsUpS(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_Slrcorn + + " │ │ + " ┼─ └─ + elseif s:IsDnS(cup) + \ && s:IsLeftS(cright) + \ && !s:IsUpS(cdown) + \ && !s:IsRightS(cleft) + exe "norm! r".b:di_Sllcorn + + " │ │ + " ┼─ ├─ + " │ │ + elseif s:IsDnS(cup) + \ && s:IsLeftS(cright) + \ && s:IsUpS(cdown) + \ && !s:IsRightS(cleft) + exe "norm! r".b:di_Srplus + + " │ │ + " ─┼ ─┤ + " │ │ + elseif s:IsDnS(cup) + \ && !s:IsLeftS(cright) + \ && s:IsUpS(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_Slplus + + " ─┼─ ─┬─ + " │ │ + elseif !s:IsDnS(cup) + \ && s:IsLeftS(cright) + \ && s:IsUpS(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_Sdnplus + + " ─┼─ ─╥─ + " ║ ║ + elseif !s:IsDnD(cup) + \ && s:IsLeftS(cright) + \ && s:IsUpD(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_ShDd + + " ║ ║ + " ─┼─ ─╨─ + elseif s:IsDnD(cup) + \ && s:IsLeftS(cright) + \ && !s:IsUpD(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_ShDu + + " │ │ + " ─┼─ ─┴─ + elseif s:IsDnS(cup) + \ && s:IsLeftS(cright) + \ && !s:IsUpS(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_Supplus + + " ║ ║ + " ┼─ ╟─ + " ║ ║ + elseif s:IsDnD(cup) + \ && s:IsLeftS(cright) + \ && s:IsUpD(cdown) + \ && !s:IsRightS(cleft) + exe "norm! r".b:di_DuSr + + " ║ ║ + " ─┼ ─╢ + " ║ ║ + elseif s:IsDnD(cup) + \ && !s:IsLeftS(cright) + \ && s:IsUpD(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_DuSl + + " │ │ + " ┼═ ╞═ + " │ │ + elseif s:IsDnS(cup) + \ && s:IsLeftD(cright) + \ && s:IsUpS(cdown) + \ && !s:IsRightD(cleft) + exe "norm! r".b:di_SuDr + + " │ │ + " ═┼ ═╡ + " │ │ + elseif s:IsDnS(cup) + \ && !s:IsLeftD(cright) + \ && s:IsUpS(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_SuDl + + " ═┼═ ═╤═ + " │ │ + elseif !s:IsDnS(cup) + \ && s:IsLeftD(cright) + \ && s:IsUpS(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_DhSd + + " │ │ + " ═┼═ ═╧═ + elseif s:IsDnS(cup) + \ && s:IsLeftD(cright) + \ && !s:IsUpS(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_DhSu + + " ║ ║ + " ─┼─ ─╫─ + " ║ ║ + elseif s:IsDnD(cup) + \ && s:IsLeftS(cright) + \ && s:IsUpD(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_DuSlr + + " │ │ + " ═┼═ ═╪═ + " │ │ + elseif s:IsDnS(cup) + \ && s:IsLeftD(cright) + \ && s:IsUpS(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_SuDlr + endif + + " - DOUBLE LINE -------------------------------------------------------- + elseif ctr == b:di_Dplus + " ═╬ ═╗ + " ║ ║ + if !s:IsDnD(cup) + \ && !s:IsLeftD(cright) + \ && s:IsUpD(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_Durcorn + + " ╬═ ╔═ + " ║ ║ + elseif !s:IsDnD(cup) + \ && s:IsLeftD(cright) + \ && s:IsUpD(cdown) + \ && !s:IsRightD(cleft) + exe "norm! r".b:di_Dulcorn + + " ║ ║ + " ═╬ ═╝ + elseif s:IsDnD(cup) + \ && !s:IsLeftD(cright) + \ && !s:IsUpD(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_Dlrcorn + + " ║ ║ + " ╬═ ╚═ + elseif s:IsDnD(cup) + \ && s:IsLeftD(cright) + \ && !s:IsUpD(cdown) + \ && !s:IsRightD(cleft) + exe "norm! r".b:di_Dllcorn + + " ║ ║ + " ╬═ ╠═ + " ║ ║ + elseif s:IsDnD(cup) + \ && s:IsLeftD(cright) + \ && s:IsUpD(cdown) + \ && !s:IsRightD(cleft) + exe "norm! r".b:di_Drplus + + " ║ ║ + " ═╬ ═╣ + " ║ ║ + elseif s:IsDnD(cup) + \ && !s:IsLeftD(cright) + \ && s:IsUpD(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_Dlplus + + " ║ ║ + " ─╬ ─╢ + " ║ ║ + elseif s:IsDnD(cup) + \ && !s:IsLeftD(cright) + \ && s:IsUpD(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_DuSl + + " ║ ║ + " ╬─ ╟─ + " ║ ║ + elseif s:IsDnD(cup) + \ && s:IsLeftS(cright) + \ && s:IsUpD(cdown) + \ && !s:IsRightD(cleft) + exe "norm! r".b:di_DuSr + + " ═╬═ ═╦═ + " ║ ║ + elseif !s:IsDnD(cup) + \ && s:IsLeftD(cright) + \ && s:IsUpD(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_Ddnplus + + " ║ ║ + " ═╬═ ═╩═ + elseif s:IsDnD(cup) + \ && s:IsLeftD(cright) + \ && !s:IsUpD(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_Dupplus + + " │ │ + " ╬═ ╞═ + " │ │ + elseif s:IsDnS(cup) + \ && s:IsLeftD(cright) + \ && s:IsUpS(cdown) + \ && !s:IsRightD(cleft) + exe "norm! r".b:di_SuDr + + " │ │ + " ═╬ ═╡ + " │ │ + elseif s:IsDnS(cup) + \ && !s:IsLeftD(cright) + \ && s:IsUpS(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_SuDl + + " ─╬─ ─╥─ + " ║ ║ + elseif !s:IsDnD(cup) + \ && s:IsLeftS(cright) + \ && s:IsUpD(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_ShDd + + " ║ ║ + " ─╬─ ─╨─ + elseif s:IsDnD(cup) + \ && s:IsLeftS(cright) + \ && !s:IsUpD(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_ShDu + + " │ │ + " ═╬═ ═╪═ + " │ │ + elseif s:IsDnS(cup) + \ && s:IsLeftD(cright) + \ && s:IsUpS(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_SuDlr + + " │ │ + " ═╬═ ═╨═ + elseif s:IsDnS(cup) + \ && s:IsLeftD(cright) + \ && !s:IsUpS(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_SuDh + + " ═╬═ ═╤═ + " │ │ + elseif !s:IsDnS(cup) + \ && s:IsLeftD(cright) + \ && s:IsUpS(cdown) + \ && s:IsRightD(cleft) + exe "norm! r".b:di_SdDh + + " ║ ║ + " ─╬─ ─╫─ + " ║ ║ + elseif s:IsDnD(cup) + \ && s:IsLeftS(cright) + \ && s:IsUpD(cdown) + \ && s:IsRightS(cleft) + exe "norm! r".b:di_DuSlr + endif + + endif + + norm! vy + let newctr= @@ + let @@= keepatat +" call Dret("s:DrawCorner : ".((newctr != ctr)? "newctr<".newctr.">" : "unchanged")) +endfun + +" --------------------------------------------------------------------- +" s:IsDrawItH: moving horizontally {{{2 +fun! s:IsDrawItH(chr) +" call Dfunc("s:IsDrawItH(chr<".a:chr.">)") + if a:chr == b:di_vert || a:chr == b:di_plus +" call Dret("s:IsDrawItH 1") + return 1 + endif + if b:di_gfxchr == 0 +" call Dret("s:IsDrawItH 0") + return 0 + endif + if a:chr == b:di_Svert || a:chr == b:di_Dvert + \ || a:chr == b:di_Splus || a:chr == b:di_Dplus + \ || a:chr == b:di_Surcorn || a:chr == b:di_Durcorn + \ || a:chr == b:di_Slrcorn || a:chr == b:di_Dlrcorn + \ || a:chr == b:di_Sllcorn || a:chr == b:di_Dllcorn + \ || a:chr == b:di_Sulcorn || a:chr == b:di_Dulcorn + \ || a:chr == b:di_Sdnplus || a:chr == b:di_Ddnplus + \ || a:chr == b:di_Supplus || a:chr == b:di_Dupplus + \ || a:chr == b:di_Srplus || a:chr == b:di_Drplus + \ || a:chr == b:di_Slplus || a:chr == b:di_Dlplus + \ || a:chr == b:di_DhSd || a:chr == b:di_DhSu + \ || a:chr == b:di_DuSl || a:chr == b:di_DuSr + \ || a:chr == b:di_ShDd || a:chr == b:di_ShDu + \ || a:chr == b:di_SuDl || a:chr == b:di_SuDr + \ || a:chr == b:di_DuSlr || a:chr == b:di_SuDlr + \ || a:chr == b:di_cSdDr || a:chr == b:di_cSdDr + \ || a:chr == b:di_cDdSr || a:chr == b:di_cDdSr + \ || a:chr == b:di_cDlSd || a:chr == b:di_cDlSd + \ || a:chr == b:di_cSlDd || a:chr == b:di_cSlDd + \ || a:chr == b:di_cDrSu || a:chr == b:di_cDrSu + \ || a:chr == b:di_cSrDu || a:chr == b:di_cSrDu + \ || a:chr == b:di_cDlSu || a:chr == b:di_cDlSu + \ || a:chr == b:di_cSlDu || a:chr == b:di_cSlDu +" call Dret("s:IsDrawItH 1") + return 1 + endif +" call Dret("s:IsDrawItH 0") + return 0 +endfun + +" --------------------------------------------------------------------- +" s:IsDrawItV: moving vertically {{{2 +fun! s:IsDrawItV(chr) +" call Dfunc("s:IsDrawItV(chr<".a:chr.">)") + if a:chr == b:di_horiz || a:chr == b:di_plus +" call Dret("s:IsDrawItH 1") + return 1 + endif + if b:di_gfxchr == 0 +" call Dret("s:IsDrawItH 0") + return 0 + endif + if a:chr == b:di_Shoriz || a:chr == b:di_Dhoriz + \ || a:chr == b:di_Splus || a:chr == b:di_Dplus + \ || a:chr == b:di_Surcorn || a:chr == b:di_Durcorn + \ || a:chr == b:di_Slrcorn || a:chr == b:di_Dlrcorn + \ || a:chr == b:di_Sllcorn || a:chr == b:di_Dllcorn + \ || a:chr == b:di_Sulcorn || a:chr == b:di_Dulcorn + \ || a:chr == b:di_Sdnplus || a:chr == b:di_Ddnplus + \ || a:chr == b:di_Supplus || a:chr == b:di_Dupplus + \ || a:chr == b:di_Srplus || a:chr == b:di_Drplus + \ || a:chr == b:di_Slplus || a:chr == b:di_Dlplus + \ || a:chr == b:di_DhSd || a:chr == b:di_DhSu + \ || a:chr == b:di_DuSl || a:chr == b:di_DuSr + \ || a:chr == b:di_ShDd || a:chr == b:di_ShDu + \ || a:chr == b:di_SuDl || a:chr == b:di_SuDr + \ || a:chr == b:di_DuSlr || a:chr == b:di_SuDlr + \ || a:chr == b:di_cSdDr || a:chr == b:di_cSdDr + \ || a:chr == b:di_cDdSr || a:chr == b:di_cDdSr + \ || a:chr == b:di_cDlSd || a:chr == b:di_cDlSd + \ || a:chr == b:di_cSlDd || a:chr == b:di_cSlDd + \ || a:chr == b:di_cDrSu || a:chr == b:di_cDrSu + \ || a:chr == b:di_cSrDu || a:chr == b:di_cSrDu + \ || a:chr == b:di_cDlSu || a:chr == b:di_cDlSu + \ || a:chr == b:di_cSlDu || a:chr == b:di_cSlDu +" call Dret("s:IsDrawItV 1") + return 1 + endif +" call Dret("s:IsDrawItV 0") + return 0 +endfun + +" --------------------------------------------------------------------- +" s:IsDnS: does the character "chr" have a single-line vertical-down? {{{2 +fun! s:IsDnS(chr) +" call Dfunc("s:IsDnS(chr<".a:chr.">)") + let ret= 0 + if b:di_gfxchr + if a:chr == b:di_Svert |let ret= 1 + elseif a:chr == b:di_Sulcorn|let ret= 1 + elseif a:chr == b:di_Surcorn|let ret= 1 + elseif a:chr == b:di_Splus |let ret= 1 + elseif a:chr == b:di_Sdnplus|let ret= 1 + elseif a:chr == b:di_Slplus |let ret= 1 + elseif a:chr == b:di_Srplus |let ret= 1 + elseif a:chr == b:di_SdDh |let ret= 1 + elseif a:chr == b:di_cDlSd |let ret= 1 + elseif a:chr == b:di_cSdDr |let ret= 1 + endif + endif +" call Dret("s:IsDnS ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:IsDnD: does the character "chr" have a double-line vertical-down? {{{2 +fun! s:IsDnD(chr) +" call Dfunc("s:IsDnD(chr<".a:chr.">)") + let ret= 0 + if b:di_gfxchr + if a:chr == b:di_Dvert |let ret= 1 + elseif a:chr == b:di_Dulcorn|let ret= 1 + elseif a:chr == b:di_Durcorn|let ret= 1 + elseif a:chr == b:di_Dplus |let ret= 1 + elseif a:chr == b:di_Ddnplus|let ret= 1 + elseif a:chr == b:di_Dlplus |let ret= 1 + elseif a:chr == b:di_Drplus |let ret= 1 + elseif a:chr == b:di_cDdSr |let ret= 1 + elseif a:chr == b:di_cSlDd |let ret= 1 + endif + endif +" call Dret("s:IsDnD ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:IsUpS: does the character "chr" have a single-line vertical-up? {{{2 +fun! s:IsUpS(chr) +" call Dfunc("s:IsUpS(chr<".a:chr.">)") + let ret= 0 + if b:di_gfxchr + if a:chr == b:di_Svert |let ret= 1 + elseif a:chr == b:di_Sllcorn|let ret= 1 + elseif a:chr == b:di_Slrcorn|let ret= 1 + elseif a:chr == b:di_Splus |let ret= 1 + elseif a:chr == b:di_Supplus|let ret= 1 + elseif a:chr == b:di_Slplus |let ret= 1 + elseif a:chr == b:di_Srplus |let ret= 1 + elseif a:chr == b:di_SuDh |let ret= 1 + elseif a:chr == b:di_cDrSu |let ret= 1 + elseif a:chr == b:di_cDlSu |let ret= 1 + endif + endif +" call Dret("s:IsUpS ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:IsUpD: does the character "chr" have a double-line vertical-up? {{{2 +fun! s:IsUpD(chr) +" call Dfunc("s:IsUpD(chr<".a:chr.">)") + let ret= 0 + if b:di_gfxchr + if a:chr == b:di_Dvert |let ret= 1 + elseif a:chr == b:di_Dllcorn|let ret= 1 + elseif a:chr == b:di_Dlrcorn|let ret= 1 + elseif a:chr == b:di_Dplus |let ret= 1 + elseif a:chr == b:di_Dupplus|let ret= 1 + elseif a:chr == b:di_Dlplus |let ret= 1 + elseif a:chr == b:di_Drplus |let ret= 1 + elseif a:chr == b:di_cSrDu |let ret= 1 + elseif a:chr == b:di_cSlDu |let ret= 1 + endif + endif +" call Dret("s:IsUpD ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:IsLeftS: does the character "chr" have a single-line horizontal-left? {{{2 +fun! s:IsLeftS(chr) +" call Dfunc("s:IsLeftS(chr<".a:chr.">)") + let ret= 0 + if b:di_gfxchr + if a:chr == b:di_Shoriz |let ret= 1 + elseif a:chr == b:di_Surcorn |let ret= 1 + elseif a:chr == b:di_Slrcorn |let ret= 1 + elseif a:chr == b:di_Splus |let ret= 1 + elseif a:chr == b:di_Sdnplus |let ret= 1 + elseif a:chr == b:di_Supplus |let ret= 1 + elseif a:chr == b:di_Slplus |let ret= 1 + elseif a:chr == b:di_cSlDd |let ret= 1 + elseif a:chr == b:di_cSlDu |let ret= 1 + endif + endif +" call Dret("s:IsLeftS ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:IsLeftD: does the character "chr" have a double-line horizontal-left? {{{2 +fun! s:IsLeftD(chr) +" call Dfunc("s:IsLeftD(chr<".a:chr.">)") + let ret= 0 + if b:di_gfxchr + if a:chr == b:di_Dhoriz |let ret= 1 + elseif a:chr == b:di_Durcorn |let ret= 1 + elseif a:chr == b:di_Dlrcorn |let ret= 1 + elseif a:chr == b:di_Dplus |let ret= 1 + elseif a:chr == b:di_Ddnplus |let ret= 1 + elseif a:chr == b:di_Dupplus |let ret= 1 + elseif a:chr == b:di_Dlplus |let ret= 1 + elseif a:chr == b:di_cDlSd |let ret= 1 + elseif a:chr == b:di_cDlSu |let ret= 1 + endif + endif +" call Dret("s:IsLeftD ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:IsRightS: does the character "chr" have a single-line horizontal-right? {{{2 +fun! s:IsRightS(chr) +" call Dfunc("s:IsRightS(chr<".a:chr.">)") + let ret= 0 + if b:di_gfxchr + if a:chr == b:di_Shoriz |let ret= 1 + elseif a:chr == b:di_Sulcorn |let ret= 1 + elseif a:chr == b:di_Sllcorn |let ret= 1 + elseif a:chr == b:di_Splus |let ret= 1 + elseif a:chr == b:di_Sdnplus |let ret= 1 + elseif a:chr == b:di_Supplus |let ret= 1 + elseif a:chr == b:di_Srplus |let ret= 1 + elseif a:chr == b:di_cDdSr |let ret= 1 + elseif a:chr == b:di_cSrDu |let ret= 1 + endif + endif +" call Dret("s:IsRightS ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:IsRightD: does the character "chr" have a double-line horizontal-right? {{{2 +fun! s:IsRightD(chr) +" call Dfunc("s:IsRightD(chr<".a:chr.">)") + let ret= 0 + if b:di_gfxchr + if a:chr == b:di_Dhoriz |let ret= 1 + elseif a:chr == b:di_Dulcorn |let ret= 1 + elseif a:chr == b:di_Dllcorn |let ret= 1 + elseif a:chr == b:di_Dplus |let ret= 1 + elseif a:chr == b:di_Ddnplus |let ret= 1 + elseif a:chr == b:di_Dupplus |let ret= 1 + elseif a:chr == b:di_Drplus |let ret= 1 + elseif a:chr == b:di_cSdDr |let ret= 1 + elseif a:chr == b:di_cDrSu |let ret= 1 + endif + endif +" call Dret("s:IsRightD ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:DrawErase: toggle [DrawIt on] and [DrawIt erase] modes {{{2 +fun! s:DrawErase() +" call Dfunc("s:DrawErase() b:di_erase=".b:di_erase) + if b:di_erase == 0 + let b:di_erase= 1 + echo "[DrawIt erase]" + let b:di_vert_save = b:di_vert + let b:di_horiz_save = b:di_horiz + let b:di_plus_save = b:di_plus + let b:di_upright_save = b:di_upright + let b:di_upleft_save = b:di_upleft + let b:di_cross_save = b:di_cross + let b:di_ellipse_save = b:di_ellipse + call SetDrawIt(' ',' ',' ',' ',' ',' ',' ') + else + let b:di_erase= 0 + echo "[DrawIt]" + call SetDrawIt(b:di_vert_save,b:di_horiz_save,b:di_plus_save,b:di_upleft_save,b:di_upright_save,b:di_cross_save,b:di_ellipse_save) + endif +" call Dret("s:DrawErase") +endfun + +" --------------------------------------------------------------------- +" s:DrawSpace: clear character and move right {{{2 +fun! s:DrawSpace(chr,dir) +" call Dfunc("s:DrawSpace(chr<".a:chr."> dir<".a:dir.">)") + let curcol= virtcol(".") + + " replace current location with arrowhead/space + if curcol == virtcol("$")-1 + exe "norm! r".a:chr + else + exe "norm! r".a:chr + endif + + if a:dir == 0 + let dir= b:lastdir + else + let dir= a:dir + endif + + " perform specified move + if dir == 1 + call s:MoveRight() + elseif dir == 2 + call s:MoveLeft() + elseif dir == 3 + call s:MoveUp() + else + call s:MoveDown() + endif +" call Dret("s:DrawSpace") +endfun + +" --------------------------------------------------------------------- +" s:DrawSlantDownLeft: / {{{2 +fun! s:DrawSlantDownLeft() +" call Dfunc("s:DrawSlantDownLeft()") + call s:ReplaceDownLeft() " replace + call s:MoveDown() " move + call s:MoveLeft() " move + call s:ReplaceDownLeft() " replace +" call Dret("s:DrawSlantDownLeft") +endfun + +" --------------------------------------------------------------------- +" s:DrawSlantDownRight: \ {{{2 +fun! s:DrawSlantDownRight() +" call Dfunc("s:DrawSlantDownRight()") + call s:ReplaceDownRight() " replace + call s:MoveDown() " move + call s:MoveRight() " move + call s:ReplaceDownRight() " replace +" call Dret("s:DrawSlantDownRight") +endfun + +" --------------------------------------------------------------------- +" s:DrawSlantUpLeft: \ {{{2 +fun! s:DrawSlantUpLeft() +" call Dfunc("s:DrawSlantUpLeft()") + call s:ReplaceDownRight() " replace + call s:MoveUp() " move + call s:MoveLeft() " move + call s:ReplaceDownRight() " replace +" call Dret("s:DrawSlantUpLeft") +endfun + +" --------------------------------------------------------------------- +" s:DrawSlantUpRight: / {{{2 +fun! s:DrawSlantUpRight() +" call Dfunc("s:DrawSlantUpRight()") + call s:ReplaceDownLeft() " replace + call s:MoveUp() " move + call s:MoveRight() " replace + call s:ReplaceDownLeft() " replace +" call Dret("s:DrawSlantUpRight") +endfun + +" --------------------------------------------------------------------- +" s:MoveLeft: {{{2 +fun! s:MoveLeft() +" call Dfunc("s:MoveLeft()") + norm! h + let b:lastdir= 2 +" call Dret("s:MoveLeft : b:lastdir=".b:lastdir) +endfun + +" --------------------------------------------------------------------- +" s:MoveRight: {{{2 +fun! s:MoveRight() +" call Dfunc("s:MoveRight()") + if virtcol(".") >= virtcol("$") - 1 + exe "norm! A \<Esc>" + else + norm! l + endif + let b:lastdir= 1 +" call Dret("s:MoveRight : b:lastdir=".b:lastdir) +endfun + +" --------------------------------------------------------------------- +" s:MoveUp: {{{2 +fun! s:MoveUp() +" call Dfunc("s:MoveUp()") + if line(".") == 1 + let curcol= virtcol(".") - 1 + if curcol == 0 && virtcol("$") == 1 + exe "norm! i \<Esc>" + elseif curcol == 0 + exe "norm! YP:s/./ /ge\<CR>0r " + else + exe "norm! YP:s/./ /ge\<CR>0".curcol."lr " + endif + else + let curcol= virtcol(".") + norm! k + while virtcol("$") <= curcol + exe "norm! A \<Esc>" + endwhile + endif + let b:lastdir= 3 +" call Dret("s:MoveUp : b:lastdir=".b:lastdir) +endfun + +" --------------------------------------------------------------------- +" s:MoveDown: {{{2 +fun! s:MoveDown() +" call Dfunc("s:MoveDown()") + if line(".") == line("$") + let curcol= virtcol(".") - 1 + if curcol == 0 && virtcol("$") == 1 + exe "norm! i \<Esc>" + elseif curcol == 0 + exe "norm! Yp:s/./ /ge\<CR>0r " + else + exe "norm! Yp:s/./ /ge\<CR>0".curcol."lr " + endif + else + let curcol= virtcol(".") + norm! j + while virtcol("$") <= curcol + exe "norm! A \<Esc>" + endwhile + endif + let b:lastdir= 4 +" call Dret("s:MoveDown : b:lastdir=".b:lastdir) +endfun + +" --------------------------------------------------------------------- +" s:ReplaceDownLeft: / X (upright) {{{2 +fun! s:ReplaceDownLeft() +" call Dfunc("s:ReplaceDownLeft()") + let curcol = virtcol(".") + let keepatat = @@ + if curcol != virtcol("$") + norm! vy + let curchar= @@ + + " determine if curchr needs to be changed to an "X" + let chg2cross = 0 + if curchar == b:di_upleft || curchar == b:di_cross + let chg2cross = 1 + elseif b:di_gfxchr + " performing following test only if gfx drawing characters exist + if curchar == b:di_Supleft || curchar == b:di_Scross + let chg2cross = 1 + endif + endif + + if chg2cross + if g:drawit_mode == 'S' + exe "norm! r".b:di_Scross + else + exe "norm! r".b:di_cross + endif + else + if g:drawit_mode == 'S' + exe "norm! r".b:di_Supright + else + exe "norm! r".b:di_upright + endif + endif + else + if g:drawit_mode == 'S' + exe "norm! i".b:di_Supright."\<Esc>" + else + exe "norm! i".b:di_upright."\<Esc>" + endif + endif + let @@= keepatat +" call Dret("s:ReplaceDownLeft") +endfun + +" --------------------------------------------------------------------- +" s:ReplaceDownRight: \ X (upleft) {{{2 +fun! s:ReplaceDownRight() +" call Dfunc("s:ReplaceDownRight()") + let curcol = virtcol(".") + let keepatat = @@ + if curcol != virtcol("$") + norm! vy + let curchar= @@ +" call Decho("case curcol#".curcol." == virtcol($) drawit_mode<".g:drawit_mode."> curchar<".curchar.">") + + " determine if curchr needs to be changed to an "X" + let chg2cross = 0 + if curchar == b:di_upright || curchar == b:di_cross + let chg2cross = 1 + elseif b:di_gfxchr + " performing following test only if gfx drawing characters exist + if curchar == b:di_Supright || curchar == b:di_Scross + let chg2cross = 1 + endif + endif + + if chg2cross + if g:drawit_mode == 'S' + exe "norm! r".b:di_Scross + else + exe "norm! r".b:di_cross + endif + else + if g:drawit_mode == 'S' + exe "norm! r".b:di_Supleft + else + exe "norm! r".b:di_upleft + endif + endif + else +" call Decho("case curcol#".curcol." != virtcol($) drawit_mode<".g:drawit_mode.">") + if g:drawit_mode == 'S' + exe "norm! i".b:di_Supleft."\<Esc>" + else + exe "norm! i".b:di_upleft."\<Esc>" + endif + endif + let @@= keepatat +" call Dret("s:ReplaceDownRight") +endfun + +" --------------------------------------------------------------------- +" s:DrawFatRArrow: ----|> {{{2 +fun! s:DrawFatRArrow() +" call Dfunc("s:DrawFatRArrow()") + if g:drawit_mode == 'N' || !b:di_gfxchr + call s:MoveRight() + norm! r| + call s:MoveRight() + norm! r> + else + call s:MoveRight() + norm! r▶ + endif +" call Dret("s:DrawFatRArrow") +endfun + +" --------------------------------------------------------------------- +" s:DrawFatLArrow: <|---- {{{2 +fun! s:DrawFatLArrow() +" call Dfunc("s:DrawFatLArrow()") + if g:drawit_mode == 'N' || !b:di_gfxchr + call s:MoveLeft() + norm! r| + call s:MoveLeft() + norm! r< + else + call s:MoveLeft() + norm! r◀ + endif +" call Dret("s:DrawFatLArrow") +endfun + +" --------------------------------------------------------------------- +" . +" s:DrawFatUArrow: /_\ {{{2 +" | +fun! s:DrawFatUArrow() +" call Dfunc("s:DrawFatUArrow()") + if g:drawit_mode == 'N' || !b:di_bfxchr + call s:MoveUp() + norm! r_ + call s:MoveRight() + norm! r\ + call s:MoveLeft() + call s:MoveLeft() + norm! r/ + call s:MoveRight() + call s:MoveUp() + norm! r. + else + call s:MoveUp() + norm! r▲ + endif +" call Dret("s:DrawFatUArrow") +endfun + +" --------------------------------------------------------------------- +" s:DrawFatDArrow: _|_ {{{2 +" \ / +" ' +fun! s:DrawFatDArrow() +" call Dfunc("s:DrawFatDArrow()") + if g:drawit_mode == 'N' || !b:di_gfxchr + call s:MoveRight() + norm! r_ + call s:MoveLeft() + call s:MoveLeft() + norm! r_ + call s:MoveDown() + norm! r\ + call s:MoveRight() + call s:MoveRight() + norm! r/ + call s:MoveDown() + call s:MoveLeft() + norm! r' + else + call s:MoveDown() + norm! r▼ + endif +" call Dret("s:DrawFatDArrow") +endfun + +" --------------------------------------------------------------------- +" s:DrawEllipse: Bresenham-like ellipse drawing algorithm {{{2 +" 2 2 can +" x y be 2 2 2 2 2 2 +" - + - = 1 rewritten b x + a y = a b +" a b as +" +" Take step which has minimum error +" (x,y-1) (x+1,y) (x+1,y-1) +" +" 2 2 2 2 2 2 +" Ei = | b x + a y - a b | +" +" Algorithm only draws arc from (0,b) to (a,0) and uses +" DrawFour() to reflect points to other three quadrants +fun! s:DrawEllipse(x0,y0,x1,y1) +" call Dfunc("s:DrawEllipse(x0=".a:x0." y0=".a:y0." x1=".a:x1." y1=".a:y1.")") + let x0 = a:x0 + let y0 = a:y0 + let x1 = a:x1 + let y1 = a:y1 + let xoff = (x0+x1)/2 + let yoff = (y0+y1)/2 + let a = s:Abs(x1-x0)/2 + let b = s:Abs(y1-y0)/2 + let a2 = a*a + let b2 = b*b + let twoa2= a2 + a2 + let twob2= b2 + b2 + + let xi= 0 + let yi= b + let ei= 0 + call s:DrawFour(xi,yi,xoff,yoff,a,b) + while xi <= a && yi >= 0 + + let dy= a2 - twoa2*yi + let ca= ei + twob2*xi + b2 + let cb= ca + dy + let cc= ei + dy + + let aca= s:Abs(ca) + let acb= s:Abs(cb) + let acc= s:Abs(cc) + + " pick case: (xi+1,yi) (xi,yi-1) (xi+1,yi-1) + if aca <= acb && aca <= acc + let xi= xi + 1 + let ei= ca + elseif acb <= aca && acb <= acc + let ei= cb + let xi= xi + 1 + let yi= yi - 1 + else + let ei= cc + let yi= yi - 1 + endif + if xi > a:x1 + break + endif + call s:DrawFour(xi,yi,xoff,yoff,a,b) + endw +" call Dret("s:DrawEllipse") +endf + +" --------------------------------------------------------------------- +" s:DrawFour: reflect a point to four quadrants {{{2 +fun! s:DrawFour(x,y,xoff,yoff,a,b) +" call Dfunc("s:DrawFour(xy[".a:x.",".a:y."] off[".a:xoff.",".a:yoff."] a=".a:a." b=".a:b.")") + let x = a:xoff + a:x + let y = a:yoff + a:y + let lx = a:xoff - a:x + let by = a:yoff - a:y + call s:SetCharAt(b:di_ellipse, x, y) + call s:SetCharAt(b:di_ellipse, lx, y) + call s:SetCharAt(b:di_ellipse, lx,by) + call s:SetCharAt(b:di_ellipse, x,by) +" call Dret("s:DrawFour") +endf + +" --------------------------------------------------------------------- +" s:SavePosn: saves position of cursor on screen so NetWrite can restore it {{{2 +fun! s:SavePosn() +" call Dfunc("s:SavePosn() saveposn_count=".s:saveposn_count.' ['.line('.').','.virtcol('.').']') + let s:saveposn_count= s:saveposn_count + 1 + + " Save current line and column + let b:drawit_line_{s:saveposn_count} = line(".") + let b:drawit_col_{s:saveposn_count} = virtcol(".") - 1 + + " Save top-of-screen line + norm! H + let b:drawit_hline_{s:saveposn_count}= line(".") + + " restore position + exe "norm! ".b:drawit_hline_{s:saveposn_count}."G0z\<CR>" + if b:drawit_col_{s:saveposn_count} == 0 + exe "norm! ".b:drawit_line_{s:saveposn_count}."G0" + else + exe "norm! ".b:drawit_line_{s:saveposn_count}."G0".b:drawit_col_{s:saveposn_count}."l" + endif +" call Dret("s:SavePosn : saveposn_count=".s:saveposn_count) +endfun + +" ------------------------------------------------------------------------ +" s:RestorePosn: {{{2 +fun! s:RestorePosn() +" call Dfunc("s:RestorePosn() saveposn_count=".s:saveposn_count) + if s:saveposn_count <= 0 +" call Dret("s:RestorePosn : s:saveposn_count<=0") + return + endif + " restore top-of-screen line + exe "norm! ".b:drawit_hline_{s:saveposn_count}."G0z\<CR>" + + " restore position + if b:drawit_col_{s:saveposn_count} == 0 + exe "norm! ".b:drawit_line_{s:saveposn_count}."G0" + else + exe "norm! ".b:drawit_line_{s:saveposn_count}."G0".b:drawit_col_{s:saveposn_count}."l" + endif + if s:saveposn_count > 0 + unlet b:drawit_hline_{s:saveposn_count} + unlet b:drawit_line_{s:saveposn_count} + unlet b:drawit_col_{s:saveposn_count} + let s:saveposn_count= s:saveposn_count - 1 + endif +" call Dret("s:RestorePosn : saveposn_count=".s:saveposn_count) +endfun + +" ------------------------------------------------------------------------ +" s:Flood: this function begins a flood of a region {{{2 +" based on b:di... characters as boundaries +" and starting at the current cursor location. +fun! s:Flood() +" call Dfunc("s:Flood()") + + let s:bndry = b:di_vert.b:di_horiz.b:di_plus.b:di_upright.b:di_upleft.b:di_cross.b:di_ellipse + if b:di_gfxchr + let s:bndry= s:bndry.b:di_Svert.b:di_Dvert.b:di_Shoriz.b:di_Dhoriz.b:di_Sulcorn.b:di_Dulcorn.b:di_Surcorn.b:di_Durcorn.b:di_Sllcorn.b:di_Dllcorn.b:di_Slrcorn.b:di_Dlrcorn.b:di_Splus.b:di_Dplus.b:di_Sdnplus.b:di_Ddnplus.b:di_Supplus.b:di_Dupplus.b:di_Slplus.b:di_Dlplus.b:di_Srplus.b:di_Drplus.b:di_Supright.b:di_Supleft.b:di_Scross + let s:bndry= s:bndry.b:di_DhSd.b:di_DhSu.b:di_DuSl.b:di_DuSlr.b:di_DuSr.b:di_ShDd.b:di_ShDu.b:di_SuDl.b:di_SuDlr.b:di_SdDh.b:di_SuDh.b:di_SuDr.b:di_cSdDr.b:di_cDdSr.b:di_cDlSd.b:di_cSlDd.b:di_cDrSu.b:di_cSrDu.b:di_cDlSu.b:di_cSlDu + endif + let row = line(".") + let col = virtcol(".") + let athold = @0 + let s:DIrows = line("$") + call s:SavePosn() + + " get fill character from user + " Put entire fillchar string into the s:bndry (boundary characters), + " although only use the first such character for filling + call inputsave() + let s:fillchar= input("Enter fill character: ") + call inputrestore() + let s:bndry= "[".escape(s:bndry.s:fillchar,'\-]^')."]" +" call Decho("s:bndry<".s:bndry.">") + if s:Strlen(s:fillchar) > 1 + let s:fillchar= strpart(s:fillchar,0,1) + endif + + " flood the region + call s:DI_Flood(row,col) + + " restore + call s:RestorePosn() + let @0= athold + unlet s:DIrows s:bndry s:fillchar + +" call Dret("s:Flood") +endfun + +" ------------------------------------------------------------------------ +" s:DI_Flood: fill up to the boundaries all characters to the left and right. {{{2 +" Then, based on the left/right column extents reached, check +" adjacent rows to see if any characters there need filling. +fun! s:DI_Flood(frow,fcol) +" call Dfunc("s:DI_Flood(frow=".a:frow." fcol=".a:fcol.")") + if a:frow <= 0 || a:fcol <= 0 || s:SetPosn(a:frow,a:fcol) || s:IsBoundary(a:frow,a:fcol) +" call Dret("s:DI_Flood") + return + endif + + " fill current line + let colL= s:DI_FillLeft(a:frow,a:fcol) + let colR= s:DI_FillRight(a:frow,a:fcol+1) + + " do a filladjacent on the next line up + if a:frow > 1 + call s:DI_FillAdjacent(a:frow-1,colL,colR) + endif + + " do a filladjacent on the next line down + if a:frow < s:DIrows + call s:DI_FillAdjacent(a:frow+1,colL,colR) + endif + +" call Dret("s:DI_Flood") +endfun + +" ------------------------------------------------------------------------ +" s:DI_FillLeft: Starting at (frow,fcol), non-boundary locations are {{{2 +" filled with the fillchar. The leftmost extent reached +" is returned. +fun! s:DI_FillLeft(frow,fcol) +" call Dfunc("s:DI_FillLeft(frow=".a:frow." fcol=".a:fcol.")") + if s:SetPosn(a:frow,a:fcol) +" call Dret("s:DI_FillLeft ".a:fcol) + return a:fcol + endif + + let Lcol= a:fcol + while Lcol >= 1 + if !s:IsBoundary(a:frow,Lcol) + exe "silent! norm! r".s:fillchar."h" + else + break + endif + let Lcol= Lcol - 1 + endwhile + + let Lcol= (Lcol < 1)? 1 : Lcol + 1 + +" call Dret("s:DI_FillLeft ".Lcol) + return Lcol +endfun + +" --------------------------------------------------------------------- +" s:DI_FillRight: Starting at (frow,fcol), non-boundary locations are {{{2 +" filled with the fillchar. The rightmost extent reached +" is returned. +fun! s:DI_FillRight(frow,fcol) +" call Dfunc("s:DI_FillRight(frow=".a:frow." fcol=".a:fcol.")") + if s:SetPosn(a:frow,a:fcol) +" call Dret("s:DI_FillRight ".a:fcol) + return a:fcol + endif + + let Rcol = a:fcol + while Rcol <= virtcol("$") + if !s:IsBoundary(a:frow,Rcol) + exe "silent! norm! r".s:fillchar."l" + else + break + endif + let Rcol= Rcol + 1 + endwhile + + let DIcols = virtcol("$") + let Rcol = (Rcol > DIcols)? DIcols : Rcol - 1 + +" call Dret("s:DI_FillRight ".Rcol) + return Rcol +endfun + +" --------------------------------------------------------------------- +" s:DI_FillAdjacent: {{{2 +" DI_Flood does FillLeft and FillRight, so the run from left to right +" (fcolL to fcolR) is known to have been filled. FillAdjacent is called +" from (fcolL to fcolR) on the lines one row up and down; if any character +" on the run is not a boundary character, then a flood is needed on that +" location. +fun! s:DI_FillAdjacent(frow,fcolL,fcolR) +" call Dfunc("s:DI_FillAdjacent(frow=".a:frow." fcolL=".a:fcolL." fcolR=".a:fcolR.")") + + let icol = a:fcolL + while icol <= a:fcolR + if !s:IsBoundary(a:frow,icol) + call s:DI_Flood(a:frow,icol) + endif + let icol= icol + 1 + endwhile + +" call Dret("s:DI_FillAdjacent") +endfun + +" --------------------------------------------------------------------- +" s:SetPosn: set cursor to given position on screen {{{2 +" srow,scol: -s-creen row and column +" Returns 1 : failed sanity check +" 0 : otherwise +fun! s:SetPosn(row,col) +" call Dfunc("s:SetPosn(row=".a:row." col=".a:col.")") + " sanity checks + if a:row < 1 +" call Dret("s:SetPosn 1") + return 1 + endif + if a:col < 1 +" call Dret("s:SetPosn 1") + return 1 + endif + + exe "norm! ".a:row."G".a:col."\<Bar>" + +" call Dret("s:SetPosn 0") + return 0 +endfun + +" --------------------------------------------------------------------- +" s:IsBoundary: returns 0 if not on boundary, 1 if on boundary {{{2 +" The "boundary" also includes the fill character. +fun! s:IsBoundary(row,col) +" call Dfunc("s:IsBoundary(row=".a:row." col=".a:col.")") + + let orow= line(".") + let ocol= virtcol(".") + exe "norm! ".a:row."G".a:col."\<Bar>" + norm! vy + let ret= @0 =~ s:bndry + if a:row != orow || a:col != ocol + exe "norm! ".orow."G".ocol."\<Bar>" + endif + +" call Dret("s:IsBoundary ".ret." : @0<".@0.">") + return ret +endfun + +" --------------------------------------------------------------------- +" s:PutBlock: puts a register's contents into the text at the current {{{2 +" cursor location +" replace= 0: Blanks are transparent +" = 1: Blanks copy over +" = 2: Erase all drawing characters +" +fun! s:PutBlock(block,replace) +" call Dfunc("s:PutBlock(block<".a:block."> replace=".a:replace.") g:drawit_xstrlen=".g:drawit_xstrlen) + call s:SavePosn() + exe "let block = @".a:block + let blocklen = strlen(block) + let drawit_line = line('.') + let drawchars = '['.escape(b:di_vert.b:di_horiz.b:di_plus.b:di_upright.b:di_upleft.b:di_cross,'\-').']' +" call Decho("blocklen=".blocklen." block<".string(block).">") + + " insure that putting a block will do so in a region containing spaces out to textwidth + exe "let blockrows= s:Strlen(substitute(@".a:block.",'[^[:cntrl:]]','','g'))" + exe 'let blockcols= s:Strlen(substitute(@'.a:block.",'^\\(.\\{-}\\)\\n\\_.*$','\\1',''))" + let curline= line('.') + let curcol = virtcol('.') +" call Decho("blockrows=".blockrows." blockcols=".blockcols." curline=".curline." curcol=".curcol) + call s:AutoCanvas(curline-1,curline + blockrows+1,curcol + blockcols) + + let iblock= 0 + while iblock < blocklen + " the following logic should permit 1, 2, or 4 byte glyphs (I've only tested it with 1 and 2) + let chr= strpart(block,iblock,4) + if char2nr(chr) <= 255 + let chr= strpart(block,iblock,1) + elseif char2nr(chr) <= 65536 + let chr= strpart(block,iblock,2) + let iblock= iblock + 1 + else + let iblock= iblock + 3 + endif +" call Decho("iblock=".iblock." chr#".char2nr(chr)."<".string(chr).">") + + if char2nr(chr) == 10 + " handle newline + let drawit_line= drawit_line + 1 + if b:drawit_col_{s:saveposn_count} == 0 + exe "norm! ".drawit_line."G0" + else + exe "norm! ".drawit_line."G0".b:drawit_col_{s:saveposn_count}."l" + endif + + elseif a:replace == 2 + " replace all drawing characters with blanks + if match(chr,drawchars) != -1 + norm! r l + else + norm! l + endif + + elseif chr == ' ' && a:replace == 0 + " allow blanks to be transparent + norm! l + + else + " usual replace character + exe "norm! r".chr."l" + endif + let iblock = iblock + 1 + endwhile + call s:RestorePosn() + +" call Dret("s:PutBlock") +endfun + +" --------------------------------------------------------------------- +" s:AutoCanvas: automatic "Canvas" routine {{{2 +fun! s:AutoCanvas(linestart,linestop,cols) +" call Dfunc("s:AutoCanvas(linestart=".a:linestart." linestop=".a:linestop." cols=".a:cols.") line($)=".line("$")) + + " insure there's enough blank lines at end-of-file + if line("$") < a:linestop +" call Decho("append ".(a:linestop - line("$"))." empty lines") + call s:SavePosn() + exe "norm! G".(a:linestop - line("$"))."o\<esc>" + call s:RestorePosn() + endif + + " insure that any tabs contained within the selected region are converted to blanks + let etkeep= &l:et + set et +" call Decho("exe ".a:linestart.",".a:linestop."retab") + exe a:linestart.",".a:linestop."retab" + let &l:et= etkeep + + " insure that there's whitespace to textwidth/screenwidth/a:cols + if a:cols <= 0 + let tw= &tw + if tw <= 0 + let tw= &columns + endif + else + let tw= a:cols + endif +" Decho("tw=".tw) + if search('^$\|.\%<'.(tw+1).'v$',"cn",(a:linestop+1)) > 0 +" call Decho("append trailing whitespace") + call s:Spacer(a:linestart,a:linestop,tw) + endif + +" call Dret("s:AutoCanvas : tw=".tw) +endfun + +" --------------------------------------------------------------------- +" s:Strlen: this function returns the length of a string, even if its {{{2 +" using two-byte etc characters. +" Currently, its only used if g:Align_xstrlen is set to a +" nonzero value. Solution from Nicolai Weibull, vim docs +" (:help strlen()), Tony Mechelynck, and my own invention. +fun! s:Strlen(x) +" call Dfunc("s:Strlen(x<".a:x.">") + + if v:version >= 703 && exists("*strdisplaywidth") + let ret= strdisplaywidth(a:x) + + elseif g:drawit_xstrlen == 1 + " number of codepoints (Latin a + combining circumflex is two codepoints) + " (comment from TM, solution from NW) + let ret= strlen(substitute(a:x,'.','c','g')) + + elseif g:drawit_xstrlen == 2 + " number of spacing codepoints (Latin a + combining circumflex is one spacing + " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.) + " (comment from TM, solution from TM) + let ret= strlen(substitute(a:x, '.\Z', 'x', 'g')) + + elseif g:drawit_xstrlen == 3 + " virtual length (counting, for instance, tabs as anything between 1 and + " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately + " preceded by lam, one otherwise, etc.) + " (comment from TM, solution from me) + let modkeep= &l:mod + exe "norm! o\<esc>" + call setline(line("."),a:x) + let ret= virtcol("$") - 1 + d + keepj norm! k + let &l:mod= modkeep + + else + " at least give a decent default + let ret= strlen(a:x) + endif + +" call Dret("s:Strlen ".ret) + return ret +endfun + +" ===================================================================== +" DrawIt Functions: (by Sylvain Viart) {{{1 +" ===================================================================== + +" --------------------------------------------------------------------- +" s:Canvas: {{{2 +fun! s:Canvas() +" call Dfunc("s:Canvas()") + + let lines = input("how many lines under the cursor? ") + let curline= line('.') + if curline < line('$') + exe "norm! ".lines."o\<esc>" + endif + call s:Spacer(curline+1,curline+lines,0) + let b:drawit_canvas_used= 1 + +" call Dret("s:Canvas") +endf + +" --------------------------------------------------------------------- +" s:Spacer: fill end of line with space {{{2 +" if a:cols >0: to the virtual column specified by a:cols +" <=0: to textwidth (if nonzero), otherwise +" to display width (&columns) +fun! s:Spacer(debut, fin, cols) range +" call Dfunc("s:Spacer(debut=".a:debut." fin=".a:fin." cols=".a:cols.") textwidth=".&textwidth) + call s:SavePosn() + + if a:cols <= 0 + let width = &textwidth + if width <= 0 + let width= &columns + endif + else + let width= a:cols + endif + + let l= a:debut + while l <= a:fin + call setline(l,printf('%-'.width.'s',getline(l))) + let l = l + 1 + endwhile + + call s:RestorePosn() + +" call Dret("s:Spacer") +endf + +" --------------------------------------------------------------------- +" s:CallBox: call the specified function using the current visual selection box {{{2 +fun! s:CallBox(func_name) +" call Dfunc("s:CallBox(func_name<".a:func_name.">)") + + if exists("b:xmouse_start") + let xdep = b:xmouse_start + else + let xdep= 0 + endif + if exists("b:ymouse_start") + let ydep = b:ymouse_start + else + let ydep= 0 + endif + let col0 = virtcol("'<") + let row0 = line("'<") + let col1 = virtcol("'>") + let row1 = line("'>") +" call Decho("TL corner[".row0.",".col0."] original") +" call Decho("BR corner[".row1.",".col1."] original") +" call Decho("xydep [".ydep.",".xdep."]") + + if col1 == xdep && row1 == ydep + let col1 = col0 + let row1 = row0 + let col0 = xdep + let row0 = ydep + endif +" call Decho("TL corner[".row0.",".col0."]") +" call Decho("BR corner[".row1.",".col1."]") + + " insure that the selected region has blanks to that specified by col1 + call s:AutoCanvas((row0 < row1)? row0 : row1,(row1 > row0)? row1 : row0,(col1 > col0)? col1 : col0) + +" call Decho("exe call s:".a:func_name."(".col0.','.row0.','.col1.','.row1.")") + exe "call s:".a:func_name."(".col0.','.row0.','.col1.','.row1.")" + let b:xmouse_start= 0 + let b:ymouse_start= 0 + +" call Dret("s:CallBox") +endf + +" --------------------------------------------------------------------- +" s:DrawBox: {{{2 +fun! s:DrawBox(x0, y0, x1, y1) +" call Dfunc("s:DrawBox(xy0[".a:x0.",".a:y0." xy1[".a:x1.",".a:y1."]) g:drawit_mode=".g:drawit_mode) + " loop each line + let x0= (a:x1 > a:x0)? a:x0 : a:x1 + let x1= (a:x1 > a:x0)? a:x1 : a:x0 + let y0= (a:y1 > a:y0)? a:y0 : a:y1 + let y1= (a:y1 > a:y0)? a:y1 : a:y0 +" call Decho('x0='.x0.' y0='.y0) +" call Decho('x1='.x1.' y1='.y1) + let l = y0 + while l <= y1 + let c = x0 + while c <= x1 + let remp= '.' + if l == y0 || l == y1 + if g:drawit_mode == 's' || g:drawit_mode == 'S' + let remp = b:di_Shoriz + elseif g:drawit_mode == 'd' || g:drawit_mode == 'D' + let remp = b:di_Dhoriz + else + let remp = b:di_horiz + endif + if g:drawit_mode =~ '[sSdD]' + if c == x0 && l == y0 + let remp= (g:drawit_mode == 's' || g:drawit_mode == 'S')? b:di_Sulcorn : b:di_Dulcorn +" call Decho('x0,y0: ulcorn<'.remp.'>') + elseif c == x1 && l == y0 + let remp= (g:drawit_mode == 's' || g:drawit_mode == 'S')? b:di_Surcorn : b:di_Durcorn +" call Decho('x0,y1: ulcorn<'.remp.'>') + elseif c == x0 && l == y1 + let remp= (g:drawit_mode == 's' || g:drawit_mode == 'S')? b:di_Sllcorn : b:di_Dllcorn +" call Decho('x1,y0: ulcorn<'.remp.'>') + elseif c == x1 && l == y1 + let remp= (g:drawit_mode == 's' || g:drawit_mode == 'S')? b:di_Slrcorn : b:di_Dlrcorn +" call Decho('x1,y1: ulcorn<'.remp.'>') + endif + else + if c == x0 || c == x1 + let remp = b:di_plus + endif + endif + else + if g:drawit_mode == 's' || g:drawit_mode == 'S' + let remp = b:di_Svert + elseif g:drawit_mode == 'd' || g:drawit_mode == 'D' + let remp = b:di_Dvert + else + let remp = b:di_vert + endif + if c != x0 && c != x1 + let remp = '.' + endif + endif + + if remp != '.' + call s:SetCharAt(remp, c, l) + endif + let c = c + 1 + endw + let l = l + 1 + endw + +" call Dret("s:DrawBox") +endf + +" --------------------------------------------------------------------- +" s:SetCharAt: set the character at the specified position (something must pre-exist at the pos'n) {{{2 +fun! s:SetCharAt(chr, x, y) +" call Dfunc("s:SetCharAt(chr<".a:chr."> xy[".a:x.",".a:y."])") + + exe a:y + if a:x <= 1 + exe "norm! 0r".a:chr + else + exe "norm! 0".(a:x-1)."lr".a:chr + endif + +" call Dret("s:SetCharAt") +endf + +" --------------------------------------------------------------------- +" s:DrawLine: Bresenham line-drawing algorithm {{{2 +" taken from : +" http://www.graphics.lcs.mit.edu/~mcmillan/comp136/Lecture6/Lines.html +fun! s:DrawLine(x0, y0, x1, y1, horiz) +" call Dfunc("s:DrawLine(xy0[".a:x0.",".a:y0."] xy1[".a:x1.",".a:y1."] horiz=".a:horiz.")") + + if ( a:x0 < a:x1 && a:y0 > a:y1 ) || ( a:x0 > a:x1 && a:y0 > a:y1 ) + " swap direction + let x0 = a:x1 + let y0 = a:y1 + let x1 = a:x0 + let y1 = a:y0 +" call Decho("swap points: p0(".x0.",".y0.") p1(".x1.",".y1.")") + else + let x0 = a:x0 + let y0 = a:y0 + let x1 = a:x1 + let y1 = a:y1 +" call Decho("points: p0(".x0.",".y0.") p1(".x1.",".y1.")") + endif + let dy = y1 - y0 + let dx = x1 - x0 +" call Decho("[dx=x1-x0]=".dx." [dy=y1-y0]=".dy) + + if dy < 0 + let dy = -dy + let stepy = -1 + else + let stepy = 1 + endif + + if dx < 0 + let dx = -dx + let stepx = -1 + else + let stepx = 1 + endif + + let dy = 2*dy + let dx = 2*dx + if a:horiz == '_' + let horiz= a:horiz + else + let horiz = (g:drawit_mode == 'N')? b:di_horiz : ((g:drawit_mode == 'S')? b:di_Shoriz : b:di_Dhoriz) + endif + if a:horiz == '|' + let vertline= a:vert + else + let vertline = (g:drawit_mode == 'N')? b:di_vert : ((g:drawit_mode == 'S')? b:di_Svert : b:di_Dvert) + endif + + if dx > dy +" call Decho("case dx>dy : Δ=".dx.",".dy." step=".stepx.",".stepy) + let char = horiz + call s:SetCharAt(char, x0, y0) + let fraction = dy - (dx / 2) " same as 2*Δy - Δx + while x0 != x1 + let char = horiz + if fraction >= 0 + if stepx > 0 +" call Decho("..case [fraction=".fraction."]≥0 and [stepx=".stepx."]>0: go upleft") + let char = (g:drawit_mode == 'N')? b:di_upleft : b:di_Supleft + else +" call Decho("..case [fraction=".fraction."]≥0 and [stepx=".stepx."]≤0: go upright") + let char = (g:drawit_mode == 'N')? b:di_upright : b:di_Supright + endif + let y0 = y0 + stepy + let fraction = fraction - dx " same as fraction -= 2*Δx +" call Decho("....[y0+=stepy]=".y0." [fraction-=dx]=".fraction) + endif + let x0 = x0 + stepx + let fraction = fraction + dy " same as fraction = fraction - 2*Δy +" call Decho("..[x0+=stepx]=".x0." [fraction-=dy]=".fraction) + call s:SetCharAt(char, x0, y0) + endw + else +" call Decho("case dx≤dy : Δ=".dx.",".dy." step=".stepx.",".stepy) + let char = vertline + call s:SetCharAt(char, x0, y0) + let fraction = dx - (dy / 2) + while y0 != y1 + let char = (g:drawit_mode == 'N')? b:di_vert : ((g:drawit_mode == 'S')? b:di_Svert : b:di_Dvert) + if fraction >= 0 + if stepx > 0 +" call Decho("..case [fraction=".fraction."]≥0 and [stepx=".stepx."]>0: go upleft") + let char = (g:drawit_mode == 'N')? b:di_upleft : b:di_Supleft + else +" call Decho("..case [fraction=".fraction."]≥0 and [stepx=".stepy."]≤0: go upright") + let char = (g:drawit_mode == 'N')? b:di_upright : b:di_Supright + endif + let x0 = x0 + stepx + let fraction = fraction - dy +" call Decho("....[x0+=stepx]=".x0." [fraction-=dy]=".fraction) + endif + let y0 = y0 + stepy + let fraction = fraction + dx +" call Decho("..[y0+=stepy]=".y0." [fraction-=dy]=".fraction) + call s:SetCharAt(char, x0, y0) + endw + endif + +" call Dret("s:DrawLine") +endf + +" --------------------------------------------------------------------- +" s:Arrow: {{{2 +fun! s:Arrow(x0, y0, x1, y1) +" call Dfunc("s:Arrow(xy0[".a:x0.",".a:y0."] xy1[".a:x1.",".a:y1."])") + + let horiz = (g:drawit_mode == 'N')? b:di_horiz : ((g:drawit_mode == 'S')? b:di_Shoriz : b:di_Dhoriz) + call s:DrawLine(a:x0, a:y0, a:x1, a:y1,horiz) + let dy = a:y1 - a:y0 + let dx = a:x1 - a:x0 + if s:Abs(dx) > <SID>Abs(dy) + " move x + if dx > 0 + call s:SetCharAt('>', a:x1, a:y1) + else + call s:SetCharAt('<', a:x1, a:y1) + endif + else + " move y + if dy > 0 + call s:SetCharAt('v', a:x1, a:y1) + else + call s:SetCharAt('^', a:x1, a:y1) + endif + endif + +" call Dret("s:Arrow") +endf + +" --------------------------------------------------------------------- +" s:Abs: return absolute value {{{2 +fun! s:Abs(val) + if a:val < 0 + return - a:val + else + return a:val + endif +endf + +" --------------------------------------------------------------------- +" s:DrawPlainLine: {{{2 +fun! s:DrawPlainLine(x0,y0,x1,y1) +" call Dfunc("s:DrawPlainLine(xy0[".a:x0.",".a:y0."] xy1[".a:x1.",".a:y1."])") + +" call Decho("exe call s:DrawLine(".a:x0.','.a:y0.','.a:x1.','.a:y1.',"_")') + exe "call s:DrawLine(".a:x0.','.a:y0.','.a:x1.','.a:y1.',"_")' + +" call Dret("s:DrawPlainLine") +endf + +" ===================================================================== +" Mouse Functions: {{{1 +" ===================================================================== + +" --------------------------------------------------------------------- +" s:LeftStart: Read visual drag mapping {{{2 +" The visual start point is saved in b:xmouse_start and b:ymouse_start +fun! s:LeftStart() +" call Dfunc("s:LeftStart()") + let b:xmouse_start = virtcol('.') + let b:ymouse_start = line('.') + vnoremap <silent> <buffer> <script> <leftrelease> <leftrelease>:<c-u>call <SID>LeftRelease()<cr>gv +" call Dret("s:LeftStart : [".b:ymouse_start.",".b:xmouse_start."]") +endf! + +" --------------------------------------------------------------------- +" s:LeftRelease: {{{2 +fun! s:LeftRelease() +" call Dfunc("s:LeftRelease()") + vunmap <buffer> <leftrelease> +" call Dret("s:LeftRelease : [".line('.').','.virtcol('.').']') +endf + +" --------------------------------------------------------------------- +" s:SLeftStart: begin drawing with a brush {{{2 +fun! s:SLeftStart() + if !exists("b:drawit_brush") + let b:drawit_brush= "a" + endif +" call Dfunc("s:SLeftStart() brush=".b:drawit_brush.' ['.line('.').','.virtcol('.').']') + noremap <silent> <buffer> <script> <s-leftdrag> <leftmouse>:<c-u>call <SID>SLeftDrag()<cr> + noremap <silent> <buffer> <script> <s-leftrelease> <leftmouse>:<c-u>call <SID>SLeftRelease()<cr> +" call Dret("s:SLeftStart") +endfun + +" --------------------------------------------------------------------- +" s:SLeftDrag: {{{2 +fun! s:SLeftDrag() +" call Dfunc("s:SLeftDrag() brush=".b:drawit_brush.' ['.line('.').','.virtcol('.').']') + call s:SavePosn() + call s:PutBlock(b:drawit_brush,0) + call s:RestorePosn() +" call Dret("s:SLeftDrag") +endfun + +" --------------------------------------------------------------------- +" s:SLeftRelease: {{{2 +fun! s:SLeftRelease() +" call Dfunc("s:SLeftRelease() brush=".b:drawit_brush.' ['.line('.').','.virtcol('.').']') + call s:SLeftDrag() + nunmap <buffer> <s-leftdrag> + nunmap <buffer> <s-leftrelease> +" call Dret("s:SLeftRelease") +endfun + +" --------------------------------------------------------------------- +" s:CLeftStart: begin moving a block of text {{{2 +fun! s:CLeftStart() + if !exists("b:drawit_brush") + let b:drawit_brush= "a" + endif +" call Dfunc("s:CLeftStart() brush=".b:drawit_brush) + if !line("'<") || !line("'>") + redraw! + echohl Error + echo "must visual-block select a region first" +" call Dret("s:CLeftStart : must visual-block select a region first") + return + endif + '<,'>call DrawIt#SetBrush(b:drawit_brush) + norm! gvr + let s:cleft_width= virtcol("'>") - virtcol("'<") + if s:cleft_width < 0 + let s:cleft_width= -s:cleft_width + endif + let s:cleft_height= line("'>") - line("'<") + if s:cleft_height < 0 + let s:cleft_height= -s:cleft_height + endif + if exists("s:cleft_oldblock") + unlet s:cleft_oldblock + endif +" call Decho("blocksize: ".s:cleft_height."x".s:cleft_width) + noremap <silent> <buffer> <script> <c-leftdrag> :<c-u>call <SID>CLeftDrag()<cr> + noremap <silent> <buffer> <script> <c-leftrelease> <leftmouse>:<c-u>call <SID>CLeftRelease()<cr> +" call Dret("s:CLeftStart") +endfun + +" --------------------------------------------------------------------- +" s:CLeftDrag: {{{2 +fun! s:CLeftDrag() +" call Dfunc("s:CLeftDrag() cleft_width=".s:cleft_width." cleft_height=".s:cleft_height) + exe 'let keepbrush= @'.b:drawit_brush +" call Decho("keepbrush<".keepbrush.">") + + " restore prior contents of block zone + if exists("s:cleft_oldblock") +" call Decho("draw prior contents: [".line(".").",".virtcol(".")."] line($)=".line("$")) +" call Decho("draw prior contents<".s:cleft_oldblock.">") + exe 'let @'.b:drawit_brush.'=s:cleft_oldblock' + call s:PutBlock(b:drawit_brush,1) + endif + + " move cursor to <leftmouse> position + exe "norm! \<leftmouse>" + + " save new block zone contents +" call Decho("save contents: [".line(".").",".virtcol(".")."] - [".(line(".")+s:cleft_height).",".(virtcol(".")+s:cleft_width)."]") + let curline= line(".") + call s:AutoCanvas(curline,curline + s:cleft_height,virtcol(".")+s:cleft_width) + if s:cleft_width > 0 && s:cleft_height > 0 + exe "silent! norm! \<c-v>".s:cleft_width."l".s:cleft_height.'j"'.b:drawit_brush.'y' + elseif s:cleft_width > 0 + exe "silent! norm! \<c-v>".s:cleft_width.'l"'.b:drawit_brush.'y' + else + exe "silent! norm! \<c-v>".s:cleft_height.'j"'.b:drawit_brush.'y' + endif + exe "let s:cleft_oldblock= @".b:drawit_brush +" call Decho("s:cleft_oldblock=@".b:drawit_brush) +" call Decho("cleft_height=".s:cleft_height." cleft_width=".s:cleft_width) +" call Decho("save contents<".s:cleft_oldblock.">") + + " draw the brush +" call Decho("draw brush") +" call Decho("draw brush ".b:drawit_brush.": [".line(".").",".virtcol(".")."] line($)=".line("$")) + exe 'let @'.b:drawit_brush.'=keepbrush' + call s:PutBlock(b:drawit_brush,1) + +" call Dret("s:CLeftDrag") +endfun + +" --------------------------------------------------------------------- +" s:CLeftRelease: {{{2 +fun! s:CLeftRelease() +" call Dfunc("s:CLeftRelease()") + call s:CLeftDrag() + nunmap <buffer> <c-leftdrag> + nunmap <buffer> <c-leftrelease> + unlet s:cleft_oldblock s:cleft_height s:cleft_width +" call Dret("s:CLeftRelease") +endfun + +" --------------------------------------------------------------------- +" DrawIt#SetBrush: {{{2 +fun! DrawIt#SetBrush(brush) range +" call Dfunc("DrawIt#SetBrush(brush<".a:brush.">)") + let b:drawit_brush= a:brush +" call Decho("visualmode<".visualmode()."> range[".a:firstline.",".a:lastline."] visrange[".line("'<").",".line("'>")."]") + if visualmode() == "\<c-v>" && ((a:firstline == line("'>") && a:lastline == line("'<")) || (a:firstline == line("'<") && a:lastline == line("'>"))) + " last visual mode was visual block mode, and + " either [firstline,lastline] == ['<,'>] or ['>,'<] + " Assuming that SetBrush called from a visual-block selection! + " Yank visual block into selected register (brush) +" call Decho("yanking visual block into register ".b:drawit_brush) + exe 'norm! gv"'.b:drawit_brush.'y' + endif +" call Dret("DrawIt#SetBrush : b:drawit_brush=".b:drawit_brush) +endfun + +" ------------------------------------------------------------------------ +" Modelines: {{{1 +" vim: fdm=marker +let &cpo= s:keepcpo +unlet s:keepcpo diff --git a/Editor/vim/autoload/goyo.vim b/Editor/vim/autoload/goyo.vim new file mode 100644 index 0000000..7c43f4e --- /dev/null +++ b/Editor/vim/autoload/goyo.vim @@ -0,0 +1,383 @@ +" Copyright (c) 2014 Junegunn Choi +" +" MIT License +" +" 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. + +let s:cpo_save = &cpo +set cpo&vim + +function! s:get_color(group, attr) + return synIDattr(synIDtrans(hlID(a:group)), a:attr) +endfunction + +function! s:set_color(group, attr, color) + let gui = has('gui_running') + execute printf("hi %s %s%s=%s", a:group, gui ? 'gui' : 'cterm', a:attr, a:color) +endfunction + +function! s:blank(repel) + if bufwinnr(t:goyo_pads.r) <= bufwinnr(t:goyo_pads.l) + 1 + \ || bufwinnr(t:goyo_pads.b) <= bufwinnr(t:goyo_pads.t) + 3 + call s:goyo_off() + endif + execute 'wincmd' a:repel +endfunction + +function! s:init_pad(command) + execute a:command + + setlocal buftype=nofile bufhidden=wipe nomodifiable nobuflisted noswapfile + \ nonu nocursorline nocursorcolumn winfixwidth winfixheight statusline=\ + if exists('&rnu') + setlocal nornu + endif + if exists('&colorcolumn') + setlocal colorcolumn= + endif + let bufnr = winbufnr(0) + + execute winnr('#') . 'wincmd w' + return bufnr +endfunction + +function! s:setup_pad(bufnr, vert, size, repel) + let win = bufwinnr(a:bufnr) + execute win . 'wincmd w' + execute (a:vert ? 'vertical ' : '') . 'resize ' . max([0, a:size]) + augroup goyop + execute 'autocmd WinEnter,CursorMoved <buffer> nested call s:blank("'.a:repel.'")' + autocmd WinLeave <buffer> call s:hide_statusline() + augroup END + + " To hide scrollbars of pad windows in GVim + let diff = winheight(0) - line('$') - (has('gui_running') ? 2 : 0) + if diff > 0 + setlocal modifiable + call append(0, map(range(1, diff), '""')) + normal! gg + setlocal nomodifiable + endif + execute winnr('#') . 'wincmd w' +endfunction + +function! s:hmargin() + let nwidth = max([len(string(line('$'))) + 1, &numberwidth]) + let width = t:goyo_width + (&number ? nwidth : 0) + return (&columns - width) +endfunction + +function! s:resize_pads() + let t:goyo_width = max([2, t:goyo_width]) + let t:goyo_margin_top = min([max([2, t:goyo_margin_top]), &lines / 2 - 1]) + let t:goyo_margin_bottom = min([max([2, t:goyo_margin_bottom]), &lines / 2 - 1]) + + let hmargin = s:hmargin() + + augroup goyop + autocmd! + augroup END + call s:setup_pad(t:goyo_pads.t, 0, t:goyo_margin_top - 1, 'j') + call s:setup_pad(t:goyo_pads.b, 0, t:goyo_margin_bottom - 2, 'k') + call s:setup_pad(t:goyo_pads.l, 1, hmargin / 2 - 1, 'l') + call s:setup_pad(t:goyo_pads.r, 1, hmargin / 2 - 1, 'h') + + let t:goyo_width = winwidth(0) +endfunction + +function! s:tranquilize() + let bg = s:get_color('Normal', 'bg') + for grp in ['NonText', 'FoldColumn', 'ColorColumn', 'VertSplit', + \ 'StatusLine', 'StatusLineNC', 'SignColumn'] + " -1 on Vim / '' on GVim + if bg == -1 || empty(bg) + call s:set_color(grp, 'fg', get(g:, 'goyo_bg', 'black')) + call s:set_color(grp, 'bg', 'NONE') + else + call s:set_color(grp, 'fg', bg) + call s:set_color(grp, 'bg', bg) + endif + call s:set_color(grp, '', 'NONE') + endfor +endfunction + +function! s:hide_statusline() + let &l:statusline = repeat(' ', winwidth(0)) +endfunction + +function! s:hide_linenr() + if !get(g:, 'goyo_linenr', 0) + setlocal nonu + if exists('&rnu') + setlocal nornu + endif + endif + if exists('&colorcolumn') + setlocal colorcolumn= + endif +endfunction + +function! s:maps_nop() + let mapped = filter(['R', 'H', 'J', 'K', 'L', '|', '_', '='], + \ "empty(maparg(\"\<c-w>\".v:val, 'n'))") + for c in mapped + execute 'nnoremap <c-w>'.escape(c, '|').' <nop>' + endfor + return mapped +endfunction + +function! s:maps_resize() + let commands = { + \ '>': ':<c-u>let t:goyo_width = winwidth(0) + 2 * v:count1 <bar> call <sid>resize_pads()<cr>', + \ '<': ':<c-u>let t:goyo_width = winwidth(0) - 2 * v:count1 <bar> call <sid>resize_pads()<cr>', + \ '+': ':<c-u>let t:goyo_margin_top -= v:count1 <bar> let t:goyo_margin_bottom -= v:count1 <bar> call <sid>resize_pads()<cr>', + \ '-': ':<c-u>let t:goyo_margin_top += v:count1 <bar> let t:goyo_margin_bottom += v:count1 <bar> call <sid>resize_pads()<cr>' + \ } + let mapped = filter(keys(commands), "empty(maparg(\"\<c-w>\".v:val, 'n'))") + for c in mapped + execute 'nnoremap <silent> <c-w>'.c.' '.commands[c] + endfor + return mapped +endfunction + +function! s:goyo_on(width) + let s:orig_tab = tabpagenr() + + " New tab + tab split + + let t:goyo_master = winbufnr(0) + let t:goyo_width = a:width + let t:goyo_margin_top = get(g:, 'goyo_margin_top', 4) + let t:goyo_margin_bottom = get(g:, 'goyo_margin_bottom', 4) + let t:goyo_pads = {} + let t:goyo_revert = + \ { 'laststatus': &laststatus, + \ 'showtabline': &showtabline, + \ 'fillchars': &fillchars, + \ 'winminwidth': &winminwidth, + \ 'winwidth': &winwidth, + \ 'winminheight': &winminheight, + \ 'winheight': &winheight, + \ 'ruler': &ruler, + \ 'sidescroll': &sidescroll, + \ 'sidescrolloff': &sidescrolloff + \ } + let t:goyo_maps = extend(s:maps_nop(), s:maps_resize()) + if has('gui_running') + let t:goyo_revert.guioptions = &guioptions + endif + + " vim-gitgutter + let t:goyo_disabled_gitgutter = get(g:, 'gitgutter_enabled', 0) + if t:goyo_disabled_gitgutter + silent! GitGutterDisable + endif + + " vim-signify + let t:goyo_disabled_signify = exists('b:sy') && b:sy.active + if t:goyo_disabled_signify + SignifyToggle + endif + + " vim-airline + let t:goyo_disabled_airline = exists("#airline") + if t:goyo_disabled_airline + AirlineToggle + endif + + " vim-powerline + let t:goyo_disabled_powerline = exists("#PowerlineMain") + if t:goyo_disabled_powerline + augroup PowerlineMain + autocmd! + augroup END + augroup! PowerlineMain + endif + + " lightline.vim + let t:goyo_disabled_lightline = exists('#LightLine') + if t:goyo_disabled_lightline + silent! call lightline#disable() + endif + + call s:hide_linenr() + " Global options + let &winheight = max([&winminheight, 1]) + set winminheight=1 + set winheight=1 + set winminwidth=1 winwidth=1 + set laststatus=0 + set showtabline=0 + set noruler + set fillchars+=vert:\ + set fillchars+=stl:. + set fillchars+=stlnc:\ + set sidescroll=1 + set sidescrolloff=0 + + " Hide left-hand scrollbars + if has('gui_running') + set guioptions-=l + set guioptions-=L + endif + + let t:goyo_pads.l = s:init_pad('vertical topleft new') + let t:goyo_pads.r = s:init_pad('vertical botright new') + let t:goyo_pads.t = s:init_pad('topleft new') + let t:goyo_pads.b = s:init_pad('botright new') + + call s:resize_pads() + call s:tranquilize() + + augroup goyo + autocmd! + autocmd TabLeave * call s:goyo_off() + autocmd VimResized * call s:resize_pads() + autocmd ColorScheme * call s:tranquilize() + autocmd BufWinEnter * call s:hide_linenr() | call s:hide_statusline() + autocmd WinEnter,WinLeave * call s:hide_statusline() + augroup END + + call s:hide_statusline() + if exists('g:goyo_callbacks[0]') + call g:goyo_callbacks[0]() + endif + silent! doautocmd User GoyoEnter +endfunction + +function! s:goyo_off() + if !exists('#goyo') + return + endif + + " Oops, not this tab + if !exists('t:goyo_revert') + return + endif + + " Clear auto commands + augroup goyo + autocmd! + augroup END + augroup! goyo + augroup goyop + autocmd! + augroup END + augroup! goyop + + for c in t:goyo_maps + execute 'nunmap <c-w>'.escape(c, '|') + endfor + + let goyo_revert = t:goyo_revert + let goyo_disabled_gitgutter = t:goyo_disabled_gitgutter + let goyo_disabled_signify = t:goyo_disabled_signify + let goyo_disabled_airline = t:goyo_disabled_airline + let goyo_disabled_powerline = t:goyo_disabled_powerline + let goyo_disabled_lightline = t:goyo_disabled_lightline + let goyo_orig_buffer = t:goyo_master + let [line, col] = [line('.'), col('.')] + + if tabpagenr() == 1 + tabnew + normal! gt + bd + endif + tabclose + execute 'normal! '.s:orig_tab.'gt' + if winbufnr(0) == goyo_orig_buffer + " Doesn't work if window closed with `q` + execute printf('normal! %dG%d|', line, col) + endif + + let wmw = remove(goyo_revert, 'winminwidth') + let ww = remove(goyo_revert, 'winwidth') + let &winwidth = ww + let &winminwidth = wmw + let wmh = remove(goyo_revert, 'winminheight') + let wh = remove(goyo_revert, 'winheight') + let &winheight = max([wmh, 1]) + let &winminheight = wmh + let &winheight = wh + + for [k, v] in items(goyo_revert) + execute printf("let &%s = %s", k, string(v)) + endfor + execute 'colo '. get(g:, 'colors_name', 'default') + + if goyo_disabled_gitgutter + silent! GitGutterEnable + endif + + if goyo_disabled_signify + silent! if !b:sy.active + SignifyToggle + endif + endif + + if goyo_disabled_airline && !exists("#airline") + AirlineToggle + silent! AirlineRefresh + endif + + if goyo_disabled_powerline && !exists("#PowerlineMain") + doautocmd PowerlineStartup VimEnter + silent! PowerlineReloadColorscheme + endif + + if goyo_disabled_lightline + silent! call lightline#enable() + endif + + if exists('#Powerline') + doautocmd Powerline ColorScheme + endif + + if exists('g:goyo_callbacks[1]') + call g:goyo_callbacks[1]() + endif + silent! doautocmd User GoyoLeave +endfunction + +function! s:goyo(bang, ...) + let width = a:0 > 0 ? a:1 : get(g:, 'goyo_width', 80) + + if a:bang + if exists('#goyo') + call s:goyo_off() + endif + else + if exists('#goyo') == 0 + call s:goyo_on(width) + elseif a:0 > 0 + let t:goyo_width = width + call s:resize_pads() + else + call s:goyo_off() + end + end +endfunction + +command! -nargs=? -bar -bang Goyo call s:goyo('<bang>' == '!', <args>) + +let &cpo = s:cpo_save +unlet s:cpo_save + diff --git a/Editor/vim/autoload/pathogen.vim b/Editor/vim/autoload/pathogen.vim new file mode 100644 index 0000000..c6d54a1 --- /dev/null +++ b/Editor/vim/autoload/pathogen.vim @@ -0,0 +1,344 @@ +" pathogen.vim - path option manipulation +" Maintainer: Tim Pope <http://tpo.pe/> +" Version: 2.3 + +" Install in ~/.vim/autoload (or ~\vimfiles\autoload). +" +" For management of individually installed plugins in ~/.vim/bundle (or +" ~\vimfiles\bundle), adding `execute pathogen#infect()` to the top of your +" .vimrc is the only other setup necessary. +" +" The API is documented inline below. + +if exists("g:loaded_pathogen") || &cp + finish +endif +let g:loaded_pathogen = 1 + +" Point of entry for basic default usage. Give a relative path to invoke +" pathogen#interpose() (defaults to "bundle/{}"), or an absolute path to invoke +" pathogen#surround(). Curly braces are expanded with pathogen#expand(): +" "bundle/{}" finds all subdirectories inside "bundle" inside all directories +" in the runtime path. +function! pathogen#infect(...) abort + for path in a:0 ? filter(reverse(copy(a:000)), 'type(v:val) == type("")') : ['bundle/{}'] + if path =~# '^\%({\=[$~\\/]\|{\=\w:[\\/]\).*[{}*]' + call pathogen#surround(path) + elseif path =~# '^\%([$~\\/]\|\w:[\\/]\)' + call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')') + call pathogen#surround(path . '/{}') + elseif path =~# '[{}*]' + call pathogen#interpose(path) + else + call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')') + call pathogen#interpose(path . '/{}') + endif + endfor + call pathogen#cycle_filetype() + if pathogen#is_disabled($MYVIMRC) + return 'finish' + endif + return '' +endfunction + +" Split a path into a list. +function! pathogen#split(path) abort + if type(a:path) == type([]) | return a:path | endif + if empty(a:path) | return [] | endif + let split = split(a:path,'\\\@<!\%(\\\\\)*\zs,') + return map(split,'substitute(v:val,''\\\([\\,]\)'',''\1'',"g")') +endfunction + +" Convert a list to a path. +function! pathogen#join(...) abort + if type(a:1) == type(1) && a:1 + let i = 1 + let space = ' ' + else + let i = 0 + let space = '' + endif + let path = "" + while i < a:0 + if type(a:000[i]) == type([]) + let list = a:000[i] + let j = 0 + while j < len(list) + let escaped = substitute(list[j],'[,'.space.']\|\\[\,'.space.']\@=','\\&','g') + let path .= ',' . escaped + let j += 1 + endwhile + else + let path .= "," . a:000[i] + endif + let i += 1 + endwhile + return substitute(path,'^,','','') +endfunction + +" Convert a list to a path with escaped spaces for 'path', 'tag', etc. +function! pathogen#legacyjoin(...) abort + return call('pathogen#join',[1] + a:000) +endfunction + +" Turn filetype detection off and back on again if it was already enabled. +function! pathogen#cycle_filetype() abort + if exists('g:did_load_filetypes') + filetype off + filetype on + endif +endfunction + +" Check if a bundle is disabled. A bundle is considered disabled if its +" basename or full name is included in the list g:pathogen_disabled. +function! pathogen#is_disabled(path) abort + if a:path =~# '\~$' + return 1 + endif + let sep = pathogen#slash() + let blacklist = get(g:, 'pathogen_blacklist', get(g:, 'pathogen_disabled', [])) + pathogen#split($VIMBLACKLIST) + return index(blacklist, fnamemodify(a:path, ':t')) != -1 || index(blacklist, a:path) != -1 +endfunction "}}}1 + +" Prepend the given directory to the runtime path and append its corresponding +" after directory. Curly braces are expanded with pathogen#expand(). +function! pathogen#surround(path) abort + let sep = pathogen#slash() + let rtp = pathogen#split(&rtp) + let path = fnamemodify(a:path, ':p:?[\\/]\=$??') + let before = filter(pathogen#expand(path), '!pathogen#is_disabled(v:val)') + let after = filter(reverse(pathogen#expand(path.sep.'after')), '!pathogen#is_disabled(v:val[0:-7])') + call filter(rtp, 'index(before + after, v:val) == -1') + let &rtp = pathogen#join(before, rtp, after) + return &rtp +endfunction + +" For each directory in the runtime path, add a second entry with the given +" argument appended. Curly braces are expanded with pathogen#expand(). +function! pathogen#interpose(name) abort + let sep = pathogen#slash() + let name = a:name + if has_key(s:done_bundles, name) + return "" + endif + let s:done_bundles[name] = 1 + let list = [] + for dir in pathogen#split(&rtp) + if dir =~# '\<after$' + let list += reverse(filter(pathogen#expand(dir[0:-6].name.sep.'after'), '!pathogen#is_disabled(v:val[0:-7])')) + [dir] + else + let list += [dir] + filter(pathogen#expand(dir.sep.name), '!pathogen#is_disabled(v:val)') + endif + endfor + let &rtp = pathogen#join(pathogen#uniq(list)) + return 1 +endfunction + +let s:done_bundles = {} + +" Invoke :helptags on all non-$VIM doc directories in runtimepath. +function! pathogen#helptags() abort + let sep = pathogen#slash() + for glob in pathogen#split(&rtp) + for dir in map(split(glob(glob), "\n"), 'v:val.sep."/doc/".sep') + if (dir)[0 : strlen($VIMRUNTIME)] !=# $VIMRUNTIME.sep && filewritable(dir) == 2 && !empty(split(glob(dir.'*.txt'))) && (!filereadable(dir.'tags') || filewritable(dir.'tags')) + silent! execute 'helptags' pathogen#fnameescape(dir) + endif + endfor + endfor +endfunction + +command! -bar Helptags :call pathogen#helptags() + +" Execute the given command. This is basically a backdoor for --remote-expr. +function! pathogen#execute(...) abort + for command in a:000 + execute command + endfor + return '' +endfunction + +" Section: Unofficial + +function! pathogen#is_absolute(path) abort + return a:path =~# (has('win32') ? '^\%([\\/]\|\w:\)[\\/]\|^[~$]' : '^[/~$]') +endfunction + +" Given a string, returns all possible permutations of comma delimited braced +" alternatives of that string. pathogen#expand('/{a,b}/{c,d}') yields +" ['/a/c', '/a/d', '/b/c', '/b/d']. Empty braces are treated as a wildcard +" and globbed. Actual globs are preserved. +function! pathogen#expand(pattern) abort + if a:pattern =~# '{[^{}]\+}' + let [pre, pat, post] = split(substitute(a:pattern, '\(.\{-\}\){\([^{}]\+\)}\(.*\)', "\\1\001\\2\001\\3", ''), "\001", 1) + let found = map(split(pat, ',', 1), 'pre.v:val.post') + let results = [] + for pattern in found + call extend(results, pathogen#expand(pattern)) + endfor + return results + elseif a:pattern =~# '{}' + let pat = matchstr(a:pattern, '^.*{}[^*]*\%($\|[\\/]\)') + let post = a:pattern[strlen(pat) : -1] + return map(split(glob(substitute(pat, '{}', '*', 'g')), "\n"), 'v:val.post') + else + return [a:pattern] + endif +endfunction + +" \ on Windows unless shellslash is set, / everywhere else. +function! pathogen#slash() abort + return !exists("+shellslash") || &shellslash ? '/' : '\' +endfunction + +function! pathogen#separator() abort + return pathogen#slash() +endfunction + +" Convenience wrapper around glob() which returns a list. +function! pathogen#glob(pattern) abort + let files = split(glob(a:pattern),"\n") + return map(files,'substitute(v:val,"[".pathogen#slash()."/]$","","")') +endfunction "}}}1 + +" Like pathogen#glob(), only limit the results to directories. +function! pathogen#glob_directories(pattern) abort + return filter(pathogen#glob(a:pattern),'isdirectory(v:val)') +endfunction "}}}1 + +" Remove duplicates from a list. +function! pathogen#uniq(list) abort + let i = 0 + let seen = {} + while i < len(a:list) + if (a:list[i] ==# '' && exists('empty')) || has_key(seen,a:list[i]) + call remove(a:list,i) + elseif a:list[i] ==# '' + let i += 1 + let empty = 1 + else + let seen[a:list[i]] = 1 + let i += 1 + endif + endwhile + return a:list +endfunction + +" Backport of fnameescape(). +function! pathogen#fnameescape(string) abort + if exists('*fnameescape') + return fnameescape(a:string) + elseif a:string ==# '-' + return '\-' + else + return substitute(escape(a:string," \t\n*?[{`$\\%#'\"|!<"),'^[+>]','\\&','') + endif +endfunction + +" Like findfile(), but hardcoded to use the runtimepath. +function! pathogen#runtime_findfile(file,count) abort "{{{1 + let rtp = pathogen#join(1,pathogen#split(&rtp)) + let file = findfile(a:file,rtp,a:count) + if file ==# '' + return '' + else + return fnamemodify(file,':p') + endif +endfunction + +" Section: Deprecated + +function! s:warn(msg) abort + echohl WarningMsg + echomsg a:msg + echohl NONE +endfunction + +" Prepend all subdirectories of path to the rtp, and append all 'after' +" directories in those subdirectories. Deprecated. +function! pathogen#runtime_prepend_subdirectories(path) abort + call s:warn('Change pathogen#runtime_prepend_subdirectories('.string(a:path).') to pathogen#infect('.string(a:path.'/{}').')') + return pathogen#surround(a:path . pathogen#slash() . '{}') +endfunction + +function! pathogen#incubate(...) abort + let name = a:0 ? a:1 : 'bundle/{}' + call s:warn('Change pathogen#incubate('.(a:0 ? string(a:1) : '').') to pathogen#infect('.string(name).')') + return pathogen#interpose(name) +endfunction + +" Deprecated alias for pathogen#interpose(). +function! pathogen#runtime_append_all_bundles(...) abort + if a:0 + call s:warn('Change pathogen#runtime_append_all_bundles('.string(a:1).') to pathogen#infect('.string(a:1.'/{}').')') + else + call s:warn('Change pathogen#runtime_append_all_bundles() to pathogen#infect()') + endif + return pathogen#interpose(a:0 ? a:1 . '/{}' : 'bundle/{}') +endfunction + +if exists(':Vedit') + finish +endif + +let s:vopen_warning = 0 + +function! s:find(count,cmd,file,lcd) + let rtp = pathogen#join(1,pathogen#split(&runtimepath)) + let file = pathogen#runtime_findfile(a:file,a:count) + if file ==# '' + return "echoerr 'E345: Can''t find file \"".a:file."\" in runtimepath'" + endif + if !s:vopen_warning + let s:vopen_warning = 1 + let warning = '|echohl WarningMsg|echo "Install scriptease.vim to continue using :V'.a:cmd.'"|echohl NONE' + else + let warning = '' + endif + if a:lcd + let path = file[0:-strlen(a:file)-2] + execute 'lcd `=path`' + return a:cmd.' '.pathogen#fnameescape(a:file) . warning + else + return a:cmd.' '.pathogen#fnameescape(file) . warning + endif +endfunction + +function! s:Findcomplete(A,L,P) + let sep = pathogen#slash() + let cheats = { + \'a': 'autoload', + \'d': 'doc', + \'f': 'ftplugin', + \'i': 'indent', + \'p': 'plugin', + \'s': 'syntax'} + if a:A =~# '^\w[\\/]' && has_key(cheats,a:A[0]) + let request = cheats[a:A[0]].a:A[1:-1] + else + let request = a:A + endif + let pattern = substitute(request,'/\|\'.sep,'*'.sep,'g').'*' + let found = {} + for path in pathogen#split(&runtimepath) + let path = expand(path, ':p') + let matches = split(glob(path.sep.pattern),"\n") + call map(matches,'isdirectory(v:val) ? v:val.sep : v:val') + call map(matches,'expand(v:val, ":p")[strlen(path)+1:-1]') + for match in matches + let found[match] = 1 + endfor + endfor + return sort(keys(found)) +endfunction + +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Ve :execute s:find(<count>,'edit<bang>',<q-args>,0) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vedit :execute s:find(<count>,'edit<bang>',<q-args>,0) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vopen :execute s:find(<count>,'edit<bang>',<q-args>,1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vsplit :execute s:find(<count>,'split',<q-args>,<bang>1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vvsplit :execute s:find(<count>,'vsplit',<q-args>,<bang>1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vtabedit :execute s:find(<count>,'tabedit',<q-args>,<bang>1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vpedit :execute s:find(<count>,'pedit',<q-args>,<bang>1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vread :execute s:find(<count>,'read',<q-args>,<bang>1) + +" vim:set et sw=2 foldmethod=expr foldexpr=getline(v\:lnum)=~'^\"\ Section\:'?'>1'\:getline(v\:lnum)=~#'^fu'?'a1'\:getline(v\:lnum)=~#'^endf'?'s1'\:'=': |