B
    ¡ƒ¼X6 ã               @   sò  d Z ddlZddlZddlZddlZddlZddlZdaejd Z	e	dkZ
e	dkrVeZi ZdZe d¡Ze d¡dkr‚e d¡Zni Ze d	¡dkr e d
¡ZndZe d¡dkr¾e d¡Zne d¡dkrÒdZndZe d¡dkrøee d¡ƒdkZndZG dd„ dƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zeed < d!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Z d)d*„ Z!d+d,„ Z"d-d.„ Z#d/d0„ Z$d1d2„ Z%d3d4„ Z&d5d6„ Z'd7d8„ Z(d9d:„ Z)d‹d;d<„Z*d=d>„ Z+d?d@„ Z,dAdB„ Z-dCdD„ Z.dEdF„ Z/dGdH„ Z0dIdJ„ Z1dKdL„ Z2dMdN„ Z3dOdP„ Z4dQdR„ Z5dSdT„ Z6dUdV„ Z7dŒdWdX„Z8dYdZ„ Z9d[d\„ Z:d]d^„ Z;d_d`„ Z<dadb„ Z=dcdd„ Z>dedf„ Z?dgdh„ Z@didj„ ZAdkdl„ ZBdmdn„ ZCdodp„ ZDdqdr„ ZEdsdt„ ZFdudv„ ZGdwdx„ ZHdydz„ ZId{d|„ ZJd}d~„ ZKddd€„ZLdd‚„ ZMdƒd„„ ZNd…d†„ ZOG d‡dˆ„ dˆƒZPd‰dŠ„ ZQdS )Žz1This module is meant to be imported by voom.vim .é    Né   z{{{z{{{(\d*[1-9]\d*)(x?)zexists('g:voom_ft_modes')Ú1zg:voom_ft_modeszexists('g:voom_default_mode')zg:voom_default_modeZfmrz#exists('g:voom_clipboard_register')zg:voom_clipboard_registerzhas('clipboard')ú+Úoz'exists('g:voom_always_allow_move_left')zg:voom_always_allow_move_leftFc               @   s   e Zd ZdZdd„ ZdS )ÚVoomOutlinezQOutline data for one Body buffer.
    Instantiated from Body by voom#Init().
    c             C   s   |t t d¡ƒkst‚d S )Nz	bufnr(''))ÚintÚvimÚevalÚAssertionError)ÚselfÚbody© r   úC/home/ssd/madduck/.vim/autoload/voom/voom_vimplugin2657/voom_vim.pyÚ__init__L   s    zVoomOutline.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   H   s   r   c          
   C   s>  t | ƒ}g |_g |_| |_tjj|_d |_d |_	d|_
