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

vimで開いたら行末に^Mと表示された時の対処法

$
0
0

細かい設定してないvimでcrlfなファイルを開くと行末に^Mとか出て鬱陶しいと思います。
改行コードを変更してもいいけど、しないでおきたいときの対応方法

以下のExコマンドを実行

:e++ff=dos

戻したい場合は

:e++ff=unix

quickrun.vim の *_spec.rb ファイル (RSpec3) 用の設定 (行指定実行、カラー出力)

$
0
0

*_spec.rbに対して quickrun.vim で rspec (RSpec 3) が実行されるようして、更に rspec の出力がカラー表示されるように設定する。

NeoBundle 'thinca/vim-quickrun'

let g:quickrun_config = {
\   ...
\   "ruby.rspec" : {
\     "command": "rspec",
\     "cmdopt": "-c -fd --tty"
\   },
\   "ruby.rspec_line" : {
\     "command": "rspec",
\     "exec": "%c %s:%{line('.')} %o" ,
\     "cmdopt": '-c -fd --tty'
\   },
\   ...
\}

*_spec.rbというファイルに対して ruby.rspecファイルタイプが適用されるように設定。

vim/ftdetect/ruby.vim
autocmd BufNewFile,BufRead *_spec.rb set filetype=ruby.rspec

行指定 (カーソル上のexampleだけ) を実行するためには、新しいキーバインドを定義しておくことにする。

vim/after/ftplugin/ruby.vim
nnoremap <silent><buffer> <Leader>rr :<C-u>QuickRun ruby.rspec_line<CR>

更に rspec の出力をカラー表示するために AnsiEsc.vim というプラグインを使う。

NeoBundle 'vim-scripts/AnsiEsc.vim'

augroup quickrun
  autocmd!
  autocmd FileType quickrun AnsiEsc
augroup END

参考にしたサイト

vimgrep、vimgrepaddの使い方

$
0
0

[vimgrep]
grepと基本的に書式は同じで、cwと組み合わせれば分割されて検索結果を見ることができる。
書き方:
vim 検索語 ファイル名 |cw

[vimgrepadd]
vimgrepの検索結果に対して、追記ができる。後から違う単語を検索して、ウィンドウに反映できる。画面はprintfをvimgrepで検索した後、includeをvimgrepaddで追加したもの。
書き方:
vimgrepa 検索語 ファイル名 |cw

  • TIPS vimgrepaddを使うときは、vimと打った後タブで補完して、aを打つ。

vimgrepa.png

Vimでブラウザを操る

$
0
0

この記事はVim Advent Calendar 2014 - Qiita 22日目の記事です
21日目の記事は @mitsuseさんの非英語ネイティブでも Vim で快適に英語を書きたいでした

Vimアドベントカレンダーですが、ちょっと趣向を変えてVimperatorという、(常にvimキーバインドが良い && キーボードから手を離したくない人)に便利なFirefoxのアドオンを紹介します

いいところ

vimキーバインドでブラウジングが出来るようになります
例えばデスクトップアプリのKobitoとかYoruFukurouだとjkで上下に移動することが出来ますが、そんな程度ではありません
今のところマウスを使うのは

  • テキストをコピーする
    • これはややめんどくさいので
  • YouTubeなどのフレーム間移動(Embedモードからの脱出)
    • vimperatorでも出来るはずだが手元ではうまくいかない
      • 誰か教えてください
  • 片手で操作したい時
    • ご飯食べながらとか

くらいになりました
もちろん個人差はあります

簡単な使い方

移動

  • j, k: 上下のスクロール
  • C-f, C-b, C-d, C-u: 0.5/1画面分の上下スクロール
  • gg, G, 10G: ページの先頭、末尾、上から10%の所にジャンプ
  • gt, gT: 左右のタブに移動
    • C-n, C-pでも可能
  • /: ページ内検索
    • n, Nでヒットした単語にジャンプできる

移動はこんな感じ
vimperator_basic.gif

ページの移動

  • f: 表示領域内のリンクに番号を表示する
    • 表示された番号を入力するとクリックしたことになる
    • Fだと新しいタブで開く
  • ⌥-←, ⌥-→: 履歴の戻る/進む
  • d: ページを閉じる
  • u: 閉じたページを開き直す
  • t, o: ページを開く
    • t hogeとタイプするとhogeでWeb検索する
      • urlを入れると、そのurlを開く
    • oだと今いるタブに、tだと新しいタブに結果を表示する

リンクの開き方はこんな感じ

