Skip to content

Instantly share code, notes, and snippets.

@shmuz shmuz/OpenURL.lua
Last active Aug 29, 2015

Embed
What would you like to do?
A Far Manager Editor macro for opening URL under cursor
-- shmuel 20.06.2014 00:22:00 +0200
-- http://forum.ru-board.com/topic.cgi?forum=5&topic=31718&start=5180#15
local patt = regex.new( [=[
\b http s? :\/\/ [^\s`'"[\](){}<>]+ |
\b ftp :\/\/ [^\s`'"[\](){}<>]+ |
\b www \d* \. [^\s`'"[\](){}<>]+ |
\b mailto: [^\s`'"[\](){}<>]+ |
(?: \b [a-z]:)? (?: [\\\/]? [\w.\-]+ )+ [\\\/]?
]=], "ix")
Macro {
description="Open URL under cursor";
area="Editor"; key="CtrlEnter CtrlNumEnter";
action=function()
local s=editor.GetStringW()
if not s then return end
local pos = editor.GetInfo().CurPos
if pos > s.StringLength+1 then return end
if pos == s.StringLength+1 then pos = pos-1 end
local text, start = s.StringText.."\0", 1
while true do
local b,e = patt:findW(text,start)
--far.Show(b,e)
if b == nil or b > pos then break end
if e >= pos then
local url = win.Utf16ToUtf8(win.subW(text,b,e))
--far.Show(url)
win.ShellExecute(nil, "open", url)
break
end
start = e+1
end
end;
}
@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

С ходу на тестировании поймал: если в конце URL встречаются знаки ` ' " { } они передаются в URL, получаем ошибку в браузере, раз и если URL имеет несколько внутренних слэшей он вообще не обрабатывается.

Проверял на этом фрагменте из libarchive::README:

Questions? Issues?

первый URL срабатывает при условии что обрамлён пробелами, второй и третий не распознаются...

А вот этот вариант модифицированной первой версии макроса с руборда:

Macro {
description="Open URL under cursor in browser";
area="Editor"; key="AltM";
action=function()
local s=editor.GetString()
if s then
local pos = editor.GetInfo().CurPos
if pos > s.StringLength then return end
pos = #s.StringText:sub(1,pos)
for b,e in s.StringText:gmatch("()[%a]%S+^.,()%[%]{}!%?%s") do
if b > pos then break end
if e > pos then
win.ShellExecute(nil, "open", string.sub(s.StringText,b,e-1))
break
end
end
end
end;
}

с линками вида 2 и 3 работает, только бы ему прикрутить проверку на наличие обрамляющих ` ' " чтобы он их удалял и вопросов к нему бы не было....

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

Поправил, спасибо!

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

С HTTPS и слэшами порядок, а вот если URL обрамлён к примеру в -https://github.com/libarchive/libarchive/pulls` , то в браузер он попадает в виде https://github.com/libarchive/libarchive/pulls` что приводит к выдаче 404-й. Эти бы "хвосты" ( `, ' , квадратные, фигурные скобки в конце пересылаемого URL) как-то отрубить...

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

Попробуйте сейчас.

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

Если URL обрамлён знаками:

' - получаем 404-ю ибо "хвост" не отсекается;
` - Ok!
фигурные, квадратные, круглые скобки - получаем 404-ю ибо "хвост" не отсекается;
" - Ok!

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

Попробуйте ещё раз (исправил).

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

работают все символы кроме " - если линк обрамлён в них, то он просто игнорируется. Ещё отыскал что если линк спрятан за ~ или @ , то получим и их в "хвосте", если же он обрамлён символом "_", то он просто игнорируется.

Я добавил в паттерн ~ и @ :

\b http s? : [^\s`'"~@{}<>]+ |

\b www . [^\s`'"~@{}<>]+ |

\b mailto: [^\s`'"~@{}<>]+

и они у меня заработали, с кавычками сложнее - они просто не опознаются.

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

Двойные кавычки исправил, что касается остального - давайте примеры, но боюсь, что тут будет сложнее.

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

И как у вас может mailto работать, если идёт отсечение по символу @ ?
Почтовик получит усечённый адрес.

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

Вообще-то, да, про майлто я просто банально забыл :( . А с тильдой (~) случайно решил попробовать исправив в тексте (я ошибся с именем файла - в тарбалле это README) линк №3 на вариант обрамлённый в знаки ~ и увидел, стало интересно можно ли предусмотреть и такую "защиту от дурака"? Попробовал, вроде и вышло...

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

Тильда может быть валидной частью адреса, я бы не стал её отсекать.

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

Согласен, про этот момент я как-то забыл. Тогда все недостатки устранены. И единственное что я сделал это сменил KEY "CtrlShiftB" на "AltM" т.к. "CtrlShiftB" у нас управляет видимостью строки статуса, а комбинация "AltM" вроде нигде пока не используется....

P.S.

Хорошо что протокол gopher давно и прочно поселился в музее, а то бы с ним пришлось повозится.:)

@z0hm

This comment has been minimized.

Copy link

z0hm commented Jun 20, 2014

можно добавить dchub и ed2k

Авторский скрипт с добавленным запросом на запуск

Macro
  description:"Open OBJECT under cursor in OS"
  area:"Editor"
  key:"CtrlM"
  action:->
    s=editor.GetString!
    if s
      pos=editor.GetInfo!.CurPos
      if pos>s.StringLength
        return
      pos=#s.StringText\sub 1,pos
      for b,e in s.StringText\gmatch "()%S+()"
        if b>pos
          break
        if e>pos
          s=string.sub s.StringText,b,e-1
          if 1==far.Message s,"Open this?",";YesNo"
            win.ShellExecute nil,"open",s
          break
@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

разумно, а также file (UNIX) и magnet (p2p сети) - первый просто адресует файлы, второй передаёт в BT-клиент DHT линк по которому тот ищет файлы. Пример его формата попавшийся на глаза magnet:?xt=urn:btih:1a0ffcf3813f3936e8ba350f16ff4ca9dfaa0117&dn=rutor.org_%D0%A2%D0%B0%D0%B9%D0%BD%D0%B0+%D0%9A%D0%B0%D1%80%D0%BF%D0%B0%D1%82%D1%81%D0%BA%D0%BE%D0%B3%D0%BE+%D0%B7%D0%B0%D0%BC%D0%BA%D0%B0+%2F+Tajemstv%C3%AD+hradu+v+Karpate+%281981%29+DVDRip-AVC&tr=udp://bt.rutor.org:2710&tr=http://retracker.local/announce

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

Пока что добавил обычные файлы и папки локальной файловой системы.
Но не все, а только имена, состоящие из букв, цифр, точек, подчёркиваний и минусов.

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

А в локальной FS по моему больше и не стоит, а то сам Фар без работы останется:)

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

В скрипте опечатки:

description:"Open URL under cursor in browser"
area:"Editor"
key:"CtrlM"

после ключевых слов description , key , area должен стоять знак "=" а не ":", в строке action не action;-> , а action=function()

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

VictorVG
Это MoonScript.

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

понял, я на Луа думал... но и с переименованием в .moon у меня он не сработал....

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

Макросы перезагружали? Должен сработать, хотя я не пробовал. Это ещё та версия, которая на ру-борд, с добавлением запроса.

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

Когда-то давно мы это проходили :)

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

Фу-ты, ну ты - это я не обратил внимания что вызов на CtrlM висит, и по привычке жал AltM. :)

