Показать файл/папку назначения Symlink и Junction на панелях

Столкнулись с проблемой в использовании Far? Здесь можно получить помощь.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Показать файл/папку назначения Symlink и Junction на панелях

Post by John Doe »

Latest post of the previous page:

HaRT wrote: Неужто имеющийся не работает?
x64 же.
Надо будет собрать dll.
far_user2
Posts: 24
Joined: Mon 01 Dec, 2014 16:51

Показать файл/папку назначения Symlink и Junction на панелях

Post by far_user2 »

HaRT wrote: В том диалоге нажимаете F1 и читаете.
Спасибо.
Last edited by far_user2 on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Спрятан офтопик
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Показать файл/папку назначения Symlink и Junction на панелях

Post by HaRT »

far_user2, на офтопик отвечать не буду. Если хотите получить ответ на свои вопросы (не факт, что от меня), задайте их в правильной теме.
Фар есть инструмент, а не нянька. © 2009 DrKnS
far_user2
Posts: 24
Joined: Mon 01 Dec, 2014 16:51

Показать файл/папку назначения Symlink и Junction на панелях

Post by far_user2 »

John Doe wrote: Это даже не микроплагин, это наноплагин
Просьба по небольшому усовершенствованию. Есть symlink AllUsers, который ведет на C:\ProgramData. Если я использую Ваш плагин, он мне так и показывает: "C:\ProgramData"
Просьба такая - можно ли поставить ПЕРЕД строкой назначения символ что-то вроде '→', чтобы было так: "→ C:\ProgramData"
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Показать файл/папку назначения Symlink и Junction на панелях

Post by John Doe »

HaRT wrote: на офтопик отвечать не буду.
Добавлю: ключевое слово для поиска подходящей темы "wow64".
far_user2
Posts: 24
Joined: Mon 01 Dec, 2014 16:51

Показать файл/папку назначения Symlink и Junction на панелях

Post by far_user2 »

Ну а по поводу добавления в плагин символа '→' можно сделать?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Показать файл/папку назначения Symlink и Junction на панелях

Post by John Doe »

far_user2 wrote: '→' можно сделать?
Можно сделать что угодно, скрипт простой и в комментариях не нуждается.
sToLp wrote: А можно ещё такой же и для FARx64?
Собрал, вложение заменил.

Колонка теперь называется <link> (надо исправить в настройках режима панели).
User avatar
sToLp
Posts: 938
Joined: Thu 23 Jul, 2009 10:16
Has thanked: 114 times
Been thanked: 12 times

Показать файл/папку назначения Symlink и Junction на панелях

Post by sToLp »

John Doe wrote:
sToLp wrote: А можно ещё такой же и для FARx64?
Собрал, вложение заменил.

Колонка теперь называется <link> (надо исправить в настройках режима панели).
Поставил и настроил. И в x86, и в x64 работает хорошо. Удобнее стало. Благодарю Вас за полезный плагин!
far_user2
Posts: 24
Joined: Mon 01 Dec, 2014 16:51

Показать файл/папку назначения Symlink и Junction на панелях

Post by far_user2 »

John Doe wrote: Можно сделать что угодно, скрипт простой и в комментариях не нуждается.
Спасибо! Теперь гораздо нагляднее стало!!!
far_user2
Posts: 24
Joined: Mon 01 Dec, 2014 16:51

Показать файл/папку назначения Symlink и Junction на панелях

Post by far_user2 »

Вопрос к разработчикам Far Manager - а можно включить этот плагин в сборку Far по-умолчанию? Ну это в крайнем случае, хотя лучше вообще это сделать изначально, без всяких плагинов...
Dima777
Posts: 6
Joined: Mon 06 May, 2019 22:13

Показать файл/папку назначения Symlink и Junction на панелях

Post by Dima777 »

John Doe wrote: Thu 03 Sep, 2015 21:21 Приложенный микро-плагин решает задачу.

Помимо установки плагина требуется ещё в Options/File panel modes задать нужный режим панели.
В простейшем виде достаточно в поле Column types записать N,<link>

P.S.
Это даже не микроплагин, это наноплагин:
Шикарный пример реализации контент-плагинов на LUA. Это не микроплагин, а целый прорыв! Спасибо большое. Я так долго искал. Уже начал исходники на С++ пилить под себя...

И, о багах. Код вызывает far.GetReparsePointInfo(FilePath) и рушит фар, если эта строка обрабатывает \\?\C:\Users\username\OneDrive. Конкретно на папке с OneDrive падает. Она какая-то особенная. Внутри OneDrive папки имеются под папки с таким же багом. Другие ссылки, не связанные с OneDrive, обрабатывает нормально. Если в нее зайти - все ок. Но линк пустой, если F4 нажать. И фар пишет "?Ссылка?" в панелях (а не "Связь").

Code: Select all

function export.GetContentData(FilePath,ColNames)
  local data = {}
  for i,v in ipairs(ColNames) do
    if v:lower()=="link" then
      local attr = win.GetFileAttr(FilePath)
      if attr and attr:find"e" then
      	if FilePath=="\\\\?\\C:\\Users\\username\\OneDrive" then -- <======= с таким костылем не падает
      		data[i]="bug"
      	else 
      		data[i] = "→"..far.GetReparsePointInfo(FilePath)
      	end
      end
    end
  end
  return next(data) and data