t d¡|_t d¡|_tƒ |_t d¡ ¡ ppt |jt¡}d| }yt|ƒ tj| }W n* tk
rº   t d| dd¡ ¡ d S X ||_||_| jd	| 7  _t d
| dd¡ ¡ t|ddƒ|_|jdkrÞt|ddƒ}|r$||_n|jtkr8t |_nt|_t|ddƒpNt!|_!t"|_"d|_#t d¡ $d¡d }||_%|t&krŠt'|_(nt) *t) +|¡d ¡|_(t d¡dkr¾t d¡|_,nt d¡ $d¡d  ¡ d |_,nDt|ddƒpît|_t|ddƒpt!|_!t|ddƒ|_"t|ddƒ|_#t d|j ¡ |t-| < d S )Né   zl:firstLinez	&filetypezl:qargszvoom_vimplugin2657.voom_mode_%sz;call voom#ErrorMsg('VOoM: cannot import Python module: %s')ú'z''z, %szlet l:mmode='%s'ÚMTYPEr   Zhook_makeOutlineZhook_newHeadlinez&foldmarkerú,z(\d*[1-9]\d*)(x?)z#exists('g:voom_rstrip_chars_{&ft}')r   zg:voom_rstrip_chars_{&ft}z&commentstringz%sz 	Zhook_changeLevBodyHeadÚhook_doBodyAfterOopzlet l:MTYPE=%s).r   ÚbnodesÚlevelsr   r   ÚcurrentÚbufferÚBodyÚtreeÚTreeÚsnLnr	   ÚbnameÚfiletypeÚget_vim_encodingÚencÚstripÚFT_MODESÚgetÚDEFAULT_MODEÚ
__import__ÚsysÚmodulesÚImportErrorÚcommandÚreplaceÚmModuleÚmmodeÚgetattrr   ÚmakeOutlineÚ	MAKE_HEADÚmakeOutlineHÚnewHeadlineÚchangeLevBodyHeadr   ÚsplitÚmarkerÚMARKERÚ	MARKER_REÚ	marker_reÚreÚcompileÚescapeÚrstrip_charsÚVOOMS)r   ÚVOr0   ZmNamer/   Úfr8   r   r   r   Ú	voom_InitP   s`    

 rC   c              C   st  t t d¡ƒ} t t d¡ƒ}t|  }|jrBt| |ƒ t d¡ dS |j}|j}t	|ƒ}d}|j
}|j}g }	xŒtd|ƒD ]~}
|||
 d  }|||ƒ ¡ d… }|s¤qv|d dkrº|
d }qv|d dkrv|	 |
d ¡ |dd… rv|d dkrv|
d }qvW |	rt|d	||	ƒ}td	||ƒ |rft d
| |f ¡ ||_|dkrp||d krpt d||d   ¡ n
t| |ƒ dS )z4This is part of voom#TreeCreate(), called from Tree.za:bodyza:blnrz
setl fdl=2Nr   r   ú=r   r   zcall voom#SetSnLn(%s,%s)zlet l:blnShow=%s)r   r   r	   r@   r   ÚcomputeSnLnr-   r   r   Úlenr;   ÚsearchÚxrangeÚendÚappendÚfoldingFlipÚfoldingCreater    )r   ÚblnrrA   r   r   Úzr    r;   Úmarker_re_searchZoFoldsÚiÚblineÚbline2ÚcFoldsr   r   r   Úvoom_TreeCreateœ   sD    

 
rT   c             C   sð   | j }| jj}t|ƒ}g g g   }}}|j|j|j  }}	}
| j}x¢t|ƒD ]–}||| kr^qL|| }||ƒ}|stqLt| d¡ƒ}|d| 	¡ …  
¡  |¡ d¡ ¡ }d| d¡p´dd|d  |f }||ƒ |	|d ƒ |
|ƒ qLW |||fS )z‚Return (tlines, bnodes, levels) for Body lines blines.
    blines is either Vim buffer object (Body) or list of buffer lines.
    r   Nz-=~z %s%s|%sr   ú z. )r8   r;   rG   rF   rJ   r?   rH   r   ÚgroupÚstartÚlstripÚrstripr%   )rA   Úblinesr8   rO   ÚZÚtlinesr   r   Ú
tlines_addÚ
bnodes_addÚ
levels_addÚcrP   rQ   ÚmÚlevÚheadÚtliner   r   r   r2   Ò   s(      $ r2   c             C   sÚ   | j }| jj}t|ƒ}g g g   }}}|j|j|j  }}	}
t| j }xˆt|ƒD ]|}||| krbqP|| }||ƒ}|sxqPt| 	d¡ƒ}|||ƒ}d| 	d¡pždd|d  |f }||ƒ |	|d ƒ |
|ƒ qPW |||fS )z‹Identical to makeOutline(), duplicate code. The only difference is that
    a custom function is used to construct Tree headline text.
    r   z %s%s|%sr   rU   z. )
r8   r;   rG   rF   rJ   r3   r"   rH   r   rV   )rA   rZ   r8   rO   r[   r\   r   r   r]   r^   r_   ÚhrP   rQ   ra   rb   rc   rd   r   r   r   r4   ò   s(    
  
 r4   c             C   s@   | d |  ¡ …  ¡  d¡ ¡ }| d¡r8|d d…  ¡ S |S d S )Nz-=~z<!éþÿÿÿ)rW   r%   Úendswith)rQ   ÚmatchÚsr   r   r   Úmake_head_html  s    
rj   Zhtmlc             C   sj  t |  }|j|kst‚| ||j¡\}}}|jgdgdg  |dd…< |dd…< |dd…< || |_|_|j}t	|ƒ}||krš|}t
 d| |f ¡ ||_d||d  dd…  ||d < |j}t	|ƒt	|ƒksê||dd…< t
 d¡ dS d}	xZtt	|ƒƒD ]J}
||
 ||
 ksü|	dkr$d}	|
}qü||d… ||d…< t
 d¡ dS qüW |	r\|| ||< t
 d¡ dS )	z’Construct outline for Body body.
    Update lines in Tree buffer if needed.
    This can be run from any buffer as long as Tree is set to ma.
    r   r   zcall voom#SetSnLn(%s,%s)z=%sNz
let l:ok=1FT)r@   r   r
   r2   r   r!   r   r   r    rF   r   r-   r   rH   )r   r   rA   r\   r   r   r    r[   r   Zdraw_onerP   Zdiffr   r   r   Ú
updateTree  s:    0 


rk   c             C   s2   t |  }t |j|¡}t d| |f ¡ ||_dS )z_Compute Tree lnum for node at line blnr in Body body.
    Assign Vim and Python snLn vars.
    zcall voom#SetSnLn(%s,%s)N)r@   ÚbisectÚbisect_rightr   r   r-   r    )r   rM   rA   r    r   r   r   rE   X  s    rE   c             C   s   | t krt | = d S )N)r@   )r   r   r   r   Úvoom_UnVoomc  s     rn   c              C   s\  t t d¡ƒt t d¡ƒ } }t d¡}tdd ƒ |sFtd|  ƒ nxt|  }|j|ks\t‚t|jƒ td| |f ƒ td|j ƒ td	t	j
 |jj¡ ƒ |jd
kr¾td|j|j|jf ƒ tdd ƒ tdtj ƒ tdtt d¡ƒ ƒ |rXtdttƒ ƒ tdttƒ ƒ tdttƒ ƒ tdttƒ ƒ tdt	j
 tjd j¡ ƒ t|ƒ d S )Nzl:bodyzl:treez	l:vimvarsz%s CURRENT VOoM OUTLINE %s)z
----------z------------------z&current buffer %s is not a VOoM bufferzBody buffer %s, Tree buffer %szmarkup mode:      %szmarkup mode file: "%s"r   z$headline markers: %s1, %s2, %s3, ...z%s VOoM INTERNALS %s)z
----------z------------------------zPython version: %szs:PYCMD = %szs:PYCMDz_VOoM2657.FT_MODES = %sz_VOoM2657.DEFAULT_MODE = %sz_VOoM2657.CLIPBOARD = %sz%_VOoM2657.ALWAYS_ALLOW_MOVE_LEFT = %sz_VOoM2657 :     "%s"zvoom_vimplugin2657.voom_vim)r   r   r	   Úprintr@   r   r
   r!   r0   ÚosÚpathÚabspathr/   Ú__file__r   r8   r*   ÚversionÚreprr&   r(   Ú	CLIPBOARDÚALWAYS_ALLOW_MOVE_LEFTr+   )r   r   ZvimvarsrA   r   r   r   Úvoom_Voominfog  s.    


rx   c              C   sB   t rt ¡  tjd= x(ttj ¡ ƒD ]} |  d¡r$tj| = q$W d S )Nzvoom_vimplugin2657.voom_vimzvoom_vimplugin2657.)ÚIS_PY2r*   Z	exc_clearr+   ÚlistÚkeysÚ
startswith)Úkr   r   r   Úvoom_ReloadAllPre‚  s    
r~   c             C   s>   | j }|dks|t|ƒkrdS ||d  || k r6dS dS dS )z1Determine if node at Tree line lnum has children.r   FTN)r   rF   )rA   Úlnumr   r   r   r   ÚnodeHasChildren’  s      r€   c             C   s^   | j }t|ƒ}|dks||kr"dS ||d  }x&t||ƒD ]}|| |kr:|| S q:W || S )z2Number of all subnodes for node at Tree line lnum.r   r   )r   rF   rH   )rA   r   r   rN   rb   rP   r   r   r   ÚnodeSubnodesš  s     r   c             C   sP   | j }||d  }|dkrdS x,t|d ddƒD ]}|| |k r0|d S q0W dS )z8Return lnum of closest parent of node at Tree line lnum.r   Nr   r   éÿÿÿÿ)r   rH   )rA   r   r   rb   rP   r   r   r   Ú
nodeParent¦  s      rƒ   c             C   s~   | j }||d  }|dkrg S g }xNt|d ddƒD ]:}|| }||k r4|}| |d ¡ |dkr4| ¡  |S q4W | ¡  |S )z4Return lnums of ancestors of node at Tree line lnum.r   r   r   r‚   )r   rH   rJ   Úreverse)rA   r   r   rb   Z	ancestorsrP   Úlevir   r   r   ÚnodeAncestors¯  s     r†   c                sD   | j ‰ | j}|dkrdgS t| |ƒ}| |¡ ‡ fdd„|D ƒ}|S )zICompute UNL of node at Tree line lnum.
    Return list of headlines.
    r   ztop-of-bufferc                s$   g | ]}ˆ |d     dd ¡d  ‘qS )r   ú|)r7   )Ú.0Úln)r   r   r   ú
<listcomp>Ë  s    znodeUNL.<locals>.<listcomp>)r   r   r†   rJ   )rA   r   r   ÚparentsÚheadsr   )r   r   ÚnodeUNLÂ  s     

r   c             C   s¤   | j }||d  }g }xFt|d ddƒD ]2}|| }||k r@P q(||kr(|d g|dd…< q(W x@t|t|ƒƒD ].}|| }||k r†P qn||krn| |d ¡ qnW |S )a  Return lnums of siblings for node at Tree line lnum.
    These are nodes with the same parent and level as lnum node. Sorted in
    ascending order. lnum itself is included. First node (line 1) is never
    included, that is minimum lnum in results is 2.
    r   r   r‚   )r   rH   rF   rJ   )rA   r   r   rb   ÚsiblingsrP   r…   r   r   r   ÚnodeSiblingsÏ  s     r   c             C   sr   |dkrd}||krdS | j }||d  }|g}x<t||ƒD ].}|| }||k rTdS ||kr<| |d ¡ q<W |S )a  Return lnums of siblings for nodes in Tree range lnum1,lnum2.
    These are nodes with the same parent and level as lnum1 node.
    First node (first Tree line) is never included, that is minimum lnum in results is 2.
    Return None if range is ivalid.
    r   r   N)r   rH   rJ   )rA   Úlnum1Úlnum2r   rb   rŽ   rP   r…   r   r   r   ÚrangeSiblingsé  s      r’   c                s  |sg S | j ‰ |d |d  }}|t| |ƒ }‡ fdd„t||ƒD ƒ}|sP|gS ˆ |d  d|fg}xp|D ]h}|d g}ˆ | }x@t|d |ƒD ].}	ˆ |	 }
|
|kr´| |	d ¡ q|
|k rP qW | |||f¡ qjW | ¡  | ¡  dd„ |D ƒ}t|ƒd t|ƒkst‚|S )a‰  Return list of groups of siblings in the region defined by 'siblings'
    group, which is list of siblings in ascending order (Tree lnums).
    Siblings in each group are nodes with the same parent and level.
    Siblings in each group are in ascending order.
    List of groups is reverse-sorted by level of siblings and by parent lnum:
        from RIGHT TO LEFT and from BOTTOM TO TOP.
    r   r‚   c                s$   g | ]}ˆ |d   ˆ | k r|‘qS )r   r   )rˆ   rP   )r   r   r   rŠ     s    z%getSiblingsGroups.<locals>.<listcomp>r   c             S   s   g | ]}|d  ‘qS )r   r   )rˆ   rP   r   r   r   rŠ     s    )r   r   rH   rJ   Úsortr„   rF   r
   )rA   rŽ   r   r‘   r‹   Zresults_decÚpÚsibsrb   rP   r…   Úresultsr   )r   r   ÚgetSiblingsGroupsþ  s0     

r—   c             C   sP   | j |d  }|r |t| |ƒ7 }|t| j ƒk r>| j | d }n
t| jƒ}||fS )z‰Return Body start and end lnums (bln1, bln2) corresponding to nodes at
    Tree lnums ln1 to ln2. Include ln2's subnodes if withSubnodes.r   )r   r   rF   r   )rA   Úln1Úln2ÚwithSubnodesÚbln1Úbln2r   r   r   ÚnodesBodyRange$  s    
r   c              C   sŠ   t t d¡ƒ} t t d¡ƒ}t| }| |_t d|j| d   ¡ | t|jƒk rnt d|j|  d pfd ¡ nt dt|jƒd  ¡ d S )Nzl:lnumzl:bodyzlet l:blnum1=%sr   zlet l:blnum2=%s)	r   r   r	   r@   r    r-   r   rF   r   )r   r   rA   r   r   r   Úvoom_TreeSelect6  s    rž   c        
      C   sØ   t t d¡ƒ} t|  }|j}|j}|j}t|ƒ}g }xŒtd|ƒD ]~}||| d  }|| 	|¡ 
¡ d … }	|	spq@|	d dkrŒ| |d ¡ q@|	d dkr@|	dd … r@|	d dkr@| |d ¡ q@W t dt|ƒ ¡ d S )Nzl:bodyr   r   rD   r   zlet l:lnums=%s)r   r   r	   r@   r   r   r;   rF   rH   rG   rI   rJ   r-   ru   )
r   rA   r   r   r;   rN   ZlnumsrP   rQ   rR   r   r   r   Úvoom_TreeToStartupNodeF  s$     rŸ   c              C   sü   t  d¡} tt  d¡ƒ}tt  d¡ƒ}tt  d¡ƒ}t| }|j|ksJt‚| dkr`t |j|¡}t	||ƒ}d 
|¡}t  d| dd	¡ ¡ t  d
¡ xH|d d… D ]8}t  d| dd	¡ ¡ t  d¡ t  d¡ t  d¡ q¢W t  d|d  dd	¡ ¡ d S )Nz	l:bufTypezl:bodyzl:treezl:lnumr   z -> zlet @n='%s'r   z''zecho ''r‚   z
echon '%s'zechohl TabLineFillzechon ' -> 'zechohl None)r   r	   r   r@   r   r
   rl   rm   r   r   Újoinr-   r.   )ZbufTyper   r   r   rA   rŒ   ÚUNLre   r   r   r   Úvoom_EchoUNL\  s$    