А с поправкой if 1==far.Message s,"Open this?",";YesNo" у меня сразу выводит ошибку разбора на эту строку, да и этот скрипт в отличии от LUa варианта работает только если URL окаймлён пробелами, а встретив такую конструкцию 'https://github.com/libarchive/libarchive/pulls' вывел запрос и ничего в шелл не переслал...

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

У меня ошибку разбора не выводит.
Я же вам сказал, что это ещё версия с ру-борда, только переведена на мунскрипт.

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

Да, вставился криво, поправил и ошибка исчезла, но патерн со старыми недостатками...

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

Да, посему чуть поправил паттерн:

было:

"()%S+()"

сделал:

"()[%a]%S+^.,`'"()%[%]{}!%?%s"

и "хвосты" стали отрубаться, ЧТД. Это я вначале неверно у себя вставлял фрагмент удаления ` ' " , а сейчас вот что в сумме имеем:


Macro
  description:"Open OBJECT under cursor in OS"
  area:"Editor"
  key:"CtrlM"
  action:->
    s=editor.GetString!
    if s
      pos=editor.GetInfo!.CurPos
      if pos>s.StringLength
        return
      pos=#s.StringText\sub 1,pos
      for b,e in s.StringText\gmatch "()[%a\\]%S+[^.,`\'\"()%[%]{}!%?%s]()"
        if b>pos
          break
        if e>pos
          s=string.sub s.StringText,b,e-1
          r=far.Message s,"Open this?",";YesNo"
          if r==1
            win.ShellExecute nil,"open",s
          break

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

z0hm
Вам не кажется, что вы в большой оффтоп заехали?
Никто вам не мешает открыть gist как для запускателя URL, так и для раскрасчика. Там и будете их обсуждать.

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 20, 2014

