htmlの勉強用に便利だぜ

どもです。
実家に帰った際に小学4年生の姪っ子に麻雀なんて教えてませんよ。
教えたその日,というか手積み2,3回目にしてしっかり手積みができるようになって,
すさまじいポテンシャルを垣間見たとかなんてことはありませんよ。
みんな心配しすぎだってばよ。
久しぶりに牌を握ったけどやっぱたまらんものがあるぜ!

さて。

htmlのお勉強をしているのですが,ある程度マークアップしてから,
「あーやっぱこのへんをdivりたいなーとか,やっぱtableにして,この辺をtrからのthしたいなー」
なんてことがちょいちょいあるんですが,この作業がだりー。
いくらnxml-modeのelectric-slashによる補助があってもめんどくせー。
リージョン指定して,このリージョンを<div></div>するとか,<tr><th></th></tr>するとか
できるのはどっかにあるだろうと,aproposから^nxmlして一通りチラ見したけどそれらしきものを見つけられなかった。

なので書いてみた。

(defun my-nxml-mode-entag-region (start end)
  (interactive "r")
  (let* ((tag (split-string (read-from-minibuffer "Tag: ") "[ ,]" t))
         (start-tag (mapconcat (lambda (s)
                                 (concat "<" s ">"))
                               tag ""))
         (end-tag (mapconcat (lambda (s)
                               (concat "</" s ">"))
                             (reverse tag) ""))
         ;; skip leading whitespaces
         (start2 (or (progn (goto-char start)
                            (when (string-match "[ \t]" (make-string 1 (char-after)))
                              (goto-char start)
                              (back-to-indentation)
                              (point)))
                     start))
         ;; skip backward trailing whitespaces
         (end2 (save-excursion
                 (goto-char end)
                 (if (re-search-backward "[^ \t\n\r]" nil t)
                     (1+ (point))
                   end)))
         ;; region to be replaced with new-region
         (region (and (< start2 end2) (buffer-substring start2 end2)))
         ;; and new-region
         (new-region (and (< start2 end2)
                          (concat start-tag
                                  region
                                  end-tag))))
    (when (< start2 end2)
      (kill-region start2 end2)
      (goto-char start2)
      (insert new-region)
      (goto-char start2))))
使い方的なもの

リージョン指定して,M-x my-nxml-mode-entag-region すると,
「Tag: 」とミニバッファに出るので,タグ名をスペースまたはカンマ区切りで入力します。
んで,ウマー!!

;; 例
;; リージョンを選択(選択とはいわんのか?)して・・・
;; リージョン内に「if i say im not a region, what would you call me?」とします。
M-x my-nxml-mode-entag-region [RET]
Tag: span [RET]
;; さっきのリージョンが
;; <span>if i say im not a region, what would you call me?</span>
;; となります。

私は,

(defun my-nxml-mode-hook-func ()
  (interactive)
  ;; たくさんあるので略
  (define-key nxml-mode-map (kbd "C-c C-e") 'my-nxml-mode-entag-region)
  (auto-complete-mode t)
  )

として,C-c C-e にバインドして使っています。entag の e ね,ちなみに。

結論
  • もっとずっと高機能で便利な物があるはずなのでそれを探して使うのがいいと思います。
  • mapconcatを初めて知った。
    • 今まではmapcarしてreduceしてきたが,mapconcatが出てきてreduceたん涙目w
    • けど僕はreduceたんと一生付き合っていくつもりです!