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

インデントの設定をExモードで変更する

$
0
0
Vim Script
lets:coding_styles = {}
lets:coding_styles['DefaultTab'] ='setl tabstop=4 shiftwidth=4 shiftwidth=4 softtabstop=4 noexpandtab'lets:coding_styles['Default'] ='setl tabstop=4 shiftwidth=4 shiftwidth=4 softtabstop=4 expandtab'lets:coding_styles['ShortExpandStyle'] ='setl tabstop=2 shiftwidth=2 shiftwidth=2 softtabstop=2 expandtab'lets:coding_styles['ShortExpandStyleTab'] ='setl tabstop=2 shiftwidth=2 shiftwidth=2 softtabstop=2 noexpandtab'

command!
      \ -bar-nargs=1-complete=customlist,s:coding_style_complete
      \ CodingStyle
      \ execute get(s:coding_styles,<f-args>,'')function!s:coding_style_complete(...)"{{{return keys(s:coding_styles)endfunction"}}}

ExモードからCodingStyle Defaultみたいな形で呼び出してます。


Solarizedのカラーテーマとvim-powerlineのカラースキームを同時に変更する

$
0
0

自分はここ最近ずっと、SolarizedをVimのテーマに使ってます。ステータスラインはもうディスコンになってますが、vim-powerlineを使ってます。

このvim-powerlineですが、ちゃんとSolarized用のカラースキームが用意されてます。

Solarizedは:ToggleBGというコマンドが用意されており、このコマンドを呼び出すと lightdarkを切り替えることができます。

気分によってSolarizedの色合いを切り替えたいなーという時に:ToggleBG呼び出してもpowerlineのカラースキームは元のままということでかなり残念な感じになってしまいます。

mismatch

そこでこの2つを連動させるための関数作って.vimrcに書いて対応しました。

Vim Script
function! TogglePowerlineColorscheme()
  :ToggleBG
  if exists(':ToggleBG')&& exists(':PowerlineReloadColorscheme')letg:Powerline_colorscheme =&background=='light' ? 'solarized' : 'solarized256'
    PowerlineReloadColorscheme
  endifendfunctionnnoremap<F6> :call TogglePowerlineColorscheme()<CR>inoremap<F6> :call TogglePowerlineColorscheme()<CR>vnoremap<F6> :call TogglePowerlineColorscheme()<CR>

これで<F6>を押すと以下のように良い感じに切り替えができます。

Solarized light

light

Solarized dark

dark

他に何か良い方法あるのかな…。

Undoを管理する

$
0
0

本記事は Vim Advent Calendar 2012の169日目です。
168日目は@cohamaさんによる、tig なんて目じゃない! Git のログ系 Vim プラグイン gitv & gitv をGit 統合インターフェース化する最強の設定でした。

Vimにはundo(redo)機能があります。エディタとしては当たり前ですね。
回数は無制限です。ここまで聞くと高機能だと感じる方もいるかもしれません。
が、Vimは更にundo履歴をツリー状に管理することができます。標準で。
undo履歴のツリー管理機能を標準で持つエディタを他に聞いたことありませんし、
実際なかなか無いでしょう。

こうして標準搭載されていながらも、なぜかあまり噂を聞かない(私だけ?)この機能について
今回調べてみましたので、触れていこうかと思います。

undo-branches(undo-tree)

アンドゥツリーなどと言ったりするこの機能ですが、Vimではundo-branchesとも言うようです。
というより、調べて見た感じだと実装時はundo-branchesと呼ばれ、最近ではundo-treeとも呼ぶようになった印象を受けました。
:h undo-branches
:h undo-tree
:h usr_32

概要

よく使うであろうコマンドは以下です。

  • g- / g+

ツリーを利用したundo/redoを行います。但し、ツリーを利用した、と言っても
実際は時間にそって編集履歴をたどっていっているのみです。
以下のような編集履歴があったとします。

change 1 - change 2
         \ change 3 - change 4@

仮にすべて1分間隔で編集が行われていったとすると、以下のように時間が記録されます。

change 1 - change 2
(1 min.)   (2 min.)
         \ change 3 - change 4@
           (3 min.)   (4 min.)

