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

Vimで矢印キーの有効無効を切り替える

$
0
0

実践Vimを読んでいます、基本機能の習得・おさらいにはとても良い本だと思います。

さて、

コラム:矢印キーに指を伸ばすクセをやめる

によると、 矯正期間に限り vimrcで矢印キーを無効にしてしまうという例があった。

まだまだhjklでの移動をしない軟弱者なので、切り替えできるようにしてみた。

.vimrc
function! HardMode ()noremap<Up><Nop>noremap<Down><Nop>noremap<Left><Nop>noremap<Right><Nop>endfunctionfunction! EasyMode ()noremap<Up><Up>noremap<Down><Down>noremap<Left><Left>noremap<Right><Right>endfunction

command! HardMode call HardMode()
command! EasyMode call EasyMode()

これで:HardModeと打てば矢印キーが無効になり、:EasyModeでまた有効にできた。集中して作業できる時にHardModeにしてみよう。

なお、EasyModeExploreと出だしがかぶっているので、Eをよく使う人は別名にしましょう。


Mac の Vim (CUI) でクリップボードを有効化する

$
0
0

Mac (Mac OS X Mountain Lion 10.8) の Vim は標準状態ではクリップボードが有効化されていません。

$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 23 2012 13:50:52)
Compiled by root@apple.com
Normal version without GUI.  Features included (+) or not (-):
-arabic +autocmd -balloon_eval -browse +builtin_terms +byte_offset +cindent 
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments 
-conceal +cryptv +cscope +cursorbind +c
...
...

-clipboardというようにマイナスが付いていては、クリップボードは使用できません。

Vim をインストールし直す

とりあえずソースから、ということで。今回は homebrew を使用します。

hg コマンドをインストール

$ brew install hg

vim をインストール

$ hg clone https://vim.googlecode.com/hg/ /tmp/vim
$ cd /tmp/vim
$ make clean
$ ./configure --prefix=/usr/local --enable-multibyte --enable-xim --enable-fontset --enable-rubyinterp --enable-perlinterp --with-features=huge --disable-selinux
$ make
$ make install

2〜3分待てば完了するはず。configureに与えるものは各人が必要な物を指定してください。

今回は /usr/local以下にインストールしました。おそらくデフォルトでは、

$ which vim
/usr/bin/vim

となっているので、以降PATHの順番を変えたり、いっそエイリアスなどで直接指定してやってください。

+clipboard を確認

$ /usr/local/bin/vim --version | grep clipboard
+clipboard       +iconv           +path_extra      -toolbar
+eval            +mouse_dec       +startuptime     -xterm_clipboard

完了です。

MacVim をコマンドラインから起動する

$
0
0

MacVim を起動するときコマンドラインから、

$ open -a MacVim

と、やりますよね(おそらく)。

このままエイリアスでもいいのですが、もう少し勝手を良くしようというのが今回の趣旨です。

gvim 関数を作成

エイリアスには限界があるので、関数化しましょう。環境は bashとします。

