Cudatext. Плагин breadcrumbs

mix-7
Posts: 741
Joined: 11.05.2018 11:02

Post by mix-7 »

plugins.ini

Code: Select all

[snippet_panel]
folder=Greek alphabet (lower)

[show_unsaved]
x=539
y=499
w=900
h=500

[breadcrumbs]
#20230612 
show_bar=0
#20230612 
position_bottom=1
#position_bottom=1
root_dir_source=0
show_root_parents=1
file_sort_type=name
tilde_home=1
#show_hidden_files=0
show_hidden_files=1
max_name_len=25
max_dirs_count=0
path_separator=
code_navigation=0
code_tree_height=0
dialog_width=250
dialog_height=400

[code_tree_x]
icon=/home/one/.config/cudatext/py/cuda_code_tree_x/icon.png

Здесь и далее, что добавил, окружаю строками комментариев #20230612

#20230612
добавление
#20230612
mix-7
Posts: 741
Joined: 11.05.2018 11:02

Post by mix-7 »

breadcrumbs.py (начало, дальше не правил, вернее, добавлял "print" для отладки, убрал потом):

Code: Select all

import os
import sys
from pathlib import Path
#from collections import namedtuple
from itertools import zip_longest

from cudatext import *

from cudax_lib import get_translation
_ = get_translation(__file__)  # I18N

"""
#TODO
* update icons
* handle hidden CodeTree
"""

dir_settings = app_path(APP_DIR_SETTINGS)
fn_config    = os.path.join(dir_settings, 'plugins.ini')
OPT_SEC      = 'breadcrumbs'

#20230612 
opt_show_bar          = False
#20230612 
opt_position_bottom   = True
opt_root_dir_source   = [0]
opt_show_root_parents = True
opt_tilde_home        = True
opt_file_sort_type    = 'name'
opt_show_hidden_files = False
opt_max_name_len      = 25
opt_code_navigation   = 0 # 0=off, 1=fast, 2=good
opt_max_dirs_count    = 0
opt_path_separator    = '' # empty string for os.sep
opt_code_tree_height  = 0 # 0=no change; -1=fullscreen; 1+=pixel height
opt_dialog_w          = 250
opt_dialog_h          = 400

PROJECT_DIR = None
USER_DIR    = os.path.expanduser('~')

#20230612 
#SHOW_BAR = False
#20230612 

SHOW_BAR = True
SHOW_CODE = False

#CodeItem = namedtuple('CodeItem', 'name icon')

h_tree      = app_proc(PROC_GET_CODETREE, "")


def bool_to_str(v): return '1' if v else '0'

def str_to_bool(s): return s=='1'

def hide_tree(tag='', info=''):
    if Bread._tree:
        Bread._tree.hide()


def get_project_dir():
    """ choose project root directory: .opt_root_dir_source
    """
    if 'cuda_project_man' not in sys.modules:
        return None

    import cuda_project_man

    path = None
    for optval in opt_root_dir_source:
        if optval == 0: # project file dir
            path = cuda_project_man.project_variables()["ProjDir"]
        elif optval == 1: # first node
            _nodes = cuda_project_man.global_project_info.get('nodes')
            path = _nodes[0] if _nodes else None
        elif optval == 2: # project's main-file dir
            path = cuda_project_man.global_project_info.get('mainfile')
            if path:
                path = os.path.dirname(path)

        if path:
            return path


class Command:

    def __init__(self):
        self._load_config()

        self._ed_uis = {} # h_ed -> Bread
        self.is_loading_sesh = False

        self._last_oncaret_time = 0
        self._opened_h_eds = set() # handles for editors that have been `on_open`-ed - to ignore on_focus

        Colors.update()

        # subscribe to events
        _events = 'on_open,on_save,on_state,on_focus,on_close'
        if opt_code_navigation:
            _events += ',on_caret'
        _ev_str = 'cuda_breadcrumbs;{};;'.format(_events)
        app_proc(PROC_SET_EVENTS, _ev_str)

    def _load_config(self):
        

        global PROJECT_DIR
#20230612 
        global SHOW_BAR
        global opt_show_bar
