五月 2, 2013
» Auth-source in Emacs

前幾天將 Emacs 一口氣更新到 24.3 以後,發現有一堆東西都不太一樣了,一執行就回報一堆錯誤。畢竟現在已經有很多工作都在上面進行,工具有問題的話很麻煩,只好花點時間調整。

首先要找出有問題的套件,暫時移出路徑待修,結果一整理下來發現有一大堆根本不曉得為什麼存在的東西會報錯,把 mercurial log 叫出來一看才知道上次整修的時間已經是 2009 了。存在這麼多年卻完全沒印象的東西叫做垃圾,乾脆整個目錄都翻出來整理。(不過我要強調這只是倒垃圾,還不到 dot emacs bankruptcy 的程度XD)

後來在更新 g-client 設定時,發現在新版裡已經改用 auth-source 來取得認證所需的資訊。玩了一下發現這東西還真是不錯,可以把一些認證用的密碼資訊統一管理,並透過 api 來取得。大概瞭解運作方式後,馬上動手整合到跟認證有關的套件中。

auth-source 目前支援兩種用來取得認證資訊的 backend,分別是傳統的 .netrc 和 freedesktop 提出的 Secret Service API.netrc 雖然比較簡單,但對於有 un*x-like 環境使用經驗的人會比較熟悉,再加上 auth-source 支援 GPG 加密過的 .netrc,因此目標就是把敏感資訊都移到 .netrc 裡面管理。另一方面也是因為我沒有 Gnome 或 KDE 環境,沒辦法實驗 Secret Service API。

首先要告訴 auth-source 資料庫的位置,如果沒有特殊需求的話,預設會先找 ~/.authinfo,格式等同於 ~/.netrc。雖然這個檔案一般會將權限設為 600,但裡面存放的是明碼,總覺得不太保險。有使用 GPG 的話,可以將這個檔案加密使用,auth-source 可以處理加密後的檔案,預設檔名會是 ~/.authinfo.gpg。如果想改變存放位置,可以透過 auth-sources 指定路徑:

基本的 .netrc 內容格式如下:

machine <host> login <user> password <pass>

可以看到能儲存的資訊有 host、user、password 三種,而 auth-source 引入新的 key:port,可以用來儲存額外資訊,也可以當作搜尋時的 key 來使用。 使用方式並不難,只要透過 auth-source-search 這支函式,並在 spec 參數指定好用來搜尋的 key 就可以得到結果。例如我想取得某個站的認證密碼:

傳回來的資訊是一個 plist,可以透過 plist-get 取得需要的資訊。其中 secret 欄位的值有可能是一個用來取得真正密碼的函式,因此需要特別處理。除此之外,由於上面的例子中指定找不到就建立一組新資訊,在認證資訊不存在時,可以選擇是否儲存目前設定,一般會需要搭配 auth-source-creation-defaultsauth-source-creation-prompts 以提示使用者輸入不足的資訊:

同時,在第一次建立時也可以從 plist 取得儲存用的程序,直接執行就可以了。

執行這個函式會詢問儲存位置,也可以趁這個時候修改儲存內容。

完成這些工作,取得密碼後就可以丟給真正執行認證的函式處理了。


Filed under: emacs, Note

八月 13, 2009
» [tips] linux裡 emacs23 utf8 中文輸入與SCIM

最近新昇到emacs 23.1

又發現SCIM中文輸入有問題, ctrl+space老是變回mark.

我的locale是zh_TW.UTF-8

其他程式輸入中文都沒啥問題

就emacs23.1無法輸入中文,

試了老半天 (暫時)解決方法如下:

啟動emacs時用 LC_CTYPE="zh_CN" emacs-23

.emacs 加上這行

