mirror of
https://github.com/Foltik/dotfiles
synced 2025-03-24 20:42:40 -04:00
Clean parse script and start text menu
This commit is contained in:
parent
096dc8f0f3
commit
0b4052798e
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
|||||||
*.swp
|
__pycache__/
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
from subprocess import call
|
@ -57,12 +57,24 @@ Shut up, emacs.
|
|||||||
(setq ring-bell-function 'ignore)
|
(setq ring-bell-function 'ignore)
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
** Show relative line numbers
|
** Relative line numbers
|
||||||
|
Use the default emacs relative line numbers, but switch to absolute lines when in insert mode.
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(unless (version< emacs-version "26.1")
|
|
||||||
(setq display-line-numbers-type 'relative)
|
|
||||||
(setq linum-format " %3d ")
|
(setq linum-format " %3d ")
|
||||||
(global-display-line-numbers-mode t))
|
(setq-default display-line-numbers 'relative
|
||||||
|
display-line-numbers-widen t
|
||||||
|
display-line-numbers-current-absolute t)
|
||||||
|
|
||||||
|
(defun foltz-relative-numbers ()
|
||||||
|
(setq-local display-line-numbers 'relative))
|
||||||
|
|
||||||
|
(defun foltz-absolute-numbers ()
|
||||||
|
(setq-local display-line-numbers t))
|
||||||
|
|
||||||
|
(add-hook 'evil-insert-state-entry-hook #'foltz-absolute-numbers)
|
||||||
|
(add-hook 'evil-insert-state-exit-hook #'foltz-relative-numbers)
|
||||||
|
|
||||||
|
(global-display-line-numbers-mode t)
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
** y or n prompts
|
** y or n prompts
|
||||||
@ -158,6 +170,7 @@ See [[https://github.com/noctuid/general.el#which-key-integration][here]] for wh
|
|||||||
:prefix "SPC"
|
:prefix "SPC"
|
||||||
"m" '(:ignore t :which-key "major-mode...")
|
"m" '(:ignore t :which-key "major-mode...")
|
||||||
"o" '(:ignore t :which-key "org-mode...")
|
"o" '(:ignore t :which-key "org-mode...")
|
||||||
|
"p" '(:ignore t :which-key "projectile-mode...")
|
||||||
"g" '(:ignore t :which-key "git...")
|
"g" '(:ignore t :which-key "git...")
|
||||||
"h" '(:ignore t :which-key "help...")
|
"h" '(:ignore t :which-key "help...")
|
||||||
"b" '(:ignore t :which-key "buffer...")
|
"b" '(:ignore t :which-key "buffer...")
|
||||||
@ -181,6 +194,9 @@ See [[https://github.com/noctuid/general.el#which-key-integration][here]] for wh
|
|||||||
:prefix "SPC o")
|
:prefix "SPC o")
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
**** p - projectile-mode
|
||||||
|
Since we will be binding the entire projectile-mode
|
||||||
|
keymap to this, we don't actually need a definer.
|
||||||
**** g - git
|
**** g - git
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(general-create-definer foltz-git-def
|
(general-create-definer foltz-git-def
|
||||||
@ -591,6 +607,17 @@ Keybinds [here](https://github.com/emacs-evil/evil-magit)
|
|||||||
:after evil))
|
:after evil))
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
** Projects
|
||||||
|
Projectile provides project-level features like
|
||||||
|
make shortcuts and file switching
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(use-package projectile
|
||||||
|
:bind-keymap
|
||||||
|
:general
|
||||||
|
(foltz-leader-def
|
||||||
|
:states 'normal
|
||||||
|
"p" '(:keymap projectile-command-map)))
|
||||||
|
#+END_SRC
|
||||||
** Languages
|
** Languages
|
||||||
*** Fish
|
*** Fish
|
||||||
Beter editing of scripts for the fish shell
|
Beter editing of scripts for the fish shell
|
||||||
|
80
menu.py
Executable file
80
menu.py
Executable file
@ -0,0 +1,80 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import curses
|
||||||
|
from curses import panel
|
||||||
|
|
||||||
|
class Menu(object):
|
||||||
|
def __init__(self, stdscreen, items):
|
||||||
|
self.window = stdscreen.subwin(0, 0)
|
||||||
|
self.window.keypad(1)
|
||||||
|
self.panel = panel.new_panel(self.window)
|
||||||
|
self.panel.hide()
|
||||||
|
panel.update_panels()
|
||||||
|
|
||||||
|
self.position = 0
|
||||||
|
self.items = items
|
||||||
|
self.items.append(('exit', 'exit'))
|
||||||
|
|
||||||
|
def navigate(self, n):
|
||||||
|
self.position += n
|
||||||
|
self.position %= len(self.items)
|
||||||
|
|
||||||
|
def display(self):
|
||||||
|
self.panel.top()
|
||||||
|
self.panel.show()
|
||||||
|
self.window.clear()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
self.window.refresh()
|
||||||
|
curses.doupdate()
|
||||||
|
for index, item in enumerate(self.items):
|
||||||
|
if index == self.position:
|
||||||
|
mode = curses.A_REVERSE
|
||||||
|
else:
|
||||||
|
mode = curses.A_NORMAL
|
||||||
|
|
||||||
|
msg = '%d. %s' % (index, item[0])
|
||||||
|
self.window.addstr(1+index, 1, msg, mode)
|
||||||
|
|
||||||
|
key = self.window.getch()
|
||||||
|
|
||||||
|
if key in [curses.KEY_ENTER, ord('\n')]:
|
||||||
|
if self.position == len(self.items)-1:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
self.items[self.position][1]()
|
||||||
|
|
||||||
|
elif key == curses.KEY_UP:
|
||||||
|
self.navigate(-1)
|
||||||
|
|
||||||
|
elif key == curses.KEY_DOWN:
|
||||||
|
self.navigate(1)
|
||||||
|
|
||||||
|
self.window.clear()
|
||||||
|
self.panel.hide()
|
||||||
|
panel.update_panels()
|
||||||
|
curses.doupdate()
|
||||||
|
|
||||||
|
class App(object):
|
||||||
|
def __init__(self, stdscreen):
|
||||||
|
self.screen = stdscreen
|
||||||
|
curses.curs_set(0)
|
||||||
|
|
||||||
|
submenu_items = [
|
||||||
|
('beep', curses.beep),
|
||||||
|
('flash', curses.flash)
|
||||||
|
]
|
||||||
|
submenu = Menu(self.screen, submenu_items)
|
||||||
|
|
||||||
|
main_menu_items = [
|
||||||
|
('beep', curses.beep),
|
||||||
|
('flash', curses.flash),
|
||||||
|
('submenu', submenu.display)
|
||||||
|
]
|
||||||
|
main_menu = Menu(self.screen, main_menu_items)
|
||||||
|
main_menu.display()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
curses.wrapper(App)
|
||||||
|
|
||||||
|
|
22
parse.py
22
parse.py
@ -1,30 +1,34 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
|
import re
|
||||||
|
|
||||||
class Package:
|
class Package:
|
||||||
def __init__(self, line):
|
def __init__(self, line):
|
||||||
self.type = line[0]
|
self.type = line[0]
|
||||||
self.name = line[1]
|
self.name = line[1]
|
||||||
self.script = line[2] if len(line) == 3 else None
|
self.script = line[2] if len(line) == 3 else None
|
||||||
type = None
|
@staticmethod
|
||||||
name = None
|
def is_package_line(line):
|
||||||
script = None
|
return re.match(r"^[^*]+", line[0])
|
||||||
|
|
||||||
class Category:
|
class Category:
|
||||||
def __init__(self, line):
|
def __init__(self, line):
|
||||||
self.name = ' '.join(line[1:])
|
self.name = ' '.join(line[1:])
|
||||||
self.packages = []
|
self.packages = []
|
||||||
name = ''
|
@staticmethod
|
||||||
packages = []
|
def is_category_line(line):
|
||||||
|
return re.match(r"^\*+", line[0])
|
||||||
|
|
||||||
|
def split(lines):
|
||||||
|
return list(map(lambda line: line.rstrip().split(' '), lines))
|
||||||
|
|
||||||
def parse_package_listing(file):
|
def parse_package_listing(file):
|
||||||
f = open(file, 'r')
|
f = open(file, 'r')
|
||||||
lines = list(map(lambda l: l.rstrip().split(' '), f.readlines()))
|
|
||||||
categories = []
|
categories = []
|
||||||
category = None
|
category = None
|
||||||
for line in lines:
|
for line in split(f.readlines()):
|
||||||
if line[0].startswith('*'):
|
if Category.is_category_line(line):
|
||||||
category = Category(line)
|
category = Category(line)
|
||||||
categories.append(category)
|
categories.append(category)
|
||||||
elif len(line[0]) != 0:
|
elif Package.is_package_line(line):
|
||||||
category.packages.append(Package(line))
|
category.packages.append(Package(line))
|
||||||
return categories
|
return categories
|
||||||
|
Loading…
Reference in New Issue
Block a user