#20230612 
        global opt_position_bottom
        global opt_root_dir_source
        global opt_show_root_parents
        global opt_file_sort_type
        global opt_tilde_home
        global opt_show_hidden_files
        global opt_max_name_len
        global opt_max_dirs_count
        global opt_path_separator
        global opt_code_navigation
        global opt_code_tree_height
        global opt_dialog_w
        global opt_dialog_h

        PROJECT_DIR = get_project_dir()

        _root_dir_source_val = ini_read(fn_config, OPT_SEC, 'root_dir_source', '0')
        try:
            opt_root_dir_source = list(map(int, _root_dir_source_val.split(',') ))
        except Exception:
            print(_('NOTE: Breadcrumbs - Unable to parse option value: "root_dir_source" should be '
                    'a comma-separated string of integers 0-2'))
#20230612 
        opt_show_bar = str_to_bool(ini_read(fn_config, OPT_SEC, 'show_bar', '1'))
        SHOW_BAR = opt_show_bar 
#20230612 
        opt_position_bottom = str_to_bool(ini_read(fn_config, OPT_SEC, 'position_bottom', '1'))
        opt_show_root_parents = str_to_bool(ini_read(fn_config, OPT_SEC, 'show_root_parents', '1'))
        opt_file_sort_type = ini_read(fn_config, OPT_SEC, 'file_sort_type', opt_file_sort_type)
        opt_tilde_home = str_to_bool(ini_read(fn_config, OPT_SEC, 'tilde_home', '1'))
        opt_show_hidden_files = str_to_bool(ini_read(fn_config, OPT_SEC, 'show_hidden_files', '0'))
        opt_max_name_len = int(ini_read(fn_config, OPT_SEC, 'max_name_len', str(opt_max_name_len)))
        opt_max_dirs_count = int(ini_read(fn_config, OPT_SEC, 'max_dirs_count', str(opt_max_dirs_count)))
        opt_path_separator = ini_read(fn_config, OPT_SEC, 'path_separator', opt_path_separator)
        opt_code_navigation = int(ini_read(fn_config, OPT_SEC, 'code_navigation', str(opt_code_navigation)))
        opt_code_tree_height = int(ini_read(fn_config, OPT_SEC, 'code_tree_height', str(opt_code_tree_height)))
        opt_dialog_w = int(ini_read(fn_config, OPT_SEC, 'dialog_width', str(opt_dialog_w)))
        opt_dialog_h = int(ini_read(fn_config, OPT_SEC, 'dialog_height', str(opt_dialog_h)))

        if opt_code_navigation not in {0,1,2}:
            opt_code_navigation = 0

    def config(self):
        _root_dir_source_str = ','.join(map(str, opt_root_dir_source))
#20230612 
#       ini_write(fn_config, OPT_SEC, 'show_bar',    bool_to_str(opt_position_bottom ) ) !!!
        ini_write(fn_config, OPT_SEC, 'show_bar',    bool_to_str(opt_show_bar) )
        print(" def config(self): SHOW_BAR 3=",SHOW_BAR, "opt_show_bar=", opt_show_bar)
#20230612 
        ini_write(fn_config, OPT_SEC, 'position_bottom',    bool_to_str(opt_position_bottom) )
        ini_write(fn_config, OPT_SEC, 'root_dir_source',    _root_dir_source_str)
        ini_write(fn_config, OPT_SEC, 'show_root_parents',  bool_to_str(opt_show_root_parents) )
        ini_write(fn_config, OPT_SEC, 'file_sort_type',     opt_file_sort_type)
        ini_write(fn_config, OPT_SEC, 'tilde_home',         bool_to_str(opt_tilde_home) )
        ini_write(fn_config, OPT_SEC, 'show_hidden_files',  bool_to_str(opt_show_hidden_files) )
        ini_write(fn_config, OPT_SEC, 'max_name_len',       str(opt_max_name_len) )
        ini_write(fn_config, OPT_SEC, 'max_dirs_count',     str(opt_max_dirs_count) )
        ini_write(fn_config, OPT_SEC, 'path_separator',     opt_path_separator)
        ini_write(fn_config, OPT_SEC, 'code_navigation',    str(opt_code_navigation) )
        ini_write(fn_config, OPT_SEC, 'code_tree_height',   str(opt_code_tree_height) )
        ini_write(fn_config, OPT_SEC, 'dialog_width',       str(opt_dialog_w) )
        ini_write(fn_config, OPT_SEC, 'dialog_height',      str(opt_dialog_h) )
        file_open(fn_config)

    def on_caret(self, ed_self):

        _callback = "module=cuda_breadcrumbs;cmd=_update_callback;"
        timer_proc(TIMER_START_ONE, _callback, 500, tag=str(ed_self.h))


    def on_open(self, ed_self):
        #20230612 
        
        print("КТ on_open ed_self=", ed_self,", SHOW_BAR=",SHOW_BAR)
        #20230612 
        self._opened_h_eds.add(ed_self.get_prop(PROP_HANDLE_PRIMARY))
        self._opened_h_eds.add(ed_self.get_prop(PROP_HANDLE_SECONDARY))

        if not self.is_loading_sesh:
            breads = self._get_breads(ed_self, check_files=True)
            for b in breads:
                b.on_fn_change()

    def on_save(self, ed_self):
        #20230612 
        print("КТ on_save")
        #20230612 
