bar.lua 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. local micro = import("micro")
  2. local buffer = import("micro/buffer")
  3. SideBar = {
  4. buffer_pane = nil,
  5. owner = nil,
  6. -- Must be initialized by user
  7. -- Initialized in mdtree
  8. callbacks = {}
  9. }
  10. function SideBar:Create(buffer_pane)
  11. self.owner = buffer_pane
  12. self:CreatePane(35)
  13. end
  14. function SideBar:CreatePane(size)
  15. -- Create and configure buffer of sidebar
  16. local sidebar_buf = buffer.NewBuffer("", "mdtree")
  17. -- Enable syntax highlighting
  18. sidebar_buf:SetOptionNative("filetype", "mdtree")
  19. -- Make the buffer unsavable and uneditable
  20. sidebar_buf.Type.Scratch = true
  21. sidebar_buf.Type.Readonly = true
  22. -- Configure status line to show nothing
  23. sidebar_buf:SetOptionNative("statusformatl", "")
  24. sidebar_buf:SetOptionNative("statusformatr", "")
  25. -- Disable window decorations
  26. sidebar_buf:SetOptionNative("ruler", false)
  27. sidebar_buf:SetOptionNative("diff", false)
  28. sidebar_buf:SetOptionNative("diffgutter", false)
  29. sidebar_buf:SetOptionNative("scrollbar", false)
  30. sidebar_buf:SetOptionNative("softwrap", true)
  31. self.buffer_pane = micro.CurPane():VSplitIndex(sidebar_buf, false)
  32. -- NOTE: Bugged with current micro version (2.0.13)
  33. -- Resize the leftmost pane instead of current
  34. -- https://github.com/zyedidia/micro/issues/3046
  35. self.buffer_pane:ResizePane(size)
  36. end
  37. function SideBar:Close()
  38. self.buffer_pane:Quit()
  39. self.buffer_pane = nil
  40. self.owner = nil
  41. end
  42. -- To prevent creation new field and modification other methods
  43. function SideBar:IsOpen()
  44. if self.buffer_pane == nil
  45. then
  46. return false
  47. else
  48. return true
  49. end
  50. end
  51. function SideBar:Insert(location, text)
  52. self.buffer_pane.Buf.EventHandler:Insert(location, text)
  53. end
  54. function SideBar:Append(text)
  55. local buf = self.buffer_pane.Buf
  56. self:Insert(buf:End(), text)
  57. end
  58. function SideBar:Clear()
  59. if self.buffer_pane ~= nil then
  60. local buf = self.buffer_pane.Buf
  61. buf.EventHandler:Remove(buf:Start(), buf:End())
  62. end
  63. end
  64. function SideBar:SelectLine(line)
  65. if line ~= nil
  66. then
  67. self.buffer_pane.Cursor.Loc.Y = line
  68. end
  69. self.buffer_pane.Cursor:DeleteSelection()
  70. self.buffer_pane:SelectLine()
  71. end
  72. function SideBar:SetActive()
  73. local tab = micro.CurTab()
  74. tab:SetActive(tab:GetPane(self.buffer_pane:ID()))
  75. self:SelectLine(0)
  76. end
  77. ------------------------------------------
  78. -- Hooks of micro
  79. -- NOTE: They aren't part of the `SideBar`
  80. -- so must use `SideBar` instead of `self`
  81. ------------------------------------------
  82. function preQuit(buffer_pane)
  83. -- Handle: when user wants to close bar via `command:Quit`
  84. if buffer_pane == SideBar.buffer_pane
  85. then
  86. SideBar:Close()
  87. return false
  88. end
  89. -- Handle when user wants to close buffer for which bar was created
  90. if buffer_pane == SideBar.owner
  91. then
  92. SideBar:Close()
  93. return true
  94. end
  95. end
  96. -- Update information on save
  97. function onSave(buffer_pane)
  98. if not buffer_pane == SideBar.owner
  99. then
  100. SideBar.callbacks:Update()
  101. end
  102. end
  103. -- Handle if user edited document to show correct information
  104. function onSetActive(buffer_pane)
  105. if buffer_pane == SideBar.buffer_pane
  106. then
  107. SideBar.callbacks:Update()
  108. end
  109. end
  110. -- Handle when user wants to select some entry
  111. function preInsertNewline(buffer_pane)
  112. if buffer_pane == SideBar.buffer_pane
  113. then
  114. SideBar.callbacks:Jump(SideBar.buffer_pane.Cursor.Y)
  115. return false
  116. end
  117. end
  118. ------------------------------------------
  119. -- Cursor movement hooks
  120. ------------------------------------------
  121. -- NOTE: Workaround that emulates normal Deselect behavior
  122. function preCursorDown(buffer_pane)
  123. if buffer_pane == SideBar.buffer_pane
  124. then
  125. buffer_pane:Deselect()
  126. buffer_pane.Cursor:End()
  127. buffer_pane.Cursor:Down()
  128. SideBar:SelectLine()
  129. return false
  130. end
  131. return true
  132. end
  133. -- Can be used instead of above workaround after micro merge https://github.com/zyedidia/micro/pull/3091
  134. -- function onCursorDown(buffer_pane)
  135. -- if buffer_pane == SideBar.buffer_pane
  136. -- then
  137. -- SideBar:SelectLine()
  138. -- end
  139. -- return true
  140. -- end
  141. function onCursorUp(buffer_pane)
  142. if buffer_pane == SideBar.buffer_pane
  143. then
  144. SideBar:SelectLine()
  145. end
  146. return true
  147. end
  148. -- TODO: Handle when user tries to interact with bar in any way different from
  149. -- up, down select
  150. function preCursorRight(buffer_pane)
  151. if buffer_pane == SideBar.buffer_pane
  152. then
  153. return false
  154. end
  155. return true
  156. end
  157. function preCursorLeft (buffer_pane)
  158. if buffer_pane == SideBar.buffer_pane
  159. then
  160. return false
  161. end
  162. return true
  163. end