The Yak Shaver
さあ、今日も毛を刈ろう。
skip to main
|
skip to sidebar
ラベル
emacs
の投稿を表示しています。
すべての投稿を表示
ラベル
emacs
の投稿を表示しています。
すべての投稿を表示
2013/10/03
Completionsバッファでディレクトリに色づけ
C-x C-f(find-file)などでファイルを開くときに、minibuffer でTABキーを押すとCompletionsバッファが開き、補完候補が列挙されます。 このとき、ファイルとディレクトリの区別がつきにくいので、ディレクトリに色を付けるようにしてみました。
ディレクトリがたくさんあるところに行くと、ちょっと重いかもです。
2013/09/06
行末とコメントを除いた部分の行末を行き来する end-of-line
Emacsで C-e するとコメントがあろうがなかろうが行末に飛びます。 いたって普通の動作です。 しかし、カレント行にコメントがある場合は、**コメントではない部分の末尾に**飛んでほしいと、以前から思っていました。 言葉にするとややこしいのですが、下の画像のようなことがしたかったわけです。 C-e すると、まずはコメントではない部分の末尾にジャンプ。
もう一度 C-e すると、行末にジャンプ。
さらにもう一度 C-e すると…、これ以降トグルです。 長年の希望が叶ったので記念に貼っておきます。 ちなみに、ソースの `*` が付いている2行のコメントアウトを外すと、 コメントではない部分の末尾 → コメントの先頭 → 行末 と飛びますが、ちょっと煩雑すぎる気がしたので無効にしています。
2013/08/20
Emacs で ssh 接続してファイルを開く
ふつうに C-x C-f で開けます。 C-x C-f /ssh:ユーザ@ホスト#ポート番号:ファイル名 例: C-x C-f /ssh:john@192.168.1.2#1022:/etc/hosts ポート番号はデフォルト(22)のときは省略可です。
2013/07/20
Dired から Mac の openコマンドでファイルを開く
Emacs の Dired では、ファイルを選択してEnterキーを押すと、何でもかんでも Emacsで開こうとします。しかし画像や動画のファイルは専用のソフトで開きたいところです。 Mac ではファイルごとに関連付けられたデフォルトのアプリでファイルを開く `open` コマンドがあります。 このコマンドと、以前試したQuick Look の[これ](http://yak-shaver.blogspot.jp/2013/03/emacs-mac-quick-look.html)を使って、 Dired で Enter を押したしたときに自動判別して開くようにしてみました。 下記では jpeg や png などの静止画は Quick Look で、avi などの動画や pdf は `open` で開きます。
2013/07/17
html-modeで閉じタグにジャンプする
[web-mode.el](http://web-mode.org) では`web-mode-tag-match`というコマンドで開始タグと閉じタグの間をジャンプできます。 これを html-mode で使うには、 (require 'web-mode) (add-hook 'html-mode-hook '(lambda () (define-key html-mode-map "\M-]" 'web-mode-tag-match))) 単純に上のようにすればいいです。 しかし、なんとなく [mic-paren](http://www.emacswiki.org/emacs/mic-paren.el) のカッコ間ジャンプと同居させてみたくなったので、下記のようなのを仕込みました。 これで、カーソル位置がカッコならカッコ間ジャンプ、それ以外ならタグ間ジャンプをしてくれます。
2013/07/14
Dired でファイルを削除したときに、ゴミ箱に移動する
Dired で`D`キーを押してファイルを削除したときに、直接消さずにゴミ箱に移動するようにするには、下記の1行を .emacs に追加するだけでOKです。 (setq delete-by-moving-to-trash t)
Emacsで開いているファイルの場所をターミナルで開く
[これ](http://yak-shaver.blogspot.jp/2013/01/emacsfinder.html)のつづきです。 とりあえず、やっつけで作りました。ちょっと難ありです。 現状の問題点は、 - Mac専用 - 1つでもターミナルを開いていることが前提 - 他のターミナルのウィンドウがすべて前面化される 一応 Dired でも使えます。
#### 参考にさせていただいたサイト - [ターミナル (Mac)](http://ja.wikipedia.org/wiki/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB_(Mac))
2013/07/05
Emacs でも、Win/Mac のような 全選択を。
最近のEmacsは Shift + カーソル移動でテキストを選択できるようになっているようです。 全選択(Select All)もそれっぽいのが欲しくなったので、似たようなのを作ってみました。
`M-a` するとバッファ内のすべてに色がつき、カーソルがバッファ末尾に移動します。 #### 参考にさせていただいたサイト - [Emacsでキーボードイベントを扱う方法まとめ](http://d.hatena.ne.jp/uk-ar/20120213/1329138385)
2013/07/04
recentf のホームディレクトリを "~" に置換
[recentf-ext のディレクトリを色付け](http://yak-shaver.blogspot.jp/2013/07/recentf-ext.html)に引き続き、recentfネタです。 recentf で列挙されるパスのホームディレクトリ部分(Mac では `"/Users/hoge"`など)を `"~"` に置換します。
↑こういう表示が、↓こういう感じになります。
既出っぽいネタですが、これで視認性がよくなりました。
recentf-ext のディレクトリを色付け
[人は俺を「recentfマスター」と呼ぶ](http://d.hatena.ne.jp/rubikitch/20091224/recentf) の recentf-ext.el を使うと、最近使ったファイルだけでなくディレクトリも列挙されるようになります。 あとは、そのディレクトリを選んでEnterを押すだけで dired で開けます。これに慣れてしまうと、`M-x dired ` や `C-x C-d`してディレクトリ名を入力なんて、やってられません。大抵の場合は、recentf して近場のディレクトリ名をインクリメンタルサーチして Enterすれば事足ります。 とても便利になりましたが、どれがディレクトリなのか見分けづらいこともあります。 そこで、ディレクトリだけを色付けするようにしてみました。
recentf がマイナーモードということもあって色付けには overlay を使いましたが、こういうものは本来 syntax-table か font-lock ですべきなのかもと思ったのは書いた後でした。
2013/06/26
Emacs で JSON を Flymake する
[コマンドラインで使える JSON Lint](http://yak-shaver.blogspot.jp/2013/06/json-lint.html)のつづきです。 どうせなら Emacs で Flymake したいなぁという話しです。 [JSON Lint](https://github.com/zaach/jsonlint ) 以外に必要な物は下記3つです。 - [json-mode](https://github.com/joshwnj/json-mode ) の json-mode.el - [flymake-easy](https://github.com/purcell/flymake-easy ) の flymake-easy.el - [flymake-json](https://github.com/purcell/flymake-json ) の flymake-json.el それぞれダウンロードして、load-path の通ったところに置き、下記を .emacs に追加します。 (require 'json-mode) (add-to-list 'auto-mode-alist '("\\.json$" . json-mode)) (require 'flymake-json) (add-hook 'json-mode-hook 'flymake-json-load) これで *.json を開くと、エラー行に色がつくようになります。
次のエラー行に飛ぶには `M-x flymake-goto-next-error` とします。
2013/06/25
ちょこっと確認するとき用の shell モード
Emacs を使っている時にシェルを使いたいときは `M-x shell` とするのですが、今ひとつ使い勝手がよくありません。 少し億劫に感じてきたので、最近はこんなものを使っています。
ちょこっと確認したいときなどは、 1. `M-x term` とたたく 1. 下部に rebuilder っぽく小さいシェルウィンドウが開く 1. ちょろっとコマンド入れて確認 1. `C-x k` で抜ける としています。抜けるときはシェルバッファとプロセスは毎回消します。 `term`というコマンド名には別のコマンドが割り付けられていますが、とりあえず気にしないということで…。
2013/06/19
メジャーモードごとに eval-region を切り替える
[Python でもスクラッチバッファで対話したい](http://yak-shaver.blogspot.jp/2013/04/python.html) のつづきです。 メジャーモードごとに eval-region を切り替えるようにしてみました。簡単な割に便利です。 これで、スクラッチバッファでもそうでなくても `M-x eval-region` すると、そのメジャーモードにふさわしい eval-region が呼び出され、リージョンの評価結果をプリントするようになります。…といっても、今のところ Python, Ruby, ELispだけですが。 各モード用の `eval-region-xxx` の関数定義は共通化すればシンプルになりそうですが、早すぎる最適化を招きそうなのでこのまま放置です。
Emacs Lisp の関数のすげ替え テスト
fset / setf と、とてもまぎらわしいので、備忘録的においておきます。 テストとして、挨拶文を表示する`greeting`という関数を朝用と夜用にすげ替えてみます。 これでいいのか、今ひとつ自信ないです…。
2013/04/19
Elisp のトグル動作や内部カウンタはクロージャを使う
よく忘れるので、メモしておきます。 トグル動作をさせたい場合や、内部のカウンタを使いたいときは、スタティック変数が欲しいところです。 Emacs Lisp ではクロージャを使えば可能です。 (defun cage1 () (lexical-let ((v 0)) (defun func1 () (setq v (1+ v))))) ; C-x C-e これを評価すると、`cage1` という関数が定義されます。しかし `cage1` 関数自体はコールされてないため、`cage1` の中にある `func1` 関数はまだ未定義です。 なので、`func1`をコールしたいと思っても、 (func1) ; C-x C-e Debugger entered--Lisp error: (void-function func1) (func1) eval((func1) nil) eval-last-sexp-1(nil) eval-last-sexp(nil) call-interactively(eval-last-sexp) eval-region-or-last-sexp() call-interactively(eval-region-or-last-sexp nil nil) となり、エラーが発生します。 一旦 `cage1` をコールしてやれば、 `func1` が定義されるので、それ以後は問題なく `func1` をコールできるようになります。 (cage1) ; C-x C-e (func1) ; C-x C-e => 1 (func1) ; C-x C-e => 2 (func1) ; C-x C-e => 3 ここでもし 変数 `v` がグローバル変数なら、外から値を変更できてしまいます。しかし、この `v` はレキシカル変数(この場合 `cage1` 内部にある、一種のローカル変数)なので、外から変更できません。 外から変更しようとして、下のようにしても (setq v 100) ; C-x C-e (func1) ; C-x C-e => 4 (func1) ; C-x C-e => 5 というぐあいに、`func1` が 101, 102, ... を返したりはせず、カウンタの動作として正しい値をカウントし続けます。 つまり、100 を setq した `v` と `func1` がカウンタに使っている `v` は別物ということです。 カウンタではなく、トグル動作にしたい場合は (defun cage1 () (lexical-let ((v nil)) (defun func1 () (setq v (not v))))) とします。
2013/04/10
C-u つきの query-replace は正規表現で
- M-% で、ふつうの置換(query-replace) - C-u M-% で、正規表現で置換(query-replace-regexp) というふうにしたいです。 (defun my-query-replace (arg) (interactive "P") (let ((current-prefix-arg nil)) (call-interactively (if arg 'query-replace-regexp 'query-replace)))) xyzzy でもこんなのを書いたような…。
Python でもスクラッチバッファで対話したい
果てしなく車輪の再発明っぽいのですが、Emacs の Python の対話環境をでっちあげてみました。 リージョンを選択して M-x eval-region-python すると、評価結果をカーソル行の下に挿入します。雰囲気としては Lisp Interaction モード で C-j したときのような感じです。 (defun eval-region-python (beg end) (interactive "r") (insert (with-output-to-string (shell-command-on-region beg end "python" standard-output)) "\n")) ちなみに、結果をスクラッチバッファに出さずに、slime っぽく別のウィンドウに表示する場合は下記のように。 (defun eval-region-python (beg end) (interactive "r") (let ((buf "*Py Output*") (curwin (selected-window))) (shell-command-on-region beg end "python" buf) (pop-to-buffer buf) (select-window curwin))) こういうのをスクラッチバッファのメジャーモードを検知してすべての言語に対応してやれば、最強のスクラッチバッファになるかも…。 ####参考にさせてもらったページ - [スクラッチバッファで小さなプログラムを走らせる](http://ryo1miya.hatenablog.com/entry/20121108/1352390277) - [How to implement 'shell-command-on-region-to-string' emacs/elisp function?](http://stackoverflow.com/questions/3576192/how-to-implement-shell-command-on-region-to-string-emacs-elisp-function)
コード片を Markdown 向けに
コードスニペットを Markdown にしてブログに貼り付けることが多いので、こんなのを使っています。 (defun markdown-code-region (beg end) (interactive "r") (save-excursion (save-restriction (untabify beg end) (narrow-to-region beg end) (goto-char (point-min)) (while (search-forward-regexp "\\(^.*\\)" nil t) (replace-match (concat " " (match-string 1))))))) リージョンを選択して M-x markdown-code-region すると、それぞれの行頭にスペースを4つづつ入れます。
2013/04/04
モードラインにファイルのフルパスを表示
Emacs のモードラインの左部分にはバッファ名が表示されています。 この部分を左クリックしたら一定時間だけファイルのパス名が表示されるようにしてみました。 ついでにクリックと同時にパス文字列をキルリングにコピーします。 下記は [powerline](https://github.com/milkypostman/powerline)での表示例です。 普段はバッファ名が表示されているけど…  左クリックするとフルパス表示に切り替わる  (defvar mode-line-buffer-fullpath (list 'buffer-file-name (propertized-buffer-identification "%12f") (propertized-buffer-identification "%12b"))) (add-hook 'dired-mode-hook (lambda () ;; TODO: handle (DIRECTORY FILE ...) list value for dired-directory (setq mode-line-buffer-identification ;; emulate "%17b" (see dired-mode): '(:eval (propertized-buffer-identification (if (< (length default-directory) 17) (concat default-directory (make-string (- 17 (length default-directory)) ?\s)) default-directory)))))) (setq mode-line-buffer-default mode-line-buffer-identification) (defun show-mode-line-fullpath (event) (interactive "e") (when (buffer-file-name) (select-window (posn-window (event-start event))) ; activate window (let ((wait-sec 5)) (setq mode-line-buffer-identification mode-line-buffer-fullpath) (force-mode-line-update) (my-copy-buffer-file-name) ; copy path string to killring (sit-for wait-sec) (setq mode-line-buffer-identification mode-line-buffer-default) (force-mode-line-update) (message "")))) (define-key mode-line-buffer-identification-keymap [mode-line mouse-1] 'show-mode-line-fullpath) ; left click (set-face-attribute 'mode-line-highlight nil :box nil) ; remove box when hover mouse (defun my-copy-buffer-file-name () "copy buffer-file-name to kill-ring." (interactive) (let ((fn (unwind-protect (buffer-file-name) nil))) (if fn (let ((f (abbreviate-file-name (expand-file-name fn)))) (kill-new f) (message "copied: \"%s\"" f)) (message "no file name")))) この例では5秒間表示されます。表示時間は wait-sec で変更します。 なお、一定時間表示ではなく、クリックするたびに表示をトグルしたい場合は、`show-mode-line-fullpath` の代わりに下記の `toggle-mode-line-fullpath` を `define-key` するといいです。 (defun toggle-mode-line-fullpath () (interactive) (setq mode-line-buffer-identification (if (string= (format "%s" mode-line-buffer-identification) (format "%s" mode-line-buffer-fullpath)) mode-line-buffer-default mode-line-buffer-fullpath)) ;; (force-mode-line-update) ) ####参考リンク - [Add button with dynamic menu to emacs's modeline?](http://stackoverflow.com/questions/9019717/add-button-with-dynamic-menu-to-emacss-modeline)
2013/03/22
Emacs のモードラインを平面化する
EmacsをGUIで起動すると、モードラインは縁がついて3Dっぽくなります。 しかし、最近のGUIは平面的なものが多いので、Emacsのモードラインも平面的にしてみます。 (set-face-attribute 'mode-line nil :box nil) (set-face-attribute 'mode-line-inactive nil :box nil) 3D(デフォルト)  平面化  [powerline](https://github.com/milkypostman/powerline)には平面的なモードラインが似合いそうな気がします。
前の投稿
ホーム
About
Unknown
詳細プロフィールを表示
Labels
AVR
( 12 )
Blogger
( 10 )
Chrome
( 2 )
cocoa
( 5 )
Eagle
( 5 )
emacs
( 31 )
game
( 1 )
Google
( 4 )
iPhone
( 2 )
Javascript
( 1 )
lisp
( 4 )
LPCXpresso
( 1 )
mac
( 53 )
Markdown
( 4 )
msp430
( 1 )
NXP
( 1 )
Parallels Desktop
( 1 )
PIC
( 3 )
python
( 19 )
Raspberry Pi
( 9 )
ruby
( 1 )
Safari
( 2 )
shell script
( 4 )
Sublime Text
( 1 )
windows
( 7 )
xcode
( 8 )
xyzzy
( 60 )
おぼえがき
( 69 )
まとめ
( 6 )
メール
( 2 )
よもやま
( 19 )
工作
( 23 )
電験
( 4 )
本日の探索結果
( 2 )
Blog Archive
▼
2015
( 3 )
▼
02
( 1 )
C99 サンプルコード
►
01
( 2 )
►
2014
( 17 )
►
12
( 1 )
►
07
( 3 )
►
06
( 3 )
►
04
( 2 )
►
03
( 4 )
►
01
( 4 )
►
2013
( 135 )
►
12
( 5 )
►
10
( 6 )
►
09
( 7 )
►
08
( 10 )
►
07
( 24 )
►
06
( 15 )
►
05
( 15 )
►
04
( 17 )
►
03
( 13 )
►
02
( 17 )
►
01
( 6 )
►
2012
( 11 )
►
10
( 5 )
►
07
( 1 )
►
02
( 2 )
►
01
( 3 )
►
2011
( 86 )
►
12
( 2 )
►
11
( 2 )
►
10
( 1 )
►
07
( 2 )
►
06
( 3 )
►
05
( 20 )
►
04
( 49 )
►
03
( 7 )
►
2009
( 4 )
►
03
( 1 )
►
01
( 3 )
►
2008
( 8 )
►
12
( 8 )
STAT
Ads
Amazon.co.jp ウィジェット
Powered by
Blogger
.