r¢   c              C   s¼  t t d¡ƒ} t t d¡ƒ}t|  }|j|ks2t‚|j}t d¡t d¡ }}t d¡t d¡ }}g g  }}	i }
i }i }d}x(|D ]}i }x~|D ]v}t |ƒ}t ||¡}d||< ||
krÐ|
|  d7  < nd|
|< ||krê|||< q–|| |ks|
| dkr–|||< q–W t || ƒr”xtt	| 
¡ ƒD ]d}t||ƒ}xRt|d || d ƒD ]8}||krRd||< d|
|< ||d  ||< d||< qRW q,W |d7 }| |¡ q†W d}xª|D ]¢}i }x*|D ]"}t |ƒ}t ||¡}d||< qÂW t || ƒrBxJt	| 
¡ ƒD ]:}t||ƒ}x(t|d || d ƒD ]}d||< q*W qW |d7 }|	 |¡ q´W |szi  tdt|ƒd ƒ¡g}tt||	ƒƒ}i }d}xŠ|D ]‚}|sÂ||d  ||< d|
|< d	||< n,|ræ||krÜd	||< nd
||< nd
||< td||
| || f ƒ}||kr–|}q–W g }x‚|D ]z}td||
| || f ƒ}d||  }d t||ƒ¡ dd¡}d|| ||
| ||f }d||| | f }| |¡ q&W t dd |¡ ¡ d S )Nzl:bodyzl:treezl:matchesANDzl:matchesNOTzl:inhANDzl:inhNOTr   r   ÚnÚNz%s%s%srU   z -> r   z''z%s%s:%s%s|%sz&{'text':'%s', 'lnum':%s, 'bufnr':%s}, zcall setqflist([%s],'a')Ú )r   r   r	   r@   r   r
   r   rl   rm   rz   r{   r   rH   rJ   ÚfromkeysrF   ÚsortedÚintersectDictsr    r   r.   r-   )r   r   rA   r   Z
matchesANDZ
matchesNOTZinhANDZinhNOTZ	tlnumsANDZ	tlnumsNOTZcountsZblnumsZinh_onlyZidxÚLZtlnumsÚblnZtlnÚtZsubnri   r–   ZnNsZmax_sizeÚsizeZloclistZspacesr¡   ÚtextÚdr   r   r   Ú	voom_Grept  sš    















r¯   c             C   sŠ   | si S t | ƒdkr| d }n>i }x8| d D ],}x&| dd… D ]}||kr>P q>W d||< q,W x(|D ] }x|D ]}||krl||= qlW qbW |S )z­Arguments are two lists of dictionaries. Keys are Tree lnums.
    Return dict: intersection of all dicts in dictsAND and non-itersection with
    all dicts in dictsNOT.
    r   r   N)rF   )ZdictsANDZdictsNOTZresÚkeyr®   r   r   r   r¨   à  s    