end
Падение: i.imgur .com/RpI30lQ.png
F4 на OneDrive папке: i.imgur .com/1CQYn1H.png
Панель с костылем: i.imgur .com/7owTd9V.png
(пробелы в урлах сотрите, антиспам форума не пускает ссылки)
lvm
Posts: 58
Joined: Thu 13 Sep, 2018 12:48

Показать файл/папку назначения Symlink и Junction на панелях

Post by lvm »

У меня этот плагин тоже падает на определенных фолдерах

Code: Select all

╔══════════════════════════ Exception occurred ═══════════════════════════╗
║ Exception:   0xC00000FD - EXCEPTION_STACK_OVERFLOW                      ║
║ Details:     A new guard page for the stack cannot be created.          ║
║ errno:                                                                  ║
║ LastError:                                                              ║
║ NTSTATUS:                                                               ║
║ Address:     0x7FF9FC92D4CC - ntdll.dll!RtlWalkFrameChain               ║
║ Source:                                                                 ║
║ Function:    GetContentDataW                                            ║
║ Module:      C:\Program Files\Far Manager\Plugins\Links\c0link-x64.dll  ║
╟─────────────────────────────────────────────────────────────────────────╢
║           { Unload plugin } [ Stack ] [ Minidump ] [ Ignore ]           ║
╚═════════════════════════════════════════════════════════════════════════╝
Винда создает какие-то странные симлинки, фар показывает их как ?symlink?, а по ^q говорит Unknown reparse point "(data not available)", sysinternalовский junction говорит, что это UNKNOWN MICROSOFT REPARSE POINT. Это некий не очень понятный мне, но штатный процесс, я нашел, при каких условиях винда (10-64) создает их всегда: фолдеры LocalCache программ, установленных через windows store (%USERPROFILE%\AppData\Local\Packages\<program name>\LocalCache), для некоторых программ, например, для телеграма, он переходит в такое состояние при каждом запуске, те если LocalCache стереть и пересоздать как обычный фолдер (содержимое лучше сохранить, иначе слетят все настройки), и запустить телеграм, он снова станет странным симлинком. Так вот, на этих кривых симлинках плагин падает и уносит с собой фар (5439), unload plugin не помогает.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Показать файл/папку назначения Symlink и Junction на панелях

Post by John Doe »

lvm wrote: Wed 07 Aug, 2019 13:27 У меня этот плагин тоже падает на определенных фолдерах
Например каких?
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Показать файл/папку назначения Symlink и Junction на панелях

Post by HaRT »

John Doe wrote: Wed 07 Aug, 2019 14:20Например каких?
Там дальше разъяснено.
Фар есть инструмент, а не нянька. © 2009 DrKnS
lvm
Posts: 58
Joined: Thu 13 Sep, 2018 12:48

Показать файл/папку назначения Symlink и Junction на панелях

Post by lvm »

Дело оказалось в том, что для таких линков far.GetReparsePointInfo возвращает nil, если вставить обработку этого в c0link.lua, падать перестает. Ну и дальше не удержался: теперь оно показывает в одном поле ->таргет для линка или имя для обычных файлов - я использую его в статусе, и теперь, если в настройках статуса указать только <link>, но не N, он работает как mc, а кроме того, убирает из путей \??\ и не трогает ..

Code: Select all

function export.GetContentFields(ColNames)
  for i,v in ipairs(ColNames) do
    if v:lower()=="link" then return true end
  end
end

function export.GetContentData(FilePath,ColNames)
  local data = {}
  for i,v in ipairs(ColNames) do
    if v:lower()=="link" then
      local attr = win.GetFileAttr(FilePath)
      if string.find(string.reverse(FilePath),"\\")==1 then
        data[i] = ".."
      elseif attr and attr:find"e" and 	far.GetReparsePointInfo(FilePath)~=nil then
        data[i] = "->"..string.gsub(far.GetReparsePointInfo(FilePath),"\\+%?+\\","")
      else
        data[i] = string.gsub(string.sub(FilePath,-string.find(string.reverse(FilePath),"\\")+1),"\\+%?+\\","")
      end
    end
  end
  return next(data) and data
end
Last edited by lvm on Thu 08 Aug, 2019 06:40, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Показать файл/папку назначения Symlink и Junction на панелях

Post by John Doe »

Вероятно не все ещё заметили, но теперь возможности контент-плагинов доступны и в luamacro, т.е. плагин не нужен, достаточно макроса.

А вот такой вариант можно в обоих случая использовать:

Code: Select all

-- https://forum.farmanager.com/viewtopic.php?p=132337#p132337
local c0 = {
  GetContentFields = function(ColNames)
    for i,v in ipairs(ColNames) do
      if v:lower()=="link" then return true end
    end
  end;

  GetContentData = function(FilePath,ColNames)
    local data = {}
    for i,v in ipairs(ColNames) do
      if v:lower()=="link" then
        local attr = win.GetFileAttr(FilePath)
        if attr and attr:find"e" then
          data[i] = "→"..(far.GetReparsePointInfo(FilePath) or "(data not available)")
        end
      end
    end
    return next(data) and data
  end
}

if not Far then
  for k,v in pairs(c0) do export[k] = v; end
elseif ContentColumns then
  ContentColumns(c0)
end
@lvm
Спасибо за исправление.
Post Reply

Return to “Нужна помощь”