ホーム > タグ > Vim Hacks

Vim Hacks

Hack #222: カーソル位置を目立たせる

あるファイルを編集中に全く関係のない別の作業をすると、カーソルの位置を見失ってしまうことが多々あります。
そんな場合に少しでも見失い難くするために、カーソル位置を目立たせることが有用です。

‘cursorline’ と ‘cursorcolumn’ を設定することで、現在のカーソル位置をハイライトすることが出来ます。

:set cursorline
:set cursorcolumn

それぞれ、以下の様にすることで、highlight の指定が行なえます。

:highlight CursorLine     xxx term=underline cterm=underline guibg=Grey90
:highlight CursorColumn   xxx term=reverse ctermbg=7 guibg=Grey90

参照資料

Sixeight

Hack #205: 複数行をコメントアウトする

問題

普段のコーディングにおいて、ある程度のコードの塊をまとめてコメントアウトしたくなることがありせんか。 コメントアウトしたコードは大抵不要となり捨てることになるのですが、一時的にリファクタリング前のコードを残したり、デバッグなどの際に止めを得ずコメントの付け外しを行うことがあるかと思います。

コードのコメントアウトと聞いてすぐに思い浮ぶのは, Hack #12: 条件にマッチする行を削除する にあるような I# <Esc> とする方法です。 しかしながら、この方法では複数行をコメントアウトするのに時間がかかり、気がつけば Fibonacci 数列を求めるコードを 3 パターンほど記述出来る程度の時間を浪費していることもあります。

別解として ^<C-v>jjjI# <Esc> などとして、コメントアウトする方法もありますが、行頭がずれていたりすると大変面倒です。

解決方法

もっとも手頃な方法として commentout.vim を使用する方法が挙げられます。 これは vim online Tip #271: easy (un)commenting out of source code として掲載されていたもので 参照資料1 に詳しい解説があります。

また Tip 1570 Commenting with opfunc で紹介されているスクリプトを利用する方法もあります。 オリジナルは Ruby に対応していなかったため、一部修正を加えています。

" Comment or uncomment lines from mark a to mark b.
function! CommentMark(docomment, a, b)
  if !exists('b:comment')
    let b:comment = CommentStr() . ' '
  endif
  if a:docomment
    exe "normal! '" . a:a . "_\<C-V>'" . a:b . 'I' . b:comment
  else
    exe "'".a:a.",'".a:b . 's/^\(\s*\)' . escape(b:comment,'/') . '/\1/e'
  endif
endfunction

" Comment lines in marks set by g@ operator.
function! DoCommentOp(type)
  call CommentMark(1, '[', ']')
endfunction

" Uncomment lines in marks set by g@ operator.
function! UnCommentOp(type)
  call CommentMark(0, '[', ']')
endfunction

" Return string used to comment line for current filetype.
function! CommentStr()
  if &ft == 'cpp' || &ft == 'java' || &ft == 'javascript'
    return '//'
  elseif &ft == 'vim'
    return '"'
  elseif &ft == 'python' || &ft == 'perl' || &ft == 'sh' || &ft == 'R' || &ft == 'ruby'
    return '#'
  elseif &ft == 'lisp'
    return ';'
  endif
  return ''
endfunction

nnoremap <Leader>c <Esc>:set opfunc=DoCommentOp<CR>g@
nnoremap <Leader>C <Esc>:set opfunc=UnCommentOp<CR>g@
vnoremap <Leader>c <Esc>:call CommentMark(1,'<','>')<CR>
vnoremap <Leader>C <Esc>:call CommentMark(0,'<','>')<CR>

コメントアウトしたい箇所を Visual mode で選択し、<leader>c を打鍵することで Filetype に沿ってコメントアウトされます。 逆に、コメントアウトされた箇所を Visual mode で選択し <leader>C を打鍵することでコメントを外すことも出来ます。

また、<leader>cip などと打鍵することで、text-objects の単位でのコメントアウトも可能です。コメントを外す際は <leader>Cip と打鍵します。

参照資料

Sixeight

Hack #134: Vimをデフォルトの状態で起動する

問題

例えば何らかのプラグインが原因でVimの動作が怪しいといった状況になったときなど、 Vimをデフォルトの状態で起動したいことがあります。 vimrcや各種プラグインを一旦削除してから起動すれば可能ですが、 さすがにそれは面倒です。簡単に行う方法はないでしょうか。

解決方法

