Vimpulse / viper-mode用スクリプト
ヒストリ貼り付け
22行目と、11行目から14行までと、17行目の三カ所をヤンク(コピー)か削除して、ヤンク(削除)した順番に貼り付けをしたいというような時に使います。
Vimpulse/viper-modeどちらでも使用可能です。
コピーではなく削除でもかまいませんが、行単位を前提にしているので yy(Y) ddを使用して下さい。
余談ですが vimだけではなく viでもほぼ同じトリックが標準で実装されています。
「ヒストリ貼り付け」 (vimの場合)
;; ヒストリ貼り付け開始
(define-key viper-vi-global-user-map [\C-,] 'my-viper-Put-history-first)
;; ヒストリ貼り付け
(define-key viper-vi-global-user-map [\C-.] 'my-viper-Put-history)
- 貼り付けをしたい行を最大9カ所まで行単位でヤンク(削除でも可)します。
- Ctrl+, でヒストリ貼り付けを開始します。
- 以降は Ctrl+. を押すごとにヒストリをさかのぼって貼り付けを行います。
キーマップを2つも使いたくない場合は Ctrl+, の代わりに "1Ctrl+. (3ストローク)でも代用可能です。
設定例では viper-modeでも使えるように viper-vi-global-user-mapを使用していますが、Vimpulseなら vimpulse-mapでかまいません。
;; ヒストリ貼り付け開始
(define-key viper-vi-global-user-map [\C-,] 'my-viper-Put-history-first)
;; ヒストリ貼り付け
(define-key viper-vi-global-user-map [\C-.] 'my-viper-Put-history)
;; "1P... ヒストリ貼り付け
(defun my-viper-Put-history (arg)
(defvar my-viper-Put-history-reg1 48)
(defvar my-viper-Put-history-reg 1)
(interactive "P")
(setq last-command 'my-viper-Put-history)
(when (and viper-use-register (viper-valid-register viper-use-register '(digit)))
;; (message (format "%d" viper-use-register))
(setq my-viper-Put-history-reg1 (- viper-use-register 1))
(setq my-viper-Put-history-reg 1))
(setq reg (+ my-viper-Put-history-reg my-viper-Put-history-reg1))
(setq my-viper-Put-history-reg (+ my-viper-Put-history-reg 1))
(if (> my-viper-Put-history-reg 9)
(setq my-viper-Put-history-reg 1))
(when (viper-valid-register reg '(digit))
(let ((text (current-kill (- reg ?1) 'do-not-rotate)) (pos (point)))
(viper-beginning-of-line arg)
(insert text)
(goto-char pos))))
(defun my-viper-Put-history-first (arg)
(interactive "P")
(setq my-viper-Put-history-reg 1)
(my-viper-Put-history arg))
単語単位の検索とビジュアルモードの検索
g* でコマンドを実行すると vimpulse-cjk.el を使用している場合は文字種ごとに、そうでない場合でも Emacsの文節扱いでカーソル位置の単語/symbolを拾います。
検索方向はコマンド実行後に n か Nで決定します。
- viper-mode用設定例
;; * 検索コマンド(symbol)
(define-key viper-vi-global-user-map "*" 'my-viper-search-for-symbol-at-point)
;; カーソル位置の単語を検索文字列として取得
(define-key viper-vi-global-user-map "g*" 'my-viper-search-star)
- Vimpulse用設定例
- Vimpulseの場合はビジュアルモードで選択中に * で「選択中の文字列」を検索文字列として登録可能です。
- (ビジュアルモードで検索文字列設定)
;; デフォルト互換の * 検索コマンド(symbol)
(vimpulse-map "*" 'my-viper-search-for-symbol-at-point)
;; カーソル位置の単語を検索文字列として取得
(vimpulse-map "g*" 'my-viper-search-star)
;; ビジュアルモードで選択中の文字列を検索文字列として設定
(vimpulse-vmap "*" 'my-vimpulse-visual-search-star)
(注意)
コマンド実行しても検索文字列を取得するだけで検索実行しないのは個人的な好みからです。
気に入らない場合はハイライト処理(my-viper-flash-pattern)を行っている部分を、コメントアウトしてある次行の検索コマンド(viper-search)と置き換えてください。
その場合は -backwardで逆方向への検索が可能です。
;; # 検索コマンド
(define-key viper-vi-global-user-map "#" 'my-viper-search-for-symbol-at-point-backward)
;; カーソル位置の単語を検索文字列として逆方向検索
(define-key viper-vi-global-user-map "g#" 'my-viper-search-star-backward)
単語単位でカーソル位置の単語を検索文字列として取得
キーマップは前述の例を参考に好みの物を設定してください。
;------------------------------------
;; viper lib
;------------------------------------
;; * 検索コマンド
(defun my-viper-search-for-symbol-at-point (&optional backward)
(interactive)
(setq viper-s-forward (not backward))
(setq viper-s-string (thing-at-point 'symbol))
;; 単語として検索したい場合は以下を有効に
;; (setq viper-s-string (concat "\\_<" viper-s-string "\\_>"))
(viper-flash-search-pattern))
;; (viper-search viper-s-string viper-s-forward 1))
(defun my-viper-search-for-symbol-at-point-backward ()
(interactive)
(my-viper-search-for-symbol-at-point t))
;; カーソル位置の単語を検索文字列として取得
(defun my-viper-search-star (&optional backward)
(interactive)
(setq viper-s-forward (not backward))
(save-excursion
(forward-char)
(if (featurep 'vimpulse-cjk)
(viper-backward-word 1)
(backward-word))
(let ((pos (point)))
(kill-ring-save pos (point))
(if (featurep 'vimpulse-cjk)
(viper-forward-word 1)
(forward-word))
(copy-region-as-kill pos (point))
(setq viper-s-string (regexp-quote (buffer-substring pos (point))))
(setq viper-s-string (replace-regexp-in-string "\\s-+$" "" viper-s-string))
(setq viper-s-string (replace-regexp-in-string "\n+$" "" viper-s-string))
(my-viper-flash-search-pattern pos))))
;; ))(viper-search viper-s-string viper-s-forward 1))
(defun my-viper-search-star-backward ()
(interactive)
(my-viper-search-star t))
(defun my-viper-flash-search-pattern (&optional pos)
(cond (pos
(unless (region-active-p)
(push-mark nil t))
(goto-char pos)
(cond
((looking-at viper-s-string)
(save-excursion
(search-forward viper-s-string)
(viper-flash-search-pattern)))
(t
(viper-search viper-s-string t 1)
(unless (region-active-p)
(pop-mark)))))
(t
(viper-flash-search-pattern))))
ビジュアルモードで「選択中の文字列」を検索文字列として設定
ビジュアルモードで選択中に * で選択文字列を検索文字列として設定します。
設定後に n Nで検索が実行されます。
;; ビジュアルモードで選択中の文字列を検索文字列として設定
(vimpulse-vmap "*" 'my-vimpulse-visual-search-star)
これは vimpulse.elの vimpulse-yank をコピーして一部改変しただけの手抜きスクリプトです。
Vimpulseのバージョンによって動作しない場合は vimpulse.elから同名関数をコピーして copy-regionしている部分を書き換えると良いかもしれません。
;====================================
;; vimpulse
;====================================
(when (featurep 'vimpulse)
;------------------------------------
;; vimpulse lib
;------------------------------------
;; ビジュアルモードで選択中の文字列を検索文字列として設定
(vimpulse-define-operator my-vimpulse-visual-search-star (beg end)
"Search text from BEG to END. vimpulse-yank (beg end)"
:repeat nil
:move-point nil
(let (last-command)
(vimpulse-with-operator-message beg end "Saved <N>"
(cond
((eq vimpulse-this-motion-type 'block)
(setq killed-rectangle (extract-rectangle beg end))
;; associate the rectangle with the last entry in the kill-ring
(unless kill-ring
(copy-region-as-kill beg end))
(put 'killed-rectangle 'previous-kill (current-kill 0))
(vimpulse-visual-block-rotate 'upper-left beg end)
)
(t
(vimpulse-store-in-current-register beg end)
;; (copy-region-as-kill beg end) ;; この行を改変しました
(setq viper-s-string (regexp-quote (buffer-substring beg end)))
(setq viper-s-forward t) ;; ここまで改変
(unless (eq vimpulse-this-motion-type 'line)
(goto-char beg))
(when (and (eolp) (not (bolp)))
(backward-char)))))))
) ;; end of featurep 'vimpulse
挿入モードでモードラインの色を変更する
挿入モードではモードラインの色を変更すると現在の編集モードを間違える事が無くなって便利です。
;------------------------------------
;; モードラインを強調表示
;------------------------------------
;; モードラインの色設定 保存/復元
(setq my-viper-default-face-background (face-background 'mode-line))
(defadvice viper-go-away (after my-viper-go-away-restore activate)
(set-face-background 'mode-line my-viper-default-face-background))
;; モードラインの色変更
(defun my-viper-set-mode-line-face ()
(unless (minibufferp (current-buffer))
(set-face-background 'mode-line (cdr (assq viper-current-state
'((vi-state . "DarkGrey")
(insert-state . "Yellow3")))))))
(dolist (hook (list
'viper-vi-state-hook
'viper-insert-state-hook
))(add-hook hook 'my-viper-set-mode-line-face))
「挿入モードでステータスラインの色を変更する」 (vim)
縦に連番を入力する
縦に連続した番号を追加したいときがあります。
fuga[]
fuga[]
fuga[]
これを次のように変更したりする場合です。
fuga[0]
fuga[1]
fuga[2]
Emacs用の縦の連番入力コマンドが有ればそれを割り当ててもいいのですが、Vimpulseなら 矩形選択で連番を貼り付け可能です。
「縦に連番を入力する」 (Vimpulse)
http://gitorious.org/vimpulse/pages/Tips#Fill+Visual+Block+selection+with+increasing+numbers
- 「Fill Visual Block selection with increasing numbers」を設定ファイルにコピーします。
- C-vで連番を挿入したい場所を矩形選択します。
- M-n で初期値と増減数を入力します。
「縦に連番を入力する」 (vim)