gvim.sh
    gvim(){if[$# -eq 0 ]; thenopen -a MacVim
        elseopen -a MacVim "$@"fi        return 0
    }

素直に、引数がなければ起動するだけ、あれば引数を渡して終了。なのですが、MacVimは、存在しないファイルが渡された時、CUI のように新規作成してはくれません。

$ gvim myfile
The file /Users/tester/myfile does not exist.
exit 1

新規作成の機能を実装しましょう。

複数ファイルに対応する前に、とりあえず引数は1つしか取れないとしておきます。

gvim.sh
     1: gvim(){
     2:     if[$# -eq 0 ]; then3:         open -a MacVim
     4:     elif[$# -eq 1 ]; then5:         if[ ! -f "$1"]; then6:             touch "$1"||return 1
     7:         fi8:         open -a MacVim "$1"
     9:     else10:         echo"$@: invalid arguments"
    11:         return 1
    10:     fi11:     return 0
    12: }

5-7行目です。ファイルがない場合、作成しています。Permission deniedなどで作成できなかった場合のための処理も加えました。

これで一応は機能します。しかし、ちょっとしたバグが潜んでいます。それは、gvim に myfile2という新規ファイルを渡したいとき、間違って myfile1の新規ファイル名で渡したとします。:qなどで Vim を終了した時、カレントディレクトリには myfile1が作られたままになってしまうのです。

$ ls
Desktop/    Documents/
$ gvim myfile1                      # ミス。myfile2だった。vim を終了させる
$ ls
Desktop/    Documents/  myfile1     # myfile1 は存在していてほしくない

この対処をしましょう。

ファイルサイズが0ならば、終了後に消す

作成したファイルに何も書き込まれず(ファイルサイズが0)終了したのなら、そのファイルはミスだったと判断していいものとしました。

gvim.sh
     1: gvim(){
     2:     if[$# -eq 0 ]; then3:         open -a MacVim
     4:     elif[$# -eq 1 ]; then5:         if[ ! -f "$1"]; then6:             touch "$1"||return 1
     7:         fi8:         touch -t $( date -v+1S +'%Y%m%d%H%M') ~/.compare
     9:         open -a MacVim "$1"&&{
    10:             sleep 0.2
    11:             if[ ~/.compare -ot "$1"]; then12:                 [ ! -s "$1"]&& rm "$1"
    13:             fi14:             rm ~/.compare
    15:         }
    16:     else17:         echo"$@: invalid arguments"
    18:         return 1
    19:     fi20:     return 0
    21: }

これで実装完了です。以下解説。

少し特殊な動きをしているのが、8行目からです。touchコマンドで時刻指定をし、最新のファイル ~/.compareを作成します。そして、$1と比較(11行目)をし、~/.compareのほうが古かったら、なおかつファイルサイズが0だったら削除するというようにしました。

なぜ、こんな回りくどい方法かというと、単純にファイルサイズ0にすると、もともとあったファイルサイズ0ファイルがこの gvim関数で開いただけで、削除されるという恐ろしいことになるからです。

それにしても周りくどいような気がします。もっとエレガントに書けるなら教えてください。

あとは、エイリアスをはるなり、以下のように

$ gvim myfile

実行するなりで使用できます。

Vim で 現在開いているファイルを簡単に実行して、結果を表示させる

$
0
0
.vimrc
autocmd FileType php,rubynnoremap<Space> :execute '!' . &filetype . ' %'<CR>

ファイルタイプが php か ruby なら、保存後、ノーマルモードでスペースキーを押すと結果が下の方に表示される(MacVimの場合。Vimの場合は画面が切り替わる)。ちょっとしたものを確認したい場合とかに便利かなと思います。

上記のコードの場合、例えば php ファイルを開いたあとに txt ファイルを開いたりすると、それも実行できてしまうため、以下のようなコードのほうが良いかもしれません。

.vimrc
function! ExecuteCurrentFile()if&filetype=='php'||&filetype=='ruby'
    execute '!' . &filetype . ' %'endifendfunctionnnoremap<Space> :call ExecuteCurrentFile()<CR>

これで php, ruby ファイルを開いたあとで、それ以外のファイルタイプのものを開いて実行しようとしてもできないようになります。

CentOS6.4でVim7.3のsrc.rpmからrpmを作成する方法

$
0
0

概説

ここでは、CentOS6.4の環境で、Vim7.3のsrc.rpmファイルから、以下のrpmファイル群を作成する方法を示します。

  • vim-X11-7.3.944-1.el6.x86_64.rpm
  • vim-common-7.3.944-1.el6.x86_64.rpm
  • vim-debuginfo-7.3.944-1.el6.x86_64.rpm
  • vim-enhanced-7.3.944-1.el6.x86_64.rpm
  • vim-filesystem-7.3.944-1.el6.x86_64.rpm
  • vim-minimal-7.3.944-1.el6.x86_64.rpm

前提

作業はrootユーザーのカレントディレクトリ「/root」で行うこととします。

事前準備

まず、rpmファイルを作成する際に必要な関連パッケージをインストールしておきます。

参考URL:Building an rpm package for vim 7.3 under CentOS6

コマンド
# yum install rpm-build# yum install \>python-devel\>ncurses-devel\>libacl-devel\>gpm-devel\>autoconf\>libselinux-devel\>ruby-devel\>gtk2-devel\>libSM-devel\>libXt-devel\>libXpm-devel\>perl-ExtUtils-Embed# yum groupinstall "Development tools"

Vim7.3のsrc.rpmを取得

Rpmfind mirrorのFTPサイトから対象のrpmを取得します。今回は、バージョン7.3.944を利用することにしました。

コマンド
# wget ftp://rpmfind.net/linux/fedora/linux/releases/19/Fedora/source/SRPMS/v/vim-7.3.944-1.fc19.src.rpm

依存パッケージの確認

このように、 rpmbuild --rebuildを実行すると、依存パッケージが確認できるので、足りない分は追加でインストールします。

コマンド
# rpmbuild --rebuild vim-7.3.944-1.fc19.src.rpmエラー:ビルド依存性の失敗:gpm-develvim-2:7.3.944-1.el6.x86_64に必要とされていますruby-develvim-2:7.3.944-1.el6.x86_64に必要とされていますrubyvim-2:7.3.944-1.el6.x86_64に必要とされていますlibXpm-develvim-2:7.3.944-1.el6.x86_64に必要とされています# yum install -y gpm-devel ruby-devel ruby libXpm-devel

rpmbuild --rebuildの際に、以下のような警告が大量に表示される場合があります。

警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します

警告なので無視してもよいですが、気になる場合は、以下のコマンドを実行し、ダミーでユーザーを作成しておきます。

コマンド
# useradd -s /sbin/nologin mockbuild

specファイル等の作成

コマンド
# rpm -Uvh --nomd5 vim-7.3.944-1.fc19.src.rpm警告:vim-7.3.944-1.fc19.src.rpm:ヘッダV3RSA/SHA256Signature,keyIDfb4b18e6:NOKEY1:vim########################################### [100%]

rpmファイルの作成(「不正な終了ステータス」が発生するパターン)

rpmbuildを実行すると、以下のようなエラーが大量に発生します。

コマンド
# rpmbuild -ba ~/rpmbuild/SPECS/vim.spec省略objects/term.o:Infunction`set_termname':/root/rpmbuild/BUILD/vim73/src/term.c:1686: undefined reference to `PC'/root/rpmbuild/BUILD/vim73/src/term.c:1672: undefined reference to `tgetnum'/root/rpmbuild/BUILD/vim73/src/term.c:1670:undefinedreferenceto`tgetnum'/root/rpmbuild/BUILD/vim73/src/term.c:1647: undefined reference to `tgetflag'/root/rpmbuild/BUILD/vim73/src/term.c:1679: undefined reference to `tgetnum'/root/rpmbuild/BUILD/vim73/src/term.c:1644:undefinedreferenceto`tgetflag'/root/rpmbuild/BUILD/vim73/src/term.c:1641: undefined reference to `tgetflag'/root/rpmbuild/BUILD/vim73/src/term.c:1638: undefined reference to `tgetflag'/root/rpmbuild/BUILD/vim73/src/term.c:1635:undefinedreferenceto`tgetflag'collect2: ld returned 1 exit statuslink.sh: Linking failedmake: *** [vim] Error 1エラー: /var/tmp/rpm-tmp.FNOnSy の不正な終了ステータス (%build)RPM ビルドエラー:    /var/tmp/rpm-tmp.FNOnSy の不正な終了ステータス (%build)

参考URL:Building an rpm package for vim 7.3 under CentOS6
↑このサイトを参考に対象ファイル(7.3.050)の修正を行います。

コマンド
# vi ~/rpmbuild/SOURCES/7.3.050
58-63行目:修正前
+LINK_AS_NEEDED=+# Check if linker supports --as-needed and --no-as-needed options+if$CC-Wl,--help2>/dev/null|grepas-needed>/dev/null;then+LDFLAGS="$LDFLAGS -Wl,--as-needed"+LINK_AS_NEEDED=yes+fi
58-63行目:修正後
+LINK_AS_NEEDED=no+# Check if linker supports --as-needed and --no-as-needed options+#if $CC -Wl,--help 2>/dev/null | grep as-needed > /dev/null; then+#  LDFLAGS="$LDFLAGS -Wl,--as-needed"+#  LINK_AS_NEEDED=yes+#fi
100-105行目:修正前
+LINK_AS_NEEDED=+# Check if linker supports --as-needed and --no-as-needed options+if$CC-Wl,--help2>/dev/null|grepas-needed>/dev/null;then+LDFLAGS="$LDFLAGS -Wl,--as-needed"+LINK_AS_NEEDED=yes+fi
100-105行目:修正後
+LINK_AS_NEEDED=no+# Check if linker supports --as-needed and --no-as-needed options+#if $CC -Wl,--help 2>/dev/null | grep as-needed > /dev/null; then+#  LDFLAGS="$LDFLAGS -Wl,--as-needed"+#  LINK_AS_NEEDED=yes+#fi

rpmファイルの作成(気を取り直して)

コマンド
# rpmbuild -ba ~/rpmbuild/SPECS/vim.spec

以下のディレクトリにファイルが作成されています。

コマンド
# ls -l ~/rpmbuild/RPMS/x86_64/合計14048-rw-r--r--.1rootroot113816011704:332013vim-X11-7.3.944-1.el6.x86_64.rpm-rw-r--r--.1rootroot661797611704:332013vim-common-7.3.944-1.el6.x86_64.rpm-rw-r--r--.1rootroot522048411704:332013vim-debuginfo-7.3.944-1.el6.x86_64.rpm-rw-r--r--.1rootroot100202811704:332013vim-enhanced-7.3.944-1.el6.x86_64.rpm-rw-r--r--.1rootroot1148411704:332013vim-filesystem-7.3.944-1.el6.x86_64.rpm-rw-r--r--.1rootroot38824011704:332013vim-minimal-7.3.944-1.el6.x86_64.rpm

現在インストールされているVimのバージョンを確認

コマンド
# rpm -qa |grep vimvim-enhanced-7.2.411-1.8.el6.x86_64vim-common-7.2.411-1.8.el6.x86_64vim-minimal-7.2.411-1.8.el6.x86_64

作成したVim7.3のrpmをインストールする(現在インストールされているものと入れ替え)

vim-filesystemvim-commonと依存関係があるため、一緒に入れます。

コマンド
# rpm -e --nodeps vim-enhanced vim-common vim-minimal# rpm -Uvh ~/rpmbuild/RPMS/x86_64/vim-{m,c,e,f}*準備中...########################################### [100%]1:vim-filesystem########################################### [ 25%]2:vim-common########################################### [ 50%]3:vim-enhanced########################################### [ 75%]4:vim-minimal########################################### [100%]

その他参考URL

CentOS: rpmbuild-ing Vim w/ Ruby support

vim7.4をソースからインストール

$
0
0

最新版を取得

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

パッチ用のディレクトリを作成

mkdir patches
cd patches/

パッチを取得(2013/10/16時点)

seq -f http://ftp.vim.org/pub/vim/patches/7.4/7.4.%03g 052 | xargs wget
cd ..

パッチをあてる

cat patches/7.4.* | patch -p0

src/Makfileを修正

これをやらないとsedが戻らなくなる
http://www40.atwiki.jp/hirukiyo/m/pages/18.html

インストール

# インストール先を/usr/local/vim74にして、古いvimも共存させる。
# リモートホストのvimを使う想定。
./configure --prefix=/usr/local/vim74 --disable-selinux --enable-multibyte --with-features=huge --enable-pythoninterp --prefix=/usr/local/vim74 --disable-netbeans --enable-perlinterp --disable-xsmp-interact --disable-xsmp --without-x --disable-gui

# コンパイル
make

# makeでperl関連のエラーが出たら以下
yum -y install perl-ExtUtils-Embed

# インストール
make install

古いvimと入れ替え

prefix指定なしでconfigureしていればこの手順はいらないと思う。

# 古いvimをmv
mv /usr/bin/vim /usr/bin/vim72

# 新しいvimをパスに入れる
ln -s /usr/bin/vim /usr/local/vim74/bin/vim

OSXでrbenv使ってて、vimをソースからビルドしてインストールすると、SEGVが発生してvimが落ちてしまう

$
0
0

vimを起動するとこういうエラーが出る。

% vim
dyld: lazy symbol binding failed: Symbol not found: _rb_encdb_declare
  Referenced from: /Users/kameda/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/x86_64-darwin12.2.0/enc/encdb.bundle
  Expected in: flat namespace

dyld: Symbol not found: _rb_encdb_declare
  Referenced from: /Users/kameda/.rbenv/versions/1.9.3-p392/lib/ruby/1.9.1/x86_64-darwin12.2.0/enc/encdb.bundle
  Expected in: flat namespace

Vim: Caught deadly signal SEGV
Vim: Finished.
zsh: segmentation fault  vim

以下の条件が重なった時に、vim起動時にSEGVで落ちる。

  • vimのconfigureで --enable-ruby-interpを指定している
  • rubyのdylibがない。(rubyビルド時に、--enable-sharedを指定してない)

rubyのdylibが無いのが原因らしい。
http://attonblog.blogspot.jp/2013/02/ruby-193-rubyinterp-vim-brew.html

これを解消するため、rubyを--enable-sharedをつけてビルドしなおさないといけない。
また、ruby2.0からはrbenvの環境変数がCONFIGURE_OPTSからRUBY_CONFIGURE_OPTSに変わった。
ruby1.9.3ならCONFIGURE_OPTSを使う。
http://attonblog.blogspot.jp/2013/02/rbenv-enable-shared-ruby-200-p0.html

以下の手順で ruby と vim をビルドし直す。

まず ruby-build を使って ruby をインストール。

RUBY_CONFIGURE_OPTS='--enable-shared' rbenv install 2.0.0-p247
rbenv global 2.0.0-p247

あとは普通にvimをソースからインストール。

hg clone https://vim.googlecode.com/hg/ vim
cd vim
./configure --with-features-huge --enable-perlinterp --enable-pythoninterp --enable-rubyinterp
make && make install

--prefixを指定してないと、/usr/local/bin に vim がインストールされる。
OSXのデフォルトでは $PATHが /usr/local/bin より先に /usr/bin を見に行くので、/usr/local/bin を先に見に行くために、.bashrc か .zshrc などで $PATHの順番を変えてやる必要があります。

.zshrc
export PATH=/usr/local/bin:$PATH

以上です。

Vimでpull requestの差分を見るためのunite-pull-request作った(まだ途中)

$
0
0

ぼくのはじめてのゆないとそーす。

githubの特定リポジトリのpull requestを一覧してファイルのdiffを開くuniteソース
unite-pull-request

GitHubのpull requestっていうのは、ゴイスーにベンリですよね。
コードレビューライフが変わったり、こんなぼくでもおーぷんそーすにぱっちを送っていいんだ!って気持ちになる。

でも、diffは若干見辛いと思うこともある。
WebページUIの限界みたいなのがあると思うけども。
やっぱり手元のVimで見れた方が見易い。vimdiff結構好きだし。

というわけで、作ってみたのがunite-pull-request

既に誰か作ってるのでは?感が凄いあったのだが、unite-pull-requestとunite-pullrequestは検索しても何も出なかったので、多分無いと思う。

とりあえずある程度使える所まで持っていくのを第一にしていたので、まだ今の所見る専用。
rawデータの取得にめちゃめちゃハマってしまって、何故かプライベートリポジトリのデータが取れなくて泣きそうになった。
なんだよ406 Not Acceptableって。情報が何もねえよ…。Acceptヘッダ弄っても効かねえし…。
色々試行錯誤した結果、x-oauth-basic認証とraw.github.comのURLなら何故か取得できることを発見したので、そちら側に取得方法を揃えたが、そもそもこれは取得方法として正しいのだろうか。

現在の機能

  • 特定のリポジトリのpull requestを一覧する
  • pull requestを選択すると、そのpull requestに含まれる変更されたファイルの一覧が出る
  • ファイルの一覧は、バイナリっぽい拡張子をフィルターできる
  • ファイルの追加、変更、削除に合わせて色を変える
  • 変更ファイルを選択すると、baseとheadのファイルを取得してdiffを表示する
  • pull requestを選択した状態で、actionメニューからbrowseを選択すると、ブラウザでpull requestが開ける

近々やりたいこと

カーソル当ててる行にレビューコメントを付けるのは、やればなんとかなりそうな気はする。

問題はその他のレビューコメントの取得と表示。これはちょっと良いUIが思い付かない。
まあ、そこはブラウザで見るのでも良いか…。

後、github APIを叩くvimプラグイン二つ目なんだけど、認証の扱いがベタ書きでダサいので何とかしたい。

スクリーンショットスクリーンショット 2013-11-09 5.50.35.png

スクリーンショット 2013-11-09 5.51.03.png
スクリーンショット 2013-11-09 5.51.22.png


quickrun.vimでD言語のユニットテスト

$
0
0

quickrun.vimは素晴らしいことに標準でD言語に対応しています。
またD言語は素晴らしいことに簡単に単体テストの記述が可能です。

デフォルトでは「r」でquickrunによる実行ができるので、「R」で先に単体テストをしつつ実行するようにしました。

letg:quickrun_config = {}
letg:quickrun_config['d_unittest'] = {
      \ 'command': 'rdmd',
      \ 'cmdopt' : '-unittest',
      \ 'tempfile': '%{tempname()}.d',
      \ }

nnoremap<buffer><leader>R :<C-u>QuickRun d_unittest<CR>

なお「d_unittest」の部分を「d」だけにすれば常に単体テストが有効になります。

tagbar.vimでctagsを使ってJSの関数、CSSの一覧を出す

$
0
0

Vimにtagbar.vimがインストールされている前提で。

下記からctagsをインストール

HomeBrewでインストールするとCSS用のパッチを当てられない
CSS用のパッチが必要ない場合はHomeBrewでインストールしても良い

http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz

CSS用のパッチを上記ディレクトリに突っ込む

http://designtomarkup.com/vim/download/ctags5.8-patch.zip

ctagsをインストール

$ cd ctags-5.8
$ ./configure
$ make
$ sudo make install

.bash_profileまたは.bashrcに下記を追記

MacOSデフォルトのctagsを使用しないように

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

ホームディレクトリに設定ファイルである.ctagsを追加する

$ cd ~/ && touch .ctags

JS用の設定ファイルを.ctagsに記述

https://gist.github.com/tim-smart/199338

検索結果を別タブで開きたいので下記を.vimrcに設定

nnoremap <F3> :<C-u>tab stj <C-R>=expand('<cword>')<CR><CR>

下記の方法で検索できる

  1. methodName上でctrl + ]
  2. methodName上で<F3>
  3. :tag methodName

対象となるディレクトリに移動してtagsファイルを作成

$ ctags -R .

注意点

エディタで開くときはtagsファイルがあるディレクトリで開くこと。

参考リンク

Vimの自動保存で読み込み専用や名前がない場合に警告が出ないようにする設定

$
0
0

Vimの自動保存、便利ですね。バージョン管理システムが普通になった時代ならではですね。

さて、通常の自動保存の設定は、みんな大好きvim-users.jpにもある通り

.vimrc
setautowritesetupdatetime=500

autocmd CursorHold *  wall
autocmd CursorHoldI *  wall

ぐらいで事足りるんですが、読み込み専用やファイル名がない場合に警告が出てうざいです。

なので、関数でラップしてそのような場合は保存を呼び出さないようにしました。

.vimrc
setautowritesetupdatetime=500functions:AutoWriteIfPossible()if!&readonly&& bufname('%')!=# ''wendifendfunction

autocmd CursorHold * calls:AutoWriteIfPossible()
autocmd CursorHoldI * calls:AutoWriteIfPossible()

と、.vimrcに書いてください。

おしまい。

iTermでもMacVimを開けるようにエイリアスを貼る

レジスターの簡単な利用

$
0
0

個人的に便利に使っている方法。

ときどき使うので、操作を忘れてしまうことが多く、レジスターを利用して操作を簡略化しています。
みんな知っていることかもしれないので、恥ずかしいのですが。

@pのマクロに、次の内容を登録する。
"+gP のテキストをブロック指定をしてから、"pyの操作をして、レジスターに登録する。
動作 他のWindowでコピーした内容を@pでコピーする。 

同様にレジスターに登録していく。

マクロ  コピー操作  内容    動作
@c   "cy      "+y    ペースト
@a   "ay      ggVG   全指定
@s   "sy      :g/^\s*$/d  スペース行の削除
@t   "ty       :%s/aaa/\t/g  タブへの変換
@h   "hy      :let g:vimwiki_list = [{'path':'~/Dropbox/vimwiki/','path_html':'~/Dropbox/vimwiki_html/'},{'path':'~/vimwiki','path_html':'~/vimwiki_html/'}] vimwikiのdropboxへの環境変更

終了してもレジスターに残っていますから、一度登録すれば続けて使えます。

errorformatについて(入門編)

$
0
0

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

昨日は@manga_osyoさんのquickrun.vim でリアルタイムに出力を行う場合の注意でした。
今回は&errorformatについて説明したいと思います。
この記事では&errorformatをどういうふうに設定すればよいのかを説明するつもりです。
&errorformatがどんな時に使われるか全く検討のつかない方はQuickfixや:makeについて
調べてから読むことをおすすめします。
また、ここで説明することは:help error-file-formatにすべて載っています。

前準備

&errorformatをいろいろと試してみるにあたり、まずは&errorformatのテスト環境をまず作りましょう。

function! TestErrFmt(errfmt,lines)let temp_errorfomat =&errorformattrylet&errorformat=a:errfmt
    cexprjoin(a:lines,"\n")copencatch
    echo v:exception
    echo v:throwpoint
  finallylet&errorformat= temp_errorfomat
  endtryendfunction

これは以下のような感じで使います。

:call TestErrFmt('(%l\,%c):%m',['(1,2): abc','(13,27): xyz','hoge'])

Quickfixの出力結果

|1 col 2| abc
|13 col 27| xyz
|| hoge

簡単にこのTestErrFmt関数を説明すると、これは引数に「&errorformat文字列」と「解析する文字列」を指定し、
その結果をQuickfixに出力する関数です。

行っていることは以下のような感じです。:cexpr便利ですね!

  1. temp_errorfomatに現在の&errorformatを退避しておく。
  2. &errorformatを設定する。
  3. :cexprでTestErrFmt関数に渡された引数をもとにQuickfixを作成する。
  4. :copenでQuickfixを開く。
  5. &errorformatを元に戻す。

&errorformatの書式

カンマ(,)

&errorformatとは複数のパターンというものをカンマ(,)で区切ってある文字列のことです。

let &errorformat = 'File %f,(%l\,%c):%m'
set errorformat=File\ %f,(%l\\,%c):%m

カンマ(,)がパターンに含まれている場合には\でエスケープしなければなりません。
個人的にletのほうがエスケープがめんどくないので好みです。

基本要素

&errorformatのパターンは%Xのように%でエスケープされた特殊文字と単なる文字(例えばAとか)で
構成させています。

1.主な特殊文字

  • %f: ファイルパスにマッチする文字列。各文字は&isfnameに含まれていなければなりません。
  • %l: 行番号。単なる数字にマッチします。
  • %c: 桁番号。単なる数字にマッチします。
  • %m: エラーメッセージ。正規表現でいうところの/.*/です。

上記の特殊文字はそれぞれ%f|%l col %c| %mの形式でQuickfixの表示される部分に当たります。

2.正規表現のように扱われる特殊文字

  • %\: 単体の '\' という文字。
  • %.: 単体の '.' という文字。
  • %#: 単体の '*' という文字。
  • %[: 単体の '[' という文字。文字の範囲[]のために使われる。
  • %~: 単体の '~' という文字。

上記の特殊文字は正規表現のアトムと全く同じ扱われ方をします。

3.便利な特殊文字

  • %-G: このメッセージを無視する。これを付けるとそのパターンはQuickfixに表示されなくなります。
  • %A: 複数行メッセージの開始。
  • %C: 複数行メッセージの継続。
  • %Z: 複数行メッセージの終了。

上記の特殊文字は基本的にパターンの先頭に置きます。
それぞれ、単体では何もマッチしませんので他のものと一緒に使用します。

パターンマッチ

パターンマッチは行単位で行われ、&errorformatの先頭から順にそれぞれのパターンと
パターンマッチが行われます。
どれにもマッチしなかった場合には、単なるメッセージとしてQuickfixに表示されます。

&errorformatの使用例

まぁ簡単にまとめてみましたが、日本語で説明するのは難しいので、
先ほどのTestErrFmt関数を使っていくつか例をあげて終わりにしたいと思います。


1. TestErrFmt('$%m,%-G%.%#',['$hoge','$foo','piyo'])

Quickfixの出力結果

|| hoge
|| foo

どれにもマッチしなかった場合には、単なるメッセージとしてQuickfixに表示されるので、
最後に'%-G%.%#'のパターンをつけておくと、'%.%#'によって0文字以上の任意の文字にマッチし、
'%-G'によってQuickfixに表示されなくなるので余計な出力を消せてすごく便利です。
また、'%m'にマッチした部分しか表示されないので'$'の部分は表示されません。


2. TestErrFmt('(%l\,%c):%m',['(1,2): abc','(13,27): xyz','hoge'])

Quickfixの出力結果

|1 col 2| abc
|13 col 27| xyz
|| hoge

最後の'hoge'はどれにもマッチしなかったので単なるメッセージとしてQuickfixに表示されています。


3. TestErrFmt('%A[%f],%C%l\,%c,%Z%m',['[~/.vimrc]','12,5','hoge'])

Quickfixの出力結果

.vimrc|12 col 5|  hoge

'%A'と'%C'と'%Z'を一緒に使うことで複数行を1つの出力として扱うことができます。


4. TestErrFmt('%.%m',['hoge','foo','piyo'])

Quickfixの出力結果

|| oge
|| oo
|| iyo

'%.'は正規表現でいう/./に当たるので出力はそれに1文字消費されてしまいます。


5. TestErrFmt('%[a-i]%m',['hoge','foo','piyo'])

Quickfixの出力結果

|| oge
|| oo
|| piyo

'%[a-i]'は正規表現でいう/[a-i]/に当たるので、hogeのhとfooのfは消費されてしまいます。

終わり

以上、「errorformatについて(入門編)」でした。
これがすべてではないので、詳しくは:help error-file-formatを参照してください。
Vim Advent Calendar 2012もあと16日ですね。明日は@unmoremasterさんっぽいです。

vimでxmlを整形(xmllint使用)

$
0
0

バッファ全体

:%!xmllint --format -

選択範囲

:'<,'>!xmllint --format -

Vim + tmux + Slimuxでインタラクティブなコーディング

$
0
0

Vim + tmux + pry / R

rubyとRを統合しながら開発しているので、分析時に使っているRStudio的な開発をVimとtmuxでやりたい!と思ったので設定しました。

+ Slimux

今まではjpalardy/vim-slimeを使っていたんですが、RStudioみたいに行単位で送りたいなー、と思って探していたらepeli/slimuxに行き当たりました。(設定次第でvim-slimeでも出来るのかもしれませんが…)

vim-slimeよりもconfigurableな感じで使いやすいです。

#409 - asciinema

NeoBundle 'epeli/slimux'

map <C-c><C-c> :SlimuxREPLSendLine<CR>j
vmap <C-c><C-c> :SlimuxREPLSendSelection<CR>

標準の設定ではmap ...<CR>ですが、僕は最後にjを付けてます。これでCtrl押しながらc連打で各行をtmuxの画面に送れます。RStudioでcmd+enterしてるのと同じ感じですね。 ->追記:初回設定時に毎回jが効いて鬱陶しいので回避方法募集中です。

v}<C-c><C-c>してやれば複数領域の実行も出来るので良いですね!
体感としてはRStudioで実行するよりも軽量なので気に入りました。

バッファ単位で送り先のtmux panelも変えられるので、僕はtmuxを縦に二分割して片方をpry、もう片方にRを起動してgvimからCtrl+cしながらコーディングしてます。
特にRはデータを直接確認しながら作業をすることが多いので、いちいちRStudioに画面を切り替えることなくvimから全て実行できる環境は快適です。

作者に感謝!
Slimux - tmux Plugin for Vim - Esa-Matti Suuronen

余談

僕はgvimをサブモニタに表示しながら使ってるんですが、
一般的にはtmuxのpanelを分割して使うものなんでしょうか。

何にせよvim, tmux, pryの組み合わせは便利です。
言葉だと余り便利さが伝わりにくいですが、僕は以下の動画を見て「使いたい!」と思いました。
Velvet Pulse » Improve Your Ruby Workflow by Integrating vim/tmux/pry
こっちもいい感じです。
▶ LA Ruby Conf 2013 - Impressive Ruby Productivity with Vim and Tmux by Chris Hunt - YouTube

fugitiveの:Gblameで更に過去にさかのぼる方法

$
0
0

:Gblamegit-blameの結果を表示できますが、ある行が変更されるその前の状態を表示したい場合は、その行にカーソルを移動させて ~を押します。すると、その行を変更したcommitのsha1が012345だったとすると、 git blame 012345^ -- fileを実行したような結果がvimdiffで表示されます。

ちなみに ~[count]を受け取るので 3~git blame 012345^^^ - fileになります。また -git blame 012345 -- fileです。便利

tips: 空白差分だけの変更を無視する

そもそも ~が必要になる場面というのは、blameで得られた差分がインデントの変更みたいな、実質中身のない変更の場合のことも多いです。 git-blame-wオプションでそういった空白のみの変更を無視してくれるので便利です。 :Gblame wで同様になります。 :Gblameを使うときはとりあえず wフラグを渡しとくといいかも知れません。

他のフラグや使い方については :help fugitive-:Gblameを参照してください。

環境変数PATHを共通化する。

$
0
0

Windowsで環境変数PATHを設定するのってすごく面倒なので、
VimとPowerShellとBatファイル、それぞれ共通のファイルを
読み込んでPATHを設定しようと思いました。

で、以下のコードを.vimrcMicrosoft.PowerShell_profile.ps1に書けばOK。
共通のファイルは1行ごとにPATHが書かれています。

Bat ファイル

@echooffsetlocal enabledelayedexpansion
setPATH=FOR/F%%i in (%HOME%\example.pathrc) do @setPATH=%%i;!PATH!
echo%PATH%endlocal

Vim script

if filereadable(expand('~/example.pathrc'))let $path=join(readfile(expand('~/example.pathrc')),';')endif
echo $path

PowerShell script

if(test-path"$env:HOME\example.pathrc"){$env:path=[string]::join(';',(get-content"$env:HOME\example.pathrc"))}write-host$env:path

文字化けしたファイルを修正する

$
0
0

shift-jisのファイルを開いて萎えた時に

vimで開いて

:e ++enc=cp932
:set fileencoding=utf-8
:wq

cp932はshift-jisのこと
euc-jpならここを変えればいい

tmuxのバッファ内容をVIMで開く

$
0
0

シェルから下記コマンドを入力するだけの簡単なお仕事です。

tmux capture-pane -S -10000\; show-buffer | vim +10000 -Rc 'set ts=8 nolist nonu' -

alias例

~/.zshrc
alias zp="tmux capture-pane -S -10000\; show-buffer | vim +10000 -Rc 'set ts=8 nolist nonu' -"# vimshellを導入している人向け(シンタックスハイライトが付きます)alias zp="tmux capture-pane -S -10000\; show-buffer | vim +10000 -Rc 'set ft=vimshell ts=8 nolist nonu' -"
Viewing all 5720 articles
Browse latest View live


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