Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all 5486 articles
Browse latest View live

Vimでカーソル下のSVGファイルのパスをSVGOで最適化してData URIに変換する

$
0
0

S!V!G!

VimL
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のすごい便利なのにあまり使われていない「タブページ」機能

$
0
0

vim タブページ

みなさんvimのタブページ機能を使っていますか?

この一番上のバーに出ている、ブラウザなどでよくある「タブ」のことです。↓

vim-tabpage2.jpg

これはvim 7.3から導入された機能なのですが、なぜかあまり使われていません。
Google検索 vim タブページ

 

しかし、これはめちゃめちゃ便利です!
今までtmuxでvimを複数個立ち上げており、ちょっと別の作業をするときは別のvimを起動していたのですが、タブページを利用することによって1つのvimで作業することができ、更にヤンクももちろんタブ間で共有されるので開発効率がかなり上がりました。

あまり使われていない原因はおそらく、デフォルトの状態だと、タブ間の移動がかなりめんどくさいからだと思います。

デフォルトはこんな感じ
Screen Shot 2013-07-16 at 16.15.16.png

右側のタブに移動するたびに :tabnext
ラストのタブに移動するには :tablastなど打っていられません。

また、:tabnext3などのコマンドで、左から3番目のタブに移動できるのですが、
デフォルトのタブライン(タブのステータスバー)は番号も書いてないので、簡単には移動出来ません。

 

そこで暗黒美夢王(ダークビムマスター)ことShougoさんの.vimrcを参考に
快適にタブページ機能を使えるよう.vimrcを作りました。

参考 Shougo/shougo-s-github

.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に書き込むことにより、下のような写真の状態になり、

vim-tabpage2.jpg

  • t1, t2,,,t9で左からn番目のタブにジャンプ
  • tcで新しいタブ, txでタブを閉じる

でタブページを効率的に使えます。

tに既にコマンドを割り当てている場合は、[Tag]を別にキーに当てはめれば問題なく使えると思います。

`vimproc#system({expr})`の{expr}の展開のされ方

$
0
0

この記事はVim Advent Calendar 2012 : ATND231日目の記事になります。

昨日の記事は@ujihisaさんのVim script初心者用入門記事でした。
なので、今回はVim scripterになると必ずお世話になるだろうvimproc.vim
具体的にはvimproc#system({expr})の{expr}の展開のされ方について説明します。


この記事で語ることは、基本的にvimproc#system()でのみで確認しています。
vimproc#system_bg()などでも同じ展開のされ方になると思いますが(たぶん)、
未確認なのでご了承ください。

以下のVim環境で確認しています。

  • Windows7 Pro SP1 64bit
  • VIM - Vi IMproved 7.3 MS-Windows 32-bit GUI version Included patches: 1-966
  • set shell=C:\Windows\System32\cmd.exe
  • set noshellslash
  • vimproc: c7bada0

{expr}の展開の流れ

vimproc#system({expr})の{expr}に指定された文字列は大まかに以下の順番で展開されます。
(実際にはもうちょっと複雑で、以下の通りではありません。が、処理は以下のようなことが処理されています。)

  1. コメント除去
  2. 複数のステートメントに分解する(アンパサンド、パイプ、セミコロン)

  3. 特殊文字を展開する

    1. ブロック
    2. チルダ
    3. 実行コマンドパス
    4. 変数
    5. ワイルドカード
    6. チルダ
  4. コメント除去

  5. 複数のステートメントに分解する(リダイレクト)

  6. 各ステートメントの実行

ただし、文字が以下に当てはまる場合には上記とは異なる扱いになります。

  • シングルクォート内の文字
  • ダブルクォート内の文字
  • バッククォート内の文字
  • エスケープされている文字

それぞれの説明

コメント除去

#以降の文字列はすべてコメントととして扱われます。

VimL
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は&|を単なる文字列として認識します(これも処理系に依存しますね)。

VimL
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を参照)

VimL
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の値に置換します。(チルダの前のスペースも必要!)

VimL
echo vimproc#system('echo ~')" C:/Users/rbtnn
echo vimproc#system('echo a~')" a~

実行コマンドパス

=に続くコマンド文字列をそのコマンドのパスに置換します。(イコールの前のスペースも必要!)

VimL
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要参照

変数

環境変数を展開します。

VimL
echo vimproc#system('echo $HOME')" C:/Users/rbtnn

ワイルドカード