vimperator_link.gif

その他

  • :: コマンドモード
  • gi: 1つめの入力ボックスにフォーカス
    • 3giで3つめにフォーカス
    • google検索など、検索ボックスに瞬時にフォーカス出来て便利
  • 補完の選択: TabS-Tabで選択できる

大体これくらいおぼえておけば普段は問題ないでしょう

個人的には入力ボックスへのフォーカスがめっちゃ便利だと思っていて、こんな感じにフォーカス出来ます
vimperator_focus_text.gif

設定

本家vimと同様、vimperatorもカスタマイズすることが出来ます

設定ファイル

~/.vimperatorrcに記述できます
自分で使っているものとして

~/.vimperatorrc
" スクロールの端などの際に出るbeepをoff
set nobeep

" デフォルトの検索エンジン
set defsearch=google

" 検索キーワードのハイライト
set hlsearch

" j/k でのスクロール幅を 1行 から 3行 に変更
" map j 3jとかすると無限ループして死ぬ
map j 3<C-e>
map k 3<C-y>

" ddでタブを閉じる, dでは何もしない
no dd :tabclose<CR>
map d <NOP>

" h/lに戻る/進むを割り当て
map H <A-Left>
map L <A-Right>

" H/Lでタブ移動
map h gT
map l gt
" Shift + ←/→ で現在のタブの位置変更
map <S-Right> :tabmove! +1<CR>
map <S-Left> :tabmove! -1<CR>

などがあります
キーバインドを自由に設定できるのはストレスが無くて良いです

プラグイン

これも本家vim同様、様々なプラグインを導入することが出来ます
こちらはブラウザへの操作をするためにJavaScriptで記述します

~/.vimperator/pluginディレクトリにjsファイルを保存すれば読み込みます
vimpr/vimperator-pluginsに大量においてあります
プラグインについてはほんの少しはてブを検索するVimperatorプラグインを作った - petitviolet_blogに書いたことがあります

例えば、:ht vimとするとはてなブックマークでvimタグがついたものを検索できるようにするプラグインだと下のように書けます