main Alexey
Posts: 2245
Joined: 25.08.2021 18:15

Post by main Alexey »

мне было трудно. когда переносил правки. делал через Double Commander 'compare by contents'. лучше когда дают .diff file. его применять, это одна команда
git apply ~/p.diff
main Alexey
Posts: 2245
Joined: 25.08.2021 18:15

Post by main Alexey »

выложил обновление.
mix-7
Posts: 741
Joined: 11.05.2018 11:02

Post by mix-7 »

main Alexey wrote:лучше когда дают .diff file. его применять, это одна команда
git apply ~/p.diff
Я понимаю и согласен, но как сделать .diff file?
Наверное, самое "близкое" CudaText плагином Differ?
main Alexey wrote:выложил обновление.
Спасибо!

> Наверное, самое "близкое" CudaText плагином Differ?

Code: Select all

--- /home/one/.config/cudatext/py/cuda_breadcrumbs/source_breadcrumbs.py
+++ /home/one/.config/cudatext/py/cuda_breadcrumbs/breadcrumbs.py
@@ -19,6 +19,9 @@
 fn_config    = os.path.join(dir_settings, 'plugins.ini')
 OPT_SEC      = 'breadcrumbs'
 
+#20230612 
+opt_show_bar          = False
+#20230612 
 opt_position_bottom   = True
 opt_root_dir_source   = [0]
 opt_show_root_parents = True
@@ -36,6 +39,10 @@
 PROJECT_DIR = None
 USER_DIR    = os.path.expanduser('~')
 
+#20230612 
+#SHOW_BAR = False
+#20230612 
+
 SHOW_BAR = True
 SHOW_CODE = False
 
@@ -45,6 +52,7 @@
 
 
 def bool_to_str(v): return '1' if v else '0'
+
 def str_to_bool(s): return s=='1'
 
 def hide_tree(tag='', info=''):
@@ -97,7 +105,13 @@
         app_proc(PROC_SET_EVENTS, _ev_str)
 
     def _load_config(self):
+        
+
         global PROJECT_DIR
+#20230612 
+        global SHOW_BAR
+        global opt_show_bar
+#20230612 
         global opt_position_bottom
         global opt_root_dir_source
         global opt_show_root_parents
@@ -120,7 +134,10 @@
         except Exception:
             print(_('NOTE: Breadcrumbs - Unable to parse option value: "root_dir_source" should be '
                     'a comma-separated string of integers 0-2'))
-
+#20230612 
+        opt_show_bar = str_to_bool(ini_read(fn_config, OPT_SEC, 'show_bar', '1'))
+        SHOW_BAR = opt_show_bar 
+#20230612 
         opt_position_bottom = str_to_bool(ini_read(fn_config, OPT_SEC, 'position_bottom', '1'))
         opt_show_root_parents = str_to_bool(ini_read(fn_config, OPT_SEC, 'show_root_parents', '1'))
         opt_file_sort_type = ini_read(fn_config, OPT_SEC, 'file_sort_type', opt_file_sort_type)
@@ -139,6 +156,11 @@
 
     def config(self):
         _root_dir_source_str = ','.join(map(str, opt_root_dir_source))