これをg-を用いてchange 4から遡って行くと、
change4, 3, 2, 1となっていくわけです。

  • :undol[ist]

ツリーの葉に当たる部分をリスト表示します。
上記の例で行けばchange2, 4についてのリストが表示されます。
このリスト番号を用いて直接undoしたいときは、
:earlier {count} / :later {count}を用います。

活用法を考える

こんな便利にもかかわらず、どこかとっつきにくい印象を受けるのでどうしたら使いやすくなるか考えてみました。
まず、この機能をフル活用するという前提のもとに、以下の設定を行なっておきます。

Vim Script
" Undo履歴をファイルに保存するsetundodir=$HOME/.vim/undodirsetundofile

これでVimを終了してもファイルのundo履歴は残ります。
では具体的にどのように活用するか。例えばこのような方法があります。

プラグインを導入する

Gundo - Visualize your Vim Undo Tree
http://sjl.bitbucket.org/gundo.vim/

GundoはUndo-branchesを可視化し、利用しやすくすることができます。
プラグインの持つウインドウには可視化されたツリーと差分が表示されます。
GundoImg

表示されているツリーはカーソルを移動して<CR>することでその編集履歴まで戻ることができます。カーソルを動かしてbranchesをたどっている時も差分を見ることができるので、直感的なundoができます。

欠点を上げるならば、結構画面を食われてしまうことでしょうか。また、変更がリアルタイムにツリーに反映されないので、使用する際はマニュアルにあるように、起動コマンド:GundoToggle<CR>をmapして使うことになるでしょう。

mapする

思い切って普段のundo/redoコマンドにundo-branchesを利用するコマンドをマップしてしまいます。

Vim Script
nnoremapug-nnoremap<C-r>g+

枝がない箇所では通常通りundoとして機能するので、使い勝手もあまり変わりません。劇的な使い勝手の向上とはいかないですが、意識せず使えるのが良い点です。上書きするのが忍びない場合は覚えやすい他のマップでもいいでしょう。個人的にはよく連打でundoするので、U(行単位Undo)を上書きするのも有りだと思います。
普段使わないコマンドだとこんな簡単なものでも結構覚えてないことがあるので、いざ枝を辿ろうとした時にあたふたしなくていいのもいいかもしれません。

まとめ

色々と書いてみましたが、実際なぜあまり聞かないのかというと、

意外と使わない

ということではないかと思っています。
実際に、こうしてみてみると便利そうだけど、いざというときは存在を忘れてuを連打している私がいます。また常にツリー構造が見えているわけでもないので、分岐が把握しにくい、とっつきにくい、というところもあり、活用するためにはそういったところが課題として感じました。いつか取り組んでみたいです。

以上VAC 169日目の記事でした、次回のAdvent Calendar 170日目は@tyruさんです。

参考

http://kaworu.jpn.org/kaworu/2008-04-30-1.php
http://blog.bonar.jp/entry/20080613/1213312249
http://umezo.hatenablog.jp/entry/20090429/1240989787
http://vim-users.jp/2010/07/hack162/

Unite.vimで結果をソートする。(メモ)

$
0
0

Unite.vimの出力結果をソートする方法をしらなかったのでメモ。
:Unite directory_mruの結果をソートしたい場合、vimrcに以下のような感じで設定する。

Vim Script
call unite#custom_source('directory_mru','sorters','sorter_word')

'sorter_word'の部分には他に

  • sorter_default
  • sorter_nothing
  • sorter_word
  • sorter_length
  • sorter_rank
  • sorter_reverse

が設定できる。(:h unite-filter-sorter_defaultあたりを参照)

タグファイル(tags)を使ってみる

$
0
0

作成する

$ /usr/local/bin/ctags -f gems.tags --totals -R /Users/nakamatsu/.rvm/gems/ruby-1.9.3-p125
$ /usr/local/bin/ctags -f tags --totals -R .

vimで使う

キー説明
<C-]>カーソル位置の関数にジャンプ
<C-t>直前に戻る
g<C-]>複数候補から選択してジャンプ
<C-w}>カーソル位置の関数の定義をプレビュー

MacVim+clang-complete(tokoromさん版)の組み合わせでは.mファイルが開けない?

$
0
0

