cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

yankround.vimがunite.vimでの履歴の閲覧に対応しました。

LeafCage/yankround.vim

:Unite yankround

これでShougo/unite.vimレジスタの履歴を閲覧できます。
出来ることはunite-source-history/yankとほぼ同じです。(参考にさせていただきました。Shougoさんありがとうございます。)

kien/ctrlp.vimと比較すると、unite.vimでの閲覧は一覧性に優れています。
ctrlp.vimで履歴を一覧するには、何も入力されていない状態で、<C-j> <C-k>で1行ずつスクロールするか、<PageUp> <PageDown>というvimmerにとっては苦行に近いキーによってページスクロールするしかありませんでした。
その点、unite.vimでは通常のVimの操作でスクロールして一覧できます。

もちろん、ctrlp.vimにも利点はあります。速度はctrlp.vimが優れています。*1
インターフェイスについては好みが分かれるところですが、ご自分の使いやすいインターフェイスを選んでお使い下さい。

*1:ctrlp.vimのインターフェイスは絞り込みに特化しているので挿入したい候補が決まっているときに使うと良いでしょう。

yankround.vimにリージョンハイライト機能が付きました

  let g:yankround_use_region_hl = 1

で有効になります。*1
有効にするとyankroundが有効な間、貼り付けたテキストがハイライトされるようになります。
<C-p> <C-n> で回したテキストもです。

g:yankround_region_hl_groupname でハイライトに使うグループを指定できます。
既定の設定は以下のような感じになっています。

let g:yankround_region_hl_groupname = 'YankRoundRegion'

autocmd ColorScheme *   call s:define_region_hl()
function! s:define_region_hl()
  if &bg=='dark'
    highlight default YankRoundRegion   guibg=Brown ctermbg=Brown term=reverse
  else
    highlight default YankRoundRegion   guibg=LightRed ctermbg=LightRed term=reverse
  end
endfunction

動作画面(貼り付けた部分がハイライトされている)

f:id:leafcage:20131211191702p:plain

まだ挙動に謎な部分がありますが、主要なバグは取り除けたと思います。

*1:t9mdさんのプルリクです。ありがとうございます。

Vimの:highlight定義の流儀

colorschemeが先頭で:hl clearをしてくるので、カラースキーム以前に定義された:highlightは軒並み吹っ飛ばされるという問題。
結論を言うと、:highlightの定義はautocmd ColorScheme *でするか、使う直前その場でやるべき。

hl clear つけるのが流儀という理解。なので、プラグインが使う、highlight は ユーザーがカラースキームかえるかも、と考えると autocmd ColorScheme * :call refresh_highlight() とかそういうふうにして、消えずに、蘇らさにゃならんの。。。面倒だけど。

消したくない、highlight 名登録しておいたら、ColoScheme イベントで蘇らせてくれる汎用機能的なのをつくった事があるようなないような。。。。眠いから寝よう。。。

http://lingr.com/room/vim/archives/2013/12/10#message-17790568

LeafCage:
.gvimrcでcolorschemeを設定していると、vimrcやplugin/配下で定義された:highlightが吹き飛ぶ。.gvimrc派の人に注意喚起。
.gvimrcって読み込まれるのが各種plugin/よりも後なのか

manga_osyo:
それだと vimrc で autoload 関数呼んでる場合もアウトの可能性が

LeafCage:
あー。やっぱり念のために、autocmd ColorScheme * で定義する(または利用する関数内でその場で定義する)のが安全か。

http://lingr.com/room/vim/archives/2013/12/10#message-17790643

複数ウィンドウを開いているときneosnippetのスニペットを発動させると他のウィンドウのfoldingが閉じてしまう現象

一番最後のウィンドウで発動させるとこの現象は発生しない。
自分のウィンドウよりも後のウィンドウにのみ発生する模様。

些末なるVim scriptのTips

実際に使った、役に立ったもの

あるechoの表示で一時停止させてユーザに確認を促したい

echo の直後で call getchar() する

インプットメソッドを強制的にオフにしたい

'imdisable'で一時的にIMをオフにする。

let save_imd = &imd
set imdisable
let &imd = save_imd