r¨   c          
   C   s\   g }d}xN| D ]F}|  d|dd… d|||  d  || d¡d… f ¡ |d7 }qW |S )zšSet level of each Tree line in tlines to corresponding level from levels.
    levels should be VO.levels.
    j is index of the first item in levels.
    r   z%s%s%sNr   z. r   r‡   )rJ   Úindex)r\   r   Újr–   rP   r«   r   r   r   ÚsetLevTreeLines  s    
:r³   c             C   sT   |dkr|S | j  |¡}t| d¡ƒ}d|d| d¡… || || d¡d… f S )z’Increase or decrease level number of Body headline by levDelta.
    NOTE: markup modes can replace this function with hook_changeLevBodyHead.
    r   r   z%s%s%sN)r;   rG   r   rV   rW   rI   )rA   re   ÚlevDeltara   Úlevelr   r   r   r6     s
     r6   c             C   s    d}d|| j |f dg}||fS )z Return (tree_head, bodyLines).
    tree_head is new headline string in Tree buffer (text after |).
    bodyLines is list of lines to insert in Body buffer.
    ZNewHeadlinez---%s--- %s%sr¥   )r8   )rA   rµ   Zblnumr‰   Ú	tree_headÚ	bodyLinesr   r   r   r5     s    r5   c             C   st   t  dt|  dd¡f ¡ tr(t| ƒ}nt|  tƒ d¡ƒ}t  dt ¡d| kspt  dt ¡ t  dt ¡ d	S d
S )z3Set Vim register CLIPBOARD (usually +) to string s.zlet @%s = '%s'r   z''r.   zlen(@%s)z%szEcall voom#ErrorMsg('VOoM: error setting clipboard (Vim register %s)')z
let @%s=''r‚   r   )	r   r-   rv   r.   ry   rF   Úencoder#   r	   )ri   Zlen_sr   r   r   ÚsetClipboard&  s    
r¹   c              C   sF  t t d¡ƒt t d¡ƒ } }t|  }|j|ks4t‚d}| ||j¡\}}}t|j	ƒt|ƒd ks~t 
d¡ t 
d¡ d}d S |jgdgdg  |dd…< |dd…< |dd…< |j}d	||d  dd …  ||d < |j|ksöt 
d
¡ t 
d¡ d S |j|ksd}t 
d¡ |j	d d … |ks2d}t 
d¡ |rBt 
d¡ d S )Nza:bodyza:treeTr   zHcall voom#ErrorMsg('VOoM: outline verification failed: wrong Tree size')zYcall voom#ErrorMsg('VOoM: OUTLINE MAY BE CORRUPT!!! YOU MUST UNDO THE LAST OPERATION!!!')Fr   z=%szEcall voom#ErrorMsg('VOoM: outline verification failed: wrong bnodes')zEcall voom#ErrorMsg('VOoM: outline verification failed: wrong levels')zIcall voom#ErrorMsg('VOoM: outline verification failed: wrong Tree lines')z
let l:ok=1)r   r   r	   r@   r   r
   r2   r   rF   r   r-   r!   r    r   r   )r   r   rA   Úokr\   r   r   r    r   r   r   Úvoom_OopVerify=  s2    

0 




r»   c              C   s¨   t t d¡ƒ} t t d¡ƒt t d¡ƒ }}|dkr8dS t|  j}t|ƒ||d   }}xJt||ƒD ]<}|| }|d |krˆ||k rˆdS |d |krd||krd|S qdW |S )a  This is part of voom#Oop() checks.
    Selection in Tree starts at line ln1 and ends at line ln2.
    Selection can have many sibling nodes: nodes with the same level as ln1 node.
    Return lnum of last node in the last sibling node's branch.
    Return 0 if selection is invalid.
    zl:bodyzl:ln1zl:ln2r   r   )r   r   r	   r@   r   rF   rH   )r   r˜   r™   r   rN   Zlev0rP   rb   r   r   r   Úvoom_OopSelEnd\  s     
  r¼   c              C   sx   t t d¡ƒt t d¡ƒ } }t t d¡ƒt t d¡ƒ }}t|  }|j|ksRt‚t|||ƒ\}}t d||f ¡ d S )Nzl:bodyzl:treezl:ln1zl:ln2zlet [l:bln1,l:bln2]=[%s,%s])r   r   r	   r@   r   r
   r   r-   )r   r   r˜   r™   rA   r›   rœ   r   r   r   Úvoom_OopSelectBodyRangeq  s    r½   c              C   s¨   t t d¡ƒt t d¡ƒ } }t t d¡ƒt d¡ }}t|  }|j|ksNt‚|dkrf|j|d  }n0|dkr–|t|jƒk rŒ|j| d }n
t|jƒ}t 	d| ¡ d S )	Nzl:bodyzl:treezl:lnumza:oprP   r   ÚIzlet l:bLnr=%s)
r   r   r	   r@   r   r
   r   rF   r   r-   )r   r   r   ÚoprA   ZbLnrr   r   r   Úvoom_OopEditz  s    
rÀ   c             C   s¢  t t d¡ƒt t d¡ƒ }}t t d¡ƒt d¡ }}t| }|j|ksNt‚|j|j|j|j	f\}}}}	||d  }
|dkr„d}
nH| r’|
d7 }
n:|t
|ƒkr n,|
|| k rÌ|dkrÄ|t||ƒ7 }n|
d7 }
d||	d  dd …  ||	d < |t
|ƒk r
|j| d }nt
|ƒ}| ||
||¡\}}dd	|
d  |f }|g|||…< ||||…< t d
|d  ¡ d|| dd …  ||< |d |_	t d||d f ¡ d S )Nzl:bodyzl:treezl:lnzl:ln_statusr   ÚfoldedrU   z= %s|%sz. zlet l:bLnum=%srD   zcall voom#SetSnLn(%s,%s))r   r   r	   r@   r   r
   r   r   r   r    rF   r   r   r5   r-   )Zas_childr   r   r‰   Ú	ln_statusrA   r   r   r   r    rb   ZbLnumr¶   r·   ZtreeLiner   r   r   Úvoom_OopInsert‰  s8      
   
