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
動作画面(貼り付けた部分がハイライトされている)
まだ挙動に謎な部分がありますが、主要なバグは取り除けたと思います。
*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:
http://lingr.com/room/vim/archives/2013/12/10#message-17790643
あー。やっぱり念のために、autocmd ColorScheme * で定義する(または利用する関数内でその場で定義する)のが安全か。
複数ウィンドウを開いているときneosnippetのスニペットを発動させると他のウィンドウのfoldingが閉じてしまう現象
一番最後のウィンドウで発動させるとこの現象は発生しない。
自分のウィンドウよりも後のウィンドウにのみ発生する模様。
些末なるVim scriptのTips
実際に使った、役に立ったもの
あるechoの表示で一時停止させてユーザに確認を促したい
echo の直後で call getchar() する
インプットメソッドを強制的にオフにしたい
'imdisable'で一時的にIMをオフにする。
let save_imd = &imd set imdisable let &imd = save_imd
まだ役に立つかどうか未知数
マルチバイト文字にマッチするパターン
>マルチバイト文字にマッチするようなパターン
http://lingr.com/room/vim/archives/2013/12/10#message-17781111
ものすごーくざっくりやるとすると、
[^\x00-\x7f]
かなぁ
うまくいかないパターンもあるかも
undobreak
undobreak1
haya14busa:
undojoin案件、その後のundobreak的なコマンド抜けてて困ったことあったから、vim-overのソースみてみたらちゃんとそこも対応してた。さすがだt9md:
http://lingr.com/room/vim/archives/2013/12/10#message-17781824
undobreak とは。どういうケースで必要になるんですか。僕も undojoin は使ってるので知りたい。
Plugin 内で undojoin した後 u するよカーソルがあらぬ方向にいっちゃうの何とか出来るのか知りたい。
undobreakとは
:undojoinはあるけど:undobreakはない。
しかし:undobreak相当のことは次のコマンドでできるようだ。 :execute 'normal!' "i\
http://lingr.com/room/vim/archives/2009/09/08#message-3450u\ "
すなおに:undobreakよういしてください
haya14busa:
undobreakこれです。 > t9mdさんまさに、プラグイン内でundojoinしてそのあと履歴を区切らないと、uしたときに前の部分まで戻ってカーソル動いちゃうと思います。
http://lingr.com/room/vim/archives/2013/12/10#message-17784905
undobreak2
thinca:
http://lingr.com/room/vim/archives/2013/12/10#message-17785046
command! Undobreak let &undolevels = &undolevels
haya14busa:
undobreak相当のこと、thincaさんがおっしゃってる let &undolevels = &undolevelsでもできるんですね
どっちがいいんだろうthinca:
http://lingr.com/room/vim/archives/2013/12/10#message-17786194
現在のモードに依存しないので undolevels いじった方がいいと思っている
Vimコマンドラインのキーマッピングを改造するプラグイン作りました。
lastmess.vimで表示されるメッセージのハイライトをいろいろ定義できるようにした。
メッセージの開始と、メッセージの中身の色を定義できるようにした
g:lastmess_highlight_errstart
とg:lastmess_highlight_errcontents
を指定することで、
エラーの開始点と内容が色分けされてこのようにエラーメッセージが見やすくなります。
(デフォルトでエラーの中身は"PreProc"のハイライトを使うように変更されました。)
(あっ比較のために更新前の画像もキャプっとけばよかった。この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>
Vimにパッチが当てられるまでの間、Windowsでとりあえず外部grepを使えるようにする
mattn
jvgrepの問題、vimを直すしか方法ない
http://lingr.com/room/vim/archives/2013/12/05#message-17742024
vimがCreateProcessWを使えば解決
たしかパッチは出してあってtodoに入ってたと思う
とのことなので、それまでは我慢と工夫で乗り切るしかないのだ。
仕方ないので、Grepというコマンドを作った。ついでにターゲット無指定の時には現在バッファ周辺を検索対象にすることにして利便性を高めた。
function! s:grep_for_cmdprompt(cmd, argstr) "{{{ let args = split(a:argstr, '\%(\\\@<!\s\)\+') let i = 0 while match(args, '^-', i)!=-1 let i+=1 endwhile let dflbase = expand('%:p:h') let dflbase = dflbase==?expand('$HOME') ? expand('%') : dflbase.'/**/*' let opts = i==0 ? '' : join(args[:i-1]) let pat = has('win32') ? iconv(escape(args[i], '#%'), 'utf-8', 'cp932') : escape(args[i], '#%') let target = i+1>=len(args) ? dflbase : join(args[(i+1):]) let g:greped = a:cmd. ' '. opts. ' -8 '. pat. ' '. target silent exe g:greped endfunction "}}} command! -nargs=+ -complete=file Grep call s:grep_for_cmdprompt('grep', '<args>')
しかし外部grepだと、% # といった特殊文字が展開されてしまうのでエスケープしないといけないのが辛いところ。
vimgrepだとエスケープの必要がない。差別である。
どうにか利用時にエスケープしなくても済むようにしようとしたけれど無駄だった。
関連エントリ:最新版のjvgrepをコンパイルするにはgo言語とMercurialが必要だった - LeafCage備忘録