vimprocは3種類のワイルドカード(*,?,[])をサポートしています。
(:h vimshell-tips-wildcardを参照)

VimL
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はシングルクォート内のシングルクォートを''で表すことができます。変数は展開されません。

VimL
echo vimproc#system("echo 'He''s a student.'")" "He's a student."

ダブルクォート

vimprocはダブルクォート内で特定の文字をエスケープすることができ、以下のような辞書(escape_sequences)にて変換が行われます。変数は展開されます。

VimL
let escape_sequences = {
      \ 'a' : "\<C-g>",'b' : "\<BS>",
      \ 't' : "\<Tab>",'r' : "\<CR>",
      \ 'n' : "\<LF>",'e' : "\<Esc>",
      \ '\' : '\',  '?' : '?',
      \ '"' : '"',"'" : "'",
      \ '`' : '`','$' : '$',
      \}
VimL
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を参照)

VimL
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つの文字をエスケープ出来ます。

VimL
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でお手軽にXMLを整形する

$
0
0

開発などで改行がないXMLをvimでお手軽に整形するコマンドです。

VimL
:%s/></>\r</g|setf xml | normal gg=G

もしくは

VimL
:%s/></>^M</g|setf xml | normal gg=G

^M^Mの2文字ではなく、Ctrl-Vの後にEnterを入力した1文字です。

整形例

XML
<foo><bar><qiita>example</qiita></bar></foo>

こんなテキストが

XML
<foo><bar><qiita>example</qiita></bar></foo>

このように整形されます。

vimのすごい便利なのにあまり使われていない「タブページ」機能

$
0
0

vim タブページ

みなさんvimのタブページ機能を使っていますか?

この一番上のバーに出ている、ブラウザなどでよくある「タブ」のことです。↓

vim-tabpage2.jpg

これはvim 7.3から導入された機能なのですが、なぜかあまり使われていません。
Google検索 vim タブページ

 

しかし、これはめちゃめちゃ便利です!
今までtmuxでvimを複数個立ち上げており、ちょっと別の作業をするときは別のvimを起動していたのですが、タブページを利用することによって1つのvimで作業することができ、更にヤンクももちろんタブ間で共有されるので開発効率がかなり上がりました。

あまり使われていない原因はおそらく、デフォルトの状態だと、タブ間の移動がかなりめんどくさいからだと思います。

デフォルトはこんな感じ
Screen Shot 2013-07-16 at 16.15.16.png

右側のタブに移動するたびに :tabnext
ラストのタブに移動するには :tablastなど打っていられません。

また、:tabnext3などのコマンドで、左から3番目のタブに移動できるのですが、
デフォルトのタブライン(タブのステータスバー)は番号も書いてないので、簡単には移動出来ません。

 

そこで暗黒美夢王(ダークビムマスター)ことShougoさんの.vimrcを参考に
快適にタブページ機能を使えるよう.vimrcを作りました。

参考 Shougo/shougo-s-github

.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に書き込むことにより、下のような写真の状態になり、

vim-tabpage2.jpg

  • t1, t2,,,t9で左からn番目のタブにジャンプ
  • tcで新しいタブ, txでタブを閉じる

でタブページを効率的に使えます。

tに既にコマンドを割り当てている場合は、[Tag]を別にキーに当てはめれば問題なく使えると思います。

関数などのtemplateを作成するvimscript

$
0
0

単体テストなどのコードを書く際など、テスト対象関数名にtest_をつけた名前にしてお決まりのおまじないを書くことが結構多い気がしたので、vimscriptの勉強も兼ねて少し考えて見ました。
test_func_bodyの中身にテスト関数で共通で行う内容を入れておくと、便利かもしれません。

sample.vim
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とすると
現在のカーソル位置に

sample.c
voidtest_sample(void){printf("%s start",__func__);printf("%s end",__func__);}

のように出力されます。

ctrlp.vimの使い方まとめ

$
0
0

ctrlp.vimとは

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

とか打ち込むと、
5bdc55b6518b1ce68851b525b97a16d2.png
って感じでview以下だけうまく絞り込めます。
さらにこっからpost以下だけ見たいってときは、

view/pos

とかすると、
057977c6cccc5b312664bec6c35a765c.png
と省略して入力してもいい感じに察して絞り込んでくれます。

また、git管理されてるディレクトリの中などで使うとルートフォルダっぽいとこを自動で認識して、そこ以下のファイルを再帰的に探してくれます。

