Вот код:
Sublime плагин:
Файл 1: open_in_default_program.py:
# https://github.com/SublimeTextIssues/Core/issues/2368
import webbrowser
import sublime_plugin
class OpenInDefaultProgramCommand(sublime_plugin.TextCommand):
def run(self, edit):
if self.view.file_name():
webbrowser.open_new_tab("file://" + self.view.file_name())
def is_visible(self):
return self.view.file_name() is not None and (
self.view.file_name()[-5:] == ".html" or
self.view.file_name()[-3:] == ".md" or
self.view.file_name()[-4:] == ".ahk")
Файл 2: Context.sublime-menu:
[
{ "command": "open_in_default_program" },
]
Файл теста AutoHotkey :
Test.ahk:
MsgBox Something
Мой вопрос:
Он работает для файлов HTML и Markdown. Он также работает для файлов AutoHotkey, но как? Из того, что я вижу, он использует браузер. Файлы AutoHotkey не могут быть открыты в браузере - но на самом деле они прекрасно могут быть запущены с помощью этого плагина. Почему это работает?
Вот еще один плагин для открытия файлов в приложении по умолчанию, но он намного сложнее: https://github.com/SublimeText/OpenDefaultApplication/blob/master/OpenDefault.py
Это указано в документации для webbrowser.open
:
Обратите внимание, что на некоторых платформах, пытаясь открыть имя файла, используя эту функцию, может работать и запускать связанную с операционной системой программу. Однако это не поддерживается и не переносится.
Причина этого заключается в том, что некоторые браузеры, когда им задан файл, который они не знают, как обрабатывать, автоматически откроют его в программе по умолчанию для этого файла. Например, в Windows, Internet Explorer, в основном та же программа, как в Проводнике Windows, 1 поэтому просят Internet Explorer, чтобы открыть файл, он не знает, как обращаться имеет в основном тот же эффект, дважды щелкнув файл в проводнике Windows.
Конечно, другие браузеры ничего не могут сделать или скопировать файл в каталог "Загрузки" или открыть диалоговое окно с запросом на то, что вы хотите сделать с этим файлом. Вот почему документы говорят, что "это не поддерживается и не переносится".
Также стоит отметить, что, как и многие модули stdlib, документы для webbrowser
имеют ссылку на исходный код наверху, а исходный код - довольно простой, простой код Python. Вы можете видеть, что в конечном счете, просто используя модуль subprocess
чтобы вызвать что-то вроде (в зависимости от вашего обнаруженного браузера и, возможно, с некоторыми конкретными опциями браузера, чтобы сказать это ", не запускайте совершенно новый браузер, сообщите текущему окну браузера открыть новую вкладку "):
iexplore.exe file://path/to/your/file
Вы можете легко определить, в какой команде он работает, и экспериментировать с той же командой в командной строке.
Более сложный плагин показывает способ сделать это как можно более мобильно:
os.startfile
.open
.xdg-open
.Эти три варианта обычно достаточно, чтобы охватить 99% ваших пользователей, и почти все остальные пользователи будут людьми, которые знают, что они делают, и могут выяснить, что добавить в ваш файл настроек. (Если, конечно, вы не разрабатываете для мобильных устройств, в этом случае вы захотите написать специальные обработчики для iOS и Android.)
1. В современных Windows это уже не так, но это достаточно близко, чтобы проиллюстрировать суть.
self.view.file_name()[-5:] == ".html" or self.view.file_name()[-3:] == ".md" or self.view.file_name()[-4:] == ".ahk"
- это действительно многословный / хрупкий (благодаря жестко закодированным индексам срезов) способself.view.file_name.endswith((".html", ".md", ".ahk"))
(endswith
tuple
возможных окончаний и возвращаетTrue
если какой-либо из них завершает строку, и избегает хрупких вещей, таких как нарезка жестко закодированными индексами).