Google 的奇葩 UI 設計

「オレまた来ましたぞーやらないか?」
不知何時開始,Google 簡直擁有了 Apple 在粉絲眼中的地位,也出現了一些 Google 粉絲建立的 Google 消息站(例如谷奥)。

Google 的服務也用很久了,從以前 GMail beta 剛出來在到現在,這之間 Google 帶給大家許多驚喜,但已經不得不說,我開始不懂 Google 現在到底在做什麼了。以前簡直把 Google 當神在拜,但現在的 Google 除了把好用的服務關掉外,也開始把原本很好用的 UI 改得越來越難用。尤其要恭喜 Google+ 的 UI 現在已經成為我所用過體驗最差勁的網路服務之一。別再嘲笑 Facebook,雖然沒 G+ 好看但它比 G+ 好用很多。

Read More

Emacs Lisp 學習資源

學 Emacs 最好的方法除了多用,另一點應該就是請務必學 Lisp。網路上教 Emacs 的文章已經太多太多了,但要學 Lisp 就有點累人了,不知該從何下手。

個人覺得學 Emacs Lisp 其實不一定要靠 GNU 提供的那厚厚一堆文件,對我來說我就沒啥耐心看那個…下面整理了一些 Emacs Lisp 的學習資源,不多但都非常值得參考。

Read More

用 Emacs + SMPlayer 看動畫/影片

###廢話###
我在做一些不太需要大腦的學校作業時有配動畫這種好習慣,但常常雙手都沾滿黏土顏料時,動畫一話看完還要按下一集很麻煩,所以我會 cd 到某部動畫的資料夾下後:

1
for i in *;do mplayer $i;done

用這種方法可以一口氣看完一整部動畫手都不用動,但不夠好用。不過現在我們有 Emacs 跟 Dired。

在 Emacs 上要看影片聽音樂有 EMMS 這個選擇,但個人覺得這個做得太複雜,當初設定我也弄不太起來,所以乾脆自己搞一個剛好夠用、設定又簡易的函數。

我平常是偏好使用 SMPlayer 作為影片播放器,功能完整自訂性高,而且他有提供把檔案直接加入 playlist 的參數-add-to-playlist,於是搭配Dired就很好實作了:

Read More

初學 Emacs Lisp 小技巧

我完全不會寫程式,但在去年的寒假開始學習使用 Emacs。虛擲大量時間在找別人的設定檔,卻一直沒有去學 Emacs Lisp。

Emacs 用一用,為了實現一些自己要的功能,好像還是一定得去學 Emacs Lisp。學了 Lisp 以後真的方便很多很多,也才開始開始實際掌握到 Emacs 的威力。

這篇不是教學,只是一些瑣碎筆記。當初不知道這種問題該怎麼問人或問誰(IRC 其實是個非常棒的發問管道,即時又有效,在 freenode 上的#emacs,還有中文的#emacs.tw),所以一開始寫時覺得很痛苦。

在這裡記下一些能讓入門 Emacs Lisp 更輕鬆方便的小技巧,需要的人許可以參考。

Eval

  • 在任何 mode 下,C-x C-e 可以將游標之前的 S-expression(就是 Lisp 運算式,常簡寫成 sexp)eval (求值) 並輸出結果到 minibuffer 中。

    • 前面加一個 C-u 的話會把結果插入目前游標位置。(所以高興的話可以在 Emacs 裡任何地方寫 Lisp 式子來當計算機。)
    • 如果你在 emacs-lisp-mode 下,C-M-x (eval-defun) 則能夠 eval 目前的 defun
    • 因為覺得內建的 eval 快速鍵要拿來作其他用途有點不方便(例如拿來當作臨時的計算機),所以我自己是另外弄了設定讓他更方便:
      1. Eval 目前的 sexp,輸出其 eval 結果後,直接自動刪除該 sexp。
      2. 加上一個 C-u prefix 就是先按 C-u 再按 key-binding。
        C-u 在 Emacs 裡稱作 universal-argument,很多 function 在前面加 C-u 都會有不同功能。
        的話,不刪除 sexp,而且會先插入一個箭頭 => 再插入 eval 結果。例如(+ 1 5) => 6
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        ;; Makes eval elisp sexp more convenient
        (defun eval-elisp-sexp ()
        "Eval Elisp code at the point, and remove current s-exp
        With one `C-u' prefix, insert output following an arrow"
        (interactive)
        (cond ((equal current-prefix-arg nil) ;if no prefix
        (let ((OUTPUT (eval (preceding-sexp))))
        (kill-sexp -1)
        (insert (format "%S" OUTPUT))))
        ((equal current-prefix-arg '(4)) ;one C-u prefix
        (save-excursion
        (let ((OUTPUT (eval (preceding-sexp))))
        (insert (format "%s%S" " => " OUTPUT)))))))
        (global-set-key (kbd "C-c C-x C-e") 'eval-elisp-sexp)
        ;; avoid key-binding conflict with org
        (define-key org-mode-map (kbd "C-c C-x C-e") 'org-clock-modify-effort-estimate)
  • 在 lisp-interaction-mode 中 (例如 *Scratch* ) ,可以在一個運算式的最後一個括弧後面按下 C-j 直接 eval 並直接將 eval 結果插入當前游標後面。

    Read More