Когда я открываю Emacs, он оценивает мой файл инициализации, который включает в себя обновление моих архивов пакетов через интернет-соединение. Это проблематично, когда у меня нет подключения к Интернету, поэтому мне нужно предотвратить выполнение этого кода при запуске Emacs без подключения к Интернету. Чтобы решить эту проблему, мне интересно, есть ли способ заставить Emacs игнорировать код обновления пакета, когда у меня нет подключения к интернету?
Вот первые несколько строк моего init.el
:
;; Requisites: Emacs >= 24
(require 'package)
(package-initialize)
;; PACKAGE MANAGEMENT
(add-to-list 'package-archives
'("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-refresh-contents)
Я представляю, что могу добавить код для загрузки моего файла Emacs следующим образом:
;; Requisites: Emacs >= 24
(when (connected-to-internet-p) ; I need this predicate function
(require 'package)
(package-initialize)
(add-to-list 'package-archives
'("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-refresh-contents))
Есть ли (connected-to-internet)
функция или подобный подход для решения этой проблемы?
elisp
networking
modulitos
источник
источник
Ответы:
Ну, если вы все еще хотите обновить содержимое автоматически, по возможности, вы можете сделать что-то вроде кода ниже:
Немного примечаний из-за:
(ignore-errors (package-refresh-contents))
если бы вам было все равно, удастся это или нет.источник
Простое решение, которое я принял из своих сценариев оболочки:
Вы можете проверить это в
*scratch*
буфере:источник
Одна вещь, которую вы можете попробовать, это функция
network-interface-list
. Возвращает список сетевых интерфейсов и их IP-адресов.Для меня это то, что он возвращает, когда я подключен к Ethernet и Wi-Fi:
И когда я выключаю wifi,
en0
пропадает:Поэкспериментируйте с этим и посмотрите, что вы получите, когда у вас нет подключения к Интернету. Например, чтобы обновлять пакеты только после запуска
en0
, сделайте что-то вроде:источник
(("eth0" . [10 72 153 234 0]) ("lo" . [127 0 0 1 0]))
потому что я подключен к Ethernet.Чтобы расширить ответ Легоссии:
Это вернет список активных сетевых подключений (
lo.*
это петлевой интерфейс, в некоторых случаяхlo
в другихlo#
.Если тест возвращается
non-nil
, значит, есть сетевое соединение (wifi / ethernet, однако нет гарантии, что он действительно достигнет внешнего интернета. Придется пинговать где-нибудь в качестве теста для этого), если он возвращается,nil
то нет способа извлечь пакет список.источник
Я использую следующее, чтобы исключить
loopback
интерфейсы, а также интерфейсы VirtualBox и Docker. Я надеюсь, что это полезно.источник
В современной системе Linux с DBus и NetworkManager:
источник
Я думаю, что вы смотрите на это неправильно. Если вы действительно хотите автоматически обновлять ваши пакеты, то не делайте это синхронно при запуске: делайте это из какого-то таймера простоя. Например
источник