rÃ   c        	      C   sœ   t t d¡ƒ} t t d¡ƒt t d¡ƒ }}t|  }|j|j }}||d  }|t|ƒk rh|| d }nt|ƒ}||d |… }td |¡ƒ t 	d¡ d S )Nzl:bodyzl:ln1zl:ln2r   Ú
zlet l:pyOK=1)
r   r   r	   r@   r   r   rF   r¹   r    r-   )	r   r˜   r™   rA   r   r   r›   rœ   rZ   r   r   r   Úvoom_OopCopyº  s     rÅ   c              C   s  t t d¡ƒt t d¡ƒ } }t t d¡ƒt t d¡ƒ }}t t d¡ƒ}t|  }|j|ks`t‚|j|j }}|j|j	 }}	||d  }
|t
|ƒk r¢|| d }nt
|ƒ}||
d |… }td |¡ƒ}|röt d¡ t d	| |f ¡ t d
¡ d S g ||
d |…< ||d  }||
 d }x(t|t
|ƒƒD ]}||  |8  < q.W g ||d |…< g |	|d |…< |jr’| |ddd d d d |
d |d ¡	 t d| ||f ¡ |j}d||d  dd …  ||d < g ||d |…< d||d  dd …  ||d < ||_t d| ¡ t d
¡ d S )Nzl:bodyzl:treezl:ln1zl:ln2zl:lnUp1r   rÄ   z;call voom#ErrorMsg('VOoM (cut): outline operation aborted')zcall voom#OopFromBody(%s,%s,-1)zlet l:pyOK=1Zcutr   zcall voom#OopFromBody(%s,%s,%s)rU   rD   zlet l:blnShow=%s)r   r   r	   r@   r   r
   r   r   r   r   rF   r¹   r    r-   rH   r   r    )r   r   r˜   r™   ÚlnUp1rA   r   r   r   r   r›   rœ   rZ   ÚerrorÚblnShowÚdeltarP   r    r   r   r   Úvoom_OopCutÊ  sF     

"  rÊ   c                 sæ  t t d¡ƒt t d¡ƒ } }t t d¡ƒt d¡ }}t|  }|j|ksNt‚|j|j }}|j|j	 }}t dt
 ¡}	|	s¦t d¡ t d| |f ¡ t d¡ d S |	 d	¡}
| ||
¡\}}}|g ksØ|d
 dkrt d¡ t d| |f ¡ t d¡ d S |d
 }xb|D ]Z}||d
 k rLt d¡ t d| |f ¡ t d¡ d S || dkrdt d¡ |}qW ||d  }|dkr¢t|ƒdkrœ|d }nd}n@|t|ƒkr²n0||| k râ|dkrÚ|t||ƒ7 }n|d7 }||d
  ‰ ˆ r>‡ fdd„|D ƒ}|j}|r>x*|D ]"}|||
|d  ˆ ƒ|
|d < qW |t|ƒk rZ|| d }nt|ƒ}|
|||…< |d }x(td
t|ƒƒD ]}||  |7  < q†W t|
ƒ}x(t|t|ƒƒD ]}||  |7  < q¸W ||||…< ||||…< |d }|t|ƒ }|jr,| |dˆ |||t|
ƒ d |d d ¡	 t d| ||f ¡ |j}d||d  dd …  ||d < ˆ r|t|||d ƒ}||||…< t d| ¡ t d| ¡ d||d  dd …  ||d < ||_t d| ¡ t d¡ d S )Nzl:bodyzl:treezl:lnzl:ln_statusz@%sz6call voom#ErrorMsg('VOoM (paste): clipboard is empty')zcall voom#OopFromBody(%s,%s,-1)zlet l:pyOK=1rÄ   r   r   zScall voom#ErrorMsg('VOoM (paste): invalid clipboard--first line is not a headline')zGcall voom#ErrorMsg('VOoM (paste): invalid clipboard--root level error')zdcall voom#WarningMsg('VOoM (paste): inconsistent levels in clipboard--level incremented by >1', ' ')rÁ   c                s   g | ]}|ˆ  ‘qS r   r   )rˆ   rb   )r´   r   r   rŠ   F  s    z!voom_OopPaste.<locals>.<listcomp>Zpastezcall voom#OopFromBody(%s,%s,%s)rU   zlet l:ln1=%szlet l:ln2=%srD   zlet l:blnShow=%s)r   r   r	   r@   r   r
   r   r   r   r   rv   r-   r7   r2   rF   r   r6   rH   r   r    r³   )r   r   r‰   rÂ   rA   r   r   r   r   ZpTextZpBlinesZpTlinesZpBnodesZpLevelsZlev_rb   rB   Úblrª   rÈ   rP   rÉ   r˜   r™   r    r   )r´   r   Úvoom_OopPaste  sœ    










 
 
 
" 
  rÌ   c                 s˜  t t d¡ƒt t d¡ƒ } }t t d¡ƒt t d¡ƒ }}t t d¡ƒt t d¡ƒ }}t|  }|j|kspt‚|j|j }}|j|j	 }	}
|
|d  }|
|d  d |
|d  krÂ|
|d  }n|
|d  }|| ‰ |	|d  }|t
|	ƒk  rþ|	| d }nt
|ƒ}||d |… }ˆ r`|j}|r`x6|	|d |… D ]"}|||||  ˆ ƒ||| < q:W |	|d  }|}g ||d |…< |||d |d …< || d }x,t|d |d ƒD ]}|	|  |7  < q´W || }x(t|d |ƒD ]}|	|  |8  < qæW |	|d |… }g |	|d |…< ||	|d |d …< |
|d |… }ˆ r\‡ fdd	„|D ƒ}g |
|d |…< ||
|d |d …< |jrÒ| |d
ˆ |||t
|ƒ d |t
|ƒ d |d t
|ƒ |d t
|ƒ ¡	 t d| ||f ¡ |j}d||d  dd …  ||d < ||d |… }ˆ r2t||
|d ƒ}g ||d |…< |||d |d …< d||d  dd …  ||d < ||_t d| ¡ t d¡ d S )Nzl:bodyzl:treezl:ln1zl:ln2zl:lnUp1zl:lnUp2r   c                s   g | ]}|ˆ  ‘qS r   r   )rˆ   rb   )r´   r   r   rŠ   Ç  s    zvoom_OopUp.<locals>.<listcomp>Zupzcall voom#OopFromBody(%s,%s,%s)rU   rD   zlet l:blnShow=%szlet l:pyOK=1)r   r   r	   r@   r   r
   r   r   r   r   rF   r6   rH   r   r-   r    r³   )r   r   r˜   r™   rÆ   ZlnUp2rA   r   r   r   r   ÚlevOldÚlevNewr›   rœ   rZ   rB   rË   ZblnUp1rÈ   rÉ   rP   ÚnLinesÚnLevelsr    r\   r   )r´   r   Ú
voom_OopUp‚  sr     "
   rÑ   c                 s¢  t t d¡ƒt t d¡ƒ } }t t d¡ƒt t d¡ƒ }}t t d¡ƒt d¡ }}t|  }|j|kslt‚|j|j }}|j|j	 }	}
|
|d  }|
|d  }|}|t
|
ƒkr²n4|
|d  |
| k ræ|dkrÞ|t||ƒ7 }n|d7 }|| ‰ |	|d  }|	| d }||d |… }ˆ r`|j}|r`x6|	|d |… D ]"}|||||  ˆ ƒ||| < q:W |t
|	ƒk r||	| d }nt
|ƒ}||||…< g ||d |…< || }x(t|d |ƒD ]}|	|  |7  < q¸W || d }x$t||ƒD ]}|	|  |8  < qêW |	|d |… }||	||…< g |	|d |…< |j}|d || d  }||_t d	| ¡ |	|d  }|
|d |… }ˆ r’‡ fd
d„|D ƒ}||
||…< g |
|d |…< |jrð| |dˆ |||t
|ƒ d |t
|ƒ d |d |d ¡	 t d| ||f ¡ d||d  dd …  ||d < ||d |… }ˆ rJt||
|d ƒ}||||…< g ||d |…< d||d  dd …  ||d < t d| ¡ t d¡ d S )Nzl:bodyzl:treezl:ln1zl:ln2zl:lnDn1zl:lnDn1_statusr   rÁ   zlet snLn=%sc                s   g | ]}|ˆ  ‘qS r   r   )rˆ   rb   )r´   r   r   rŠ   ;  s    z voom_OopDown.<locals>.<listcomp>Zdownzcall voom#OopFromBody(%s,%s,%s)rU   rD   zlet l:blnShow=%szlet l:pyOK=1)r   r   r	   r@   r   r
   r   r   r   r   rF   r   r6   rH   r    r-   r   r³   )r   r   r˜   r™   ZlnDn1ZlnDn1_statusrA   r   r   r   r   rÍ   rÎ   ZlnInsr›   rœ   rZ   rB   rË   ZblnInsrÉ   rP   rÏ   ZsnLn_r    rÈ   rÐ   r\   r   )r´   r   Úvoom_OopDownê  s€    " 
  rÒ   c              C   sh  t t d¡ƒt t d¡ƒ } }t t d¡ƒt t d¡ƒ }}t|  }|j|ksRt‚|j|j }}|j|j	 }}d}	||d  ||d  krd}	n|j
dkr¨d}	t d	¡ |	ràt d
¡ t d| |f ¡ t d¡ t d¡ d S |j}
|
r$x6||d |… D ]"}|
|||d  dƒ||d <  qþW ||d  }||d |… }dd„ |D ƒ}|||d |…< |jr¤|t|ƒk r‚|| d }nt|ƒ}| |dd||||d d ¡	 t d
¡ t d| ||f ¡ ||d |… }t|||d ƒ}|||d |…< |j}||ksLd||d  dd …  ||d < |}d||d  dd …  ||d < ||_t d| ¡ t d¡ d S )Nzl:bodyzl:treezl:ln1zl:ln2Fr   r   TzYcall voom#ErrorMsg('VOoM: operation ''Move Right'' is not available in this markup mode')zlet &fdm=b_fdmzcall voom#OopFromBody(%s,%s,-1)zlet l:doverif=0zlet l:pyOK=1c             S   s   g | ]}|d  ‘qS )r   r   )rˆ   rb   r   r   r   rŠ   €  s    z!voom_OopRight.<locals>.<listcomp>Úrightzcall voom#OopFromBody(%s,%s,%s)rU   rD   zlet l:blnShow=%s)r   r   r	   r@   r   r
   r   r   r   r   r   r-   r6   r   rF   r³   r    )r   r   r˜   r™   rA   r   r   r   r   Ú
cannotmoverB   rª   rÈ   rÐ   Úblnum2r\   r    r   r   r   Úvoom_OopRight\  sX    




" 

  rÖ   c              C   sŒ  t t d¡ƒt t d¡ƒ } }t t d¡ƒt t d¡ƒ }}t|  }|j|ksRt‚|j|j }}|j|j	 }}d}	||d  dkrˆd}	nBt
s²|t|ƒk r²|| ||d  kr²d}	n|jdkrÊd}	t d¡ |	rt d	¡ t d
| |f ¡ t d¡ t d¡ d S |j}
|
rHx6||d |… D ]"}|
|||d  dƒ||d < q"W ||d  }||d |… }dd„ |D ƒ}|||d |…< |jrÈ|t|ƒk r¦|| d }nt|ƒ}| |dd||||d d ¡	 t d	¡ t d| ||f ¡ ||d |… }t|||d ƒ}|||d |…< |j}||kspd||d  dd …  ||d < |}d||d  dd …  ||d < ||_t d| ¡ t d¡ d S )Nzl:bodyzl:treezl:ln1zl:ln2Fr   TzXcall voom#ErrorMsg('VOoM: operation ''Move Left'' is not available in this markup mode')zlet &fdm=b_fdmzcall voom#OopFromBody(%s,%s,-1)zlet l:doverif=0zlet l:pyOK=1r‚   c             S   s   g | ]}|d  ‘qS )r   r   )rˆ   rb   r   r   r   rŠ   Å  s    z voom_OopLeft.<locals>.<listcomp>Úleftzcall voom#OopFromBody(%s,%s,%s)rU   rD   zlet l:blnShow=%s)r   r   r	   r@   r   r
   r   r   r   r   rw   rF   r   r-   r6   r   r³   r    )r   r   r˜   r™   rA   r   r   r   r   rÔ   rB   rª   rÈ   rÐ   rÕ   r\   r    r   r   r   Úvoom_OopLeftž  s\    $




" 

  rØ   c              C   s  t t d¡ƒt t d¡ƒ } }t t d¡ƒt t d¡ƒ }}t|  }|j|ksRt‚|j|j }}|j|j	 }}|j
}	xŽt|d |ƒD ]|}
||
 }|d dkr„d|d |d	d … f ||
< ||
 }||d  }|	 |¡ d¡}d|d |… ||d … f ||d < q„W t d
¡ d S )Nzl:bodyzl:treezl:ln1zl:ln2r   Úxz%sx%sr   r   zlet l:pyOK=1)r   r   r	   r@   r   r
   r   r   r   r   r;   rH   rG   rI   r-   )r   r   r˜   r™   rA   r   r   r   r   r;   rP   rd   rª   rQ   rI   r   r   r   Úvoom_OopMarkã  s     (rÚ   c              C   s  t t d¡ƒt t d¡ƒ } }t t d¡ƒt t d¡ƒ }}t|  }|j|ksRt‚|j|j }}|j|j	 }}|j
}	x”t|d |ƒD ]‚}
||
 }|d dkr„d|d |d	d … f ||
< ||
 }||d  }|	 |¡ d¡}d
|d |… ||d …  d¡f ||d < q„W t d¡ d S )Nzl:bodyzl:treezl:ln1zl:ln2r   rÙ   z%s %sr   r   z%s%szlet l:pyOK=1)r   r   r	   r@   r   r
   r   r   r   r   r;   rH   rG   rI   rX   r-   )r   r   r˜   r™   rA   r   r   r   r   r;   rP   rd   rª   rQ   rI   r   r   r   Úvoom_OopUnmarkú  s     .rÛ   c              C   sX  t t d¡ƒt t d¡ƒ } }t t d¡ƒ}t|  }|j|ksBt‚|j|j }}|j|j	 }}|j
}|dkrrd}	n||d  }	xÚ|dd … D ]Ê}
|
|	kršqŒ||
d  }| |¡ ¡ }||d … }|sÆqŒ|d dkr d|d |… ||d …  d¡f ||
d < qŒ|d d	krŒ|dd … rŒ|d dkrŒd|d |d … ||d d …  d¡f ||
d < qŒW |dkrrt d
¡ d S ||	d  }| |¡ ¡ }||d … }|s¼d| ||	d < t d
¡ d S |d dkrØt d
¡ d S |d d	kr|dd … r|d dkrt d
¡ d S |d d	kr&|d7 }d|d |… ||d … f ||	d < t d
¡ d S )Nzl:bodyzl:treezl:lnr   r   rD   z%s%sz=xor   zlet l:pyOK=1z%s=z%s=%s)r   r   r	   r@   r   r
   r   r   r   r   r;   rG   rI   rX   r-   )r   r   r‰   rA   r   r   r   r   r;   Zbln_selectedrª   rQ   rI   rR   r   r   r   Úvoom_OopMarkStartup  sT      ,$6



*
$rÜ   c             C   s  t t d¡ƒt t d¡ƒ }}t| }|j|ks4t‚| dks®t t d¡ƒt t d¡ƒ }}||k rl|| }}|dkr‚t d¡ d S ||kr®|t||ƒ }||kr®t d¡ d S | dkrÐt||ƒ}t	||||ƒ n4| d	kròt
|||ƒ}t|||ƒ n| dkrt|ƒ t d¡ d S )
Nzl:bodyzl:treeZcleanupza:ln1za:ln2r   zlet l:pyOK=1ZsaveZrestore)r   r   r	   r@   r   r
   r-   r   Ú
foldingGetÚfoldingWriteÚfoldingReadrL   ÚfoldingCleanup)Úactionr   r   rA   r˜   r™   rS   r   r   r   Úvoom_OopFolding]  s0     




râ   c             C   sÞ   g }| }x¬||d k r´t t d| ¡ƒ|krª| |¡ t t d| ¡ƒd }|}|}t d| ¡ xNt|d |ƒD ]2}t t d| ¡ƒ|krr| |¡ t d| ¡ qrW q
|d7 }q
W | ¡  x|D ]}t d| ¡ qÄW |S )z¦Get all closed folds in line range ln1-ln2, including subfolds.
    If line ln2 is visible and is folded, its subfolds are included.
    Executed in Tree buffer.
    r   zfoldclosed(%s)zfoldclosedend(%s)zkeepj normal! %sGzozkeepj normal! %sGzc)r   r   r	   rJ   r-   rH   r„   )r˜   r™   rS   r   ZfoldendZlnum0r‰   r   r   r   rÝ   |  s$    


rÝ   c             C   s2   t  d| |f ¡ x|D ]}t  d| ¡ qW dS )z¸Create folds in range ln1-ln2 from a list of closed folds in that range.
    The list must be reverse sorted. Must not contain nodes without children.
    Executed in Tree buffer.
    z?try | %s,%sfoldopen! | catch /^Vim\%%((\a\+)\)\=:E490/ | endtryzkeepj normal! %sGzcN)r   r-   )r˜   r™   rS   r‰   r   r   r   rL     s    	
rL   c             C   sN   i   |¡}g }x2t||d ƒD ] }t| |ƒr||kr| |¡ qW | ¡  |S )z_Convert list of opened/closed folds in range ln1-ln2 into list of
    closed/opened folds.
    r   )r¦   rH   r€   rJ   r„   )rA   r˜   r™   ZfoldsZfolds_flippedr‰   r   r   r   rK   ¬  s    
rK   c       
      C   sŽ   g }| j }| j}| j}xjt||d ƒD ]X}t| |ƒs6q&|||d  d  }| |¡ ¡ }	|	t|ƒk rt||	 dkrtq&q&| |¡ q&W | 	¡  |S )z!Read "o" marks in Body headlines.r   r   )
r;   r   r   rH   r€   rG   rI   rF   rJ   r„   )
rA   r˜   r™   rS   r;   r   r   r‰   rQ   rI   r   r   r   rß   »  s    
rß   c             C   s  i   |¡}| j}| j}| j}xêt||d ƒD ]Ø}t| |ƒs<q,||d  }||d  }	| |	¡ ¡ }
||k}|
t|	ƒk r²|	|
 dkr²|r°d|	d|
… |	|
d…  	d¡f ||d < q,|s,|
t|	ƒkrÔd|	 ||d < q,|	|
 dkr,d|	d|
… |	|
d… f ||d < q,W dS )z"Write "o" marks in Body headlines.r   r   z%s%sNÚoxz%soz%so%s)
r¦   r;   r   r   rH   r€   rG   rI   rF   rX   )rA   r˜   r™   rS   r;   r   r   r‰   rª   rQ   rI   ZisClosedr   r   r   rÞ   Ð  s&    

,rÞ   c             C   s¦   | j }| j}| j}xŽtdt|ƒd ƒD ]x}t| |ƒr6q&||d  }||d  }| |¡ ¡ }|t|ƒk r&|| dkr&d|d|… ||d…  d¡f ||d < q&W dS )z3Remove "o" marks from  from nodes without children.r   r   r   z%s%sNrã   )	r;   r   r   rH   rF   r€   rG   rI   rX   )rA   r;   r   r   r‰   rª   rQ   rI   r   r   r   rà   í  s    
 rà   c              C   sÎ  d} dddddddœ}t  d¡}| ¡  ¡ }x¢|D ]š}|dkrDd} q2|dkrVd|d	< q2|d
krhd|d< q2|dkrzd|d< q2|dkrŒd|d< q2|dkržd|d< q2t  d| dd¡ ¡ t  d¡ t  d¡ d S q2W |d |d  |d  dkrt  d¡ t  d¡ d S |d r&td kr&ddlma tƒ |d< t	t  d¡ƒt	t  d¡ƒ }}t	t  d¡ƒt	t  d¡ƒ }}t
| }|j|ks„t‚|j|j }	}
|j|j }}||kr¶t||ƒ}n*t|||ƒ}|sàt  d¡ t  d¡ d S d\}}| st||f|Ž\}}n<t||ƒ}x0|D ](}t||f|Ž\}}||7 }||7 }qW |dkr`t  d ¡ t  d¡ d S |dkr‚t  d!¡ t  d¡ d S |d }|d" t||d" ƒ }||d  }t  d#|||f ¡ t  d¡ d S )$NFr   )ÚoIgnorecaseÚoBytesÚoEncÚoReverseÚoFlipÚoShuffleza:qargsZdeepTrP   r   rä   Úrrç   Zfliprè   Úshuffleré   Úbytesrå   z5call voom#ErrorMsg('VOoM (sort): invalid option: %s')r   z''zucall voom#WarningMsg('VOoM (sort): valid options are: deep, i (ignore-case), r (reverse-sort), flip, shuffle, bytes')zlet l:pyOK=1zUcall voom#ErrorMsg('VOoM (sort): these options cannot be combined: r, flip, shuffle'))rë   ræ   zl:bodyzl:treezl:ln1zl:ln2z9call voom#ErrorMsg('VOoM (sort): invalid Tree selection'))r   r   z4call voom#WarningMsg('VOoM (sort): nothing to sort')z3call voom#WarningMsg('VOoM (sort): already sorted')r‚   z*let [l:blnShow,l:lnum1,l:lnum2]=[%s,%s,%s])r   r	   r%   r7   r-   r.   rë   Zrandomr#   r   r@   r   r
   r   r   r   r   r   r’   ÚsortSiblingsr—   r   )ZoDeepÚDÚoptionsr   r   r   r˜   r™   rA   r   r   r   r   rŽ   Zflag1Zflag2Zsiblings_groupsrV   ra   r£   r   r‘   rÈ   r   r   r   Úvoom_OopSort  s~    

  
 
 
 
 






 





 





