Emacs Emacs-Lisp

Tumblesocks:Emacs tumblr client

 
Emacs から tumblr への投稿を試したいと思って、tumble.el を導入したが認証で失敗する。おそらく tumblr の認証方式が変わったのだと思う。
 
そこで Package にあったもう一つの tumblesocks というのを試してみたところあっさりOKになった。予想通り OAuth認証になっているようだ。作者の GitHub にあるマニュアル通りに進めていけばよい。

init.el への設定は以下の通り。(キーバインドはご自由に・・)

;; tumblesocks-mode
(require 'tumblesocks)
(setq tumblesocks-blog "YourBlogName.tumblr.com")
(setq oauth-nonce-function 'oauth-internal-make-nonce)
(global-set-key (kbd "C-r") 'tumblesocks-text-post-from-region)
(global-set-key (kbd "C-b") 'tumblesocks-text-post-from-buffer)
;; end

 
※ 導入手順

  • M-x tumblesocks-api-forget-authentication を実行するとプラウザが tumblr と Emacs とのアプリ連携承認画面を開く。
  • 承認すると apiコードが表示されるのでマウスでコピーし、Emacs のミニバッファーへコピーして RETキーを押す。
  • 連携が成立すると ~/.emacs.d/ に tumblr-oauth-token というファイルが生成される。次回ログインからはこれが参照されるのだと思う。
  • 念の為に M-x tumblesocks-api-test-auth を実行する。
  • ミニバッファーに ‘Hello, sneakygcr! Tumblesocks is working properly.’と表示れたら無事認証されている。
  • 試しに * scratch * のメッセーでも選択して M-x tumblesocks-text-post-from-region を実行してみる。
  • Title や カテゴリーなどを聞いてくるので適当に入力して投稿してみよう。

Tumblr は Blog としての一面もあるけれど、メモ代わりになんでも貼り付けておくことができるので、eww と組み合わせて使えるようになると便利かもしれない。
 

このエントリーをはてなブックマークに追加

Emacs Emacs-Lisp

Emacs:カーソル付近のwordをweblio日本語串刺し検索

 
Emacs で編集中にカーソル付近の word をキーワードとして即座に串刺し検索して、その結果をプラウザ上に表示させるというのがこの Lisp の使命である。
 
Emacs24.4 には標準で高速な webプラウザ:eww が内蔵されたが、Emacs だけですべてのワークを処理するというこだわりはぼくにはない。Macbook上で safari / mail / icalendar などを使い、その右サイドの縦置き外部モニター上で Emacs を使うという二刀流スタイルのほうがはるかに快適だからである。
 
この Lisp は昔どこかの個人サイトで紹介されていたものを weblio用に修正しただけ。調べたい word 付近にカーソルがあれば自動的にキーワードとしてミニバッファーに読み込んでくれるので、RETキーを押すだけ。引数がないときはミニバッファーで編集することもできる。
 
この種の Emac-Lisp はたくさん紹介されているけれど、今のところこれが一番使いやすいと思う。簡単な内容なので書き換えていろんな WEB検索に応用できる。ぼくは、google / Lead2Amazon / weblio古語検索などにも作って重宝している。
 

;; ------------------------------------------------------------------------------
;; weblio.el 日本語串刺し検索 for browse-url
;; カーソル付近の Word を key-word に自動的に web検索する
;;; Usage:
;; (load "weblio")
;; (setq browse-url-browser-function 'browse-url-generic)
;; (setq browse-url-generic-program "open") ; default browser で開く
;; 調べたい文字にカーソルをおいて、M-x weblio
;;; key-bind-sample
;; (global-set-key (kbd "M-w") 'weblio) 
;; ------------------------------------------------------------------------------
(require 'browse-url)
(require 'thingatpt)
(defun my-url-encode-string (str &optional coding)
  (apply (function concat)
         (mapcar
          (lambda (ch)
            (cond
             ((eq ch ?\n)               ; newline
              "%0D%0A")
             ((string-match "[-a-zA-Z0-9_:/]" (char-to-string ch)) ; xxx?
              (char-to-string ch))      ; printable
             ((char-equal ch ?\x20)     ; space
              "+")
             (t
              (format "%%%02X" ch))))   ; escape
          ;; Coerce a string to a list of chars.
          (append (encode-coding-string (or str "") (or coding 'iso-2022-jp))
                  nil))))

;; weblioで検索。引数無しだと mini-buffer で編集できる。
(defun weblio (str &optional flag)  "引数無しだと mini-buffer で編集できる。"
  (interactive
   (list (cond ((or
                 ;; mouse drag の後で呼び出された場合
                 (eq last-command 'mouse-drag-region) ; for emacs
                 (and (eq last-command 'mouse-track) ; for xemacs
                      (boundp 'primary-selection-extent)
                      primary-selection-extent)
                 ;; region が活性
                 (and (boundp 'transient-mark-mode) transient-mark-mode
                      (boundp 'mark-active) mark-active) ; for emacs
                 (and (fboundp 'region-active-p)
                      (region-active-p)) ; for xemacs
                 ;; point と mark を入れ替えた後
                 (eq last-command 'exchange-point-and-mark))
                (buffer-substring-no-properties
                 (region-beginning) (region-end)))
               (t (thing-at-point 'word)))
         current-prefix-arg))
  (if flag
      nil
    (setq str (read-from-minibuffer "weblio 日本語串刺し検索 : " str)))
  (browse-url
   (concat
    "http://weblio.jp/content/"
    (my-url-encode-string str 'utf-8);;辞書側の文字コードに合わせる
)))
このエントリーをはてなブックマークに追加

Emacs Emacs-Lisp

Emacs:アクティブでないバッファーを全て閉じる

kotatu.org というブログで見つけた設定ですがとても便利なので紹介します。
 
tabbar.el を使っていると、うっかりしているとファイル名の文字が判別できないほど tabbar がいっぱいになっていることがあります。そんなときに、アクティブでないバッファーをすべて閉じることができれば嬉しいですね。
 
kill all buffers と言うのはよく見かけますが、kill other buffers という発想が素晴らしいです。実用的にはこちらのほうが重宝しますね。
 

;; アクティブでないバッファをすべて閉じる
(defun my/filter (condp lst)
  (delq nil
        (mapcar (lambda (x) (and (funcall condp x) x)) lst)))
(defun kill-other-buffers ()
  "Kill all other buffers."
  (interactive)
  (let* ((no-kill-buffer-names
          ;; 消さないバッファ名を指定
          (list (buffer-name (current-buffer))
                "*Messages*" "*Compile-Log*" "*Help*"
                "*init log*" "*Ibuffer*" "*scratch*"
                "*MULTI-TERM-DEDICATED*"))
         (interested-buffers
          (my/filter
           '(lambda (buffer)
              (and
               ;; donk kill buffers who has the windows displayed in
               (not (get-buffer-window (buffer-name buffer)))
               ;; dont kill hidden buffers (hidden buffers' name starts with SPACE)
               (not (string-match "^ " (buffer-name buffer)))
               ;; dont kill buffers who have running processes
               (let ((proc (get-buffer-process buffer)))
                 (if proc
                     (equal 'exit
                            (process-status
                             (get-buffer-process buffer)))
                   t))))
           (buffer-list)))
         (buffers-to-kill
          (set-difference interested-buffers
                          (mapcar '(lambda (buffer-name)
                                     (get-buffer buffer-name))
                                  no-kill-buffer-names))))
    (mapc 'kill-buffer buffers-to-kill)))
(global-set-key (kbd "M-]") 'kill-other-buffers)

※ キーバインドはお好みで・・・

このエントリーをはてなブックマークに追加

Emacs

shell-pop.el を zsh で使うと便利

emacs24.4のlisp群をパッケージ化するために、shell-pop も入れなおしたのですが動作が怪しい。色々調べるとバージョンアップされていて設定も少し変わっていたので、init.el も書き直しました。
 
[C-t]は、shell-pop の起動・停止がトグルできるようになっていて使い終わったら exitしたのち [C-t] で隠れます。起動時はカレントディレクトリになっていますが、cd[RET] でホームディレクトリになります。便利ですね(^_^)
 

;; term
;; ---------------------------------------------
(require 'shell-pop)
(custom-set-variables
 '(shell-pop-shell-type (quote ("ansi-term" "*shell-pop-ansi-term*" (lambda nil (ansi-term shell-pop-term-shell)))))
 '(shell-pop-term-shell "/bin/zsh")
 '(shell-pop-universal-key "C-t")
 '(shell-pop-window-height 30)
 '(shell-pop-window-position "bottom"))
;; -----------------------------------------------

 
zshのインストールは、homebrew で行うのが簡単です。
 

% brew install zsh

 
zshは、terminalの現在位置を明示してくれるので僕のようなビギナーにはとても助かります。他にも優れた点はたくさんあるようなので興味のある方は、下記のサイトの記事がわかりやすいです。
 

 

15786160958_00010ab2cb_z.jpg
 
参考サイト

このエントリーをはてなブックマークに追加

Mac

capsキーをcontrolキーとして使う

emacs使いのうちでは常識みたいな設定かもしれないのですが遅まきながらやってみました。めちゃくちゃ便利です。

僕の場合、capsキーを使うことはほとんどなく、大文字入力するときは shift押しで操作する。むしろうっかり capsを押してしまっていて気づかずに、”あれれ?” になることのほうが多い。まだのかたはぜひお試しくだされ(^_^)
 
15963466131_0851423699_o.jpg

このエントリーをはてなブックマークに追加

Emacs

Emacs24.4は終了時のフレーム状態を保存できる

WEBで見つけた情報によると、emacs24.4からフレームの状態が保存できるようになったとのこと、早速 init.el にその設定を追加して試してみました。

;; desktop-save-mode
(desktop-save-mode 1)

 

僕の場合、Mac本体はシャットダウンすることなくスリープで終了します。当然ながらemacsも起動しっぱなしです。けれども設定ファイルを修正したり、新しい package lisp を試したりするときに何度も再起動せざるをえないことがあります。そんなとき改めて必要なバッファーを開くには面倒です。
 
15791539898_f8c15d1f83_o.jpg
 
僕のワークスタイルは、Macbook で safari を開き、縦置きの外部モニターで、emacsを開いているという状況です。以前はemacsを再起動すると最初は Macbook側に立ち上がるので、その都度外部モニター側へ移動させてやる必要がありましたが、desktop-save-mode を設定しておくと、自動的に外部モニターに移動します。もちろん、exitするまえに開いていた buffer もちゃんと読み込んでいます。

快適!!
 
※ 参考にした情報

このエントリーをはてなブックマークに追加

Emacs

Emacs24.4 with libmxl2 for Mavericks

バージョン24.4から同包された eww が使いたくて一度ビルドしたのですが、Libxml2 がないとerrorがでて動きません。いろいろ情報を集めてなんとか emacs24.4 with Libxml2 をビルドできたので備忘録としてまとめました。
 

Libxml2 を Mac にインストール

/usr/include 以下に Libxml2 があれば大丈夫です。
僕の場合、Mac に Mavericks をクリーンインストールしなおしたので、Xcodeはインストールしたのですが、 /usr/include のフォルダすらありませんでした。Plamo さんのブログで情報を得たので、ターミナルから

% xcode-select --install

として、command line developer tool をインストールします。 /usr/include のフォルダが出来てその中に Libmxl2 も入っています。

一連の作業は、すべてターミナルアプリで行います。
mac標準のターミナルで十分ですが、
僕の場合はフリーソフトの iterm2.app を愛用しています。
 

Emacs 24.4のアーカイブをダウンロード

作業ディレクトリへ移動して、Emacs 24.3のアーカイブをダウンロードします。特にどこでもいいのですが、僕の場合はデスクトップで作業すること多いです。

% cd ~/desktop
% wget http://ftp.gnu.org/pub/gnu/emacs/emacs-24.4.tar.xz
% tar xvf emacs-24.4.tar.xz

 

インラインパッチをダウンロード

Plamoさんのサイト からインラインパッチをダウンロードして適用します。

% wget http://plamo.linet.gr.jp/~matsuki/mac/emacs-24.4-inline.patch.bz2
% bunzip2 emacs-24.4-inline.patch.bz2
% pathch -p1 < ../emacs-24.4-inline.patch

 

ビルドします

make の -j2 オプションは、CPU のコア数に合わせて適宜変更してください。
(4コアなら -j4)

% ./configure --with-ns --with-xml2 --without-x 
% make -j2
% make install

無事にビルドが完了すればnextstep/Emacs.appが生成されるので/Applicationsディレクトリにコピーします。
 

このエントリーをはてなブックマークに追加

Emacs

*scratch*バッファーを消さないようにする

Emacsのなんたるかも知らずに使い始めたころ、何のために *sratch* バッファーがあるのかも知らずに、保存不要のメモテーブルとして使っていました。

その後の学習で、Emacsにとって重要な役目をしていることが解り、うっかりkill-bufferで消してしまって、やむなくEmacsを再起動するというナンセンスなことをやっていました。
そこで見つけたのが次のリンクのTips
 

このlispを導入すると、*scratch* バッファで kill-buffer した場合はバッファの内容をクリアし、*scratch* バッファの内容を名前をつけて保存したときには新しく、*scratch* バッファを作ってくれます。

 (defun my-make-scratch (&optional arg)  
(interactive)  
(progn  
;; "*scratch*" を作成して buffer-list に放り込む  
(set-buffer (get-buffer-create "*scratch*"))  
(funcall initial-major-mode)  
(erase-buffer)  
(when (and initial-scratch-message (not inhibit-startup-message))  
(insert initial-scratch-message))  
(or arg (progn (setq arg 0)  
(switch-to-buffer "*scratch*")))  
(cond ((= arg 0) (message "*scratch* is cleared up."))  
((= arg 1) (message "another *scratch* is created")))))

(add-hook 'kill-buffer-query-functions  
;; *scratch* バッファで kill-buffer したら内容を消去するだけにする  
(lambda ()  
(if (string= "*scratch*" (buffer-name))  
(progn (my-make-scratch 0) nil)  
t)))

(add-hook 'after-save-hook  
;; *scratch* バッファの内容を保存したら *scratch* バッファを新しく作る  
(lambda ()  
(unless (member (get-buffer "*scratch*") (buffer-list))  
(my-make-scratch 1))))

このエントリーをはてなブックマークに追加

Emacs

emacs の IME を便利にコントールする設定

Emacsを日本語環境でよく使う僕の場合、うっかりIME ON のままでミニバッファーへのコマンド入力や、[MIGEMO]isearch して「おいおい・・」というケースが多かったので、以下のように設定しています。

lipsを見て貰えば一目瞭然、説明の必要は無いと思います。

;; emacs 起動時は英数モードから始める  
(add-hook 'after-init-hook 'mac-change-language-to-us)

;; minibuffer 内は英数モードにする  
(add-hook 'minibuffer-setup-hook 'mac-change-language-to-us)  
(mac-translate-from-yen-to-backslash)

;; buffer 切替時、IMEの状態をアップデート  
(load "cl")  
(add-hook  
'post-command-hook  
(lexical-let ((previous-buffer nil))  
#'(lambda ()  
(unless (eq (current-buffer) previous-buffer)  
(if (bufferp previous-buffer) (mac-handle-input-method-change))  
(setq previous-buffer (current-buffer))))))

;; [migemo]isearch のとき IME を英数モードにする  
(add-hook 'isearch-mode-hook 'mac-change-language-to-us)  


このエントリーをはてなブックマークに追加

Emacs

Emacs24 Fullscreen の評価は?

まずはプリントスクリーンの比較から

 

Fullscreen

fullscreen

 
 

Normalscreen

tabbar



よく見ると、タイトルバーの部分がブラックでマスキングされてるだけ、作業面積で言えば全く変わりません。僕の場合、通常は外部モニター側をメインに作業するため、Mac本隊のメニューバーは外部モニターに表示させています。したがって、MacBook側の表示は、フルスクリーン表示でもノーマルスクリーン表示で同じ・・・なんです。

 

いいかえるとMacBook単体で使う場合に限っては、メニューバーの分だけ広くなると言うことですね。
写真でも解るようにフルスクリーンモードでは、画面の透過機能は死んでしまいます。またマルチスクリーンの場合、片側モニターの表示も死んでしまいます。なのでマルチモニター環境では余り意味の無い設定といえます。ま、不要なものが表示されない分、集中できる・・・と言った程度の効用でしょうか。

このエントリーをはてなブックマークに追加