最近新昇到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的使用者應該不會遇到.
在大部份的編輯器中,對付太長的文字列通常用的是自動換行 (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-prefix 或 C-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
- EmacsWiki: LineWrap
- Elisp Ref: Truncation
- Emacs Manual: Filling Text
- Emacs Manual: Long Lines Mode
- Emacs Manual: Continuation Lines
Posted in emacs, Note
前陣子在使用 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
玩了幾個晚上,總算可以順利從 emacs 裡將文章送到 Blog 了。 自從開始用 emacs 後就一直改用 muse 在寫筆記和報告,設定好以後可以透過 LaTeX 轉換成 PDF 檔,相當方便。用習慣後也曾興起透過 muse 寫 Blog 的念頭,找了很多資料,也知道有很多人實作成功,但說真的要拿來用還是有點問題,主要還是 elisp 不熟,而且大部份的實作竟然都是直接在 emacs 裡寫 html 後送出去 (還有人推薦用 nxml);就算直接在後台寫也有方便的 wysiwyg editor,但 emacs 還有 muse 這個好東西,何必那麼苦命呢。
玩了幾個晚上,總算可以順利從 emacs 裡將文章送到 Blog 了。
自從開始用 emacs 後就一直改用 muse 在寫筆記和報告,設定好以後可以透過 LaTeX 轉換成 PDF 檔,相當方便。用習慣後也曾興起透過 muse 寫 Blog 的念頭,找了很多資料,也知道有很多人實作成功,但說真的要拿來用還是有點問題,主要還是 elisp 不熟,而且大部份的實作竟然都是直接在 emacs 裡寫 html 後送出去 (還有人推薦用 nxml);就算直接在後台寫也有方便的 wysiwyg editor,但 emacs 還有 muse 這個好東西,何必那麼苦命呢。
目前的做法還是透過 xml-rpc 加 weblogger,後來找到有人針對 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
玩了幾個晚上,總算可以順利從 emacs 裡將文章送到 Blog 了。
自從開始用 emacs 後就一直改用 muse 在寫筆記和報告,設定好以後可以透過 LaTeX 轉換成 PDF 檔,相當方便。用習慣後也曾興起透過 muse 寫 Blog 的念頭,找了很多資料,也知道有很多人實作成功,但說真的要拿來用還是有點問題,主要還是 elisp 不熟,而且大部份的實作竟然都是直接在 emacs 裡寫 html 後送出去 (還有人推薦用 nxml);就算直接在後台寫也有方便的 wysiwyg editor,但 emacs 還有 muse 這個好東西,何必那麼苦命呢。
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
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的態度來說, 應該是遲早的事)
最近因為在 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 給的更多,幾乎是一個很完整的整合界面了。
最近因為在 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 與 [...]
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
裝起 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,但忘了怎麼做@@)
裝起 emacs 快一年了,這期間斷斷續續使用,一直只會基本操作。為了習慣操作方式,我甚至連 Visual Studio 的編輯器都改成 emacs-like key-binding,但在 linux console 時大部份時間還是回到熟悉的 vim 環境,其中一個原因就是找不到自動轉換編碼的設定…















