S!V!G!
command! SVGO :call<SID>OptimizeSVG()function!s:OptimizeSVG()letcfile= expand('<cfile>')call setreg('d', substitute(getline('.'),cfile, system('svgo -i ' . cfile . ' -o - --datauri=base64'),''))
normal! V"dp
endfunction
S!V!G!
command! SVGO :call<SID>OptimizeSVG()function!s:OptimizeSVG()letcfile= expand('<cfile>')call setreg('d', substitute(getline('.'),cfile, system('svgo -i ' . cfile . ' -o - --datauri=base64'),''))
normal! V"dp
endfunction
みなさんvimのタブページ機能を使っていますか?
この一番上のバーに出ている、ブラウザなどでよくある「タブ」のことです。↓
これはvim 7.3から導入された機能なのですが、なぜかあまり使われていません。
Google検索 vim タブページ
あまり使われていない原因はおそらく、デフォルトの状態だと、タブ間の移動がかなりめんどくさいからだと思います。
デフォルトはこんな感じ
右側のタブに移動するたびに :tabnext
ラストのタブに移動するには :tablast
など打っていられません。
また、:tabnext3
などのコマンドで、左から3番目のタブに移動できるのですが、
デフォルトのタブライン(タブのステータスバー)は番号も書いてないので、簡単には移動出来ません。
そこで暗黒美夢王(ダークビムマスター)ことShougoさんの.vimrcを参考に
快適にタブページ機能を使えるよう.vimrcを作りました。
" Anywhere SID.function!s:SID_PREFIX()return matchstr(expand('<sfile>'),'<SNR>\d\+_\zeSID_PREFIX$')endfunction" Set tabline.function!s:my_tabline()"{{{lets=''foriin range(1, tabpagenr('$'))let bufnrs = tabpagebuflist(i)let bufnr = bufnrs[tabpagewinnr(i)-1] " first window, first appearslet no =i" display 0-origin tabpagenr.letmod= getbufvar(bufnr,'&modified') ? '!' : ' 'lettitle= fnamemodify(bufname(bufnr),':t')lettitle='[' . title . ']'lets .='%'.i.'T'lets .='%#' . (i== tabpagenr() ? 'TabLineSel' : 'TabLine') . '#'lets .= no . ':' . titlelets .=modlets .='%#TabLineFill# 'endforlets .='%#TabLineFill#%T%=%#TabLine#'returnsendfunction"}}}let&tabline='%!'. s:SID_PREFIX() . 'my_tabline()'setshowtabline=2" 常にタブラインを表示" The prefix key.nnoremap [Tag] <Nop>
nmap t [Tag]
" Tab jumpfornin range(1,9)
execute 'nnoremap <silent> [Tag]'.n':<C-u>tabnext'.n.'<CR>'endfor" t1 で1番左のタブ、t2 で1番左から2番目のタブにジャンプ
map <silent> [Tag]c :tablast<bar>tabnew<CR>" tc 新しいタブを一番右に作る
map <silent> [Tag]x :tabclose<CR>" tx タブを閉じる
map <silent> [Tag]n :tabnext<CR>" tn 次のタブ
map <silent> [Tag]p :tabprevious<CR>" tp 前のタブ
これを.vimrcに書き込むことにより、下のような写真の状態になり、
t1
, t2
,,,t9
で左からn番目のタブにジャンプtc
で新しいタブ, tx
でタブを閉じるでタブページを効率的に使えます。
tに既にコマンドを割り当てている場合は、[Tag]を別にキーに当てはめれば問題なく使えると思います。
この記事はVim Advent Calendar 2012 : ATND231日目の記事になります。
昨日の記事は@ujihisaさんのVim script初心者用入門記事でした。
なので、今回はVim scripterになると必ずお世話になるだろうvimproc.vim、
具体的にはvimproc#system({expr})
の{expr}の展開のされ方について説明します。
この記事で語ることは、基本的にvimproc#system()
でのみで確認しています。vimproc#system_bg()
などでも同じ展開のされ方になると思いますが(たぶん)、
未確認なのでご了承ください。
以下のVim環境で確認しています。
set shell=C:\Windows\System32\cmd.exe
set noshellslash
c7bada0
vimproc#system({expr})
の{expr}に指定された文字列は大まかに以下の順番で展開されます。
(実際にはもうちょっと複雑で、以下の通りではありません。が、処理は以下のようなことが処理されています。)
複数のステートメントに分解する(アンパサンド、パイプ、セミコロン)
特殊文字を展開する
コメント除去
複数のステートメントに分解する(リダイレクト)
各ステートメントの実行
ただし、文字が以下に当てはまる場合には上記とは異なる扱いになります。
#
以降の文字列はすべてコメントととして扱われます。
echo vimproc#system('echo hello # world!')" hello
echo vimproc#system('echo hello $HOGE world!')" $HOGEが'#'のとき" hello
echo vimproc#system('echo hello # world $HOGE hoge')" $HOGEが'#'のとき" hello
vimprocは&&
、||
、;
によって複数のステートメントだと認識します。
もし変数に'&&'
などが入っている場合、vimprocは1つのステートメントだと認識します。
(この場合の'&&'
の処理は処理系に依存します)
また、vimprocは&
と|
を単なる文字列として認識します(これも処理系に依存しますね)。
echo vimproc#system('echo hello && echo world')" hello " world
echo vimproc#system('echo hello || echo world')" world
echo vimproc#system('echo hello ; echo world')" hello" world
echo vimproc#system('echo hello $HOGE echo world')" $HOGEが'&&'のとき" hello " world
vimprocはブロックという値リストのようなものをサポートしています。
(:h vimshell-tips-block
を参照)
echo vimproc#system('echo /bin/{cd,ls}')" /bin/cd /bin/ls
echo vimproc#system('echo {0..9}')" 00 01 02 03 04 05 06 07 08 09
echo vimproc#system('echo {00..09}')" 000 001 002 003 004 005 006 007 008 009
echo vimproc#system('echo {0..3}-{0..3}')" 0..3}-{0..3
echo vimproc#system('echo /bin/$HOGE')" $HOGEが'{cd,ls}'のとき" /bin/{cd,ls}
~
を$HOME
の値に置換します。(チルダの前のスペースも必要!)
echo vimproc#system('echo ~')" C:/Users/rbtnn
echo vimproc#system('echo a~')" a~
=
に続くコマンド文字列をそのコマンドのパスに置換します。(イコールの前のスペースも必要!)
echo vimproc#system('echo =cmd')" C:/Windows/SysWOW64/cmd.exe
echo vimproc#system('echo =ls')" C:/Git/bin/ls.exe
echo vimproc#system('echo =ls hello')" C:/Git/bin/ls.exe hello
https://github.com/Shougo/vimproc.vim/pull/68要参照
環境変数を展開します。
echo vimproc#system('echo $HOME')" C:/Users/rbtnn
vimprocは3種類のワイルドカード(*
,?
,[]
)をサポートしています。
(:h vimshell-tips-wildcard
を参照)
echo vimproc#system('echo ~/ntuser.dat.????')" C:/Users/rbtnn/ntuser.dat.LOG1 C:/Users/rbtnn/ntuser.dat.LOG2
echo vimproc#system('echo ~/.vim[a-z]c')" C:/Users/rbtnn/.vimrc
echo vimproc#system('echo ~/.git*')" C:/Users/rbtnn/.git C:/Users/rbtnn/.gitconfig C:/Users/rbtnn/.gitconfig.local C:/Users/rbtnn/.gitignore
vimprocは5種類のリダイレクト(<
,1>
,2>
,>&
,>>
)をサポートしています。
vimprocはシングルクォート内のシングルクォートを''
で表すことができます。変数は展開されません。
echo vimproc#system("echo 'He''s a student.'")" "He's a student."
vimprocはダブルクォート内で特定の文字をエスケープすることができ、以下のような辞書(escape_sequences
)にて変換が行われます。変数は展開されます。
let escape_sequences = {
\ 'a' : "\<C-g>",'b' : "\<BS>",
\ 't' : "\<Tab>",'r' : "\<CR>",
\ 'n' : "\<LF>",'e' : "\<Esc>",
\ '\' : '\', '?' : '?',
\ '"' : '"',"'" : "'",
\ '`' : '`','$' : '$',
\}
echo vimproc#system('echo "hoge\nfoo"')" fooが出力されなかった。バグ?" hoge"
echo vimproc#system('echo "hoge\tfoo"')" hoge foo
echo vimproc#system('echo "\$HOHE"')" $HOHE
echo vimproc#system('echo "$HOME"')" C:/Users/rbtnn
vimprocはバッククォート内にコマンドもしくはVim script式を入れて評価した結果を展開することができます。
(:h vimshell-tips-backquote
を参照)
echo vimproc#system('echo `git --version`')" git version 1.8.1.msysgit.1
echo vimproc#system('echo `=3`')" Vim script式" 3
echo vimproc#system('echo `=3*&columns`')" Vim script式" 510
vimprocはクォート外では以下の4つの文字をエスケープ出来ます。
echo vimproc#system('echo \\')" \
echo vimproc#system('echo \''')" '
echo vimproc#system('echo \"')" "\""
echo vimproc#system('echo \`')" `
以上、「vimproc#system({expr})
の{expr}の展開のされ方」でした。
vimproc.vimは暗黒美夢王さんのプロダクトなのでvimshell.vimの挙動そのままですね。
明日の記事は@deris0126さんです。
みなさんvimのタブページ機能を使っていますか?
この一番上のバーに出ている、ブラウザなどでよくある「タブ」のことです。↓
これはvim 7.3から導入された機能なのですが、なぜかあまり使われていません。
Google検索 vim タブページ
あまり使われていない原因はおそらく、デフォルトの状態だと、タブ間の移動がかなりめんどくさいからだと思います。
デフォルトはこんな感じ
右側のタブに移動するたびに :tabnext
ラストのタブに移動するには :tablast
など打っていられません。
また、:tabnext3
などのコマンドで、左から3番目のタブに移動できるのですが、
デフォルトのタブライン(タブのステータスバー)は番号も書いてないので、簡単には移動出来ません。
そこで暗黒美夢王(ダークビムマスター)ことShougoさんの.vimrcを参考に
快適にタブページ機能を使えるよう.vimrcを作りました。
" Anywhere SID.function!s:SID_PREFIX()return matchstr(expand('<sfile>'),'<SNR>\d\+_\zeSID_PREFIX$')endfunction" Set tabline.function!s:my_tabline()"{{{lets=''foriin range(1, tabpagenr('$'))let bufnrs = tabpagebuflist(i)let bufnr = bufnrs[tabpagewinnr(i)-1] " first window, first appearslet no =i" display 0-origin tabpagenr.letmod= getbufvar(bufnr,'&modified') ? '!' : ' 'lettitle= fnamemodify(bufname(bufnr),':t')lettitle='[' . title . ']'lets .='%'.i.'T'lets .='%#' . (i== tabpagenr() ? 'TabLineSel' : 'TabLine') . '#'lets .= no . ':' . titlelets .=modlets .='%#TabLineFill# 'endforlets .='%#TabLineFill#%T%=%#TabLine#'returnsendfunction"}}}let&tabline='%!'. s:SID_PREFIX() . 'my_tabline()'setshowtabline=2" 常にタブラインを表示" The prefix key.nnoremap [Tag] <Nop>
nmap t [Tag]
" Tab jumpfornin range(1,9)
execute 'nnoremap <silent> [Tag]'.n':<C-u>tabnext'.n.'<CR>'endfor" t1 で1番左のタブ、t2 で1番左から2番目のタブにジャンプ
map <silent> [Tag]c :tablast<bar>tabnew<CR>" tc 新しいタブを一番右に作る
map <silent> [Tag]x :tabclose<CR>" tx タブを閉じる
map <silent> [Tag]n :tabnext<CR>" tn 次のタブ
map <silent> [Tag]p :tabprevious<CR>" tp 前のタブ
これを.vimrcに書き込むことにより、下のような写真の状態になり、
t1
, t2
,,,t9
で左からn番目のタブにジャンプtc
で新しいタブ, tx
でタブを閉じるでタブページを効率的に使えます。
tに既にコマンドを割り当てている場合は、[Tag]を別にキーに当てはめれば問題なく使えると思います。
単体テストなどのコードを書く際など、テスト対象関数名にtest_をつけた名前にしてお決まりのおまじないを書くことが結構多い気がしたので、vimscriptの勉強も兼ねて少し考えて見ました。
test_func_bodyの中身にテスト関数で共通で行う内容を入れておくと、便利かもしれません。
function! TestFunc(target_func)lets:test_func="test_".a:target_func
lets:test_func_body=[
\" printf(\"%s start\", __func__);",
\" printf(\"%s end\", __func__);",
\]
lets:i=0call append(line(".")+s:i,s:test_func."();")lets:i+=1call append(line(".")+s:i,"void ".s:test_func."(void)")lets:i+=1call append(line(".")+s:i,"{")lets:i+=1for item ins:test_func_body
call append(line(".")+s:i, item)lets:i+=1endforcall append(line(".")+s:i,"}")lets:i+=1endfunction
command!-nargs=1 UTFunc call TestFunc("<args>")
上記のサンプルの使い方は、テスト関数を作成したい場所にカーソルを移動して、そこで
UTFuncコマンドの引数にテスト対象関数を入れます。
例えば、sample関数のテスト関数を作成したい場合には、UTFunc sampleとすると
現在のカーソル位置に
voidtest_sample(void){printf("%s start",__func__);printf("%s end",__func__);}
のように出力されます。
ctrlp.vimは多機能セレクタとかそんな感じのvimプラグインです。
環境変わるのが嫌で、カラースキーマやシンタックス関係意外あんまりvimにプラグインとか入れたくない派だったんですが、CtrlPは見た目よくてわかりやすく、結構気にいったので長く使ってます。
似たプラグインとしてはUniteがあります。比較するとUniteの方が高機能でいろいろ出来、他のプラグインと連携も出来ますが設定がやや複雑かなって感じです。
pathogen: 適当なとこにgit clone
git clone https://github.com/kien/ctrlp.vim ~/.vim/bundle
NeoBundle: .vimrcに書くだけ
NeoBundle "kien/ctrlp.vim"
Ctrl+pを押して適当に希望のファイル名っぽいのを入力すると勝手に絞り込んでくれます。便利。
例えば、railsかなんかを書いているとして、
view
とか打ち込むと、
って感じでview以下だけうまく絞り込めます。
さらにこっからpost以下だけ見たいってときは、
view/pos
とかすると、
と省略して入力してもいい感じに察して絞り込んでくれます。
また、git管理されてるディレクトリの中などで使うとルートフォルダっぽいとこを自動で認識して、そこ以下のファイルを再帰的に探してくれます。
検索にはいくつかのモードがあって、正規表現による絞り込みもできます。
使える正規表現の例とかは :help ctrlp-input-formats を読むのが一番いいです。
:help ctrlp-mappings するのが一番正確です。
デフォルトの設定でよくつかうやつだけ。
キー | 動作 |
---|---|
Ctrl+p | CtrlP起動 |
Ctrl+c,ESC | CtrlPを終了 |
Ctrl+d | フルパス検索モードとファイル名のみの検索モードを切り替え |
Ctrl+r | 正規表現検索モードと通常の検索モードを切り替え |
Ctrl+f,Ctrl+b | 検索対象(バッファとか)を切り替え |
キー | 動作 |
---|---|
Ctrl+j | 下を選択 |
Ctrl+k | 上を選択 |
Ctrl+a | カーソルを先頭に |
Ctrl+e | カーソルを最後尾に |
Ctrl+u | コマンドラインをクリア |
Ctrl+n,Ctrl+p | コマンド入力履歴を辿る |
Ctrl+\ | コマンドラインにいろいろコピペできるダイアログを開く (レジスタとか) |
Tab | ディレクトリ名を補完 |
キー | 動作 |
---|---|
CR(Enter) | 現在のウインドウで開く |
Ctrl+t | 新しいタブで開く |
Ctrl+v | 垂直分割して開く |
Ctrl+s,Ctrl+CR | 水平分割して開く |
Ctrl+z | ファイルやディレクトリをマークする |
Ctrl+o | ファイルをダイアログつきで開く。マークしてあるとマークしたファイルを全部開く |
Ctrl+y | 新しいファイルを現在のディレクトリに作成。マークしてあるとそのディレクトリに対して作成する |
これまでの内容にも出てきましたが、CtrlPにはファイルだけでなく、さまざまなものを同じCtrlPインターフェイスで扱うための拡張が標準で付属しています。
標準で付属しているものの一覧は :help ctrlp-extensions にあります。
個人的に便利なやつをいくつか紹介します。
CtrlPBuffer
バッファセレクタとして使えます。
CtrlPMRUFiles
これまで開いたファイル履歴から絞り込みます。
CtrlPMixed
ファイル、バッファ、履歴を一度に絞り込みます。
ぶっちゃけこれで大体足りるといえば足りる。
CtrlPQuickfix
vimのquickfixと連携出来ます。
:grepとかと組み合わせて使うのがメインかも。
CtrlPTag
タグ一覧を表示、絞り込みできます。
CtrlPLine
現在のファイル内の各行を対象に絞り込みます。unite lineと大体一緒です。
簡易ファイル内grep的に使えます。
CtrlPDir
ディレクトリを検索してカレントディレクトリを切り替えたりできます。
:help ctrlp-options を見るのが(ry
デフォルトのコマンドが結構長くてめんどくさいので、よく使うの中心に適当にキー割り当てするのがいいと思います。
自分はsをあんまり使わないのでPrefix扱いにしてます。Ctrl+pは切ってます。
" Prefix: snnoremaps<Nop>nnoremapsa :<C-u>CtrlP<Space>nnoremapsb :<C-u>CtrlPBuffer<CR>nnoremap sd :<C-u>CtrlPDir<CR>nnoremapsf :<C-u>CtrlP<CR>nnoremapsl :<C-u>CtrlPLine<CR>nnoremapsm :<C-u>CtrlPMRUFiles<CR>nnoremap sq :<C-u>CtrlPQuickfix<CR>nnoremapss :<C-u>CtrlPMixed<CR>nnoremapst :<C-u>CtrlPTag<CR>letg:ctrlp_map ='<Nop>'" Guess vcs root dirletg:ctrlp_working_path_mode ='ra'" Open new file in current windowletg:ctrlp_open_new_file ='r'letg:ctrlp_extensions = ['tag','quickfix','dir','line','mixed']
letg:ctrlp_match_window ='bottom,order:btt,min:1,max:18'
自分でctrlp-extensionを作ることもできます。それほど難しくはないです。
詳しくはkaneshinさんによる記事がわかりやすいです。
githubなどにいろんな方が作られたctrlp-extensionがあるので、探してみるのもいいと思います。
:help ctrlp
意外と知られていない便利なvimプラグイン「ctrlp.vim」
ctrlp.vimを使う
:
で実行したExコマンドや/
と?
で検索した履歴をvimのウインドウに表示したり再実行できる機能です。
コマンドモードは1行しかないので履歴を辿るのに視認性が悪かったり、カーソル移動が矢印キーなので面倒だったりしますが、コマンドラインウインドウではウインドウ内に数行分の履歴を表示したり、vimのカーソル移動やコマンドを実行できるので、使いやすくなっています。
※ここで言うウインドウはWindowsやMacのウインドウではなく、vimのウインドウです。
Exコマンドの場合、:
の代わりにq:
を入力するとvimのウインドウが分割されて下側にコマンド履歴が表示されます。
vimを終了する:q
と間違えて入力したことがある人は見覚えがないでしょうか?
ここでEnter
を入力するとカーソルがある行のコマンドが実行されます。もちろん編集もできます。
また、履歴から前方検索したい場合は/
の代わりにq/
、後方検索の場合は?
の代わりにq?
を入力すると同様にコマンドラインウインドウが開きます。
vimのウインドウなので:q
で閉じます。
コマンドラインウインドウでCtrl-C
を入力するとカーソルがある行の履歴がコマンドラインに送られます。
コマンドラインに移動後、Esc
やCtrl-C
で実行をキャンセルするとコマンドラインウインドウも一緒に閉じます。
:
や/
、?
でコマンドラインに移動後、Ctrl-F
を入力するとコマンドラインウインドウが開きます。
続きは:help cmdwin
で
指定したディレクトリがなかったら作る
if isdirectory($HOME . '/.vimbackups')setbackupdir=~/.vimbackups
elsecallmkdir($HOME . '/.vimbackups')setbackupdir=~/.vimbackups
endifif isdirectory($HOME . '/.vimswps')setdirectory=~/.vimswps
elsecallmkdir($HOME . '/.vimswps')setdirectory=~/.vimswps
endif
neco-lookという、lookを使って英単語を補完候補に出してくれるプラグインがあります。
参考: Vim-users.jp - Hack #208: 英語を正確に素早く入力する
ですが、入れたままの状態ではSphinxで使うreStructuredText形式で補完してくれません。
neco-lookはneocompleteなどと協調して動きますが、text_modeとして設定されているfiletypeでのみ動作します。なので、text_modeとして認識して欲しいfiletypeにreStructuredTextを追加します。
コードの例はneocompleteです。neocomplcacheも、ほぼ同じ設定で動くと思うのでhelpを引いてください。
まず、neocompleteの autoload/neocomplete/init.vim を参照します。
" Initialize text mode filetypes. "{{{
call neocomplete#util#set_default_dictionary(
\ 'g:neocomplete#text_mode_filetypes',
\ 'hybrid,text,help,tex,gitcommit,vcs-commit,markdown', 1)
"}}}
となっているかと思います。
rst形式を追加するには、.vimrcに
if !exists('g:neocomplete#text_mode_filetypes')
let g:neocomplete#text_mode_filetypes = {}
endif
let g:neocomplete#text_mode_filetypes = {
\ 'rst': 1,
\ 'markdown': 1,
\ 'gitrebase': 1,
\ 'gitcommit': 1,
\ 'vcs-commit': 1,
\ 'hybrid': 1,
\ 'text': 1,
\ 'help': 1,
\ 'tex': 1,
\ }
こんな感じに設定してやりましょう。ついでにgitrebaseとかも足してます。
rst形式のファイルを開いて、適当な英単語を入力しようとしてみてください。いい感じに補完候補が出てくるはずです。やったぜ。
ちなみに、うまく動いてくれないという方はskip_auto_completion_time
あたりの設定を見直してみて見ると解決するかもしれません。
$ vim -p *.php
Vim でコメントを複数行にわたって書きたい場合、自動でコメント開始文字列を挿入、インデントするための設定。
使う option は 2 つ。
たとえば C 言語のコメント用設定は以下のようになる。
" insert comment strings and indent automaticallysetlocalcomments=sr:/*,mb:*,ex:*/,://" synonymous with :setlocal formatoptions=croql" don't use = operator with formatoptions" see :help 'formatoptions'setlocalformatoptions-=tsetlocalformatoptions+=rol
ポイントは 3 つ。
sr:/*,mb:*,ex:*/
/*
で以降右揃え*
*/
で、中間文字列が自動で挿入されたあとに /
を打つとコメント終了とする://
=
を使わない
=
を使わないようにとヘルプに書いてあるtcq
なので、必要なものとの差分を -=
と +=
で指定とりあえず上記の設定を ftplugin なんかに書いておくとコメント記述の際の省力化につながる。
JavaScript はそのまま使える。というか、 JavaScript 書こうとしてコメントまわりの設定がされてないことに気づいたので調べたという経緯。
Javadoc 用に開始文字列を sr:/**
などとしてもいいかもしれない。
gvim を使っている場合、それは .vimrc ではなくて .gvimrc に書くべき設定かもしれない。ウィンドウや IM なんかの設定に関しては可能性が高い。
MacVim の kaoriya さん版を利用しているんだけど input mode 移行時にいちいち IM が off にされてしまう。
これは由々しき事態だ、何とかしなければ。
:help コマンドと Google 検索で 'imdisableactivate' が悪さをしていることがわかったぞふはは。 .vimrc に set noimdisableactivate
を書けば一件落着だ。
と、意気揚々と変更して :source ~/.vimrc
してみたものの変わらない。
なぜだ。
おかしい。
.vimrc に書いているんだから適用されてないはずがない。適用後にどこかでさらに変更されているはずだ。
まず .vim/after の中身をチェック。該当なし。
となると system 設定ファイルが怪しいな。 :cd $VIM
して :vim /imdisableactivate/ **
まで一連の流れ。しばらく待つ。と、結果が 1 件。 gvimrc ? えっ ?
確か system の設定ファイルが読まれてから local の設定ファイルが読まれるはずだったから…、あれ、おかしい。
ここで :help start
まで打って補完させる。 startup て項目があった。 :help startup
。…順番違うじゃん。
ヘルプには設定ファイルが読み込まれる順番が書いてあった。上から順に実行されるってことは :help system-vimrc
、 :help .vimrc
、 :help init-gui
の順だな。
どうも以下の順番になるらしい。
そうか、 local .vimrc で設定した option を system .gvimrc が変更していたわけか。
じゃあ設定を .gvimrc に移して、よし動いた。
でも文字入力なのに GUI だとかは関係ないはずだよなー、と思って調べていたら :help imdisable
に以下の一文を発見。
{only available when compiled with the |+xim|,
|+multi_byte_ime| or |global-ime| features, always
available in MacVim}
あー、 GUI 版は XIM 経由だから GUI 側の設定なのね。 CUI 版は terminal だとかからの入力で賄ってるわけか。
納得した。
'guioptions' とか明らかに GUI まわりの設定や IM まわりの設定は .gvimrc に書かないと反映されない、ということがわかった。
html5-tidy が experimental とはいえ公開されていたので早速設定。
http://w3c.github.io/tidy-html5/
最後の方にある Building the tidy command-line tool にしたがってコマンド叩くだけ。
git clone https://github.com/w3c/tidy-html5
make -C build/gmake/
make install -C build/gmake/
これで /usr/local/bin にインストールされる。
Vim からあらかじめアクセスできるようにパスを適宜通しておく。
Mac でパスの関係上、以前の /usr/bin/tidy がヒットしてしまう場合は /etc/paths を書き換えて /usr/local/bin を優先するといい。
http://qiita.com/tk3fftk/items/8b389c0e4b1f9c64ebe3
ftplugin でもろもろ設定する。
NeoBundle で利用できるようにパッケージングしてみた。
https://github.com/januswel/html5.vim
.vimrc に以下のように書いて :NeoBundleUpdate
と打てば使えるようになる。
NeoBundle januswel/html5.vim
ごちゃごちゃやってるが、キモは以下の 4 点。
execute 1,$!tidy
簡単なのでチェックは compiler を使う。 :make
するだけでチェック結果が QuickFix ウィンドウに出てくるので楽。
対して整形は buffer local なキーマップを定義。デフォルトは m
にマップしている。
accessibility check は判断基準が古いみたいでちょっと今の時代にあってないのではずしてみた。
tidy は外部ファイルに渡すオプションを書いて指定することもできるんだけど、パスの設定だとかが面倒なのでスクリプト埋め込みに。
気に入らない場合は直で修正、で。
vimrc読書会は 毎週土曜 23:00〜行われています。
私は、22:00より SystemVerilog読書会を行なっている関係で、
なかなか参加が出きずにいたのですが、前日の 第56回で自分のが読まれていました!!!
最初から見ていたものの、突然の出来事でじっと見つめることしか出来ませんでした><
事前に知っていればメンテナンスしたのに・・・(T_T)
ともあれ、Vimmerな方々に見てきただき感謝いたしますm(_ _)m
ということで、少なからずコメントしたいと思います。
完全に見落としです。かなり、ショックです。
更に、NeoBundleのリストは '
と "
が入り乱れており、こんなソースを書く人とは一緒に仕事したくないですね(棒
set sw=4
の割に 2
で書いているのですが、私自身まだ悩んでる項目の一つです。
今は他人が書くものなどは 4
が多いので、こちらの設定になっています。
noremap<F2><ESC>:bp<CR>noremap<F3><ESC>:bn<CR>noremap<F4><ESC>:bw<CR>
これは今では全く使ってません。Ctrl-^
とかで移動させてます。
inoremap<C-v><ESC>"*pa
cnoremap <C-v><C-r>+
inoremap()()<Left>inoremap [] []<Left>inoremap {} {}<Left>inoremap""""<Left>inoremap''''<Left>inoremap<><><Left>
という設定としているため、smartinput
への疑問がありましたが、
今の状態でいうと上記で満足しています。insert
モードのまま貼り付けなど行うと、上記の設定が影響してしまうのですが、
私は normal
モードで貼り付けをするようにキーマップ変えちゃいました。smartinput
は試したのですが、よく使いこなせなかったです。また機会があれば挑むつもりです。
前に *.mdファイル だと markdown
ではなく modula2
になったので、その名残書いてます。
これは今はもう無いのかしら?
inoremap<C-a><ESC>0i
ではなく、本当は以下でした(汗
inoremap<C-a><ESC>^i
githubに上げていたのが更新されていませんでした。
不覚><
まだまだ初心者な私の .vimrcを読んでいただきありがとうございます。
これからも Vimについては学んでいくつもりですので、アドバイスのほどよろしくお願いします!
:h version-7.4
より
Show absolute number in number column when 'relativenumber' option is on. Now there are four combinations with 'number' and 'relativenumber'. (Christian Brabandt)
これは便利。
unite-quickfixをインストールして.vimrcに
letg:syntastic_always_populate_loc_list=1
を書くだけ.
:Unite location_list
で表示されるよ!
*'syntastic_always_populate_loc_list'*
Default: 0
Enable this optionto tell syntastic to always stick any detected errors into the loclist:
>letg:syntastic_always_populate_loc_list=1<
とのこと.
以下の記事に触発されて、vimでmarkdownのクォートの中を上手くシンタックスハイライトさせる方法は無いか調べてみました。
vim-preciousでも良さそうなのですが、最初からハイライトされてる方が自分好みだったので。
Vim Advent Calendarとして書けば良かったかもしれない。
function! MarkdownQuoteSyntaxGroup(filetype)letft= toupper(a:filetype)return'markdownCodeGroup'.ftendfunctionfunction! IncludeOtherSyntax(filetype)let group = MarkdownQuoteSyntaxGroup(a:filetype)" syntax saveif exists('b:current_syntax')lets:current_syntax =b:current_syntax
unlet b:current_syntax
endif
execute 'syntax include @'.group.' syntax/'.a:filetype.'.vim'" syntax restoreif exists('s:current_syntax')letb:current_syntax=s:current_syntax
else
unlet b:current_syntax
endifreturn group
endfunction
syntax include @groupName syntax/javascript.vim
で他のシンタックスファイルを読み込み名前付ける事ができる。
ただし、シンタックスファイルはb:current_syntax
が存在すると読み込みをストップするようになってます。
なので、一時的にb:current_syntax
を無効化してからシンタックスを読み込みます。
function! MarkdownQuoteSyntaxRegion(filetype)letft= toupper(a:filetype)return'markdownCodeRegion'.ftendfunctionfunction! EnableMarkdownQuoteSyntax(filetype,start)let group = MarkdownQuoteSyntaxGroup(a:filetype)let region = MarkdownQuoteSyntaxRegion(a:filetype)let regexp_start ="^\\s*```".a:start."$"let regexp_end ="^\\s*```\\ze\\s*$"
execute 'syntax region '.region.'
\ matchgroup=markdownCodeDelimiter
\ start="'.regexp_start.'"end="'.regexp_end.'"
\ keepend contains=@'.group
endfunction
syntax region
を使うと指定のパターンに囲まれた部分に対してシンタックス設定を適用できる。
それと合わせてcontains
オプションを指定する事でregionの内側で使うシンタックス設定を設定できる。
さっき読み込んで名前を付けたシンタックス設定をcontainsに指定する事で、特定の領域内だけ他言語のシンタックスハイライトを適用できる。
call IncludeOtherSyntax("javascript")call EnableMarkdownQuoteSyntax("javascript","\\%(javascript\\|js\\)")
で、せっかくなのでプラギンにしてみました。
joker1007/vim-markdown-quote-syntax
joker1007/vim-ruby-heredoc-syntax
これでvimのシンタックスハイライトは大したことないとか言わせねえ!
まだドキュメントとか全然書いてないので対応言語が分かりづらいですが、現在デフォルトで対応しているのは以下の通りです。
vim-markdown-quote-syntax
vim-ruby-heredoc-syntax
デフォルトの設定は適当に目についた言語とrubyのヒアドキュメントで書く事の多そうな言語です。
Rubyのヒアドキュメントのシンタックス定義を解読するの辛かった…。
let regexp1 ="\\%(\\%(class\\s*\\|\\%([]})\"'.]\\|::\\)\\)\\_s*\\|\\w\\)\\@<!<<-\\=\\zs".a:startlet regexp2 ="\\%(\\%(class\\|::\\)\\_s*\\|\\%([]}).]\\)\\s\\|\\w\\)\\@<!<<-\\=\\z(".a:start."\\)\\ze\\%(.*<<-\\=['`\"]\\=\\h\\)\\@!"
書いたプラグインのコードの一部ですが、もう意味分かりませんw