rð   c             C   sj  |}t |ƒdk rdS | j| j }	}
| j| j }}t |ƒt |ƒ }}g }|sN|r”x(t|ƒD ]}|| }| d||f¡ qXW |r†| ¡  n|r’t|ƒ n–xrt|ƒD ]f}|| }|
|d   	dd¡d }t
rØ|sèt||dƒ}n|rèt||dƒ}|rô| ¡ }| |||f¡ qžW |r"|jdd„ d	d
 n| ¡  dd„ |D ƒ}||krFdS ||d d  }|d t| |d ƒ }||k r„|| d }nt |	ƒ}g }xªt|ƒD ]ž}|| }|| d }|| }||d  }|d |k rò||d  }||d  d }n.|t| |ƒ }||k r|| d }nt |	ƒ}| |	|d |… ¡ qšW t |	ƒ}||	|d |…< |t |	ƒksft‚dS )zÌSort sibling nodes. 'siblings' is list of Tree lnums in ascending order.
    This only modifies Body buffer. Outline data are not updated.
    Return progress flags (flag1,flag2), see voom_OopSort().
    r   )r   r   r   r   r‡   r.   c             S   s   | d S )Nr   r   )rÙ   r   r   r   Ú<lambda>  s    zsortSiblings.<locals>.<lambda>T)r°   r„   c             S   s   g | ]}|d  ‘qS )r   r   )rˆ   rP   r   r   r   rŠ   ‘  s    z sortSiblings.<locals>.<listcomp>)r   r   r‚   )r   r   )rF   r   r   r   r   rH   rJ   r„   rë   r7   ry   Zunicoderì   Úlowerr“   r   Úextendr
   )rA   rŽ   rä   rå   ræ   rç   rè   ré   r•   r   r   r   r   rN   r[   Zsibs_decrP   Zsibrc   Zsibs_sortedZblnum1r£   rÕ   rZ   r²   Zsib_newr›   Zsib_nextrœ   Z	node_lastZbody_lenr   r   r   rí   f  sn    




rí   c             C   sh   t t d¡ƒ}t| }t t d¡ƒ}t d¡dkr@t |j|¡}t|||| ƒ\}}t d||f ¡ d S )Nzl:bodyza:lnumz	l:bufTyper   zlet [l:bln1,l:bln2]=[%s,%s])	r   r   r	   r@   rl   rm   r   r   r-   )rš   r   rA   r   r›   rœ   r   r   r   Úvoom_GetVoomRange¿  s    rô   c              C   sZ   t t d¡ƒ} t t d¡ƒt t d¡ƒ }}t|  }t|||ƒ\}}t d||f ¡ d S )Nzl:bodyza:ln1za:ln2zlet [l:bln1,l:bln2]=[%s,%s])r   r   r	   r@   r   r-   )r   r˜   r™   rA   r›   rœ   r   r   r   Úvoom_GetBufRangeÉ  s
    rõ   c              C   sÊ   t  d¡dkr$ttt  d¡ƒ j} nt jj} tt  d¡ƒtt  d¡ƒ }}| |d |… }dtƒ  }d|d	|d
  d	 |¡f }t t	j