(prefer-coding-system 'utf-8)

這樣就沒問題了

至於為什麼要如此我也不能理解

如果有高人肯告訴我那就再好不過了,

不過我暫時懶得去追了, 設個alias也就算了.

總之locale裡似乎只有zh_CN跟zh_CN.gbk會動.

btw,我的環境是gentoo linux.

註: 這個問題 基本上只在terminal上使用emacs -nw的使用者應該不會遇到.

二月 11, 2009
» Line wrap in Emacs

在大部份的編輯器中,對付太長的文字列通常用的是自動換行 (line wrap),就我目前所知,在 Emacs 中有以下幾種不同方式可以選擇:

Line wrap

預設行為即是一般常見的 line wrap。在這種環境下的文字內容並不會被更動,僅在顯示時將超出視窗邊界的部份顯示在下一行,同時在換行處加上一個記號 (如箭頭標示處):


在切割視窗時情況不同:


可以設定一下得到相同行為:

(setq truncate-partial-width-windows nil)


Truncation

打開 truncate line 以後,超出視窗邊界的部份不顯示,同時會在邊界處顯示一個特殊符號作為識別 (與 line wrap 時用的符號不同)。一般適合在寫程式的時候使用

M-x toggle-truncate-lines


也可以寫到 .emacs

(setq default-truncate-lines t)

為了方便可以設個快速鍵:

(global-set-key [f11] 'toggle-truncate-lines)

Filling text

fill 是破壞性操作,會根據 fill-column 的值強制在特定位置插入換行字元。手動操作時只需要按下 M-q 即可,或是乾脆啟用 auto fill:

M-x auto-fill-mode


fill-column

換行寬度可以自行修改,因為設定 fill-column 要求一個數值當作參數,:

C-u 60 M-x set-fill-column

C-u 60 C-x f

fill-prefix

fill-prefix 的內容會自動加到被修改的文字列前面,預設為 nil (代表換行後前面不加任何字)。假設 fill-prefix"… ",則換行後會在該列最前面加上 "… "

設定這個參數可以用 set-fill-prefixC-x .,要注意的是這個動作會將游標所在位置前的同列文字設為 fill-prefix,若在斷行處操作,則整列文字都會被採用。因此我建議透過 eval 方式設定:

M-: (setq fill-prefix "... ")

或乾脆寫進 .emacs


fill prefix 對於整理程式碼註解很有幫助,但對於一般文字也許會造成困擾。要取消 fill-prefix 只需要找個空行再設定一次即可 (minibuf 會顯示 "fill-prefix cancelled")

Long line mode

相較於 fill mode,long line mode 則是溫和的非破壞性操作,只是在顯示上調整成 fill mode 的效果 (soft newline),並不會真的插入換行 (hard newline):

M-x longlines-mode


但顯示與實際內容畢竟有差別,可以將真正的換行處以特殊符號表示以資識別:

M-x longlines-show-hard-newlines


在處理長文字列的顯示上,Emacs 提供了豐富的設定以應付各種需求。就我個人來說,對於一般的文章我習慣用 line wrap 型式顯式;而在編輯程式碼的時候,這種方式反而會破壞縮排的視覺效果,這時改用 truncation 就很適合了。至於 long line mode,我到現在還沒用過。當然,一般編輯程式碼的時候很少會出現超長的程式碼 (也許寫 gtk 程式時例外XD),閱讀上非常不便。非不得已的時候,我會想辦法在 80 columns 內先斷行 (以前留下來的習慣@@),非超出視窗不可的部份,就交給強大的編輯器來處理吧!

Reference


Posted in emacs, Note

二月 5, 2009
» 透過 Outline mode 編輯 Muse 文稿內容

前陣子在使用 muse 撰寫筆記的時候,總覺得要找標題不太方便,似乎也沒辦法透過 speedbar 顯示大綱,玩了半天就想到了 outline mode 這個好東西,剛好語法是一樣的,只要簡單配置一下就可以帶來很大的方便。測試了一下後加了一些設定:

(add-hook 'muse-mode-hook
	'(lambda ()
	   (outline-minor-mode t)))

(define-key muse-mode-map (kbd "<f5>")  'outline-up-heading)
(define-key muse-mode-map (kbd "<f6>")  'outline-backward-same-level)
(define-key muse-mode-map (kbd "<f7>")  'outline-forward-same-level)
(define-key muse-mode-map (kbd "<f8>")  'outline-next-heading)
(define-key muse-mode-map (kbd "<f12>") 'outline-toggle-children)
(define-key muse-mode-map (kbd "C-<f12>") 'outline-mark-subtree)

(define-key muse-mode-map (kbd "C-<f5>") 'outline-promote)
(define-key muse-mode-map (kbd "C-<f6>") 'outline-move-subtree-up)
(define-key muse-mode-map (kbd "C-<f7>") 'outline-move-subtree-down)
(define-key muse-mode-map (kbd "C-<f8>") 'outline-demote)

在進入 muse mode 的同時也啟用 outline minor mode,並設定一些快速鍵以便快速在各個標題之間定位。事後在調整內容次序時,還可以整個 subtree 一起調整,不必再笨笨地用 copy & paste 修改了。


Posted in emacs, Note

十月 19, 2008
» Blogging with Emacs

玩了幾個晚上,總算可以順利從 emacs 裡將文章送到 Blog 了。 自從開始用 emacs 後就一直改用 muse 在寫筆記和報告,設定好以後可以透過 LaTeX 轉換成 PDF 檔,相當方便。用習慣後也曾興起透過 muse 寫 Blog 的念頭,找了很多資料,也知道有很多人實作成功,但說真的要拿來用還是有點問題,主要還是 elisp 不熟,而且大部份的實作竟然都是直接在 emacs 裡寫 html 後送出去 (還有人推薦用 nxml);就算直接在後台寫也有方便的 wysiwyg editor,但 emacs 還有 muse 這個好東西,何必那麼苦命呢。

» Blogging with Emacs

玩了幾個晚上,總算可以順利從 emacs 裡將文章送到 Blog 了。

自從開始用 emacs 後就一直改用 muse 在寫筆記和報告,設定好以後可以透過 LaTeX 轉換成 PDF 檔,相當方便。用習慣後也曾興起透過 muse 寫 Blog 的念頭,找了很多資料,也知道有很多人實作成功,但說真的要拿來用還是有點問題,主要還是 elisp 不熟,而且大部份的實作竟然都是直接在 emacs 裡寫 html 後送出去 (還有人推薦用 nxml);就算直接在後台寫也有方便的 wysiwyg editor,但 emacs 還有 muse 這個好東西,何必那麼苦命呢。

目前的做法還是透過 xml-rpcweblogger,後來找到有人針對 wordpress 的修改,安裝上並不難,只需稍微自訂一下就可以使用。

首先必須透過 weblogger-setup-weblog 建立設定檔,可以有多組設定,每一組設定會有一個名字作為識別。要注意的是預設並不儲存密碼,往後傳送資料時必須手動輸入。如果想偷懶可以設定一下 weblogger-save-password,建立設定資料時就會自動儲存密碼。

開始撰寫文章時先 M-x weblogger-start-entry,會自動建立簡單的樣板,填入 Subject 與內容即可。需要加上 Category 的話,可以在 header section 手動加入一行 "Keywords: ",各分類之間以逗點分隔 (必須是 server 上存在的 Category 名稱)。目前似乎還不支援 Tag。發布文件的方式很簡單,熱鍵跟存檔一樣是 C-x C-s,也可以用 C-c C-c 存成 Draft。日後需要修改時也可以把文章抓回來修改後再回存,相當方便1

Weblogger 的使用不難,比較麻煩的是跟 muse 銜接的部份,研究了一晚找出需要的資料結構,原來是建構在 message-mode 之上,所以得先產生類似 message header 的資料。這部份我直接以 html style 為基礎,建立一個新的 muse style 來處理:

(muse-derive-style "my-blog" "html"
                   :suffix ".wp.html"
                   :header
"Subject: <lisp>(muse-publishing-directive \"title\")</lisp>
From: <lisp>(muse-publishing-directive \"author\")</lisp>
Keywords: <lisp>(muse-publishing-directive \"desc\")</lisp>
--text follows this line--
"
                   :footer ""
                   :browser   'find-file
                   :regexps `((100000 "!!more!!" 0 more) )
                   :functions '((more . muse-mywp-markup-more))
                   :strings '(
(image-link      . "<a target=\"_blank\" class=\"image-link\" href=\"%s\">
<img src=\"%s.%s\"></a>")
(url             . "<a target=\"_blank\" href=\"%s\">%s</a>")
(link            . "<a target=\"_blank\" href=\"%s\">%s</a>")
(link-and-anchor . "<a target=\"_blank\" href=\"%s#%s\">%s</a>")))

當然在 project 部份也要新增一個項目

(setq muse-project-alist
	'(("blog" ("~/Note/blog" )
		(:base "my-blog" :path "~/Note/blog/convert"))))

本來的想法是找出 muse 資料的產生方式,直接丟到 webloger buffer,但是一堆括號看到頭暈,所以用了比較笨的方式:先用 muse 轉換過,再呼叫修改過的 weblogger 函式將結果轉換出必要的資料結構,最後丟上 server。

修改這些其實還算簡單,但我有個需求是要同時送到多個地方備份用,這可要我命了…因為裡面一堆全域變數,從帳號設定對應到內部資料結構的部份又太複雜 (誰說用 functional language 不會有 side-effect…XD),所以我還是用最笨的方式,每次連線前先重置相關的全域變數:

(defun muse-blog-start-entry ()
  (unless weblogger-entry-ring
    (setq weblogger-entry-ring
      (make-ring weblogger-max-entries-in-ring)))
  (ring-insert weblogger-entry-ring '(("content" "")))
  (setq weblogger-ring-index 0)
  (unless weblogger-server-username
    (setq weblogger-server-username ""))
  (unless weblogger-server-password
    (setq weblogger-server-password ""))
  (weblogger-edit-entry (weblogger-entry-buffer-to-struct)))

(defun muse-blog-send-post (&optional blogConfName)
  "send current to blog"
  (unless blogConfName
    (read-from-minibuffer "Select a blog conf: " blogConfName))
  (setq weblogger-server-username nil)
  (setq weblogger-server-password nil)
  (setq weblogger-server-url nil)
  (setq weblogger-weblog-id nil)
  (weblogger-select-configuration blogConfName)
  (weblogger-start-entry)
  (set-buffer-modified-p t)
  (weblogger-save-entry t)
  (bury-buffer))

(defvar muse-blog-conf-name-alist nil)

(defun muse-blog-publish ()
  (interactive)
  (when muse-blog-conf-name-alist
    (mapcar 'muse-blog-send-post muse-blog-conf-name-alist)))

使用前需要先設定 muse-blog-conf-name-alist,內容是一個字串的 list,就是先前在 weblogger 中建立的 profile 名稱,發布文章時就會丟到所有在清單中的 Blog 位置。

muse 文稿的部份,要注意的是利用了三個 directives:title、author 與 desc,分別對應到 message header 中的 Subject、From 與 Keywords。以本文為例,開頭的前幾行如下:

#title Blogging with Emacs
#author letoh
#desc note, emacs

產生出來的 header 如下:

Subject: Blogging with Emacs
From: letoh
Keywords: note, emacs
–text follows this line–

到這樣已經相當好用了,同一份 muse 文件除了生成 LaTeX / ConTeXt 文稿或 PDF 外,也可以發布到 Blog 上,當然產生 static page 或整理起來變成 Wiki 更不是問題。只剩一個小小的缺憾,就是還沒把 blogger 分舵加進來,因為 blogger 已經不用 xmlrpc,改用 Blogger Data API 了,這兩天再努力看看吧。有任何建議也歡迎指教。


1. 實際使用後發現抓回來的文章如果包含 <!--more--> (wordpress 設定摘要位置用的記號),只會抓回摘要的部份;此時若回存會把文章後半部份蓋掉XD 修改方法還在研究中…


Posted in emacs, Note

» Blogging with Emacs

玩了幾個晚上,總算可以順利從 emacs 裡將文章送到 Blog 了。 自從開始用 emacs 後就一直改用 muse 在寫筆記和報告,設定好以後可以透過 LaTeX 轉換成 PDF 檔,相當方便。用習慣後也曾興起透過 muse 寫 Blog 的念頭,找了很多資料,也知道有很多人實作成功,但說真的要拿來用還是有點問題,主要還是 elisp 不熟,而且大部份的實作竟然都是直接在 emacs 裡寫 html 後送出去 (還有人推薦用 nxml);就算直接在後台寫也有方便的 wysiwyg editor,但 emacs 還有 muse 這個好東西,何必那麼苦命呢。

十月 16, 2008
» Emacs 發布測試

test for blogging with emacs
透過 emacs 來寫 blog

Todo:

  • fetch entry 後,延伸閱讀以後的資料會抓不到 (也許是透過 rss/atom 抓 description 而已),此時再存檔的話,當初沒抓下來的資料就會變成光了
  • 拿掉 auto-fill-mode
  • 整合 muse (目前看到有日本人實作過),這樣等於間接把 local preview 做好
  • multi-server configuration
  • categories auto-completion (以前用 python 寫過,但現在得用 elisp 寫…囧rz)
  • 自訂 ping-slug (印象中在 api 裡有看到)

Posted in ACG, emacs, Note

六月 21, 2008
» [link] mysql now use bzr !

http://blogs.mysql.com/kaj/2008/06/19/version-control-thanks-bitkeeper-welcome-bazaar/

又一個重量級軟體投入DVCS的懷抱,
不過我倒是沒預期到mysql會倒向bzr,
因為sun之前的專案如Openjdk,OpenSolaris等, 大多都是用hg,
而mysql被sun買走, 似乎被水銀化的機會很大,
所以這次使用bzr可以說是意外的驚喜.
這麼一來dvcs三強天下三分的局勢似乎已經形成了.

剛好svn 1.5.0也正式release, 如此一來bzr-svn之前不方便安裝的問題也解決了(因為bzr-svn用到了svn1.5.0的python-binding才有的功能, svn1.4要打很多patch, 如今只要升級到最新的svn 1.5就好了),對於我這個bzr的使用者來說可以說是好消息不斷.

另外話說Emacs要從cvs轉換到bzr其實已經講一陣子了,
目前可用的是Jason Earl每小時更新的bzr readonly repo (http://bzr.notengoamigos.org/emacs/trunk/) , 似乎要等到一些merge-history的問題解決後, 官方才會完全轉換過去. (當然這還是未定數, 不過以RMS強烈支持bzr的態度來說, 應該是遲早的事)

一月 29, 2008
» gdb-mode

最近因為在 cgdb 中處理有 standard input 的程式有點問題 (遇到要輸入的地方就會停住@@)。雖然原始的 gdb 是正常的,但習慣看到 source code 後就不太想回頭一直 list,試著轉移到 emacs 的 gdb-mode 後發現還蠻方便的,所以就試著使用看看。 gdb-mode 整合了大部份 debugger 的功能,透過一個 buffer 來操作 gdb,同時開啟一個 buffer 顯示 source code。雖然 emacs 的指令有很多討厭的 prefix,所幸透過 gud 的處理,大部份 gdb 上的指令與使用習慣都可以直接搬過來,使用上沒什麼太大的困難。就目前提到的部份,跟 cgdb 做的事幾乎一樣,但 gdb-mode 給的更多,幾乎是一個很完整的整合界面了。

» gdb-mode

最近因為在 cgdb 中處理有 standard input 的程式有點問題 (遇到要輸入的地方就會停住@@)。雖然原始的 gdb 是正常的,但習慣看到 source code 後就不太想回頭一直 list,試著轉移到 emacs 的 gdb-mode 後發現還蠻方便的,所以就試著使用看看。 gdb-mode 整合了大部份 debugger 的功能,透過一個 buffer 來操作 gdb,同時開啟一個 buffer 顯示 source code。雖然 emacs 的指令有很多討厭的 prefix,所幸透過 gud 的處理,大部份 gdb 上的指令與使用習慣都可以直接搬過來,使用上沒什麼太大的困難。就目前提到的部份,跟 cgdb 做的事幾乎一樣,但 gdb-mode 給的更多,幾乎是一個很完整的整合界面了。 要體驗 gdb-ui 首先可以看看 EmacsWiki 上提供的 screen shot。啟用了 gdb-many-windows 後會在原本的 frame 新增四個 window,包括 gud window、local window、backtrace window 與 [...]

九月 15, 2007
» calendar

http://bc.tech.coop/blog/070306.html
http://emacspeak.blogspot.com/2007/03/emacs-client-for-google-services.html

google calendar api
http://code.google.com/apis/calendar/overview.html

emacspeak
http://code.google.com/p/emacspeak/

http://emacspeak.googlecode.com/svn/trunk/lisp/g-client
http://groups.google.com/group/emacs-g-client/feed/atom_v1_0_msgs.xml

八月 22, 2007
» 在 Big5 環境編輯 UTF-8 編碼的檔案

裝起 emacs 快一年了,這期間斷斷續續使用,一直只會基本操作。為了習慣操作方式,我甚至連 Visual Studio 的編輯器都改成 emacs-like key-binding,但在 linux console 時大部份時間還是回到熟悉的 vim 環境,其中一個原因就是找不到自動轉換編碼的設定…

我現在遇到中文檔案都盡量以 UTF-8 編碼來儲存,但有時候我會在 Big5 terminal 作業,想同時編輯文件時就會造成很大的困擾。比較簡單的方式是透過 screen 來轉碼,但是我試用的結果是常常回到其他 Big5 視窗就會爛掉。在 vim 中,可以透過 tenc=big5:enc=utf8:fenc=utf8 這樣的設定來達成我想要的效果,但在 emacs 中試了好久都無法成功,網路上搜尋了一下也沒看到跟我有一樣需求的人。今天狠下心翻了幾頁文件,測試幾個函式後總算有一點初步的成果了,目前 .emacs 中相關的設定是:

(set-terminal-coding-system ‘chinese-big5)
(set-keyboard-coding-system ‘chinese-big5)
(set-language-environment ‘chinese-big5)
(set-selection-coding-system ‘utf-8)
(set-buffer-file-coding-system ‘utf-8)
(set-clipboard-coding-system ‘utf-8)
(set-next-selection-coding-system ‘utf-8)

其中 keyboard-coding 不設成 Big5 的話,只要一輸入中文就會讓 emacs 停住不動,只能 kill 了。

目前在 emacs 22.1 下測試是正常的,但只要一開新檔案再存檔,又會存成 Big5。解決的方法是第一次存檔前先呼叫一次 set-buffer-file-coding-system,設定成 UTF-8 後再存檔,往後編輯或存檔就不用再做這個動作了,而且用 emacs-wiki 或 muse 時都可以正確 publish 成 UTF-8 的 HTML 或 LaTeX 檔。

初步驗證可以做到這個功能後,找個時間再研究看看怎麼讓 terminal coding 的設定值根據 locale 自動調整,這樣我在不同 locale 環境切換就更方便了。(我記得 vim 也可以設定成參考 locale,但忘了怎麼做@@)

» 在 Big5 環境編輯 UTF-8 編碼的檔案

裝起 emacs 快一年了,這期間斷斷續續使用,一直只會基本操作。為了習慣操作方式,我甚至連 Visual Studio 的編輯器都改成 emacs-like key-binding,但在 linux console 時大部份時間還是回到熟悉的 vim 環境,其中一個原因就是找不到自動轉換編碼的設定…

biggo.com.tw

A Django site.