MacBook AirでEmacs1をつかっていて時々、いらっとすることがある。
たとえば、無線LANをOFFにしたいとき、いちいちマウスでWi-Fiを「切」にしなければならない。EmacsからON/OFFできれば、いいのに——ざっとググってみたのだけれど、そういうものは見当たらなかった。しかし、MacOS自体は「networksetup」というコマンドをつかえば、ON/OFFできるらしい。
ざっくりEmacsからつかえるようにした。
ついでにモードラインにWi-Fiの状態を表示するようにも。2
ポート名はハードコーディングだけど。
;; Wi-Fi接続時、モードライン表示 ;; Wi-Fi Power (en0): On (require 'cl) (require 'deferred) (defvar y-WiFi-mode-set nil) (defvar y-WiFi-update-timer nil "Interval timer object.") (unless y-WiFi-mode-set (setq-default mode-line-format (cons '(:eval (y-WiFi-mode-line)) mode-line-format)) (setq y-WiFi-mode-line t) (setq y-WiFi-update-timer (run-at-time nil 60 'y-airport-listen))) (lexical-let ((WiFi nil)) (defun y-WiFi-mode-line () (if WiFi (propertize "[On]" 'face '(:foreground "red")) (propertize "" 'face '(:foreground "blue")))) (defun y-airport-listen() "無線LANの状態問い合わせ" (interactive) (deferred:$ (deferred:process "networksetup" "-getairportpower" "en0") (deferred:nextc it (lambda (x) (if (string-match-p "On" x) (setq WiFi t) (setq WiFi nil)))))) (defun y-airport-on() "無線LANをONにする" (interactive) (deferred:$ (deferred:process "networksetup" "-setairportpower" "en0" "on") (deferred:next (lambda()(setq WiFi t))))) (defun y-airport-off() "無線LANをOFFにする" (interactive) (deferred:$ (deferred:process "networksetup" "-setairportpower" "en0" "off") (deferred:next (lambda()(setq WiFi nil))))))