+#20230612 
+#       ini_write(fn_config, OPT_SEC, 'show_bar',    bool_to_str(opt_position_bottom ) ) !!!
+        ini_write(fn_config, OPT_SEC, 'show_bar',    bool_to_str(opt_show_bar) )
+#        print(" def config(self): SHOW_BAR 3=",SHOW_BAR, "opt_show_bar=", opt_show_bar)
+#20230612 
         ini_write(fn_config, OPT_SEC, 'position_bottom',    bool_to_str(opt_position_bottom) )
         ini_write(fn_config, OPT_SEC, 'root_dir_source',    _root_dir_source_str)
         ini_write(fn_config, OPT_SEC, 'show_root_parents',  bool_to_str(opt_show_root_parents) )
@@ -155,11 +177,16 @@
         file_open(fn_config)
 
     def on_caret(self, ed_self):
+
         _callback = "module=cuda_breadcrumbs;cmd=_update_callback;"
         timer_proc(TIMER_START_ONE, _callback, 500, tag=str(ed_self.h))
 
 
     def on_open(self, ed_self):
+        #20230612 
+        
+#        print("КТ on_open ed_self=", ed_self,", SHOW_BAR=",SHOW_BAR)
+        #20230612 
         self._opened_h_eds.add(ed_self.get_prop(PROP_HANDLE_PRIMARY))
         self._opened_h_eds.add(ed_self.get_prop(PROP_HANDLE_SECONDARY))
 
@@ -169,11 +196,18 @@
                 b.on_fn_change()
 
     def on_save(self, ed_self):
+        #20230612 
+#        print("КТ on_save")
+        #20230612 
         breads = self._get_breads(ed_self)
         for b in breads:
             b.on_fn_change()
 
     def on_focus(self, ed_self):
+        #20230612 
+#        print("КТ on_focus")
+        #20230612 
+
         if ed_self.h not in self._opened_h_eds:
             return # ignore `on_focus` that happens before `on_open`
 
@@ -188,6 +222,9 @@
 
     def on_state(self, ed_self, state):
         # tree changed
+        #20230612 
+#        print("КТ on_state")
+        #20230612 
         if state == APPSTATE_THEME_UI:
             Colors.update()
             for bread in self._ed_uis.values():
@@ -220,6 +257,9 @@
 
 
     def on_close(self, ed_self):
+#20230612 
+#        print("КТ on_close")
+#20230612 
         h_ed0 = ed_self.get_prop(PROP_HANDLE_PRIMARY)
         h_ed1 = ed_self.get_prop(PROP_HANDLE_SECONDARY)
         b0 = self._ed_uis.pop(h_ed0, None)
@@ -233,12 +273,18 @@
 
     def on_cell_click(self, id_dlg, id_ctl, data='', info=''):
         # info: "<cell_ind>:<h_ed>"
+#20230612 
+#        print("КТ on_cell_click")
+#20230612 
         cell_ind, h_ed = map(int, info.split(':'))
         bread = self._ed_uis[h_ed]
         bread.on_click(cell_ind)
 
     # cmd
     def toggle_vis(self):
+#20230612 
+#        print("КТ toggle_vis global SHOW_BAR")
+#20230612 
         global SHOW_BAR
 
         SHOW_BAR = not SHOW_BAR
@@ -254,22 +300,34 @@
 
     # cmd
     def show_tree(self):
+#20230612 
+#        print("КТ show_tree")
+#20230612 
         breads = self._get_breads(ed)
         breads[0].show_file_tree()
 
     # cmd
     def show_code_tree(self):
+#20230612 
+#        print("КТ show_code_tree")
+#20230612 
         breads = self._get_breads(ed)
         breads[0].show_code_tree()
 
 
     def _update_callback(self, tag='', info=''):
+#20230612 
+#        print("КТ _update_callback")
+#20230612 
         h_ed = int(tag)
         if h_ed == ed.get_prop(PROP_HANDLE_SELF):
             self._update(ed)
 
 
     def _update(self, ed_self):
+#20230612 
+#        print("КТ _update")
+#20230612 
         if not SHOW_BAR:
             return
 
@@ -278,6 +336,9 @@
             b.update()
 
     def _get_breads(self, ed_self, check_files=False):
+#20230612 
+#        print("_get_breads")
+#20230612
         """ returns tuple of Breads in tab; usually one,  two on split tab with two files
         """
         h_ed = ed_self.get_prop(PROP_HANDLE_SELF)
@@ -321,9 +382,15 @@
 
     @property
     def current(self):
+#20230612 
+#        print("current")
+#20230612
         return self._ed_uis.get(ed.get_prop(PROP_HANDLE_SELF))
 
     def print_breads(self):