d dœ}yt||ƒ W n   t||ƒ Y nX td||f ƒ d S )Nz	l:bufTyper   zl:bodyzl:bln1zl:bln2r   z# -*- coding: %s -*-z%s
%s%s
rÄ   r   zvoom_vimplugin2657.voom_vim)r   Ú	_VOoM2657z"---end of Python script (%s-%s)---)r   r	   r@   r   r   r   r   r#   r    r*   r+   ÚexecÚprintTracebackro   )ZBufr›   rœ   rZ   r$   Z_code_Z_globs_r   r   r   Ú	voom_ExecÑ  s    
rù   c             C   sˆ   d}z t  ¡ \}}}t |||¡}W dd } }}X |sHt j d¡ dS d| |f }| dkrd|d7 }|g|dd…< t j d |¡¡ dS )z6Print traceback from exception caught during Voomexec.Nz1ERROR: Voomexec failed to format Python tracebackz+  ...exception executing script (%s-%s)...
r   z<  ...subtract 1 from traceback lnums to get buffer lnums...
r   r¥   )r*   Úexc_infoÚ	tracebackÚformat_exceptionÚstderrÚwriter    )r›   rœ   ZoutZetypeÚvalueÚtbÚinfor   r   r   rø   ÿ  s    rø   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚLogBufferClasszLA file-like object for replacing sys.stdout and sys.stdin with a Vim buffer.c             C   sD   t jj| _t  d¡| _dt | jd< d| _tr@tƒ | _	t
dƒ| _d S )Nz	bufnr("")zPython %s Log buffer ...r   FrU   )r   r   r   r	   ÚlogbnrÚ
PY_VERSIONr    ry   r#   ÚencodingÚtypeÚtype_u)r   r   r   r   r     s    
zLogBufferClass.__init__c             C   s$  |sdS t  d| j ¡dkr^t  d| j ¡ t  d¡ t  dt|ƒ dd¡ ¡ t  d	¡ dS y^tr~t|ƒ| jkr~| 	| j
¡}| jrš| jd
 | }| jd
