Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Общалка aka Флуд _ Вопрос по НоутПад++

Автор: district 9.5.2009, 14:22

Вопрос: закрываю ноутпад - функции свернуты (см.картинку)... Открываю - опять зараза все развернуты. Как это можно побороть?

 

Автор: Setuper 9.5.2009, 16:52

Побороть никак. Данная фишка сделана для удобства только на время разработки.

Автор: district 9.5.2009, 16:59

Жаль... глючит иногда, перезапускать приходится. И ресурса с памятью (на откатах видимо) много кушать начинает. Но все равно спасибо, теперь хоть ясность есть.

Автор: Setuper 9.5.2009, 17:06

Хм... Глючит? Это странно. У меня за всю работу никогда не глючил.
Попробуй обновить версию.

Лично я ставлю ansi версию, так как под юникод нет плагина FunctionList, который очень удобен. С данным плагином и не нужно свёртывать функции, просто щёлкнул по нужной, и курсор установился на начало это функции big_smile.gif

Автор: ustas 9.5.2009, 19:44

Цитата(Setuper @ 9.5.2009, 18:06) *
..так как под юникод нет плагина FunctionList
есть

Автор: Setuper 9.5.2009, 20:07

где?

Есть только под ansi: http://mydc.ru/r/?http://sourceforge.net/project/showfiles.php?group_id=189927&package_id=223668

Автор: ustas 9.5.2009, 22:01

http://mydc.ru/r/?http://ifolder.ru/12033793

Автор: Nickolya 9.5.2009, 23:19

Вот зачем выкладывать хрен знает куда? Там же срок хранения есть... Прилагаю. nothing_to_say.gif

 FunctionList_unicode.rar ( 61.38 килобайт ) : 12
 

Автор: ustas 10.5.2009, 11:05

виноват, не подумал

Автор: district 10.5.2009, 15:19

Тоже хочу пять копеечек внести. Оказалось, у меня НоутПад 4.7.2 (рус). Пробовал подключить FunctionList 2 Alfa - не пошло. Порылся, нашел дллку 1.2 версии, подключил, все замечательно. Очень удобная и полезная фича. Прикреплю ее тут на всякий случай.
Когда ботик строк так на 50, то может и ничего, а вот когда под 3000 - вот тут очень много времени тратится на шарахания в поисках нужного места в коде. Тут-то плагин и выручает.

 FunctionList_1_2_dll.zip ( 69.31 килобайт ) : 4
 

Автор: Setuper 10.5.2009, 15:56

3000 строк - это жёстко. Подобного рода коды просто необходимо дробить на файлы, чтобы самому же не запутаться big_smile.gif
А вообще, советую любой достаточно большой проект дробить на файлы по функциональности того или иного класса выполняемых задач. Дробление на файлы - это хороший тон программирования. big_smile.gif

Автор: district 10.5.2009, 17:39

Так я не против разделения (дробления), кое-что уже научился делать - подключать модули способом dofile... Просто, как написано в одной мудрой книге, "Есть время разбрасывать камни, а есть время их собирать". Вот соберем все в кучу, осмыслим, что получилось, а там и подробить можно будет.

... вот кстати и вопрос сразу же, по теме. Есть несколько подключаемых модулей. В настройках выбирается, использовать тот или другой. Соответственно, они вызываюся при старте скрипта или не вызываются. А как быть с совершенно невообразимой длины ChatArrival ? Как его функционально разделить, возможно ли это? Пока что в нем предусмотрена отработка команд для всех возможных модулей, т е ChatArrival единый и неделимый.

... а впрочем чуть подумав уже раскидал. Получился центральный модуль, около 1500 строк, там в основном ChatArrival, Main, таблицы под генерацию "матричного" меню с невообразимым количеством возможных команд, да функции вспомогательные для формирования и вывода отчетности. И семь подключаемых модулей, разбитых по функциональной принадлежности... Переменные локальные в центральном модуле большей частью пришлось на глобальные переделать - а как же, без них модули работать отказываются ;) В общем, мне это нравится big_smile.gif

Автор: Setuper 10.5.2009, 21:50

Ты на верном пути. Вот только размышления не совсем верные. Нужно написать систему плагинов, которая будет подключать тот или иной модуль, и выполнять ту или иную функцию из модуля, отвечающую за то или иное действие. Центральный модуль должен содержать минимум строк для того, чтобы его можно было легко переписать под работу на другом api или вовсе под другой хаб (со своим api). Также стоит выделить отдельно модуль отсылок сообщений, модуль api функций, модуль хранилища информации (файлы или бд), модуль протокола, модуль утилит, модуль конфигурации, модуль-дебагер, модуль запросов, модуль обработки команд ну и тд. и тп. Тут дел много. Да и вот ещё... Нужно всякими способами избегать использование глобальных переменных, так как обращение к локальным переменным происходит быстрее.

Именно модульная система позволяет с минимальными затратами (переписав всего лишь пару модулей) адаптировать скрипт под работу на другом протоколе, или на другом хабе, или под другой api, или с другим типом хранения информации и тп.


Несколько слов про подключение модулей (как избежать использование глобальных переменных).

Пример:

Допустим у нас есть какой-то основной файл скрипта test.lua и файл модуля module.lua (файлы находятся в одной папке)

test.lua

Код
local sMainPath = debug.getinfo(1).source:match("^@(.+[/\\]).-$"):gsub('\\','/')
package.path = sMainPath.."?.lua;"..package.path

local mObj = require"module"