hatenaBookmarkTagSearch.js
(function(){liberator.modules.commands.addUserCommand(["hatenaTag","hatena","ht"],"search from hatena bookmarks by tags",function(args){if(args.length===0){liberator.echo('input a query!');returnfalse;}// make "and" queryvarquery=args.join("+");varhatenaTagUrl='http://b.hatena.ne.jp/search/tag?safe=on&sort=recent&q='// open in a new tabliberator.open(hatenaTagUrl+query,liberator.NEW_TAB);returnfalse;},{},true);})();

ht.gif

あとよく使うのとして、SlideShareSpeaker DeckのスライドをCtrl-l/Ctrl-hで進む/戻るにマッピングするプラグインを書いたりしました
sd.gif

この辺の自分で作ったのはpetitviolet/vimp-pluginsに置いてあります

作り方

更新が止まってしまっていますが、addUserCommand_for2.0pre - Vimperatorを参考にプラグイン開発が出来ます

所感

最近はGoogleChromeが人気で、Firefoxをまわりで使っている人がやや少なくなってきているように感じますが、vimperator使ってめっちゃ便利にFirefox使いましょう

ちなみに、GoogleChromeだと

みたいなのがあったりもします

明日

明日の記事は @s_of_pさんです

Mercurialのコミットメッセージをvimで編集するためのあれこれ

$
0
0

hg commitを実行すると、コミットメッセージを編集するためのエディタが起動します。
このエディタにvimを使う場合に、いくつかの設定を行うことでプラスアルファの機能を追加しようという話です。

ありていに言うと committiaがすてきな感じなのでMercurialでも同じようなことができないか、という。

コミット対象のファイルを開く

そのまま開く

コミット時には、以下のようなテキストが一時ファイルに出力され、オープンされます。

HG: コミットログを入力してください。'HG:' で始まる行は無視されます。
HG: メッセージが空のままならコミットを中止します。
HG: --
HG: ユーザ: Iwata
HG: ブランチ 'default'
HG: tortoisehg/hgqt/repotreeitem.py を変更
HG: tortoisehg/hgqt/run.py を変更

このように、コミット対象のファイルがテキスト上に最初から表示されているので、そこにカーソルを合わせて <C-w>f<C-w>gfなどとすることで簡単にそのファイルを開くことができます。

が、カレントディレクトリがリポジトリルートになっていないとこれは使えません。

Mercurial自体はリポジトリルートをカレントディレクトリに設定した状態でエディタを起動してくれるのですが、Windows版のvimだと、ファイルパスを引数に与えて起動した場合カレントディレクトリがそのファイルの親ディレクトリに変わってしまうようです。
なので、この挙動を回避するために、vim/gvimを直接起動する代わりにこんな感じのバッチを起動するようにします。

hgcommit.bat
gvim -c ":e %1"

unified diffを開く

以下のようなfunctionを用意して、ファイルパス上での ;dでunified形式のdiffを表示できるようにします。(同じタブ内でウインドウを分割して表示します)

hgcommit.vim
" カーソル下のファイルに対するdiffをunified diff形式で表示
nmap <buffer> ;d :call ShowHgDiffUnified(expand('<cfile>'))<CR>function!s:find_window(pattern)foriin range(1, winnr('$'))if bufname(winbufnr(i))=~a:pattern
      returniendifendforreturn0endfunctionfunction! ShowHgDiffUnified(path) abort
  letwin=s:find_window('^\[hg diff\]')ifwin==0botrightvnewelse
    execute win . 'wincmd w'endifsetlocalfiletype=diffbuftype=nofile modifiablesilent! %delete
  silent! execute 'file [hg diff] ' . fnamemodify(a:path,':t')silent! execute 'r!hg diff ' . a:pathsetlocalnomodifiableendfunction
  • この辺のvimscriptはMercurialのコミットメッセージを編集する時だけ読み込まれればいいので、起動用バッチで gvim -c ":e %1" -S hgcommit.vimみたいに指定するか、 autocmd FileType hgcommitに引っかければいいと思います。

side by side diffを開く

さらに以下の設定で、同じく ;Dで別タブにvimdiffを表示できるようにします。

hgcommit.vim
" カーソル下のファイルに対するvimdiffを新しいタブに表示
nmap <buffer> ;D :call ShowHgDiffSideBySide(expand('<cfile>'))<CR>function! ShowHgDiffSideBySide(path) abort
  execute 'tabedit ' . a:pathletencoding=&encodingvnewsetlocalmodifiablebuftype=nofile
  execute 'setlocal fileencoding=' . encodingsilent! execute 'file ' . fnamemodify(a:path,':t')silent! execute 'r!hg cat ' . a:pathsilent!1delete _
  execute 'doautocmd BufNewFile ' . a:pathsetlocalnomodifiablewindodiffthisendfunction

コミットメッセージの挿入

GUIクライアントだと、最近入力したコミットメッセージを一覧から選択して挿入する機能があったりします。
正直あまり使いませんが、せっかくなのでこれもUnite sourceとして実装しておきましょう。

hgcommit.vim
" 最近のコミットメッセージを表示するUnite sourcelets:unite_last_messages = {
            \ 'name' : 'last-messages',
            \ 'default_action' : { '*' : 'insert' },
            \ }

function!s:unite_last_messages.gather_candidates(args, context) abort
  let log = system('hg log -r "last(all(), 20)" --template "{desc}\n___SEP___\n"')let encoded = iconv(log,'cp932',&encoding)let splitted = split(encoded,'\n___SEP___\n')return map(splitted, '{
            \ "word": split(v:val,"\n")[0],
            \ "source": "last-messages",
            \ "kind": "word",
            \ "action__text": v:val,
            \ }')endfunctioncall unite#define_source(s:unite_last_messages)
unlet s:unite_last_messages

nmap <buffer> ;m :Unite last-messages<CR>

これは単純に最新20コミットを対象にして検索する例ですが、「authorが自分」などの条件を加えてもいいかもしれません。
Windows + win32mbcs環境を前提にしているので文字コード変換(iconv)をかけていますが、Linux環境でvimのencodingもutf8ならこれは不要です。

TODO

commit --amendへの対応

diffの機能がcommit --amend時には無力なので、そこを何とかする。
と言ってもエディタ側からは通常のコミットなのかamendなのかは分からないので、両方のモードを用意して手動でスイッチする感じ?

[GVim]メモ:WindowsのGVimに必要な設定

$
0
0

PCを移行した時などに参照にする用。

デフォルトで同じディレクトリにアンドゥ用ファイルと、
バックアップファイルを作るため、
一回閉じてもう一度開こうとすると、tabで予測に引っかかるので、
邪魔。gvimは設定が必要。

設定ファイルの確認は
:echo $VIM
とすると、どこに設定ファイルがあるのが分かる。

これを利用して、
:e $vim\vimrc
などとして、vimrcを開き、以下を追記する
(ディレクトリは任意のフォルダを指定する)

vimrc
set undodir=D:\gvim_temp_files\
set backupdir=D:\gvim_temp_files\

Vim でもこころぴょんぴょんしたい!

$
0
0

A. ジャンプコマンドを使おう。

この記事は Vim Advent Calendar 2014の 23 日目の記事です。

22 日目は petitviolet さんによる Vimでブラウザを操るでした。

Vim にはタグジャンプを始めとする様々なジャンプコマンドがあります。これらを活用することで こころぴょんぴょんコードリーディングをよりスムーズにすることが出来ます。

:help tagsrch.txt

タグジャンプ

ctagsを使って作成したタグファイルの情報を元に、定義元にジャンプすることが出来ます。
キーワードの上で <C-]>を押すとジャンプしますが、定義元が複数ある場合は最初のものにジャンプします。
ジャンプ先を選択したい場合は g<C-]>でジャンプ先を一覧表示し、選択することが出来ます。

タグジャンプはウィンドウ系のコマンドと組み合わせて、ウィンドウ分割で開いたり <C-w><C-]>
プレビューウィンドウに表示させたり <C-w>}することも出来ます。

