Vimscript for bash

bashで変数を${}で囲うのが面倒になってきたので、愛用しているVimのscriptを書いてみた。 NeoBundleで入れられます。

$hogeでいいのか、${hoge}なのか、"$hoge"にしないといけないのか、を考えるよりも、統一して"${hoge}“にしておけば良いのだけど、入力するのが面倒だっただけに、たまにトラブルを招く結果になっていたがこれで安心。ただ、scriptの内容があまりきれいではない。もう少しすっきり書ける気はする。

Vimscript 簡易メモ

  • 関数はfunctionで定義する。同名の関数があっても打ち消したい場合はfunction!で定義する。仮引数にはa:を付けてアクセスする。
  • getline(‘.’)はカーソル行の文字列を取得する。col(‘.’)でカーソル列の列数を取得できるので、getline(‘.’)[col(‘.’)-1]でカーソル位置の文字を取得できる。
  • normalでノーマルモードでのコマンドを実行する。normal!とすると、そのコマンドが別のコマンドにマップされていてもそれを展開しないので、デフォルトのコマンドを確実に実行できる。
  • exe(execute)でevalっぽく文字列をコマンドとして実行できる。文字列を.で結合してexeに渡せば、所望のコマンドを構築して実行できる。
  • call cursor(row,col)でカーソル位置を移動する。

Vim command

  • 日常的に使う重要なコマンド類について
  • マクロ : qa ... q...を記憶し、@qで実行。10@qで10回実行。
  • 数字増減 : C-aでインクリメント、C-xでデクリメント。
  • 置換 : :%s/aaa/bbb/gでファイル内の全置換。vで範囲選択して:'<,'>s/aaa/bbb/gで、選択範囲のみ置換。
  • カラム単位の編集 : C-vで範囲選択してShift-iでカラム(縦)の同時編集による追記。xによる同時削除も可。
  • やり直し(redo/unredo) : uでやり直し、C-rでやり直しのやり直し。
  • 対応する括弧へジャンプ : %
  • 行結合 : Shift-Jでスペースを一つ挟んで次行を現行の末尾に結合。
  • 画面分割 : :new:vnewで新規画面、:sp:vspで画面複製(vは縦)。C-w+[hjkl]で画面移動。C-w+10[+>]でその画面を10[行列]広げる(>は縦時)。
  • 行番号表示 : .vimrcでset number。あるいは:set nu:set numは不可)。行番号非表示は:set nonu
  • ファイルオープン : :e.でカレントディレクトリのファイルを列挙し、sでtimeとsizeでのソートが可能。なお、:lcd %:hでそのウィンドウにおけるカレントディレクトリをそのファイルの位置に変更。
  • 複数ファイルオープン : -pオプションをつけて複数ファイルを指定してvimを実行。g[tT]で前後のタブに移動。
  • クリップボードのペースト : 各行がインデントされ続けてしまうため、:set pasteを実行してからペースト。
  • クリップボードへコピー : vで選択して"*y
  • 行末への追加 : A

.vimrc

  • 自分用.vimrc(一部省略)。mapを作っても使わないと忘れてしまうので、相当回数繰り返したものはmapに登録する。
" For multibyte characters
scriptencoding utf-8

" NetBundle
set runtimepath+=~/.vim/bundle/neobundle.vim/
call neobundle#begin(expand('~/.vim/bundle/'))

NeoBundleFetch 'Shougo/neobundle.vim'
 
NeoBundle 'nanotech/jellybeans.vim'
NeoBundle 'scrooloose/syntastic'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/vimproc'
NeoBundle 'cocopon/iceberg.vim'

call neobundle#end()
filetype plugin indent on
NeoBundleCheck
     
set number
syntax enable
set hlsearch
"colorscheme jellybeans
colorscheme iceberg
set background=dark
 
set tabstop=4
set cindent
set smartindent
set autoindent
set shiftwidth=4
set cinoptions=1s

nmap <CR> :noh<CR>
imap <C-H> <ESC>
noremap 9 $ 

" Paste to clipboard
let mapleader = "\<Space>"
vmap <Leader>y "+y

" Simpler
" set clipboard+=unnamed

nnoremap <Leader>cc :lcd %:h<CR>

set cursorline 
hi CursorLine cterm=NONE ctermfg=NONE ctermbg=0
set cursorcolumn
hi CursorColumn cterm=NONE ctermfg=NONE ctermbg=0
 
set scrolloff=2
autocmd BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal g`\"" | endif
set display=lastline
 
" ctags
nnoremap <C-]> g<C-]>

" ag : faster grep
" brew install the_silver_searcher
" apt-get install silversearcher-ag
nnoremap <silent> <Leader>ag :<C-u>Unite grep:. -buffer-name=search-buffer<CR><C-R><C-W>
 
noremap <expr> <C-f> max([winheight(0) - 2, 1]) . "\<C-d>" . (line('.') > line('$') - winheight(0) ? 'L' : 'H')
noremap <expr> <C-b> max([winheight(0) - 2, 1]) . "\<C-u>" . (line('.') < 1 + winheight(0) ? 'H' : 'L')
 
autocmd BufWritePost .vimrc source %

" yank also copy to clipboard
set clipboard+=unnamed