Уловил. Я привык больше sh пользоваться, но раз есть возможность научится чему-то для меня новому - надо воспользоваться.

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

z0hm
То, как вы удалили свои сообщения, разорвало всю цепочку комментариев.
Так не делается. Или это на эмоциях... Несерьёзно.
Удалить надо было только сообщение с кодом раскрасчика, ибо это был уже "полный оффтоп".

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

z0hm
Просто соответственно учту на будущее, что вы в любой момент можете удалить свои комментарии.

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

z0hm
Ну вы же умный, не можете не понимать, что разрыв логической связи между сообщениями, делает цепочку комментариев полубессмысленной.

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

z0hm

А всё что написал выше предлагаю убрать.

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

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 20, 2014

z0hm
Стесняться не надо, чего стесняться-то?
Я обычно весьма отрицательно отношусь к удалению сообщений или к такому их редактированию, которое делает последующие сообщения бессмысленными и нелепыми.

Но хватит об этом. Как хотите, так и поступайте. Имеете право.

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 21, 2014

Для того, чтобы читающие эти комментарии не подумали, что я разговариваю сам с собой, сообщаю, что пользователь z0hm удалил очередную порцию своих сообщений. Больше с этим пользователем общаться не буду.

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 22, 2014

Вот такое явление случайно обнаружил - если мы пытаемся запустить URL из HTML кода открытого в редакторе, то Lua скрипт его игнорирует, Моон передаёт в браузер весь HTML тэг. Пример взял из SumatarPDF http://sumatrapdf.googlecode.com/svn/trunk/source/docs/settings.html :

<body>
<div class=desc>
<h2>Customizing SumatraPDF</h2>
<p>You can change the look and behavior of
<a href="http://blog.kowalczyk.info/software/sumatrapdf/">SumatraPDF</a>

Луа скрипт не сработает, а Моон попробует запустить весь тэг

<a href="http://blog.kowalczyk.info/software/sumatrapdf/">SumatraPDF</a>

а если мы к примеру встретим тэги img , script? Наверное надо как-то придумать отсечку по коду атрибутов href=" , src=' , script=' , css=' и обрабатывать их как начальный разделитель, а конечным считать варианты

""пробел" , "> "/>

тогда скрипт станет более универсальным и сможет работать с длинными URL в HTML/XML скриптах которые там не редкость, а с их кодировкой пусть браузер разбирается ибо ему сиё по штату положено :) ...

@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 22, 2014

Луа скрипт не сработает, а Моон попробует запустить весь тэг

<a href="http://blog.kowalczyk.info/software/sumatrapdf/">SumatraPDF</a>

Не знаю, какой Lua-скрипт вы пробовали. Тот, что здесь, запускает это хорошо.

@VictorVG

This comment has been minimized.

Copy link

VictorVG commented Jun 22, 2014

Сейчас попробую ваш вариант. Я возился с вариантом z0hm который был описан как универсальный - меня смутила вероятность того, что могут не сработать к примеру магнет ссылки. Посмотрим на стенде что выйдет или он зря електричество кушает?:=)

Попробовал - всё в порядке, работает, не сработала только магнет ссылка - не распознавалась, но там и формат сумасшедший его только торрент-клиенты распознают. Это я перестраховался. Прошу прощения.

@z0hm

This comment has been minimized.

Copy link

z0hm commented Jun 22, 2014

VictorVG, используйте такой паттерн:

local patt = regex.new([=[
  \b http s? :\/\/     [^\s`'"[\](){}<>]+ |
  \b ftp     :\/\/     [^\s`'"[\](){}<>]+ |
  \b www \d* \.        [^\s`'"[\](){}<>]+ |
  \b mailto:           [^\s`'"[\](){}<>]+ |
  \b magnet: \?xt=urn: [^\s`'"[\](){}<>]+ |
  \b ed2k    :\/\/     [^\s`'"[\](){}<>]+ |
  \b dchub   :\/\/     [^\s`'"[\](){}<>]+ |
  (?: \b [a-z]:)? (?: [\\\/]? [\w.\-]+ )+ [\\\/]?
]=],"ix")

по желанию открытие урла можно предварить диалогом контроля:

        if 1==far.Message(url,"Open this URL?",";YesNo") then
          win.ShellExecute(nil,"open",url)
        end
@shmuz

This comment has been minimized.

Copy link
Owner Author

shmuz commented Jun 23, 2014

В связи с включением варианта данного макроса в Addons\Macros Фара, дальнейшие обновления макроса здесь, по всей вероятности, производиться не будут.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.