Страница 1 из 3

Копирование имён только выделенных файлов и каталогов

Добавлено: Вс авг 19, 2012 18:15
LonerD
Какие есть способы скопировать имена только выделенных файлов и каталогов? Возможно, хитрости через комбинацию cm-команд. Возможно, простым скриптом.
Стандартная команда 2017 если ничего не выделено - то копирует имя файла под курсором.
А нужно: Если что-то выделено (файлы или каталоги) - то копируем их имена (стандартная работа команды 2017). Если выделен один файл/каталог и курсор находится на нём - копируем имя этого одного файла/каталога. Если ничего не выделено - то содержимое буфера очищается. При этом положение курсора и состояние выделения не должно изменяться.

Добавлено: Вс авг 19, 2012 19:12
Avada
Просто в порядке реплики с места. Вспомнил тему, где обсуждалась специфика поведения выделенных объектов и объектов под курсором.
MVV писал(а):везде в тотале при отсутствии выделения файл под курсором считается выделенным (копирование/перемещение и т.п.).

Добавлено: Вс авг 19, 2012 19:16
Flasher
LonerD писал(а):Если ничего не выделено - то содержимое буфера очищается.
А это для чего :?:

Avada
И я вспомнил, заодно посмотрев тамашний скрипт, который можно модифицировать под указанную задачу, но даже в таком случае для LonerD, ессно (пока не портабл), не подойдёт..

Добавлено: Пн авг 20, 2012 01:35
LonerD
Да не то, чтобы не подойдёт, но очень громоздко.
Вообще дело началось с небольшой команды - перейти к следующему расширению файла с сохранением выделения.
Задача решилась вот таким способом:
TCFS2.exe /ef msg($0B,0) tcm(2017) tcm(524) tcm(527) tcm(525) tcm(3305) tcm(2053) tcm(524) tcm(2033) msg($0B,1) redraw()
Если на панели есть выделение, то всё работает. А если ничего не выделено, то получается некрасиво - после перехода к следующему расширению тот файл, который изначально был под курсором, становится выделенным.

Добавлено: Пн авг 20, 2012 09:41
MVV
А может сначала снять выделение и послать нажатие Insert?

Добавлено: Пн авг 20, 2012 16:20
Flasher
LonerD
Ты в команде забыл tcm(2918) перед redraw() поставить в конце. И вообще можно было бы вполне обсудить по месту назначения, а не пытаться искать в отдельном топике ответ на вопрос, который исходной задачи касается только косвенно.

Добавлено: Ср авг 22, 2012 03:23
LonerD
А может сначала снять выделение и послать нажатие Insert?
Вся суть в том, чтобы сохранить выделение если что-то выделено.
который исходной задачи касается только косвенно.
Данной задачи касается косвенно, потому я и не стал изначально описывать её.
Потому как могут возникать и другие задачи, требующие работы только с выделенными объектами.

PS. Да, кстати, частная задача решена.
Но глобальная так и осталась открытой.

Приходит в голову только алгоритм скрипта (не слишком сложный, но и не очевидный):
1. Копировать имена файлов в буфер.
2. Если в буфере несколько строк, то на этом алгоритм закончен (выделение есть).
3. Если в буфере одна строка - сохранить эту строку в переменную.
3.1. Инвертировать выделение.
3.2. Копировать имена файлов в буфер.
3.3. Инвертировать выделение.
3.4. Сравнить сохранённую переменную со строками полученного списка; если есть совпадения - то очистить буфер, иначе поместить в буфер значение сохранённой переменной.

Добавлено: Ср авг 22, 2012 09:39
MVV
LonerD писал(а):Вся суть в том, чтобы сохранить выделение если что-то выделено.
Посылаешь tcm(530) вместо tcm(2017), потом делаешь своё черное дело, потом посылаешь tcm(524) и tcm(529) вместо tcm(2033). А блин, тотал его сбрасывает при вызове cm_ClearAll... О, а при вызове cm_ClearAllFiles не сбрасывает! :D

Итого,

Код: Выделить всё

TCFS2.exe /u- /ef msg($0B,0) tcm(530) tcm(524) tcm(527) tcm(525) tcm(3305) tcm(2053) tcm(3304) tcm(529) redraw() msg($0B,1) tcm(2918)
Последняя команда - для перерисовки курсора (поставьте что получше, если есть).

Добавлено: Вс авг 26, 2012 14:14
Flasher
LonerD писал(а):Но глобальная так и осталась открытой.
Для чего эта глобальная? Зачем нужен буфер в ней? Чтобы его содержимое куда-то скопировать? Ты и так видишь, выделено у тебя что-то в панели или нет. Зачем тут костыли?

Добавлено: Вс авг 26, 2012 21:45
LonerD
MVV
Спасибо, у меня было несколько другое решение, не такое элегантное.
Значит, при копировании в буфер файл под курсором в любом случае считается выделенным если отсутствуют другие выделения.
А команда 530 (Сохранить выделение временно) не считает одиночный файл выделенным. Интересное поведение, надо будет запомнить.

Добавлено: Чт июн 13, 2013 15:49
LonerD
Можно ли каким-то образом получить тот текст (те выделенные строки), которые сохранются командой 530?
Куда они сохраняются? Куда-то в память? Можно ли считать эту информацию из памяти (каким образом) ?

Добавлено: Чт июн 13, 2013 15:56
Flasher
LonerD писал(а):Можно ли считать эту информацию из памяти (каким образом) ?
Думаю, тебе на этот вопрос только Гислер ответит..

Добавлено: Чт июн 13, 2013 17:06
MVV
И то ответит, что это внутренняя память, и к ней нет доступа извне. Да и сомневаюсь, что оно в виде текста сохраняется.

Добавлено: Чт июн 13, 2013 17:50
LonerD
Жаль, а я думал программисты смогут прояснить вопрос.

В частности пока не могу понять и воспроизвести алгоритм работы восстановления выделения по нажатию Esc в плагине TwinKey; создаётся впечатление что плагин считывает и запоминает результат работы команды 530 (cm_SaveSelection).

Вот тут упоминалось о возможности реализации проверки "нет ли в панели выделенных файлов". Интересен механизм этой проверки в случае одного файла - выделен он или просто курсор располагается на нём...

Добавлено: Чт июн 13, 2013 20:12
MVV
Думаю, гораздо проще послать команду сохранения выделения в файл и перехватить диалог выбора файла, чем ковыряться в памяти и искать непонятно что (сперва придется неслабо поковырять программу, чтобы найти, где что, но в другой версии всё будет в других местах).