= |d
 dk | _| j | ¡ ¡ W nX   t ¡  ¡ }| j d¡ | j d¡ | j t|ƒ¡ | j |¡ | j d¡ Y nX t  d¡ dS )z8Append string to buffer, scroll Log windows in all tabs.Nzbufloaded(%s)Ú0zQcall voom#ErrorMsg('VOoM (PyLog): PyLog buffer %s is unloaded or doesn''t exist')z;call voom#ErrorMsg('VOoM (PyLog): unable to write string:')z
echom '%s'r   z''zPcall voom#ErrorMsg('VOoM (PyLog): please try executing command :Voomlog to fix')r‚   rÄ   r¥   z(VOoM: exception writing to PyLog buffer:zcall voom#LogScroll())r   r	   r  r-   ru   r.   ry   r  r  r¸   r  r    r   rJ   Ú
splitlinesrû   Z
format_exc)r   ri   Z	exc_linesr   r   r   rþ   #  s0     

zLogBufferClass.writeN)r   r   r   r   r   rþ   r   r   r   r   r    s   
r  c              C   s   t  d¡} | dkrdS | S )zReturn Vim internal encoding.z&enc)zutf-8zucs-2zucs-2lezutf-16zutf-16lezucs-4zucs-4lezutf-8)r   r	   )r$   r   r   r   r#   U  s    
r#   )F)F)r   )Rr   r   r*   rp   r<   rû   rl   rë   Úversion_infor  ry   ÚrangerH   r3   r9   r=   r:   r	   r&   r(   rv   r   rw   r   rC   rT   r2   r4   rj   rk   rE   rn   rx   r~   r€   r   rƒ   r†   r   r   r’   r—   r   rž   rŸ   r¢   r¯   r¨   r³   r6   r5   r¹   r»   r¼   r½   rÀ   rÃ   rÅ   rÊ   rÌ   rÑ   rÒ   rÖ   rØ   rÚ   rÛ   rÜ   râ   rÝ   rL   rK   rß   rÞ   rà   rð   rí   rô   rõ   rù   rø   r  r#   r   r   r   r   Ú<module>	   s¬   

L6 9	&
l%

	
1CuhrBEI!(QY

.?