検索にはいくつかのモードがあって、正規表現による絞り込みもできます。
使える正規表現の例とかは :help ctrlp-input-formats を読むのが一番いいです。

キーマッピング

:help ctrlp-mappings するのが一番正確です。
デフォルトの設定でよくつかうやつだけ。

全般

キー動作
Ctrl+pCtrlP起動
Ctrl+c,ESCCtrlPを終了
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新しいファイルを現在のディレクトリに作成。マークしてあるとそのディレクトリに対して作成する

Extensions

これまでの内容にも出てきましたが、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は切ってます。

.vimrc
" 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'

Extensionの作成

自分でctrlp-extensionを作ることもできます。それほど難しくはないです。
詳しくはkaneshinさんによる記事がわかりやすいです。
githubなどにいろんな方が作られたctrlp-extensionがあるので、探してみるのもいいと思います。

参考

:help ctrlp
意外と知られていない便利なvimプラグイン「ctrlp.vim」
ctrlp.vimを使う

vimでコマンドラインウインドウを使わないのはもったいない

$
0
0

コマンドラインウインドウって何?

:で実行したExコマンドや/?で検索した履歴をvimのウインドウに表示したり再実行できる機能です。
コマンドモードは1行しかないので履歴を辿るのに視認性が悪かったり、カーソル移動が矢印キーなので面倒だったりしますが、コマンドラインウインドウではウインドウ内に数行分の履歴を表示したり、vimのカーソル移動やコマンドを実行できるので、使いやすくなっています。

※ここで言うウインドウはWindowsやMacのウインドウではなく、vimのウインドウです。

どうやって使うの?

履歴を表示、実行する

Exコマンドの場合、:の代わりにq:を入力するとvimのウインドウが分割されて下側にコマンド履歴が表示されます。
vimを終了する:qと間違えて入力したことがある人は見覚えがないでしょうか?

コマンドラインウインドウ

ここでEnterを入力するとカーソルがある行のコマンドが実行されます。もちろん編集もできます。

また、履歴から前方検索したい場合は/の代わりにq/、後方検索の場合は?の代わりにq?を入力すると同様にコマンドラインウインドウが開きます。

コマンドラインウインドウを閉じる

vimのウインドウなので:qで閉じます。

その他の機能

履歴をvimのコマンドラインに送る

コマンドラインウインドウでCtrl-Cを入力するとカーソルがある行の履歴がコマンドラインに送られます。
コマンドラインに移動後、EscCtrl-Cで実行をキャンセルするとコマンドラインウインドウも一緒に閉じます。

コマンドラインウインドウを開く別の方法

:/?でコマンドラインに移動後、Ctrl-Fを入力するとコマンドラインウインドウが開きます。

もっと詳しく

続きは:help cmdwin


.swpや.~を常に任意のディレクトリに作成する

$
0
0

指定したディレクトリがなかったら作る

VimL
if isdirectory($HOME . '/.vimbackups')setbackupdir=~/.vimbackups
elsecallmkdir($HOME . '/.vimbackups')setbackupdir=~/.vimbackups
endifif isdirectory($HOME . '/.vimswps')setdirectory=~/.vimswps
elsecallmkdir($HOME . '/.vimswps')setdirectory=~/.vimswps
endif

Vim+Sphinx+英文ではかどりそうなプラグインと設定

$
0
0

必要なもの

  • [vimのプラギン]neocomplcacheかneocomplete。および依存プラギン
  • [vimのプラギン]neco-look
  • lookコマンド(neco-look)の動作に必要

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に

.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起動とともにファイルをタブ表示

改行時に自動でコメント開始文字列の挿入とインデントを実行させる

$
0
0

Vim でコメントを複数行にわたって書きたい場合、自動でコメント開始文字列を挿入、インデントするための設定。

使う option は 2 つ。

  • 'comments'
    • 何がコメント開始文字列なのか、ブロックコメントの場合は何で終了させるのかなどを指定
    • :help 'comments' 参照
  • 'formatoptions'
    • 自動整形について細かく指定
    • :help 'formatoptions'

たとえば 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 つ。

  • setlocal を使う
    • 'comments' も 'formatoptions' も buffer local なので setlocal を使う
  • 'comments' の設定内容
    • 大きく 2 つにわけられる。
      • ブロックコメント用の sr:/*,mb:*,ex:*/
        • 開始文字列が /*で以降右揃え
        • 中間文字列が後ろに空白文字の続く *
        • 終了文字列が */で、中間文字列が自動で挿入されたあとに /を打つとコメント終了とする
      • 行コメント用の ://
  • 'formatoptions' の設定に =を使わない
    • 将来の追加オプションのために =を使わないようにとヘルプに書いてある
    • 'formatoptions' のデフォルトが tcqなので、必要なものとの差分を -=+=で指定