MacVim + clang-complete(tokoromさん版)でiOSアプリ開発目的でObjective-Cの自動補完を行おうとしたら、MacVimから.mファイルを開くと開けずに動作が止まってしまったのでメモ

開けなかった時の操作手順

  1. DockからMacVimを起動
  2. Unite fileから対象フォルダまで移動
  3. .mファイルを選択してReturnキーでファイルを開く

clang-completeを無効にしたら普通に開ける。なんで???

解決

一日以上悩んだ結果、条件が組み合わさる事で動かなかったと推測

  • clang-complete(tokoromさん版)はカレントディレクトリ以下のフォルダを自動的にインクルードの設定をしてくれる
  • MacVimはDockやLaunchPadから起動するとカレントディレクトリが/になる

つまり/ディレクトリ以下のすべてのディレクトリに対して設定しようとしていたわけか。そりゃあ動かないわけですね。

つまりカレントディレクトリを変えれば良い訳で、

  • Finderからダブルクリックでファイルを開く(Unite使いたいから自分はこれで運用)
  • プラグインを入れてカレントディレクトリを変更する(未検証)

他にもいくつか対応方法はあるりそうだけど、自分は取り合えず満足です。

以上、情けない結末でした。

クリップボードからVimへのコピー

$
0
0

ブラウザー、他のプログラムからクリップボード経由でコピーするとき、特殊なキー操作を行う。

クリップボードからコピー
"+gp
クリップボードへコピー
"+y

Gvimのショートカットキーをみて、気づく。
わからないで、苦労した。

tmux+Vimが不安定なら、いっそMacVimを使おう

$
0
0

最近tmux+VimをやめてMac版GVimであるMacVimを使うようになりました。

MacVimへ移行した理由

これまでMacVimを敬遠してきました。というのも

  • ターミナル上で動くのがVimのいいところだと思う
  • tmux上でVimとシェルを行き来するのに慣れてしまった(tmuxから出たくない)
  • 改めて設定するのが面倒くさかった

からなのですが、最近は

  • tmux上のVimの描画がおかしくなることが多い
    • いちいち:redraw!を実行するのがつらい(キーバインドを実行するのすら面倒)
  • tmux用のエスケープキーが惜しい

という感じであまり上手く行っていませんでした。そこで先日から重い腰を上げてMacVimを試しに使っています。で、その結果としては

  • 体感でターミナル上よりさくさく動く(tmuxのオーバーヘッドが無いから?)
  • tmuxのpane切り替えを、OS Xのアプリケーション切り替えに変えるだけ
  • tmuxのステータスラインが無くなった分、使える画面領域が若干増えた
  • 改めて設定することはほとんど無かった
  • tmux用のエスケープキーが開放された(私の場合はCtrl-J)
  • 色の細かい制御ができるようになった

のでこのままMacVimに移行しようと決心しました。MacVimいいよ

MacVimに行った設定

MacVimを使う上で行った設定は下記3つ

  1. ターミナルから新しいタブを開いてファイルを編集する
  2. 文字サイズを設定する
  3. 挿入モードを抜けるときに自動的に英数入力に切り換える

ターミナルから新しいタブを開いてファイルを編集する

基本的にファイルはVimから直接(unite.vimとか使って)開くけど、ターミナルからファイルを選択することもあります。
その場合、既にMacVimが立ち上がっているなら、新しいウィンドウを作るのではなく、既存のものに新しいタブを作って開いて欲しい、と思いました。
で探してみるとMacVimの [Preferences] -> [General] -> [Open files from applications][in the current window] -> [with a tab for each file]という設定があったのでそれを選択。
そして、ターミナルから開くために下記を.zshrcに追記しました。

.zshrc
case${OSTYPE} in
darwin*)# Mac OS Xfunction macvim (){if[ -d /Applications/MacVim.app ]then[ ! -f $1]&& touch $1
      open -a MacVim $1elsevim $1fi}alias vim='macvim'
  ;;
esac

これでzsh上で% vim path/to/fileとやればMacVim上の新しいタブでファイルを開くことができます。

ちなみにgvimコマンドだと上手くいきませんでした。

文字サイズを設定する