以下のオプションを指定してVimを起動します:

vim -u NONE

デフォルトの状態では'compatible'がオン (=可能な限りvi互換な挙動となる)のですが、 場合によっては'compatible'がオフの方が良い場合もあります。 その場合は以下のオプションを指定してVimを起動します:

vim -u NONE -N

解説

Vimには様々な起動オプションがあり、そのひとつとして vimrcのパスを指定する-u {vimrc}オプションがあります。 通常は~/.vimrcなどのファイルがロードされますが、 -uを指定することで別のファイルをロードさせることができます。 さらに-uには特殊な値としてNONEを指定でき、 これは「vimrcのロードは行なわず、プラグインのロードも行なわない」 という意味になります。つまりVimがデフォルトの状態で起動することになります。

-N'compatible'がオフの状態で起動するよう 指定するオプションです。 なお、-cで任意のコマンドを起動時に実行できるため、 -c "set nocompatible"としても同じことができますが、 -Nの方が簡潔です。

参考資料

kana

Hack #76: Insert mode中で単語単位/行単位の削除を行なう

問題

テキスト入力中に誤入力をしてしまうことはしばしばあります。 例えば

if (foo == bar|

とまで入力したところでbarはloungeの間違いだったことに気付いたとしましょう (「|」はカーソル位置です)。 これには

<Esc> b ciw lounge

のようにカーソル位置を調整して該当単語を修正することができます (読み易さのためにスペースを入れていますが実際にスペースは入力しません)。

しかしこの手順は面倒です。Insert mode中のまま簡単に削除を行なうことは できないでしょうか。

解決方法

これにはInsert mode中で<C-w>を入力します。 例えば最初に例示した状態で

if (foo == bar|

<C-w>を入力すると以下の状態になります。

if (foo == |

Insert mode中での<C-w>は カーソル位置より前にある単語を削除することができます。

関連項目

<C-u>というコマンドもあります。 これはカーソル行で入力された文字を全て削除します。 例えば以下のようにテキスト入力を行なったとしましょう (「^」はInsert modeの開始位置です)。

if (foo == lounge) retrun a|
                   ^

ここで<C-u>を入力すると以下の状態になります。

if (foo == lounge) |
                   ^

また、<C-w><C-u>を使う場合は ‘backspace’の値を以下のように調整しておくと より便利に使うことができるでしょう。

set backspace=indent,eol,start

参考資料

kana

Hack #61: カーソル下のファイル名に対応するファイルを開く

問題

ファイルの内容に他のファイル名が記述されていることは少なくありません。 例えばMakefileなら関連ファイルの名前が直接記述されます。 このようなファイルを閲覧しているとき、 バッファ中のファイル名に対応するファイルを開きたいことがしばしばあります。

もちろん、そのファイル名を直接手入力すれば開けますが、それは面倒です。 バッファ中のファイル名をコピー・ペーストすれば少しは手間が軽減されますが、 やはり面倒です。 簡単に行なう方法はないでしょうか。

解決方法

Normal modeでgfをタイプします。 gfはGo to Fileの略です。 これはカーソル下(あるいはカーソル近傍)のファイル名に対応するファイルを開きます。

また<C-w>fというコマンドもあります。 これはgfと同様ですが、 新しいウィンドウを開き、そこで該当ファイルを開きます。

これらのコマンドを使うことでより効率的に作業を行なうことができます。

応用例

gfは単純にカーソル下のファイル名に対応するファイルだけを 調べるだけではありません。

  • 該当ファイルが特定のディレクトリ下に存在するかどうかも調べます ('path')。 例えばCのソースコードには通常#include <stdio.h>の ような形でヘッダファイルの参照が記述されますが、 'path'を正しく設定すれば このような場合でもgfで開くことができます。
  • 該当ファイル名に特定の拡張子を付加したものが存在するかどうかも調べます ('suffixesadd')。 例えばPythonのモジュールspamに 対応するファイルは(大抵は)spam.pyですが、 'suffixesadd'を正しく設定すれば そのようなモジュール名に対応するファイルを gfで開くことができます。

他にもgfに関連するオプションがありますが、詳細は省略します。

参考資料

kana

Home > Tags > Vim Hacks

Search
Feeds
Links
  • 公式
  • 勉強会
  • 情報
  • コミュニティ
  • Meta
    Etc
    Creative Commons License
    This blog is licensed under a Creative Commons License.

    Return to page top