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

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

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

Сообщение LonerD »

Какие есть способы скопировать имена только выделенных файлов и каталогов? Возможно, хитрости через комбинацию cm-команд. Возможно, простым скриптом.
Стандартная команда 2017 если ничего не выделено - то копирует имя файла под курсором.
А нужно: Если что-то выделено (файлы или каталоги) - то копируем их имена (стандартная работа команды 2017). Если выделен один файл/каталог и курсор находится на нём - копируем имя этого одного файла/каталога. Если ничего не выделено - то содержимое буфера очищается. При этом положение курсора и состояние выделения не должно изменяться.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Просто в порядке реплики с места. Вспомнил тему, где обсуждалась специфика поведения выделенных объектов и объектов под курсором.
MVV писал(а):везде в тотале при отсутствии выделения файл под курсором считается выделенным (копирование/перемещение и т.п.).
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

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

Avada
И я вспомнил, заодно посмотрев тамашний скрипт, который можно модифицировать под указанную задачу, но даже в таком случае для LonerD, ессно (пока не портабл), не подойдёт..
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение 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()
Если на панели есть выделение, то всё работает. А если ничего не выделено, то получается некрасиво - после перехода к следующему расширению тот файл, который изначально был под курсором, становится выделенным.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

А может сначала снять выделение и послать нажатие Insert?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

LonerD
Ты в команде забыл tcm(2918) перед redraw() поставить в конце. И вообще можно было бы вполне обсудить по месту назначения, а не пытаться искать в отдельном топике ответ на вопрос, который исходной задачи касается только косвенно.
Последний раз редактировалось Flasher Ср авг 22, 2012 22:37, всего редактировалось 1 раз.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

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

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

Приходит в голову только алгоритм скрипта (не слишком сложный, но и не очевидный):
1. Копировать имена файлов в буфер.
2. Если в буфере несколько строк, то на этом алгоритм закончен (выделение есть).
3. Если в буфере одна строка - сохранить эту строку в переменную.
3.1. Инвертировать выделение.
3.2. Копировать имена файлов в буфер.
3.3. Инвертировать выделение.
3.4. Сравнить сохранённую переменную со строками полученного списка; если есть совпадения - то очистить буфер, иначе поместить в буфер значение сохранённой переменной.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение 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)
Последняя команда - для перерисовки курсора (поставьте что получше, если есть).
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

LonerD писал(а):Но глобальная так и осталась открытой.
Для чего эта глобальная? Зачем нужен буфер в ней? Чтобы его содержимое куда-то скопировать? Ты и так видишь, выделено у тебя что-то в панели или нет. Зачем тут костыли?
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

MVV
Спасибо, у меня было несколько другое решение, не такое элегантное.
Значит, при копировании в буфер файл под курсором в любом случае считается выделенным если отсутствуют другие выделения.
А команда 530 (Сохранить выделение временно) не считает одиночный файл выделенным. Интересное поведение, надо будет запомнить.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Можно ли каким-то образом получить тот текст (те выделенные строки), которые сохранются командой 530?
Куда они сохраняются? Куда-то в память? Можно ли считать эту информацию из памяти (каким образом) ?
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

LonerD писал(а):Можно ли считать эту информацию из памяти (каким образом) ?
Думаю, тебе на этот вопрос только Гислер ответит..
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

И то ответит, что это внутренняя память, и к ней нет доступа извне. Да и сомневаюсь, что оно в виде текста сохраняется.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Жаль, а я думал программисты смогут прояснить вопрос.

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

Вот тут упоминалось о возможности реализации проверки "нет ли в панели выделенных файлов". Интересен механизм этой проверки в случае одного файла - выделен он или просто курсор располагается на нём...
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

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