+#20230612 
+#        print("print_breads")
+#20230612
         for h_ed,bread in self._ed_uis.items():
             print(f'* bread: {h_ed:_}: {bread.ed}  -  {bread.ed.get_filename()}')
 
@@ -333,7 +400,22 @@
 
     _tree = None
 
+#20230612 
+    #Command._load_config(self) "NameError: name 'self' is not defined
+    global SHOW_BAR
+    #global SHOW_BAR
+    #_load_config(self) #NameError: name '_load_config' is not defined
+    #Command._load_config(self) # NameError: name 'self' is not defined
+    print("КТ _class Bread: SHOW_BAR=", SHOW_BAR)
+#20230612 
+
     def __init__(self, ed_self, is_visible):
+        #20230612
+        global SHOW_BAR
+#        Command._load_config(self)
+#        print("class Bread: def __init__(, SHOW_BAR=", SHOW_BAR, "is_visible=", is_visible) 
+        #20230612 
+
         _h_ed = ed_self.get_prop(PROP_HANDLE_SELF)
         self.ed = Editor(_h_ed)  if ed_self is ed else  ed_self
         self.fn = self.ed.get_filename(options="*")
@@ -360,6 +442,11 @@
 
     @property
     def tree(self):
+#20230612
+        global SHOW_BAR
+#        Command._load_config(self)
+#        print("class Bread: def tree(self), SHOW_BAR=", SHOW_BAR, "is_visible=", is_visible) 
+#20230612 
         if Bread._tree is None:
 
             from .dlg import TreeDlg
@@ -375,6 +462,11 @@
         return Bread._tree
 
     def _add_ui(self):
+#20230612
+        global SHOW_BAR
+#        Command._load_config(self)
+#        print("class Bread: _add_ui(self), SHOW_BAR=", SHOW_BAR, "self=", self) 
+#20230612
         self.hparent = self.ed.get_prop(PROP_HANDLE_PARENT)
         self.n_sb    = dlg_proc(self.hparent, DLG_CTL_ADD, 'statusbar')
         self.h_sb    = dlg_proc(self.hparent, DLG_CTL_HANDLE, index=self.n_sb)
@@ -392,11 +484,22 @@
 
 
     def reset(self):
+#20230612
+        global SHOW_BAR
+#        Command._load_config(self)
+#        print("class Bread:  def reset(self), SHOW_BAR=", SHOW_BAR, "self=", self) 
+#20230612
         self._path_items = []
         self._code_items = []
         statusbar_proc(self.h_sb, STATUSBAR_DELETE_ALL)
 
     def set_visible(self, vis):
+#20230612
+        global SHOW_BAR
+#        Command._load_config(self)
+#        print("class Bread:  set_visible(self, vis), SHOW_BAR=", SHOW_BAR, "vis=", is_vis) NameError: name 'is_vis' is not defined
+#        print("class Bread:  set_visible(self, vis), SHOW_BAR=", SHOW_BAR, "vis=", vis) 
+#20230612
         self.is_visible = vis
         if self.hparent is not None:
             dlg_proc(self.hparent, DLG_CTL_PROP_SET, index=self.n_sb, prop={'vis': vis})


Правильно?

Там много лишнего - отладочную печать еще не всю убрал.
main Alexey
Posts: 2245
Joined: 25.08.2021 18:15

Post by main Alexey »

ломает писАть подробно.
кратко.
почитайте туториалы про Git.
команды
- git diff
- git apply
- git clone (ее надо вызывать в папке 'py' куды)
mix-7
Posts: 741
Joined: 11.05.2018 11:02

Post by mix-7 »

Спасибо за наводку, вполне достаточно, потом посмотрю подробности, команды и формат .diff file для git.
(Например, diff — Википедия https://ru.wikipedia.org/wiki/Diff для начала и т.д.)
Плагин Breadcrumbs обновил через Addon Manager, работает, как задумывалось.
(Нужен иногда, но удобней, когда его строчка постоянно скрыта)
Заодно обновился и плагин LSP client.
main Alexey
Posts: 2245
Joined: 25.08.2021 18:15

Post by main Alexey »

diff формат в Гит такой же как и в других местах.
может можно и Гитом применитть файл от других тулов.

но Гит запишет файловые имени в начало файла так, а другие тулы не так.
Post Reply