pymode.vim 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. " Python-mode base functions
  2. fun! pymode#Default(name, default) "{{{
  3. " DESC: Set default value if it not exists
  4. "
  5. if !exists(a:name)
  6. let {a:name} = a:default
  7. return 0
  8. endif
  9. return 1
  10. endfunction "}}}
  11. fun! pymode#Option(name) "{{{
  12. let name = 'b:pymode_' . a:name
  13. if exists(name)
  14. return eval(name)
  15. endif
  16. let name = 'g:pymode_' . a:name
  17. return eval(name)
  18. endfunction "}}}
  19. fun! pymode#QuickfixOpen(onlyRecognized, holdCursor, maxHeight, minHeight, jumpError) "{{{
  20. " DESC: Open quickfix window
  21. "
  22. let numErrors = len(filter(getqflist(), 'v:val.valid'))
  23. let numOthers = len(getqflist()) - numErrors
  24. if numErrors > 0 || (!a:onlyRecognized && numOthers > 0)
  25. botright copen
  26. exe max([min([line("$"), a:maxHeight]), a:minHeight]) . "wincmd _"
  27. if a:jumpError
  28. cc
  29. elseif !a:holdCursor
  30. wincmd p
  31. endif
  32. else
  33. cclose
  34. endif
  35. redraw
  36. if numOthers > 0
  37. echo printf('Quickfix: %d(+%d)', numErrors, numOthers)
  38. else
  39. echo printf('Quickfix: %d', numErrors)
  40. endif
  41. endfunction "}}}
  42. fun! pymode#PlaceSigns() "{{{
  43. " DESC: Place error signs
  44. "
  45. if has('signs')
  46. sign unplace *
  47. if !pymode#Default("g:pymode_lint_signs_always_visible", 0) || g:pymode_lint_signs_always_visible
  48. call RopeShowSignsRulerIfNeeded()
  49. endif
  50. for item in filter(getqflist(), 'v:val.bufnr != ""')
  51. execute printf('silent! sign place 1 line=%d name=%s buffer=%d', item.lnum, item.type, item.bufnr)
  52. endfor
  53. endif
  54. endfunction "}}}
  55. fun! pymode#CheckProgram(name, append) "{{{
  56. " DESC: Check program is executable or redifined by user.
  57. "
  58. let name = 'g:' . a:name
  59. if pymode#Default(name, a:name)
  60. return 1
  61. endif
  62. if !executable(eval(l:name))
  63. echoerr "Can't find '".eval(name)."'. Please set ".name .", or extend $PATH, ".a:append
  64. return 0
  65. endif
  66. return 1
  67. endfunction "}}}
  68. fun! pymode#TempBuffer() "{{{
  69. " DESC: Open temp buffer.
  70. "
  71. pclose | botright 8new
  72. setlocal buftype=nofile bufhidden=delete noswapfile nowrap previewwindow
  73. redraw
  74. endfunction "}}}
  75. fun! pymode#ShowStr(str) "{{{
  76. " DESC: Open temp buffer with `str`.
  77. "
  78. let g:pymode_curbuf = bufnr("%")
  79. call pymode#TempBuffer()
  80. put! =a:str
  81. wincmd p
  82. redraw
  83. endfunction "}}}
  84. fun! pymode#ShowCommand(cmd) "{{{
  85. " DESC: Run command and open temp buffer with result
  86. "
  87. call pymode#TempBuffer()
  88. try
  89. silent exec 'r!' . a:cmd
  90. catch /.*/
  91. close
  92. echoerr 'Command fail: '.a:cmd
  93. endtry
  94. redraw
  95. normal gg
  96. wincmd p
  97. endfunction "}}}
  98. fun! pymode#WideMessage(msg) "{{{
  99. " DESC: Show wide message
  100. let x=&ruler | let y=&showcmd
  101. set noruler noshowcmd
  102. redraw
  103. echohl Debug | echo strpart(a:msg, 0, &columns-1) | echohl none
  104. let &ruler=x | let &showcmd=y
  105. endfunction "}}}
  106. fun! pymode#BlockStart(lnum, ...) "{{{
  107. let pattern = a:0 ? a:1 : '^\s*\(@\|class\s.*:\|def\s\)'
  108. let lnum = a:lnum + 1
  109. let indent = 100
  110. while lnum
  111. let lnum = prevnonblank(lnum - 1)
  112. let test = indent(lnum)
  113. let line = getline(lnum)
  114. if line =~ '^\s*#' " Skip comments
  115. continue
  116. elseif !test " Zero-level regular line
  117. return lnum
  118. elseif test >= indent " Skip deeper or equal lines
  119. continue
  120. " Indent is strictly less at this point: check for def/class
  121. elseif line =~ pattern && line !~ '^\s*@'
  122. return lnum
  123. endif
  124. let indent = indent(lnum)
  125. endwhile
  126. return 0
  127. endfunction "}}}
  128. fun! pymode#BlockEnd(lnum, ...) "{{{
  129. let indent = a:0 ? a:1 : indent(a:lnum)
  130. let lnum = a:lnum
  131. while lnum
  132. let lnum = nextnonblank(lnum + 1)
  133. if getline(lnum) =~ '^\s*#' | continue
  134. elseif lnum && indent(lnum) <= indent
  135. return lnum - 1
  136. endif
  137. endwhile
  138. return line('$')
  139. endfunction "}}}
  140. fun! pymode#Modeline() "{{{
  141. let modeline = getline(prevnonblank('$'))
  142. if modeline =~ '^#\s\+pymode:'
  143. for ex in split(modeline, ':')[1:]
  144. let [name, value] = split(ex, '=')
  145. let {'b:pymode_'.name} = value
  146. endfor
  147. endif
  148. au BufRead <buffer> call pymode#Modeline()
  149. endfunction "}}}
  150. fun! pymode#TrimWhiteSpace() "{{{
  151. let cursor_pos = getpos('.')
  152. silent! %s/\s\+$//
  153. call setpos('.', cursor_pos)
  154. endfunction "}}}
  155. " vim: fdm=marker:fdl=0