MacVimのデフォルトの文字サイズがやたらと小さいのでそれを指定します。フォントにはRictyを使うようにしました。
ホームディレクトリに.gvimrcファイルを置いとけばMacVimが勝手に読んでくれます。

~/.gvimrc
setguifont=Ricty:h16

h16というのが文字の大きさです。Google先生に聞いた限り、フォントを指定せずに大きさだけを変更することはできない気配がします。

挿入モードを抜けるときに自動的に英数入力に切り換える

挿入モードで日本語入力をしていて、ノーマルモードにCTRL-[などで抜けたときに、自動的に英数字入力に戻さないと死んでしまう病気にかかっているので、KeyRemap4MacBookに新しい設定を追加しました。

private.xml
<?xml version="1.0"?><root><appdef><appname>MACVIM</appname><equal>org.vim.MacVim</equal></appdef><list><item><name>Leave InsMode with EISUU(MacVim)</name><identifier>private.app_macvim_esc_with_eisuu</identifier><only>MACVIM</only><autogen>
        --KeyToKey--
        KeyCode::ESCAPE,
        KeyCode::ESCAPE, KeyCode::JIS_EISUU
      </autogen><autogen>
        --KeyToKey--
        KeyCode::C, VK_CONTROL,
        KeyCode::C, VK_CONTROL, KeyCode::JIS_EISUU
      </autogen><autogen>
        --KeyToKey--
        KeyCode::BRACKET_LEFT, VK_CONTROL,
        KeyCode::BRACKET_LEFT, VK_CONTROL, KeyCode::JIS_EISUU
      </autogen></item></list></root>

KeyRemap4MacBookの設定の仕方はこの記事参照

MacVimにしてよかったその他のこと

tmux用のエスケープキーバインドが開放された

最初にも書いたようにtmux用のエスケープキーに使っていたCTRL-Jが開放されました。
なので個人的に使用頻度の高いvim-easymotionに割り当てました。

.vimrc
NeoBundle 'Lokaltog/vim-easymotion'letg:EasyMotion_mapping_j ='<C-j>'letg:EasyMotion_mapping_k ='<C-k>'

これを設定してから、これまでほとんど使って来なかったi_CTRL-Oが神機能に昇格しました。

色の表現力が上がった

例えばvim-indent-guidesg:indent_guides_color_change_percentオプションなどはiTerm2上にいた頃は上手く機能させられていなかったのですが、MacVimに来たら何もしなくてもきちんと描画のされ方が区別されるようになりました。
やったー

まとめ

MacVim意外といいよ!


Ubuntu 13.04 での Vimコンパイル

$
0
0

時間があったのでコンパイルしました。Vim 7.3.967です。
ほとんど http://vim-jp.org/docs/build_linux.htmlの通りでよかったのですが、一点だけ。

よーしパパpython拡張つかっちゃうぞーって感じで、

Bash
./configure --with-features=huge --enable-pythoninterp --enable-fail-if-missing

とすると

Bash
checking Python version... 2.7
checking Python is 2.2 or better... yep
checking Python's install prefix... /usrchecking Python's execution prefix... /usr
checking Python's configuration directory... can't find it!
configure: error: could not configure python

となってしまいます。
たぶんubuntu側が設定変えたんですかね?

ubuntuのpython設定ディレクトリは、普通にaptで入れた場合/usr/lib/python2.7/config-i386-linux-gnuにあるようなので、

Bash
./configure --with-features=huge --enable-pythoninterp --with-python-config-dir=/usr/lib/python2.7/config-i386-linux-gnu --enable-fail-if-missing

でうまく通りました。

neocomplcache#smart_close_popup()とsmartinputの機能を両立させる

$
0
0

neocomplcacheの設定例にある…

Vim Script
" <C-h>, <BS>: close popup and delete backword char.inoremap<expr><C-h> neocomplcache#smart_close_popup()."\<C-h>"inoremap<expr><BS> neocomplcache#smart_close_popup()."\<C-h>"

これらのマッピングはなくてもneocomplcacheは動作しますが、補完候補のポップアップが出ているときに<BS><C-h>を押したときにポップアップを確実に消してくれるもので、候補の誤爆を防いだり、表示がスッキリしたりする効用があります。

ところが、この設定を使うと、smartinputの以下のような機能が使えなくなってしまいますorz

_ をカーソルと仮定して、<BS>を使う前と後

Before: hoge(_)    After: hoge_
Before: hoge()_    After: hoge_

括弧のペアを削除する機能です。まあ、ペアの括弧が入力されるだけでもかなり便利なんだけど、これはもったいない。

smartinputのローカルな関数を呼び出すために、スクリプト番号をどうやって取ろうとかなり悩んだのですが、ソースをよくよくみたらsmartinput#sid()という関数があるじゃん。一難去った。しかし、どうやっても、マッピングの内容がそのまま文字列として入力されるな… そして、helpを見てみると、関数eval()というのがある。これだ!eval()で囲ってみる。よし。できあがったものを.で結合して完成。

Vim Script
inoremap<expr><C-h>
      \ neocomplcache#smart_close_popup()
      \ . eval(smartinput#sid().'_trigger_or_fallback("\<BS>", "\<C-h>")')inoremap<expr><BS>
      \ neocomplcache#smart_close_popup()
      \ . eval(smartinput#sid().'_trigger_or_fallback("\<BS>", "\<BS>")')

2013-05-23 <CR>の分を追加しておきます。

Vim Script
inoremap<expr><CR>
      \ neocomplcache#smart_close_popup()
      \ . eval(smartinput#sid().'_trigger_or_fallback("\<Enter>", "\<Enter>")')

VimでJSON(jqとvim-json)

$
0
0

JSONを直接見るようなとき、いつもは単に目で追うだけだったり、あるいはブラウザの拡張機能とかで誤魔化していたのですが、最近はVimに貼り付けてから、整形・加工・検索しています。

pythonで整形する

こちらの記事が参考になります

自分がVimでJSONを整形したいと思ったのも、この投稿がきっかけです。

ただ、自分が普段開発している環境にはjqを入れてあるので、それを使うようにした方が何かと便利かなと思い、自分はjqを使うようにしています。

jqで整形する

jqという、コマンドラインで使えるJSONパーサーがあります。

Vimからjqを使うのに、次のようなコマンドをvimrcに定義しました。

Vim Script
command!-nargs=? Jq calls:Jq(<f-args>)function!s:Jq(...)if0==a:0letl:arg="."elseletl:arg=a:1endif
    execute "%! jq \"" . l:arg . "\""endfunction

バッファ内の文字列全体に対してjqを実行し、変換後の文字列で置き換えます。

例えば、次のようなJSONがあったとして、

{"obj":{"list":[1,1,2,3,5,8,13]},"jstr":"\u3053\u3093\u306B\u3061\u306F\u4E16\u754C","str":"helloworld","num":1}

「:Jq」と実行

{"num":1,"str":"helloworld","jstr":"こんにちは世界","obj":{"list":[1,1,2,3,5,8,13]}}

「:Jq .obj.list」と実行

[1,1,2,3,5,8,13]

なんて風になります。

ばっちりUnicodeエスケープシーケンスの変換が行われて日本語が表示されていますし、色々加工も出来ちゃいます。
欠点はもちろんjqに依存してしまうことですが、普段から良くJSONに触れている方ならjqは入れておいて損はないと思いますよ!

jqのフィルタ機能については、以下のブログがとても参考になります!

vim-jsonを入れる

JSONを表示するのに、filetypeをjavascriptにしてもいいのですが、どうせならJSON用のfiletypeプラグインを入れてしまうのをオススメします。

↑のgithubのページにスクリーンショットがありますが、filetypeをjavascriptにしたときよりも色分けされるようになりますし、文字列を囲う「"」も省略されて表示されるので、とても見易いです

vimでリモートのファイルを開く

$
0
0
vim scp://username@hoge.com//home/hoge/test.txt

サーバ上のファイルをダイレクトに編集したい時に便利。

vim高速移動

$
0
0

下を.vimrcに書くと、H, J, K, Lで高速移動できる。

.vimrc
noremap H bnoremap J }
noremap K {
noremap L w

Vim で行番号を表示する

$
0
0

.vimrcに下記を記述すると、起動時に自動的に行番号が表示されるようになります。

set number

GVim でスワップファイル、バックアップファイルが自動生成されないようにする

$
0
0

.vimrcに下記の設定を記述します。

"スワップファイルを生成しない
set noswapfile

"バックアップファイルを生成しない
set nobackup

.vimrc整理術

$
0
0

.vimrcが400行近くになり見づらくなってきたので見やすくしてみた。markerは使ってる人おおい感じがするけど、modelineと組み合わせたらかなり見やすくなったのでメモ。

1. 各種設定をmarkerで囲む

markerで囲まれた部分は折りたためるので見やすくなる。基本的な設定やマッピングの設定、プラグインを入れてる人はプラグインの設定、あとカラースキームの設定など、おおざっぱに設定をまとめてmarkerで囲む。

.vimrc
" 基本設定 {{{1setnocompatiblesetnumber" マッピング {{{1nnoremap H bnnoremap J }
nnoremap K {
nnoremap L w" カラースキーム {{{1syntaxoncolorscheme hybrid

" プラグイン {{{1" neobundle {{{2

...

" unite.vim {{{2

...

" neocomplcache {{{2

...

プラグインの設定のなかでプラグイン毎の設定もまとめたいので、折り畳みレベルを設定する。こうすると、折り畳みが入れ子になる。

2. modelineを有効にする

.vimrcのための設定を書きたいのでmodelineを有効にする。modelineの詳細は:h modelineを参照。

.vimrc
" モードラインを有効にするsetmodeline" 3行目までをモードラインとして検索するsetmodelines=3

3. modelineで.vimrc用の設定をする

ファイルの最後(最初でもいいけど)に以下を追加する。

.vimrc
" vim: foldmethod=marker" vim: foldcolumn=3" vim: foldlevel=0
  • markerで折りたたむようにする。
  • 行番号の左に折りたたまれてる箇所が表示されてわかりやすくなる。
  • デフォルトで折りたたんで表示する。(foldlevelよりfoldlevelstartの方が適切だと思ったけど、なんかうまくいかないのでとりあえずfoldlevelを使ってます)

スクリーンショット

以上の設定をすると、.vimrcはこんな感じで表示されるようになるはず。

fold.png


参考までに拙者の.vimrcのリンクも載せておく。

dotfiles/.vimrc at master · naoty/dotfiles · GitHub

これと同じことを.zshrcでもやってるので、.vimrcにかぎらず設定ファイル全般で使えるテクニックだと思う。

hjklマスターに薦める意外と便利な機能

$
0
0

本記事は Vim Advent Calendar 2012の177日目です。
176日目は@manga_osyoさんによる、lingr で動作する reading_vimrc-bot をつくったでした。

本記事は簡単なTips集のようなものです。hjklでの移動が難なく出来るようになった程度のVim練度の方を対象に、かつ意外と気づきにくい便利な機能をおすすめしていきます。

行選択する

キーバインド:V(Visual lineモード)

Windows系の操作だと基本はShiftを押しながらそのまま縦に選択していくしか行選択できないので、行選択という概念が頭になくなかなか気づきませんでした。それまでは普通にVisualモードで縦に選択していたのですが、行末の改行が選択できずもどかしい思いをしていました。
ちなみに矩形選択は<C-v>です。こっちは調べるとすぐ出るので知ってる方も多いかもしれません。

ちょっと簡単にヘルプを引く

例えば上記の矩形選択についてhelpを引くとしましょう。恐らくこうなるはずです。

:help ctrl-v

ちょっとめんどくさがればこんなかんじでしょうか。

:h ctrl-v

ですが、ctrl系のキーバインドに関するヘルプはhatを用いた、下記でも引くことができます。

:h ^v

恐らく文字コードの関係だと思いますが、詳細はわかりません。気になった方は調べてみてください。とにかくタイプ数が減るので楽ちんです。hat便利ですね。

ちょっと簡単にタブを開く

タブを開くコマンドは:tabnewですが、:tabeditでも開くことができます。:tabeditには省略形:tabeがあるので、若干ではありますが楽にタブを開くことができます。

副ファイルを開く

キーバインド:C-^

複数のファイルを開いた際に、直前のファイルを開くコマンドです。ファイルの切り替えがぱっとできるので、ファイルを交互に行き来するのに便利。hat便利ですね。連打すると2つのファイルを行き来しますが、countを与えることで更に前のファイルと切り替えることも可能です。

バッファを選択する際に、同時にリストを表示する

副ファイルとしてバッファを開けない場合は:b[uffer]でバッファを選択するかと思います。素のままでも最短で:b4などして切り替えることができるのでわざわざmapする必要もないように感じますが、もしmapするのであれば一工夫してmapしてみるのも良いでしょう。

.vimrc
nnoremap B :ls<CR>:b

これでバッファを選択する際に同時にバッファリストも表示させることができます。初めて見たときとても感動しました。

カーソル位置をジャンプする

キーバインド:<C-o>

例えば検索したあと元の位置に戻りたい、例えば間違ってgg/Gしてしまった、そんな時があると思います。そんな時に役に立つのがこの機能です。前回のカーソル位置にジャンプします。行き過ぎた際はお隣のキーC-i(もしくは<TAB>)で戻ることができます。タグジャンプした際は本来は<C-t>でタグスタックを使って戻るのですが、一応この<C-o>も使えます。覚えておくと便利。

…とこれだけでも素敵なのですが、ちょっとした裏技があります。このジャンプリスト、ファイルに記録されるのでVimを閉じたあとでも履歴が残ります。そしてたいていのファイルで何らかのジャンプをしていることが多いので、<C-o>を連打すると最近編集したファイルが開けることがあるのです。使いどころは多くないですが、閉じたあとに編集漏れを思い出した際など、適当に連打すると開くことがあって便利だったりします。
ちなみにこれを知ったのは、どなたかVimmerの方がファイルをどこに保存したかわからないと言っていた際に、<C-o>で開かないかなーと言われていたのを見たためだったと思うのですが…どこで見たか忘れました。

最後に

機能やmapの単発モノをちょっとまとめて記事にしてみました。ご覧になられている方でこんなものもあるよ!という方がいらっしゃったらコメントで教えていただいたりしたいのですが、もっといい方法があります。それは、Vim Advent Calendar 2012として記事を書くことです。

Vim Advent Calendar 2012では、まだまだ執筆者を募集しています。こんな雑多な記事でも大丈夫ですし、最近の流行りはgifアニメやyoutubeのようです。twitterでも大丈夫だと聞いたこともあります(要出典)。なんとEmacsの記事まであります。1つのキーや機能、mapについてでも構いません。是非この機会に執筆してみてはいかがでしょうか。

以上VAC 177日目の記事でした、次回のAdvent Calendar 178日目は前回に引き続き?@manga_osyoさんです。

参考

vimのバッファ操作
http://kaworu.jpn.org/kaworu/2007-07-26-1.php

hjklマスターとは


CentOS 6.3にVim 7.3をインストールする

$
0
0

CentOS 6.3のyumでインストールできるVimが7.2系なので最新版の7.3系をソースからインストールします。

方針

以下の方針でインストールします。

  • /usr/local/bin/vim にインストールする(--prefixオプション)
  • 日本語(マルチバイト)に対応する(--enable-multibyteオプション)
  • 256色に対応する(--enable-color256オプション)
  • ほとんどの機能を有効にしてコンパイルする(--with-featuresオプション)
  • スクリプト言語インターフェースは利用しない(--enable-xxxxinterpオプション)

ソースコードをダウンロード & 展開

本体は7.3を、拡張パックと言語パックは7.2を利用します。
拡張パックと言語パックは任意で利用してください。

本体とそれ以外で圧縮方法が異なるので展開のオプションが少し変わります。

Bash
$ cd /usr/local/src
$ wget ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
$ wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-extra.tar.gz
$ wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-lang.tar.gz

$ tar jxvf vim-7.3.tar.bz2
$ tar zxvf vim-7.2-extra.tar.gz
$ tar zxvf vim-7.2-lang.tar.gz

$ mv vim72 vim73/

パッチを適用

最新の状態にするため、パッチファイルを当てます。

Bash
$ mkdir vim73/patches
$ curl -O "ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.[001-798]$ cat patches/7.3.* | patch -p0

依存パッケージをインストール

コンパイルに必要なパッケージをインストールします。

Bash
$ sudo yum install ncurses-devel -y

コンパイル & インストール

準備が整ったので、必要なオプションを付けてコンパイルし、インストールします。

$ ./configure --enable-multibyte --with-features=huge --disable-selinux --prefix=/usr/local --enable-colors256
$ sudo make
$ sudo make instlall

参考

vimで検索条件に一致する行を加工する方法

$
0
0

ログファイルなど大量のテキストを加工する場合に置換だけでは不十分なケースがたまにありますが
加工したい行を検索条件で指定できる場合 global コマンドが役に立ちます。

例えばこんなログ.log
May 20 00:00:00 test-main kernel: (guest)aaaaa
May 20 00:00:00 test-main kernel: (guest)bbbbb
May 20 00:00:00 test-main kernel: (root)aaaaa
May 20 00:00:00 test-main kernel: (guest)ccccc
May 20 00:00:00 test-main kernel: (root)bbbbb
May 20 00:00:00 test-main kernel: (guest)ddddd
May 20 00:00:00 test-main kernel: (root)ccccc
May 20 00:00:00 test-main kernel: (guest)eeeee

このログに対してrootに関する行だけ取り除きたい、といった場合、

vimのコマンドモードでこんな風に入力する.txt
:[範囲]global/検索条件/Exコマンド
といったglobalコマンドを実行。
今回は範囲を「%(ファイル全体)」検索条件を「root」やりたい処理を「d(削除)」
globalは省略でgだけに出来るので(ヘルプ :h :global 参照)、それらを踏まえて
:%g/root/d

とやるとrootの行だけ削除されます。
逆に条件に一致しないというのがやりたければ

条件を反転して実行する.txt
「!」をつけることで反転。rootを含まない行だけ削除したい、といった場合は
:%g!/root/d

のようにします。

vimのブロック選択とインデントを使ってコメントを整形する。

$
0
0

例えば各行に書いてあるコメントのインデント位置を調整したい場合

適当なコメント.cpp
std::cout<<"◆お菓子"<<std::endl;// 適当なコメントSingleton*obj=Singleton::getInstance();// 適当なコメントobj->Introduce();obj->setName("妖精さん");// 適当なコメントobj->Introduce();

まずは調整したい行をVなどで範囲選択して置換。

何の変哲もない置換.txt
今回はコメントの「//」を目印に置換。置き換える先はタブ文字なり、半角スペースなり任意で。
ただし、一番長い行よりもコメントが後ろに来る位十分に割り当てます。
:'<,'>s/\/\//                      \/\//

これを実行すると

置換後のテキストはこうなる.cpp
std::cout<<"◆お菓子"<<std::endl;// 適当なコメントsingleton*obj=singleton::getinstance();// 適当なコメントobj->introduce();obj->setname("妖精さん");// 適当なコメントobj->introduce();

その後、インデントを揃えたい位置にカーソルを持って行き<C-v>で縦にブロック選択します。
今回は分かりやすいように#をブロック範囲の反転表示と見立てています。
(ブラウザのフォント等によって#の位置がズレて表示されますが縦一直線と思ってください。)

こんな感じの範囲にする.cpp
std::cout<<"◆お菓子"<<std::endl;#// 適当なコメントSingleton*obj=Singleton::getInstance();#// 適当なコメントobj->Introduce();obj->setName("妖精さん");#// 適当なコメントobj->Introduce();

ここでブロック選択の範囲がインデントを揃えたい行だけに表示されていることが重要です。
コードの部分を選択範囲に含めてしまうと、この後のインデント操作が間違って適用されるので注意。

選択範囲が決まったらブロックで表示が反転している状態で<コマンドでインデントを行います。
適用する際は十分に大きいインデント量100<などを適用してください。
(ブラウザのフォントによっては//の位置がズレて表示されますが揃ってるものとしておいてくださいorz)

調整用のインデント適用後.cpp
std::cout<<"◆お菓子"<<std::endl;// 適当なコメントSingleton*obj=Singleton::getInstance();// 適当なコメントobj->Introduce();obj->setName("妖精さん");// 適当なコメントobj->Introduce();

するとブロック範囲よりも左側にはインデントが適用されませんので選択した位置でコメントが揃います。

Viewing all 5765 articles
Browse latest View live


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