Kiedy otwieram Emacsa, ocenia mój plik init, który obejmuje odświeżanie moich archiwów pakietów przez połączenie internetowe. Jest to problematyczne, gdy nie mam połączenia z Internetem, dlatego muszę uniemożliwić wykonanie tego kodu podczas uruchamiania Emacsa bez połączenia z Internetem. Aby rozwiązać ten problem, zastanawiam się, czy istnieje sposób, aby Emacs zignorował kod odświeżania pakietu, gdy nie mam połączenia z Internetem?
Oto kilka pierwszych moich linii 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)
Wyobrażam sobie, że mogę dodać kod, aby załadować mój plik Emacs w następujący sposób:
;; 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))
Czy istnieje (connected-to-internet)
funkcja lub podobne podejście do rozwiązania tego problemu?
elisp
networking
modulitos
źródło
źródło
Odpowiedzi:
Cóż, jeśli nadal chcesz automatycznie odświeżać zawartość, jeśli to możliwe, możesz zrobić coś takiego jak poniższy kod:
Należnych jest kilka notatek:
(ignore-errors (package-refresh-contents))
, gdybyś nie przejmował się, czy się to uda, czy nie.źródło
Proste rozwiązanie, które zaadaptowałem z moich skryptów powłoki to
Możesz to przetestować w
*scratch*
buforze:źródło
Jedną z rzeczy, których możesz spróbować, jest funkcja
network-interface-list
. Zwraca listę interfejsów sieciowych i ich adresów IP.Dla mnie jest to, co zwraca, gdy jestem podłączony zarówno do Ethernetu, jak i Wi-Fi:
A kiedy wyłączam Wi-Fi,
en0
znika:Eksperymentuj z tym i zobacz, co zyskujesz, gdy nie masz połączenia z Internetem. Na przykład, aby odświeżyć pakiety tylko, gdy
en0
jest włączony, wykonaj coś takiego:źródło
(("eth0" . [10 72 153 234 0]) ("lo" . [127 0 0 1 0]))
bo jestem podłączony do sieci Ethernet.Aby rozwinąć odpowiedź Legoscii:
Zwróci listę aktywnych połączeń sieciowych (
lo.*
jest to interfejs pętli zwrotnej, w niektórych przypadkachlo
w innychlo#
.Jeśli test powróci
non-nil
, oznacza to, że połączenie sieciowe (wifi / ethernet, nie ma gwarancji, że faktycznie dotrze do zewnętrznego internetu. Musiałby jednak pingować gdzieś w celu przetestowania tego), jeśli powróci,nil
nie będzie możliwości odzyskania pakietu lista.źródło
Korzystam z poniższych, aby wykluczyć
loopback
interfejsy, a także interfejsy VirtualBox i Docker. Mam nadzieję, że to jest pomocne.źródło
W nowoczesnym systemie Linux z DBus i NetworkManager:
źródło
Myślę, że patrzysz na to w niewłaściwy sposób. Jeśli naprawdę chcesz automatycznie zaktualizować swoje pakiety, nie rób tego synchronicznie podczas uruchamiania: zrób to z jakiegoś bezczynnego timera. Na przykład
źródło