なんでもbrowse-url-at-point

平成22年11月11日(木) 14時46分55秒
区分
Emacs
報告者:
chiba

こんにちは、Chibaです!
ネタ切れなので、ちょっとした自前便利Emacs lispの紹介です!
browse-url-at-pointとは、ポイント位置にURLの文字があれば、それをブラウザで開くというものです。 このbrowse-url-at-pointで使われている、thing-at-pointという関数が肝なのですが、この関数は、ポイント(カーソル)がある場所のオブジェクトを取得できるというEmacsの関数です。
この関数なのですが使い方次第では非常に便利です。
browse-url-at-pointでは、URLが決め打ちですが、thing-at-point(ポイント位置のオブジェクトを取得)とbrowse-url(ブラウザで開く)を組み合せることによって似たようなものを簡単に作成することができます。
例えば、ポイント位置のRedmineのチケット(#1234というような形式)を開きたい場合は、色々手抜きですが、

(defun show-ticket-at-point ()
  (interactive)
  (browse-url (format "https://example.com/issues/show/%s"
                      (thing-at-point 'word))))
のように書けると思います。
簡単な割には便利ですので、エディタ上の情報からブラウザで何か開きたいと思った時には、工夫して色々作成してみてはいかがでしょう。

>View Comments          このページの上へ戻る

コッカを移動する

平成22年11月10日(水) 16時57分15秒
区分
Emacs
報告者:
chiba

こんにちは、Chibaです!
今日もネタが無さ過ぎるのでぼんやり考えたEmacs小ネタで行きます!
自分は、括弧は先に対で入力する派なのですが、先に入力するとコッカの方を後ろに移動したり前に持って行きたくなったりします。
具体的には、

(a) b c d e f
を、
(a b c d e f)
にしたくなったりするわけですね。
これは良いブログネタ!ということで早速作ってみました。
(define-key global-map [(control meta shift ?f)]
  (defun forward-thesis (arg)
    (interactive "p")
    (when (string= ")" (thing-at-point 'char))
      (delete-char 1)
      (forward-sexp arg)
      (insert ")")
      (backward-char))))

(define-key global-map [(control meta shift ?b)]
  (defun backward-thesis (arg)
    (interactive "p")
    (when (string= ")" (thing-at-point 'char))
      (delete-char 1)
      (backward-sexp arg)
      (backward-char)
      (insert ")")
      (backward-char))))
ちょっと妙な動きもしますが、使えるようであればちゃんとしたものに作り直そうかなと思っています。
ちなみに、thesisという名前は、paren/thesisに分ける呼び方があるようなので、これから取りました。
jargon, node: ASCII

>View Comments          このページの上へ戻る

elispを書き散らかすあばれん坊M-x doctor

平成22年11月4日(木) 16時50分28秒
区分
Emacs
報告者:
chiba

こんにちは、Chibaです!
ネタが無さ過ぎるのでぼんやり考えたEmacs小ネタで行きます!

Emacsの初期化を細かく関数に分ける

そのままな内容ですが、初期化するコード片を追加する度に関数にして書き散らし、大本の.emacsから呼ぶようにします。
具体的には、

(defun setup>grep ()
  (require 'grep-edit)
  (setq grep-find-command "/usr/local/bin/ack --nocolor --nogroup "))
という風に定義し、.emacsから、(setup>grep)のように呼ぶという風。
なんのメリットもなさそうですが、find-function-at-pointで定義先に飛べるので、気儘に書き散らかしても、一発でジャンプできます(要バイトコンパイル)。
これで書き散らかしても安心。もっと書き散らかしたい!

バッファのファイル名をキルリングに入れる

これまた、そのままな内容ですが、編集しているバッファのファイル名をタスクのチケット等に貼りたことが多いので、

(defun kill-new-current-bufffer-file-name ()
  (interactive)
  (kill-new (buffer-file-name)))
こういう風なものを作ってみました。地味に便利です。
以上、小ネタ2つでした。

>View Comments          このページの上へ戻る

Emacsで直前で閉じたバッファをまた開きたい

平成22年10月26日(火) 16時52分36秒
区分
Emacs
報告者:
chiba

こんにちは、chibaです!
Firefoxを使っていると良くお世話になるre-open tab(Ctrl+Shift+T)ですが、Emacsでも欲しくなりました。
ということで早速作ってみましたが、バッファをそのまま復元するというのは分からなかったので、前回閉じたファイルだけ復活できるというバージョンで。
バッファを復元できる方法が分かれば、それを試してみたいですね。

;; utils
(defmacro aif (test then &optional else)
  `(let ((it ,test))
     (if it
         ,then
         ,else)))

(defmacro awhen (test &rest body)
  `(aif ,test
        (progn
          ,@body)))

(progn
  ;; re-open-file
  (defvar *recent-buffers*)
  (setq *recent-buffers* () )
  
  (defadvice kill-buffer (before kill-buffer-before activate)
    (awhen buffer-file-name
      (push it *recent-buffers*)))
  ;; (ad-deactivate 'kill-buffer) 
  
  (defun re-open-file ()
    (interactive)
    (aif *recent-buffers*
         (find-file (pop it))
         (message "null")))
  
  (define-key global-map [(control x) (shift ?k)]
    're-open-file) )

>View Comments          このページの上へ戻る

Cimy Swift SMTP + Contact Form 7でJISのメールが送れない

平成22年10月18日(月) 10時07分02秒
区分
WordPress
報告者:
chiba

こんにちは、chibaです!
ネタ切れなので、問題の本質的な解決がされてないネタを書きます。
タイトルの通りなのですが、Cimy Swift SMTP + Contact Form 7でJISのメールを送ろうと設定していましたが、WP Multibyte Patchの設定をJISにしてもさっぱりJISでメールが送信されません。
何かがどこかで競合しているのかと思い、プラグインを削除していきましたが、Cimy Swift SMTPを抜いたところJISの設定が効くようになりました。
今回の場合は、そもそもCimy Swift SMTPは必要なかったので削除してしまうことにしましたが、今後どうしても必要になった際には調べてみたいと思います。

>View Comments          このページの上へ戻る

4つ単位で増加するuniversal-argumentで大丈夫か

平成22年10月18日(月) 09時30分03秒
区分
Emacs
報告者:
chiba

こんにちは、chibaです!
ネタ切れなので、どうでも良い感じのEmacsの日々を書きます。
Emacsのユーザーには、お馴染の数引数を入力するC-uですが、デフォルトだと(* 4)な感じで増加していきます。

================================================================
は、C-u C-u C-u =の様に入力したりしていますが、自分は便利だなと思うのはこれ位です。
どちらかというと一個ずつ増加していった方が便利なのではないだろうか、ということで、オリジナルのコードを改造して作ってみました。
C-uと置き換えてみても良かったのですが、super+uということにしてみましたが、どんな感じなのかしばらく様子を見てみたいと思います。
(defun universal-argument-1+ ()
  (interactive)
  (setq prefix-arg (list 1))
  (setq universal-argument-num-events (length (this-command-keys)))
  (ensure-overriding-map-is-bound))

(defun universal-argument-1+-more (arg)
  (interactive "P")
  (cond ((consp arg)
         (setq prefix-arg 
               (list (if (minusp (car arg))
                         (1- (car arg))
                         (1+ (car arg))))))
        ((eq arg '-)
         (setq prefix-arg (list -1)))
        ('T (setq prefix-arg arg)
            (restore-overriding-map)))
  (setq universal-argument-num-events (length (this-command-keys))))

(define-key global-map [(super u)]
  'universal-argument-1+)

(define-key universal-argument-map [(super u)]
  'universal-argument-1+-more)

>View Comments          このページの上へ戻る

使い捨てなコマンドを作っては捨て

平成22年10月4日(月) 16時33分03秒
区分
Emacs
報告者:
chiba

こんにちは、chibaです!
本当にネタ切れなので、どうでも良いレベルのEmacsの日々を書きます。
emacsのVCモードでは、gitが使えるのですが、git pushはしてくれないらしく、これだけシェルで実行していたりしました。
いやいやこれでは、いけないということで、コマンドを作成。
default-directoryにパスを束縛すれば、そのディレクトリで実行される様子(この辺あまり良く分かっていないのですが…)
ちなみに、無駄にマクロにしています。コマンド名にはスペースも使えるようなので、LispWorksのエディタみたいなコマンド名にできるようなマクロです。
anything.elで絞り込むのでこういう名前でも問題ないみたいですね。

(defmacro defcommand (name lambda-list &rest forms)
  (let* ((lambda-list (copy-list lambda-list))
         (iarg (getf lambda-list '&interactive)))
    `(progn
       (defun ,(intern name) ,(progn (remf lambda-list '&interactive) lambda-list)
         (interactive ,iarg)
         ,@forms)
       ,name)))

(defcommand "Git Push" ()
  (let ((default-directory (file-name-directory (buffer-file-name))))
    (shell-command "git push") ))

>View Comments          このページの上へ戻る

Edit with EmacsとStumpWMの連携が便利!

平成22年9月24日(金) 18時59分58秒
区分
Emacs
報告者:
chiba

こんにちは、chibaです!
Emacs大好きな自分は、Firefoxのテキストエリアの編集には、It's All Text!を利用しているのですが、最近Chromeを使うことも多く、It's All Text!みたいなのが、Chromeにもないかなあとちょっと探してみたらEdit with Emacsというのをみつけました。
It's All Text!と違ってこちらは Edit with Emacs という名前の通りEmacs専用という感じです。
Emacs側で、サーバーを立てて接続を待ち受けるという方式なので、専用のelispを読み込ませておく必要があります。
いつものパターンなのですが、ChromeからEmacsを呼び出したときは、フォーカスをEmacsに遷移、そして編集が終わればまたChromeにフォーカスを自動で戻したいところ。
StumpWMならば、シェルからコマンドを実行できる仕組みがあるので、これでフォーカスの遷移に対応してみました。

(progn
  (require 'edit-server)

  (setq edit-server-new-frame nil)

  (unless edit-server-new-frame
    (add-hook 'edit-server-done-hook
              (lambda ()
                (start-process "->chrome" nil "stumpish" "chrome"))))
      
  (add-hook 'edit-server-start-hook
            (lambda ()
              (start-process "->emacs" nil "stumpish" "emacs")))
  
  (edit-server-start) )
Edit with Emacsと連携させる、edit-server.elですが、フックを掛けられるように作り込まれていて、楽に拡張ができます。この辺りに地味に感心しました。 ■

>View Comments          このページの上へ戻る

自分好みにウィンドウ切り換え (1)

平成22年9月16日(木) 14時38分31秒
区分
Emacs
報告者:
chiba

こんにちは、chibaです!
ネタ切れなので、Emacsをいじります。
Emacsを利用している方で、 ElScreenを使っている方は多いと思います。
自分も確かに便利だなあと思うのですが、どうも挙動が自分の好みに合わないところがあり、代りにEmacsのレジスタ機能を使ってみたりしていました。(逆にややこしいですが…)
先日ふと、ウィンドウの構成はどういう風に保存/復帰しているのかを調べてみたら、(current-window-configuration)で構成を取得、set-window-configurationで設定という感じでした。
思いのほか単純だったので、自分好みの挙動をするようなものを作って行ってみようかと思います。
とりあえずで、window-configuration-listという循環リストにウィンドウの構成を保存するだけの素朴なものをでっち上げてみました。循環リストなので、くるくる回ります。
これだけでも割と使えていますが、もうちょっと便利にしたいですね。

;; 循環リストを作成する
(defun circular-list (&rest elts)
  (cdr (rplacd (last elts) elts)))

(defvar window-configuration-list)

(defun init-window-configuration-list ()
  (setq window-configuration-list
        (circular-list (current-window-configuration))))

;; window-configurationをリストにプッシュ
(defun push-window-configuration ()
  (interactive)
  (push (current-window-configuration)
        (cdr window-configuration-list))
  (message (format "created (%d)"
                   (window-configuration-list-size window-configuration-list))))

;; FIXME eqで比較するだけ
(defun window-configuration-list-size (wc)
  (let ((start wc)
        (cnt 1))
    (catch 'count
      (mapl (lambda (x)
              (when (eq start x)
                (throw 'count nil))
              (incf cnt))
            (cdr wc)))
    cnt))

(defun cycle-window-configuration-list ()
  (interactive)
  ;; 現在の窓の状態で更新
  (setcar window-configuration-list
          (current-window-configuration))
  ;; 順送り
  (setq window-configuration-list
        (cdr window-configuration-list))
  ;; 次の要素を現在の窓設定にする
  (set-window-configuration
   (car window-configuration-list)))

(defun delete-window-configuration ()
  (interactive)
  (setcar window-configuration-list
          (cadr window-configuration-list))
  (setcdr window-configuration-list
          (cddr window-configuration-list))
  (set-window-configuration
   (car window-configuration-list))
  (message (format "deleted (-> %d)"
                   (window-configuration-list-size
                    window-configuration-list)))) )

(progn
  ;; keybind
  (define-key global-map [(control meta ?l)] 'cycle-window-configuration-list)
  (define-key global-map [(control meta shift ?i)] 'push-window-configuration)
  (define-key global-map [(control meta ?!)] 'delete-window-configuration) )

(init-window-configuration-list)

>View Comments          このページの上へ戻る

Rubyでなにもしない

平成22年9月9日(木) 11時28分37秒
区分
Ruby
報告者:
chiba

こんにちは、chibaです!
最近、文字列を場合に応じてUTF-8(デフォルト)と、sjisに切り換えて文字を生成したいということがありました。
自分としては、

"こんにちは".send(if sjis? then :tosjis else なにもしない end)
と書きたかったのですが、Rubyでなにもしないメソッドってなんだったかなーと探してもなかなか見付かりません。 Haskellでいうid、LISP系では、identityというのが多いのですが、ruby identityでググったら、 - Ruby 1.9 - Feature #841: Object#self - Ruby Issue Tracking System
という一連のスレッドがみつかりました。
なるほど、提案はされているもののリジェクトされてるんですね。
高階手続きに馴染んでいる人ならば、identityの有用性は体験していると思うのですが、馴染みのない人からは、identityみたいに何もしないでそのまま受け取った値を返すものなんて何に使うの?という意見は割とFAQかなと思います。
この議論中で
class Object
  def identity() self; end
end
というのが例として挙げられていました。これを使えば、
"こんにちは".send(if sjis? then :tosjis else :identity end)
"こんにちは".send(sjis? ? :tosjis : :identity)
と書ける訳ですね。
それで結局自分はどうしたかというと、Objectにメソッドを定義するのも気が引けたので
str = "こんにちは"
if sjis? then 
  str.tosjis
else
  str
end
とか、
str = "こんにちは"
sjis? ? str.tosjis : str
と書くことにしました。
これはこれで妥当ですね。 ■

>View Comments          このページの上へ戻る

技師部隊からの
お知らせ

エンジニア募集 しています。

本頁の来客数
九万八千五百二十名

メンバー一覧

アクトインディ技師部隊員名簿

アクトインディ技師部元隊員

アクトインディへ

投稿する

カテゴリー

アクトインディ

aaaa