function ChatArrival(tUser, sData)
  local sBot = sData:match"%b<> !setbot%s+(%S+)|"
  if sBot then
    mObj:SetBot(sBot)
    Core.SendToUser(tUser, ("<%s> Новый бот установлен"):format(mObj:GetBot()))
  end
end


module.lua
Код
do
  local sBot = "Бот"

  return {
    SetBot = function(self, _sBot)
      sBot = _sBot
    end;

    GetBot = function(self)
      return sBot
    end;
  }
end


Хочу заметить, что существует 2 вида подключения модулей dofile и require. Тут предложен второй.
Различия между ними:
1) dofile загружает любые файлы по указанному пути, require загружает только lua или dll файлы (lua файлы ищутся в директориях, которые содержатся в переменной package.path (можешь вывести эту переменной и посмотреть содержимое - это строковая переменная), в этой переменной все пути разделены знаком ; а на место вопроса подставляется название модуля. Файлы dll загружаются по путям переменной package.cpath)
2) dofile загружает файл каждый раз при использовании, require загружает только один раз при первом обращении к этому файлу, при остальных обращениях используется старая загрузка. То есть можно сказать, что dofile передает параметры по значения, а require передаёт параметры по ссылке.

Именно из-за второго пункта можно в 10 местах (файлах) написать local mObj = require"module", однако локальная переменная local sBot будет принимать последнее значение, которое мы ей установили методом SetBot.

Вот я изложил кратко принцип загрузки и избавления от локальных переменных (принцип инкапсуляции).

А вообще по хорошему надо использовать классы, но об этом говорить я думаю (в данной ситуации) пока рано big_smile.gif

Автор: district 11.5.2009, 2:51

Цитата
2) dofile загружает файл каждый раз при использовании, require загружает только один раз при первом обращении к этому файлу, при остальных обращениях используется старая загрузка.

Вот это ценная информация, над ней надо в первую очередь подумать.
Это ж как говорил Портос, безумное расточительство, загружать каждый раз при каждом обращении (!) например какую-нибудь постоянную, неизменную таблицу.
Цитата
об этом говорить я думаю (в данной ситуации) пока рано

Это точно, сразу замахиваться на шедевр и стремиться утереть нос индусам-программерам тоже пока рановато big_smile1.gif

Автор: district 6.7.2009, 12:49

Нечаянно наткнулся на ту фишку, с поиска которой начался топик. Сочетание Alt+1 сворачивает все функции... Теперь ищу сочетание, которое разворачивает их обратно big_smile1.gif
Может все-таки быть альтернативой плагину, иногда. Он как-никак занимает часть экрана, а это не всегда удобно ( приходится включать перенос строк), да и функции искать глазами иногда удобнее не в вынесенном списке, а "вживую" .
Попутно наткнулся на очень замечательную фишку дублирования строки, на которой установлен курсор : Clrl+D

Автор: Setuper 6.7.2009, 19:09

Хехе.
Этих открытий можно было и не делать, а просто посмотреть список горячих клавиш (меню Опции -> Горячие клавиши) big_smile.gif
Кстати, там можно устанавливать свои собственные горячие клавиши big_smile.gif Например, удобно установить горячую клавишу на действие "копировать имя файла в буфер обмена".

Я для себя установил клавишу F5 - запуск приложения из командной строки, F9 - скомпилировать lua код big_smile.gif

Автор: district 7.7.2009, 3:16

Setuper
Ну дык, было бы время детально прогу изучить - и вопросов бы не было ))
Тогда еще пара вопросов.
1.Вот сместить ( табулировать ) выделенный кусок кода вправо - это понятно как, а вот влево - бывает такое ? Если да, то как это делается ?
2.Что означает "скомпилировать Lua-код"?

Автор: Setuper 7.7.2009, 12:35

А зачем влево? Есть настройка табулирования. Я себе установил, чтобы табуляция заменялась двумя пробелами - это распространённое действие.

Скомпилированный lua код - это означает использование luac для получения бинарного файла из обычного текстового.

Автор: district 7.7.2009, 13:22

Цитата
А зачем влево?

Чтобы красиво было, и было удобно читать. Чтобы for, if и т д падали четко на end. С первого раза ведь никогда не получится все по ступенькам расставить, приходится двигать куски кода вправо-влево.

Автор: Setuper 7.7.2009, 14:08

Хм... не знаю что ты там двигаешь, у меня всегда все нормально получается.
Просто нужно настроить табуляцию на замену двумя пробелами.

Автор: district 7.7.2009, 15:30

У меня тоже получается, но сдвигать влево приходится построчно.
Поэтому был ВОПРОС : Возможно ли в Ноут Пад ++ сдвигать(табулировать) группу строк влево так же легко, как сдвигается выделенная группа строк вправо.

 

Автор: PomanoB 7.7.2009, 15:37

Shift+Tab сдвигает влево

Автор: district 7.7.2009, 16:01

PomanoB
"+1", как выражается молодежь big_smile.gif

Автор: PomanoB 7.7.2009, 19:43

У меня встречный вопрос есть
Можно ли каким-нибудь образом выполнить последовательность различных команд в командную строку?
То есть запустить компилятор с параметром имя текущего файла, и скопировать получившийся файл в нужную директорию

Автор: Setuper 8.7.2009, 12:47

Можно.
Вкладка запуск, меню запуск))

Автор: PomanoB 8.7.2009, 13:53

Это понятно, мне нужно несколько команд выполнить, можно конечно bat файл сделать, но это как-то плохо

Автор: Setuper 8.7.2009, 17:37

Попробуй поюзать плагин NppExec.

Автор: PomanoB 8.7.2009, 21:54

Ок, спасибо, попробую