Page 1 of 2

(CudaText) Использование complete_alt в плагине Python

Posted: 08.08.2018 16:43
by Alex842
Алексей, добрый день.

Можете привести пример использования "complete_alt" для вставки сниппета?
Хочу сделать кнопку, по которой бы выделенный текст обрамлялся тэгами и курсор ставился в определенное место, напр.:

Code: Select all

"{color=${0:#FFFFFF}}"+"sample text"+"{/color}"

Posted: 08.08.2018 20:35
by Alexey
ed.complete
нашел в Н плагинах-
Python Intel
HTML Completion
....

ed.complete_alt
нашел в 1 плаге-
Intext Complete
https://github.com/kvichans/cuda_intext ... nt_cmpl.py

Posted: 08.08.2018 20:37
by Alexey
Для вставки достаточно и этого
text read/write
http://wiki.freepascal.org/CudaText_API ... ad.2Fwrite

Posted: 09.08.2018 08:46
by Alex842
Спасибо за ответ. Нашёл решение, которое меня устроила, в плагине html_ops в файле "ops.py".

Code: Select all

    def font_color(self):
        s = ed.get_text_sel() 
        carets = ed.get_carets()
        if len(carets)!=1: return msg_status('Need single caret')

        x1, y1, x2, y2 = carets[0]
        
        if (y1, x1)>(y2, x2):
            x1, y1, x2, y2 = x2, y2, x1, y1

        text = '<%s>%s</%s>' % ("color=#FFFFFF", s, "color")
        ed.replace(x1, y1, x2, y2, text)
        ed.set_caret(x1+14, y1, x1+7, y1, CARET_SET_ONE)
        sel = ed.get_text_sel()

Posted: 10.08.2018 08:40
by Alexey
надеюсь, покажите плагин когда будет готово.

Posted: 10.08.2018 17:25
by Alex842
Это не плагин. Есть такая бесплатная программа RenPy для создание визуальных новелл. Вся игра пишется в редакторе на питоне + свои функции, методы и классы. Меня не устраивают идущие в комплекте редакторы кода. Хочу внедрить Cudatext. Уже сделал лексер, некоторые примеры кода закинул в сниппеты, написал плагин для обрамления выделенного текста в часто используемые тэги и повесил их на кнопки. И теперь не знаю, как лучше писать функции.
Встроенное автодополнение не очень устраивает. Оно удобно для небольших функций. Например, не хватает табстопов или хотя бы первоначальной установки курсора в нужное место. Но при этом оно нагляднее, чем сниппеты. Сразу можно понять тип записи+подсказку прочитать.
Сейчас у меня функции, где не нужны табстопы "загнаны" в автодополнение, а где много параметров - в сниппеты. Это не слишком удобно. Приходится, то ctrl-enter жать, то на tab.
В идеале мне хотелось бы в сниппетах иметь большие фрагменты кода, напр., код какой-нибудь функции, чтобы можно было легко из проекта в проект её переносить, а в автодополнении уже саму функцию с возможностью подстановки параметров.
Вот и решил разобраться с complete_alt. Возможно, что-то получится. Но пока не очень...
Делаю так:

Code: Select all

def on_complete(self, ed_self):
       txt = 'sample1\tTest\tFirst file\nsample2\tTest\tSecond'
       ed.complete_alt(txt,'sam',3,selected=0)
       return True 
В результате по ctrl-enter появляется окно с двумя строками, но при нажатии на любую из строк ничего не вставляется.

Posted: 10.08.2018 21:01
by Alexey
не вставилось потому что complete_alt сам не вставляет--
on_snippet(self, ed_self, snippet_id, snippet_text): Called when user chooses snippet to insert, in ed.complete_alt() call.
этот on_snippet еще надо как евент регнуть в install.inf.

сам вставляет только ed.complete()

Posted: 10.08.2018 21:03
by Alexey
еще тут описано
Function gets None and listbox stays open. When user chooses listbox item, event on_snippet is called, with params:

Param "snippet_id": value from complete_alt() call; on_snippet should handle only known value of snippet_id.
Param "snippet_text": text of selected item (last column).

Posted: 11.08.2018 10:03
by Alex842
Зарегистрировал . Все равно не работает. Не могу понять в чём. Алексей, а можете сделать работающий пример?
У меня сейчас в install.inf

Code: Select all

[info]
title=MySample
desc=Some description
type=cudatext-plugin
subdir=cuda_sample1
homepage=

[item1]
section=events
events=on_complete,on_snippet
В плагине:

Code: Select all

import os
from cudatext import *

class Command:

    def on_complete(self, ed_self):
        txt = 'sample1\tTest\t{color=${1:#ffffff}}{/color} file\nsample2\tTest\tSecond'
        ed.complete_alt(txt,'sam',3,selected=0)
        return True 
        
    def on_snippet(self, ed_self, snippet_id, snippet_text):
        return

Posted: 11.08.2018 15:19
by Alexey
Fixed

Code: Select all

import os
from cudatext import *

MYID='dddd'

class Command:

    def on_complete(self, ed_self):
        txt = 'sample1\tTest\t{color=${1:#ffffff}}{/color} file\nsample2\tTest\tSecond'
        ed.complete_alt(txt,MYID,3,selected=0)
        return True
       
    def on_snippet(self, ed_self, snippet_id, snippet_text):
        if snippet_id!=MYID: return
        carets=ed.get_carets()
        x, y, x1, y1 = carets[0]
        ed.insert(x, y, snippet_text)