Cudatext Clipboard catcher (автоматическая вставка из буфера

dimon40001
Posts: 21
Joined: 05.05.2022 18:52

Post by dimon40001 »

это скорее всего реализуемо с помощью AutoKey под Linux и AutoHotKey под Windows
main Alexey
Posts: 2242
Joined: 25.08.2021 18:15

Post by main Alexey »

Желательно в CudaText включать опцию перехвата буфера обмена.
Как это реализовано в Clipboard Indicator Gnome extention, Parcellite, Qlipper, Clipman, CopyQ и т.п.
для этого программа должна перехватчик буфера ставить.
это не хорошо для простого текст редактора.
это уже вмешиваться в ОС.
mix-7
Posts: 741
Joined: 11.05.2018 11:02

Post by mix-7 »

dimon40001 wrote:это скорее всего реализуемо с помощью AutoKey под Linux и AutoHotKey под Windows

Спасибо за идею!
Только сейчас обратил внимение

How to Use AutoKey to Automate Repetitive Tasks on Linux
AutoKey is a scripting application for Linux. It lets you automate repetitive and trivial operations on your computer so you can perform them quickly and efficiently.

Some of the tasks where AutoKey serves well include text expansion, correcting typos, launching programs, and inserting boilerplate texts. Besides, you can also use it to run custom scripts to automate complex system actions on your machine.

That said, though, AutoKey can be intimidating to its first-time users. To this end, here's a guide to help you install, set up, and use AutoKey on Linux.
What Is AutoKey?

AutoKey is a free and open-source desktop automation utility for Linux. It allows you to automate various repetitive operations on your computer using hotkeys or trigger phrases so you can perform them efficiently.

GitHub - autokey/autokey: AutoKey, a desktop automation utility for Linux and X11.
https://github.com/autokey/autokey
mix-7
Posts: 741
Joined: 11.05.2018 11:02

Post by mix-7 »

main Alexey wrote: для этого программа должна перехватчик буфера ставить.
Вопрос.
Можно ли запустить (ненадолго, при необходимости) в CudaText простой (и неоптимальный из-за цикла каждые 0.1 с) скрипт

Code: Select all

import time
import sys
import pyperclip

# Based on https://github.com/bolapara/clipboardToTxt pull request.

# By preloading last_paste with the existing clipboard we avoid saving
# something from the clipboard that was put there when this tool was not
# running.  That way you can safely kill it when copying a password and
# restart it afterwards and it will not steal your sensitive paste.
last_paste = pyperclip.paste().strip()

while True:
    time.sleep(0.1)
    paste = pyperclip.paste().strip()
    if paste != last_paste:
        try:
            with open('clipboard.txt', 'a') as f:
                f.write('{}\n$\n'.format(paste))
                last_paste = paste
        except Exception as e:
            sys.stderr.write("Error: {}".format(e))
            break
(из
clipboardToTxt/clipboardToTxt.py at master · Crevette3/clipboardToTxt · GitHub
https://github.com/Crevette3/clipboardT ... rdToTxt.py )

Только модифицировав этот скрипт так, чтобы текст из clipboard писался не в файл во вкладке CudaText на место курсора.

Каким способом и какой функцией?
Где почитать?
В описании API?
main Alexey
Posts: 2242
Joined: 25.08.2021 18:15

Post by main Alexey »

наверное можно.
вот описание АПИ для clipboard:
4.3.5 app_proc - Clipboard
https://wiki.freepascal.org/CudaText_API
mix-7
Posts: 741
Joined: 11.05.2018 11:02

Post by mix-7 »

Здравствуйте, спасибо за ссылку!

Пытаюсь в консоли "прототипировать" фрагменты Cudatext Clipboard catcher.

В https://wiki.freepascal.org/CudaText#Console_panel
You can enter commands from CudaText API
Там есть примеры использование CudaText API в консоли.

Пытаюсь запомнить текущую вкладку:

Code: Select all

>>> t1 = ed
>>> =t1
<Editor h:0 id:19 title:"CudaText.wiki" gr:0 tab:18>
Перехожу в другую вкладку:

Code: Select all

>>> =t1
<Editor h:0 id:13 title:"lsp_md.json" gr:0 tab:12>
А мне нужно сохранить объект ed, связанный с одной вкладкой, куда хотел бы вставлять текст.
При переходе в другую вкладку и даже при смене фокуса на другое приложение, например, браузер.

Похоже, присваивание объектов в Python происходит по ссылке, а не по значению.
Поискал, не нашел описания.

Вопросы:

1. Как бы сохранить контекст одной вкладки даже при смене фокуса, чтобы вставлять текст именно в нее?
2. Может ли плагин работать в цикле в фоне, при смене фокуса на другое приложение? Как?
main Alexey
Posts: 2242
Joined: 25.08.2021 18:15

Post by main Alexey »

>>1. Как бы сохранить контекст одной вкладки даже при смене фокуса, чтобы вставлять текст именно в нее?

'ed' это всегда ссылка на активный таб. после смены фокуса - тоже.
вам надо запомнить хендл активного таба

h_my = ed.get_prop(PROP_HANDLE_SELF, '')
ed_my = Editor(h_my)

и вот ed_my это же ссылка на фиксированный таб!
она работает пока таб не закрыт.
работа с этим табом:

ed_my.xxxxxxxxxx()

>>2. Может ли плагин работать в цикле в фоне, при смене фокуса на другое приложение? Как?

нет. так как АПИ не дает потоков.
но можно юзать потоки питона.
но они не работают в простое программы.

реагировать на смену фокуса надо.
on_focus
on_app_deactivate
mix-7
Posts: 741
Joined: 11.05.2018 11:02

Post by mix-7 »

Спасибо!

Пока промежуточный вопрос:

CudaText API - Lazarus wiki
https://wiki.freepascal.org/CudaText_AP ... _-_General
--
on_open(self, ed_self):

Чем отличаются self и ed_self, что получает on_open при открытии файла (и другие обработчики событий) в self и ed_self?
В описании нашел только ed_self - объект, относящийся к текущая вкладке, насколько понял.
main Alexey
Posts: 2242
Joined: 25.08.2021 18:15

Post by main Alexey »

self - параметр который нужен для классов. вам он не нужен.

ed_self - обьект типа Editor. тот редактор в котором дергается событие.

для каких-то событий в ed_self дается None. все это описано в АПИ вики.
mix-7
Posts: 741
Joined: 11.05.2018 11:02

Post by mix-7 »

self - параметр который нужен для классов. вам он не нужен.
self - конкретный экземпляр класса?
Правильно?


Не могу сам разобраться вот с чем.

Code: Select all

from gi.repository import Gtk, Gdk
в начале модуля нового плагина
подвешивает CudaText!
Добавил по совету в инете

Code: Select all

import gi
gi.require_version("Gtk", "3.0") 
- не помогло, виснет.
Закомментарил, работает модуль (пока отладочная печать, подписка на events).


Gtk, Gdk нужны для работы с буфером обмена, нашел пример, как организовать обратный вызов (? hook? callback) при изменении буфера обмена.
Дело в том, что если в плагине следить в цикле за буфером обмена, то CudaText будет выполнять этот код плагина, в другую вкладку не перейдешь, чтобы редактировать или скопировать текст, команды не выполнишь, пока плагин не отдаст управление.

Посоветуйте, пожалуйста, как импортировать Gtk, Gdk и почему from gi.repository import Gtk, Gdk подвешивает плагин CudaText?

Искал "from gi.repository", нашел, что нужно установить PyGObject или python3-gi.
Но об этом были явные сообщения об ошибке Traceback. У меня же просто виснет.

PyGObject, который содержит gi.repository, установлен:

Code: Select all

pip3 install PyGObject
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: PyGObject in /usr/lib/python3/dist-packages (3.42.1)
Requirement already satisfied: pycairo>=1.16.0 in /usr/lib/python3/dist-packages (from PyGObject) (1.20.1)

Code: Select all

sudo apt install python3-gi

Уже установлен пакет python3-gi самой новой версии (3.42.1-0ubuntu1).
python3-gi помечен как установленный вручную.
Post Reply