まだ役に立つかどうか未知数

マルチバイト文字にマッチするパターン

>マルチバイト文字にマッチするようなパターン
ものすごーくざっくりやるとすると、
[^\x00-\x7f]
かなぁ
うまくいかないパターンもあるかも

http://lingr.com/room/vim/archives/2013/12/10#message-17781111

undobreak

undobreak1

haya14busa:
undojoin案件、その後のundobreak的なコマンド抜けてて困ったことあったから、vim-overのソースみてみたらちゃんとそこも対応してた。さすがだ

t9md:
undobreak とは。どういうケースで必要になるんですか。僕も undojoin は使ってるので知りたい。
Plugin 内で undojoin した後 u するよカーソルがあらぬ方向にいっちゃうの何とか出来るのか知りたい。

http://lingr.com/room/vim/archives/2013/12/10#message-17781824

undobreakとは

:undojoinはあるけど:undobreakはない。

しかし:undobreak相当のことは次のコマンドでできるようだ。 :execute 'normal!' "i\u\"
すなおに:undobreakよういしてください

http://lingr.com/room/vim/archives/2009/09/08#message-3450

haya14busa:
undobreakこれです。 > t9mdさん

まさに、プラグイン内でundojoinしてそのあと履歴を区切らないと、uしたときに前の部分まで戻ってカーソル動いちゃうと思います。

http://lingr.com/room/vim/archives/2013/12/10#message-17784905

undobreak2

thinca:
command! Undobreak let &undolevels = &undolevels

http://lingr.com/room/vim/archives/2013/12/10#message-17785046

haya14busa:
undobreak相当のこと、thincaさんがおっしゃってる let &undolevels = &undolevelsでもできるんですね
どっちがいいんだろう

thinca:
現在のモードに依存しないので undolevels いじった方がいいと思っている

http://lingr.com/room/vim/archives/2013/12/10#message-17786194

Vimコマンドラインのキーマッピングを改造するプラグイン作りました。

LeafCage/cmdlineplus.vim

提供している機能は、単語単位の移動、Emacsライクなキル、特定キャラクタのエスケープ、レジスタクリップボードに現在のコマンドラインの内容をセットする、以上になります。

lastmess.vimで表示されるメッセージのハイライトをいろいろ定義できるようにした。

メッセージの開始と、メッセージの中身の色を定義できるようにした

g:lastmess_highlight_errstartg:lastmess_highlight_errcontentsを指定することで、
エラーの開始点と内容が色分けされてこのようにエラーメッセージが見やすくなります。
(デフォルトでエラーの中身は"PreProc"のハイライトを使うように変更されました。)

f:id:leafcage:20131205005439p:plain

(あっ比較のために更新前の画像もキャプっとけばよかった。このE716:とかE15:という行は今までならエラー開始点と同じく、"ErrorMsg"でハイライトされていたのですよ。それを"PreProc"にしたことで1つのエラーのメッセージがどこまで続いているのかが視覚的に判別しやすくなったわけです。)

ユーザが指定したパターンにマッチしたメッセージの色に指定したハイライトを使うようにした

g:lastmess_special_highlightを使います。
これは[{hilight-group-name}, {pattern}]というリストを収めたリスト(つまりリストが入れ子になったリスト)です。
次のように使います。

let g:lastmess_special_highlight = [['MoreMsg', '^sourced:']]

これで'^sourced:'にマッチするメッセージにMoreMsgのハイライトが利用されます。

蛇足、便利な設定

あと、次のように無視したいメッセージパターンを登録しておくと、ノイズがなくなって便利です。

let g:lastmess_ignore_pattern = 'スキャン中\|検索したので\|箇所変更しました;\|行 削除しました;\|行 追加しました\|\d\+L, \d\+C$\|行 --\d\+%--$\|--バッファに行がありません--$\|既に一番新しい変更です\|^\s*\d\+:\s\%(\~\|\u:\)/'

また、次のように、メッセージクリアコマンドを使えるようにしておくと捗ります。

command! MessageClear for n in range(200) | echom "" | endfor| ec 'Cleared Message'
nnoremap mc :<C-u>MessageClear<CR>