とりあえず上記の設定を ftplugin なんかに書いておくとコメント記述の際の省力化につながる。
JavaScript はそのまま使える。というか、 JavaScript 書こうとしてコメントまわりの設定がされてないことに気づいたので調べたという経緯。

Javadoc 用に開始文字列を sr:/**などとしてもいいかもしれない。

.vimrc の変更が適用されないときは

$
0
0

gvim を使っている場合、それは .vimrc ではなくて .gvimrc に書くべき設定かもしれない。ウィンドウや IM なんかの設定に関しては可能性が高い。

事のはじまり

MacVim の kaoriya さん版を利用しているんだけど input mode 移行時にいちいち IM が off にされてしまう。
これは由々しき事態だ、何とかしなければ。

:help コマンドと Google 検索で 'imdisableactivate' が悪さをしていることがわかったぞふはは。 .vimrc に set noimdisableactivateを書けば一件落着だ。

と、意気揚々と変更して :source ~/.vimrcしてみたものの変わらない。
なぜだ。
おかしい。

鍵は Vim のスタートアップ時の挙動

.vimrc に書いているんだから適用されてないはずがない。適用後にどこかでさらに変更されているはずだ。

まず .vim/after の中身をチェック。該当なし。

となると system 設定ファイルが怪しいな。 :cd $VIMして :vim /imdisableactivate/ **まで一連の流れ。しばらく待つ。と、結果が 1 件。 gvimrc ? えっ ?

確か system の設定ファイルが読まれてから local の設定ファイルが読まれるはずだったから…、あれ、おかしい。

ここで :help startまで打って補完させる。 startup て項目があった。 :help startup。…順番違うじゃん。

GUI の設定ファイル読み込みはほぼ最後だった

ヘルプには設定ファイルが読み込まれる順番が書いてあった。上から順に実行されるってことは :help system-vimrc:help .vimrc:help init-guiの順だな。

どうも以下の順番になるらしい。

  1. system .vimrc
  2. local .vimrc
  3. system .gvimrc
  4. local .gvimrc

そうか、 local .vimrc で設定した option を system .gvimrc が変更していたわけか。
じゃあ設定を .gvimrc に移して、よし動いた。

文字入力なのに GUI 関係あるの ?

でも文字入力なのに 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 を手元でチェック・整形する

$
0
0

html5-tidy が experimental とはいえ公開されていたので早速設定。

html5-tidy のインストール

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

Vim の設定

ftplugin でもろもろ設定する。
NeoBundle で利用できるようにパッケージングしてみた。

https://github.com/januswel/html5.vim

.vimrc に以下のように書いて :NeoBundleUpdateと打てば使えるようになる。

NeoBundle januswel/html5.vim

ごちゃごちゃやってるが、キモは以下の 4 点。

  1. compiler の指定
  2. execute 1,$!tidy
  3. tidy に渡すオプションはコマンド埋め込みや変数として定義
  4. SVG など外部モジュールとして定義されている要素を warning で済ませられるよう new-block-tags などを使う

簡単なのでチェックは compiler を使う。 :makeするだけでチェック結果が QuickFix ウィンドウに出てくるので楽。
対して整形は buffer local なキーマップを定義。デフォルトは mにマップしている。

accessibility check は判断基準が古いみたいでちょっと今の時代にあってないのではずしてみた。

tidy は外部ファイルに渡すオプションを書いて指定することもできるんだけど、パスの設定だとかが面倒なのでスクリプト埋め込みに。
気に入らない場合は直で修正、で。

vimrc読書会で自分の.vimrcが読まれていた!!!

$
0
0

vimrc読書会は 毎週土曜 23:00〜行われています。

私は、22:00より SystemVerilog読書会を行なっている関係で、
なかなか参加が出きずにいたのですが、前日の 第56回で自分のが読まれていました!!!

最初から見ていたものの、突然の出来事でじっと見つめることしか出来ませんでした><

事前に知っていればメンテナンスしたのに・・・(T_T)

ともあれ、Vimmerな方々に見てきただき感謝いたしますm(_ _)m

ということで、少なからずコメントしたいと思います。

行末スペース

完全に見落としです。かなり、ショックです。
更に、NeoBundleのリストは '"が入り乱れており、こんなソースを書く人とは一緒に仕事したくないですね(棒

インデント

set sw=4の割に 2で書いているのですが、私自身まだ悩んでる項目の一つです。
今は他人が書くものなどは 4が多いので、こちらの設定になっています。

Windows系の名残

  • Functionキーの割り当て
noremap<F2><ESC>:bp<CR>noremap<F3><ESC>:bn<CR>noremap<F4><ESC>:bw<CR>

これは今では全く使ってません。
Ctrl-^とかで移動させてます。

  • CTRL-v による貼り付け
    insert/command モード時はこのように設定しています。
inoremap<C-v><ESC>"*pa
cnoremap <C-v><C-r>+

smartinputについて

inoremap()()<Left>inoremap [] []<Left>inoremap {} {}<Left>inoremap""""<Left>inoremap''''<Left>inoremap<><><Left>

という設定としているため、smartinputへの疑問がありましたが、

今の状態でいうと上記で満足しています。

insertモードのまま貼り付けなど行うと、上記の設定が影響してしまうのですが、

私は normalモードで貼り付けをするようにキーマップ変えちゃいました。
smartinputは試したのですが、よく使いこなせなかったです。また機会があれば挑むつもりです。

markdownのfiletype設定

前に *.mdファイル だと markdownではなく modula2になったので、その名残書いてます。

これは今はもう無いのかしら?

CTRL-a の移動について

inoremap<C-a><ESC>0i

ではなく、本当は以下でした(汗

inoremap<C-a><ESC>^i

githubに上げていたのが更新されていませんでした。

不覚><

最後に

まだまだ初心者な私の .vimrcを読んでいただきありがとうございます。
これからも Vimについては学んでいくつもりですので、アドバイスのほどよろしくお願いします!


Vim 7.4 では :set relativenumber すると現在の行数を絶対値で表示できる

$
0
0

: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)

37da0d9f7f1828e9bdb8af1286ba7d76.png

これは便利。

Vim自分用メモ

$
0
0

アレどうやってやるんだっけ?と思ってググったらググった内容を追記していく

undo,redo
  • undo -> u
  • redo -> C-r
編集中のファイルのディレクトリにカレントディレクトリを移動
  • Kaoriya版 -> :CdCurrent
  • 通常 -> :cd %:h
キーマクロ
  • qa で記録開始。もう一度qで記録終了
  • @aで記録したマクロ実行
  • 3@aで3回実行
  • "a"の部分は他の文字でもOK
    参考

syntastic.vimのlocation_listをunite-quickfixで表示する

$
0
0

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のクォート内をシンタックスハイライトする方法とプラグイン

$
0
0

以下の記事に触発されて、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
screenshot.png

joker1007/vim-ruby-heredoc-syntax

screenshot.png

これでvimのシンタックスハイライトは大したことないとか言わせねえ!

まだドキュメントとか全然書いてないので対応言語が分かりづらいですが、現在デフォルトで対応しているのは以下の通りです。

  • vim-markdown-quote-syntax

    • vim
    • diff
    • c
    • cpp
    • java
    • ruby
    • haskell
    • python
    • perl
    • javascript
    • html
    • sh
    • sql
    • ocaml
    • erlang
  • vim-ruby-heredoc-syntax

    • javascript
    • coffeescript
    • sql
    • html

デフォルトの設定は適当に目についた言語とrubyのヒアドキュメントで書く事の多そうな言語です。

Rubyのヒアドキュメントのシンタックス定義を解読するの辛かった…。

let regexp1 ="\\%(\\%(class\\s*\\|\\%([]})\"'.]\\|::\\)\\)\\_s*\\|\\w\\)\\@<!<<-\\=\\zs".a:startlet regexp2 ="\\%(\\%(class\\|::\\)\\_s*\\|\\%([]}).]\\)\\s\\|\\w\\)\\@<!<<-\\=\\z(".a:start."\\)\\ze\\%(.*<<-\\=['`\"]\\=\\h\\)\\@!"

書いたプラグインのコードの一部ですが、もう意味分かりませんw

vimで正規表現に一致した行を消す

$
0
0

一致した行を消す

:%g/^.*Port.*$/d

一致しない行を消す

:%v/^.*Port.*$/d
Viewing all 5486 articles
Browse latest View live




Latest Images