インクルードファイルの検索

Vim には'path'オプションで指定された場所のインクルードファイルから定義や
キーワードを検索しジャンプするコマンドがあります。
dで終わるものはマクロ定義を、iで終わるものはキーワードを検索します。

[i[d

定義・キーワードを含む 1 行を表示する。数字を与えると幾つ目のものを表示するか
指定することができる。

[I[D

定義・キーワードを含む行を全て表示する。

[<C-I>[<C-D>

定義・キーワードを含む行にジャンプする。数字を与えると幾つ目のものにジャンプするか
指定することができる。

検索先は 'path'オプションに依存するのでデフォルトだとカレントディレクトリ・カレント
ファイルと同階層のみとなります。ディレクトリ配下を再帰的に検索させたい場合は

setpath+=**

と指定しましょう。但し、ファイル数が多い場合は注意して下さい。検索の中断は <C-c>です。

比較

ctags が使え、タグファイルが生成出来る環境であればタグジャンプが正確で便利です。コマンドも
インクルード検索と比べると手軽です。

タグファイルを勝手に配置できなかったり、ctags が導入できない、インクルードファイルが頻繁に
変更されて毎回タグファイルを生成する訳にはいかない等の事情がある場合に、インクルードファイルの
ジャンプコマンドも覚えておくと役に立つかもしれません。

参考

https://gist.github.com/ujihisa/8292163


ちなみにまだごちうさは見ていません。リゼちゃんがかわいいのは把握してる。

以上、23 日目の記事でした。次回 24 日が現在欠番です。25 日の担当は mattn さんです!

Vim上でjqでjsonを整形

$
0
0

vim用のjqプラグインがいろいろ出てますが、vimの標準コマンドだけでも割と簡単でした。

参考:Pretty-print JSON in vim

  1. jqインストール

    brew install jq
    
  2. vimでjsonを開くかコピペする

  3. vim上で以下を実行

    :%!jq '.'
    

以上


dotfilesを一元管理するときにちょっと苦が減る方法

$
0
0

.vimrc、.zshrc、.gitconfigといったいわゆるドットファイルを複数のマシンで使いまわすためにgithubに置くってところまでは誰もがやっているところだと思う。
ただ、それだけだといちいちローカルにコピーするとか、編集後にdotfileにコピーして…なんてめんどくさくてやらないことが多い
結果として会社のPCで登録したaliasを個人macで使おうとしたら登録してなかったり、家で試したvimプラグインを反映し忘れてててげんなりする。
というわけで最近以下のようにローカルのファイルは外部ファイル読み込みにしてしまった

.vimrc
source ~/dotfiles/.vimrc
.zshrc
source ~/dotfiles/.zshrc
.gitconfig
[include]path= ~/dotfiles/.gitconfig

更に、aliasを登録してこれらのファイルを編集するときは常にdotfiles以下の方を編集するようにする

.zshrc
alias vrc='vim ~/dotfiles/.vimrc'alias zrc='vim ~/dotfiles/.zshrc'alias gcon='vim ~/dotfiles/.gitconfig'

これで常にローカルにあるdotfilesを編集すればよく、コピーしてどうちゃらみたいなことから開放される
シンボリックリンクにしてもいいけど、外部参照にしておくことでローカル固有の設定を追記できるのでこういうふうにしてる
これをやっても結局は編集後にコミットしてプッシュする、とか別マシンで変更がしたらpullするという手間は残ってるけど、その辺自動にするとそれはそれでイライラする要因を生む気がするのでそこまではやってない

VimでURLをドメインだけに置換するコマンドを正規表現でうったら、本当に正規表現って意味不明なフォルムと思った。

$
0
0

http://hoge.jp/piyo

を、ただ、

http://hoge.jp

にしたいだけ

vim
:%s/\([:\/]\)\@<!\/.*$//g

なんか、とても意味不明なコマンドだ。きっと、もっとスマートなものがあるのだろう。コードゴルフで言えばトリプルボギー的な感じなのでしょうか。知らないけど。

ただ、はじめてVimで否定的後読みの置換をしたのでその感動を書き留めて置きたかったのです。

vimのコマンド(超初心者)

$
0
0

vim使っているけどよく忘れるのでメモっておく

移動

キー動き
j下に移動
k上に移動
h左に移動
l右に移動
w右に単語単位で移動
W右に単語単位(記号を除く)で移動
b左に単語単位で移動
B左に単語単位(記号を除く)で移動
e単語の末尾に移動
E次の単語の末尾に移動
0その行の先頭に移動
^その行の先頭(余白を除く)に移動
$その行の末尾に移動
f[任意の文字]後方の任意の文字の場所に移動(faだったらaの場所に移動)
F[任意の文字]前方の任意の文字の場所に移動
ggファイルの先頭に移動
Gファイルの末尾に移動
+次の行の先頭(空白を除く)に移動
-前の行の先頭(空白を除く)に移動

//TODO あとで続き書く

[vim] 起動時に複数ファイルを分割・タブで開く方法

$
0
0

オプションで指定する。

vim -o aaa.txt bbb.txt 横分割
vim -O aaa.txt bbb.txt 縦分割
vim -p aaa.txt bbb.txt タブで開く

[vim] vimdiff 忘備録

$
0
0

有用なの忘れやすいvimdiffのコマンド
あまりにも忘れるのでメモ。

aaa.txtを開いているときにbbb.txtとdiffを取りたい
:vertical diffsplit bbb.txt
* TIPS: vertでタブを押す-> diffsでタブを押す

] c : 次の差分の行へ移動
[ c : 前の差分の行へ移動

dpで右にマージ(=diffput で dp)
doで左にマージ(=diffget だが do)

Use of alias for Vim external command

$
0
0

Vimから外部コマンドの実行時にaliasを使う方法を記す。

Introduction

Vimを使っていると外部コマンドでaliasを使いたいときがある。たとえば,私は以下のように普段頻繁に使うlsコマンドをaliasで再定義したり,OSごとで異なるクリップボードへの書き出しコマンドをaliasでまとめることで,同じコマンドからアクセスできるようにしている。

alias ls="ls -AFh --color=auto"
#### Copy to clipboard
# [ `command -v clip` ]    && alias clip="clip" # MSYS (Windows)
[ "`command -v xsel`" ]    && alias clip="xsel -ib" # Linux
[ "`command -v putclip`" ] && alias clip="putclip" # Cygwin
[ "`command -v pbcopy`" ]  && alias clip="pbcopy" # Mac

これらのaliasをVimからも使えるようにしたい。Vimから外部コマンドを使うには,コマンドラインモードで!<command>という書式で実行する。

:!ls

ここでの外部コマンドでaliasを使えるようにしたい。

Method

私はログインシェルをbashにしており,そこからtmuxの起動と同時にzshにシェルが変わるようにしている。したがって,Vimでの外部コマンドは,/bin/bashから実行される。そのため,bashのシェルスクリプトで読み込む設定ファイルを読み込むようにしたらよい。

BASH_ENV環境変数は,bashにおいて非対話的に実行したときに読み込む設定ファイル(既定はなし)を指定できる(zshでは~/.zshenvのファイルが非対話実行時に読み込まれる)。したがって,aliasを書いた設定ファイルをこの変数に指定すればよい。ただし,このままだとVimから外部コマンドの実行時にaliasが展開されないためうまくいかない。そこで,bashのexpand_aliasesオプションを有効にすることでaliasを展開することができ,Vimから外部コマンドをaliasで利用できるようになる。

たとえば,冒頭に示したaliasの設定とaliasを展開するオプション設定を~/.bashenvに記述し,BASH_ENV環境変数の設定を~/.bashrcに書いておけばよいだろう。

## .bashenv
shopt -s expand_aliases
alias ls="ls -AFh --color=auto"
#### Copy to clipboard
# [ `command -v clip` ]    && alias clip="clip" # MSYS (Windows)
[ "`command -v xsel`" ]    && alias clip="xsel -ib" # Linux
[ "`command -v putclip`" ] && alias clip="putclip" # Cygwin
[ "`command -v pbcopy`" ]  && alias clip="pbcopy" # Mac
## .bashrc
export BASH_ENV=~/.bashenv 

ちなみにこのexpand_aliasesはaliasの設定前後のどちらに書いても問題なく動作する。

BASH_ENV環境変数に設定したファイルは非対話実行時に常に読み込まれる。そのため,シェルスクリプトなどで意図しない動作を起こす可能性があり危険である。そこで,Vimの起動時にだけBASH_ENV変数を設定し,Vimの実行中だけBASH_ENV変数を読みこめばいい。つまり,以下の内容を~/.vimrcに記述して~/.bashenvファイルが読み込み可能で存在するときにBASH_ENV変数を設定すればいい。

"" 外部コマンドでaliasを使えるようにする
if filereadable(glob('~/.bashenv'))
  let $BASH_ENV=expand('~/.bashenv')
endif

これに合わせて,~/.bashrcの設定からはBASH_ENVの設定を除去し,aliasの展開オプションだけを記述する。

shopt -s expand_aliases 

これによりVimから外部コマンド実行時にaliasを使えるようになった。

Appendix

なお,蛇足ではあるが自分の備忘録のために私の設定についても述べておく。

bashとzshは設定が似通っている部分があり,aliasやPATHなどの共通設定を~/.zbashrcファイルで管理し,~/.bashrc~/.zshrcの最後に以下を記述して,~/.zbashrcを読み込むようにしている。

## for shared shell setting
[ -e ~/.zbashrc ] && source ~/.zbashrc

~/.vimrcでのBASH_ENV環境変数の設定では~/.bashenvでなく~/.zbashrcを指定し,~/.zbashrcでは以下のようにシェルがbashのときだけexpand_aliasesを設定している。

## enable alias in non-interactive shell
shell=`readlink /proc/$$/exe`
case $shell in
  *bash) shopt -s expand_aliases;;
  # *zsh) setopt aliases;;
esac

[ "`command -v xsel`" ] &&  shell=`readlink /proc/$$/exe`は説明が必要と思われるが,今回はテーマが異なるため省略する。

参考:

  • Vimの外部コマンド実行でaliasを使う http://sanrinsha.lolipop.jp/blog/2013/09/vim-alias.html
  • $BASH_ENV - メモ帳 http://d.hatena.ne.jp/parasporospa/20061103/p2

Windowsの Git bash でエディターをKaoriYa Vimにする設定

$
0
0
git config --global core.editor "'C:/Program Files/vim74-kaoriya-win32/gvim.exe' -c 'set fenc=utf-8'"

PHPファイルにHTMLを記述したとき、Vimのオートインデントがおかしくなる問題

$
0
0

はじめに

こんにちは、Vimを心から愛する諸君。私はPHPでWEBアプリケーションを書くときVimを使うのですが、オートインデントを使うとコードがぐちゃぐちゃになる問題に悩まされていました。この記事ではその解決策を示したいと思います。

追記(重要)

可能な限りSmarty等のテンプレートエンジンを活用して、PHPとHTMLをごちゃ混ぜにしないようにしましょう。PHPのご利用は計画的に。

期待する成果

PHPファイルでHTML、javascript、PHPを書いたとき、Vimのオートインデント=Gで綺麗なインデントができる状態を目指します。

方法は簡単。コピーするだけ。

cp /usr/share/vim/vim73/indent/html.vim ~/.vim/indent/php.vim

なぜこの問題が起こったのか

インデントがおかしかったのはindent/php.vimにHTMLのインデント設定が記述されていなかったからです。

このアイデアが思いつくきっかけになったヒント

きっかけはひとつのコマンドだった

ソースコードの編集中に:set filetype=htmlして、=Gしたらインデントが改善されました。この出来事はHTMLのインデント設定を読み込めば、PHPもjavascriptもHTMLも綺麗にインデントしてくれることを意味します。

Vimのインデント設定はどこにあるのか

Vimの場合、インデントの設定はvim73/indentの中のファイルに、PHPファイルを開いているときはindent/php.vimが開かれています。

それを踏まえた上でこの解決策

そこで今回の解決策、ユーザー定義の~/.vim/indent/php.vimにhtmlのインデント設定を入れてしまえというアイデアを思いついたわけです。

おしまい

最後までご拝読いただきありがとうございます。

VimのNERDTree上でgrepする

$
0
0

タイトルにはgrepと書きましたが、今回はgrepの代わりに、より高速なThe Silver Searcherを使います。

もちろん、NERDTreeは既に使えるという前提です。

1. The Silver Searcherのインストール

$ brew install the_silver_searcher

The Silver Searcherについては、以下の記事を参考。
ackを捨てて、より高速なag(The Silver Searcher)に切り替えた

2. VimからThe Silver Searcherを使えるようにする

ag.vimというプラグインを利用します。
.vimrcに以下を追記して、:NeoBundleInstall

NeoBundle 'rking/ag.vim'

これで、vimから:Ag [options] {pattern} [{directory}]で、The Silver Searcherが使えるようになります。

3. NERDTreeのmenuにgrepを追加する

grep_menuitem.vimというプラグインを利用します。

grep_menuitem.vimを.vim/bundle/nerdtree/nerdtree_plugin/以下に置く。

これで、NERDTreeのmenuにgrepが追加されます。
スクリーンショット 2014-12-27 21.10.20.png

4. NERDTreeでThe Silver Searcherを使う

2でVimからThe Silver Searcherを使えるようにし、3でNERDTreeでgrepを使えるようにしたので、次はNERDTreeでThe Silver Searcherを使えるようにします。

具体的には、3で追加したgrep_menuitem.vimを以下のように修正。

grep_menuitem.vim
" exec 'silent grep -rn ' . pattern . ' .' "変更前
exec 'silent Ag ' . pattern . ' .' "変更後

これで、NERDTreeでgrepの代わりにThe Silver Searcherが使えるようになりました。
特にファイル数の多いディレクトリ以下を検索するときは、grepよりThe Silver Searcherの方が圧倒的に早いです。

参照

0バイトのファイルを保存した時に、ファイルを削除するVim script

$
0
0

これは何か?

開いているファイルが不要になった時などに、中身を空にして保存をすると、そのファイルを削除することができる Vim script です。無条件で削除するのもアレなので、確認時に y を押した時のみ実行されます。

ユースケース

例えば memolist を使っていて、もはや不要になったメモを削除したいと思った時などに使っています。

ソース

augroup hykw_removeFile
  autocmd!
  autocmd BufWritePost * call s:Hykw_removeFileIf0Byte()
augroup END

function! s:Hykw_removeFileIf0Byte()
  let filename = expand('%:p')
  if getfsize(filename) > 0
    " do nothing
    return
  endif

  let msg = printf("\n%s is empty, remove?(y/N)", filename)
  if input(msg) == 'y'
    call delete(filename)
    bdelete
  endif
endfunction

使い方

.vim の適当な所にソースを貼り付けるだけです。ファイルの保存イベントの後に呼び出されます。

URL

https://github.com/hykw/vim-hykw-removeFileIf0Byte

CentOS(6.6)にluajitを有効化したvim7.4をインストール

$
0
0

luaじゃなくてluajitを使ったインストール手順はあんまり無いみたいなので、備忘録がわりに置いておきます。

インストール手順

makeに必要なファイルをインストール

sudo yum install ncurses-devel perl-ExtUtils-Embed python-devel readline-devel gcc ruby-devel python-devel ruby lua-devel

※最小構成で構築した CentOS6.6 のため、普通の環境の場合は、既にパッケージが入ってる可能性があります。

luajitをインストール

$ sudo mkdir /usr/local/luajit
$ sudo chown hykw /usr/local/luajit
$ wget http://luajit.org/download/LuaJIT-2.0.3.tar.gz
$ tar zxvf LuaJIT-2.0.3.tar.gz
$ cd LuaJIT-2.0.3

Makefile を編集

$ vi Makefile

export PREFIX= /usr/local/luajit
INSTALL_INC=   $(DPREFIX)/include

インストール

$ make
$ make install

$ export PATH="/usr/local/luajit/bin/:$PATH"

vim をインストール

sudo mkdir /usr/local/vim
sudo chown hykw /usr/local/vim

wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
tar jxvf vim-7.4.tar.bz2
cd vim74

./configure \
--with-features=huge \
--enable-fail-if-missing \
--prefix=/usr/local/vim \
--enable-luainterp \
--with-luajit \
--with-lua-prefix=/usr/local/luajit \
--enable-perlinterp \
--enable-pythoninterp \
--enable-rubyinterp

make

sudo touch /etc/ld.so.conf.d/luajit.conf
sudo chown hykw /etc/ld.so.conf.d/luajit.conf
echo "/usr/local/luajit/lib" > /etc/ld.so.conf.d/luajit.conf
sudo ldconfig

./src/vim --version
make install

CygwinからWin32版GVimを起動する

$
0
0

この記事は、Vim Advent Calendar 2014の27日目の記事ではありません。(たぶん)

Windowsで使えるVimにはいくつかの種類があります。例えば以下のようなものがあります。

  • Win32(or Win64)版のVim/GVim
  • Cygwin版のVim/GVim
  • MSYSのVim

それぞれの環境から別の環境のVimを起動するのはトラブルの元ですが、それでも別環境のVimを起動したい場合もあるでしょう。
ここでは、CygwinからWin32版のGVimを起動する場合の注意点を説明します。

環境変数

CygwinからWin32 GVimを起動する場合に一番問題になるのが環境変数です。Vimに関連する環境変数には以下のようなものがあります。

  • HOME
    .vimrc.gvimrcなどの設定ファイルを探す際に使用されます。Cygwinでは、/home/<user>が設定されています。Win32では通常は設定不要で、設定されていなければC:\Users\<user>が使われます。(Win32のホームディレクトリを、Cygwinのホームディレクトリを指すようにすることで設定ファイルを共有することも出来ますが、おすすめしません。)
  • SHELL
    Vimから外部コマンドを実行する際に使用されるシェルを指定します。Cygwinでは、/bin/bash等が設定されています。Win32では通常は設定不要で、設定されていなければcmd.exeが使われます。
  • PATH
    Vimから外部コマンドを実行する際に使われます。Cygwin内部では、通常のPATHの先頭に/usr/local/bin:/usr/binなどが追加されています。元の環境変数はORIGINAL_PATHに保存されています。Win32 GVimからCygwinのコマンドを実行する必要がなければ、元の環境変数を復元した方がよいでしょう。
  • TMP, TEMP
    一時ディレクトリの場所です。Cygwinでは、/tmp (=C:\cygwin\tmp)が設定されています。Win32では、C:\Users\<user>\AppData\Local\Tempが指定されています。一時ディレクトリに過ぎないので、大抵はどのディレクトリでも問題ないはずですが、外部コマンドによっては復元しておいた方がよいかもしれません。

以上を踏まえて、.bashrc等に以下のようなエイリアスを設定しておくとよいでしょう。

alias gvim='HOME= SHELL= PATH=$ORIGINAL_PATH gvim'

TMPTEMPも復元する場合は以下のようにするとよいでしょう。

alias gvim='HOME= SHELL= PATH=$ORIGINAL_PATH TMP=$LOCALAPPDATA\\Temp TEMP=$TMP gvim'

Win32版GVimにパスが通っていない場合は、末尾のgvim/cygwin/c/vim/gvim.exeなどのようにフルパスで指定してください。

これで、Cygwinからは、

gvim <filename> &

でWin32版GVimが起動できます。

パス形式

CygwinとWin32ではパスの形式が異なっています。前述の設定でWin32版GVimを起動する場合、ファイルのパスはWin32形式(あるいはWin32形式の\/に置き換えた形式)で指定する必要があります。
ファイルを相対パスで指定する場合には、Cygwin形式とWin32形式の違いを意識する必要はさほどありませんが、絶対パスで指定する場合には注意が必要です。(また、Cygwin形式のsymlinkについても注意する必要があります。)

自動変換(参考)

Cygwinのcygpathコマンドを利用すれば、パスの形式を相互に変換することが出来ます。例えば、

function gvimhelper(){HOME=SHELL=PATH=$ORIGINAL_PATH gvim $(cygpath -aw "$@")}alias gvim=gvimhelper

のような設定を行えば、パスを自動的にWin32形式に変換してGVimを起動することが出来ます。しかし、この設定の場合、GVimにオプションを渡すことが出来ないという問題があります。まじめに対処するには、引数を一つ一つチェックし、オプションでなければcygpathで変換するという処理が必要ですが、ここでは割愛します。

まとめ

CygwinからWin32版GVimを起動する際の注意点を述べましたが、GVimに限らず、他のWin32アプリを実行する際にも参考になるでしょう。

Viewing all 5735 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>