2012/10/28

Vimでカーソル位置などの設定保存 と .vimrc

vimrcを見なおしたら結構おかしいとこがありました…

あと、Vimを開いたり閉じたりしまくりますが
そのために毎回移動しなおしたり折りたたみを開いたり閉じたりは面倒です
そこで以下のように設定しました。


" 設定の保存と復元
autocmd BufWinLeave * silent mkview
autocmd BufWinEnter * silent loadview

" 2012/10/30 修正
autocmd BufWinLeave ?* silent mkview
autocmd BufWinEnter ?* silent loadview


2012/10/30追記
パターンマッチが修正前だと:helpなどにも反応してしまうので修正

Vimにはセッションビューというものがあります。
セッションが全ウィンドウとグローバル設定などで、ビューがウィンドウ毎のローカル設定らしいです。
簡単に言うとビュー∈セッションだろうか?

上記設定では、バッファがウィンドウから非表示になる時に発生するBufWinLeaveイベントでmkviewを使いビューを保存します。
同様に、バッファがウィンドウに表示される時に発生するBufWinEnterイベントでloadviewを使いビューを復元します。

viewはファイルごとに作成、保存され標準だと~/.vim/viewに書きだされます。
viewoptiosを設定することで保存と復元をする設定を選べます。

以下、.vimrc
いろんなとこを参考にしました。


"-------------------------------------------------------------------------------"
" Vim Option By mopp
"-------------------------------------------------------------------------------"

" viとの互換をオフ
set nocompatible

" バックアップ作成
set backup
set backupdir=$HOME/\.vim_backup
set writebackup  " 上書き前にバックアップ作成

" スワップファイルを作成する
set swapfile
set directory=$HOME/\.vim_backup

" インデント設定
set cindent
set shiftwidth=4 " 自動インデントの空白の数
set noexpandtab  " Tabをスペースにしない
set smarttab  " 行頭にTabでshiftwidth分インデントする
set tabstop=4  " 画面上のTab幅

" エンコーディング関連
set encoding=utf-8     " vim内部で通常使用する文字エンコーディングを設定
set charconvert=utf-8    " 文字エンコーディングに使われるexpressionを定める
set fileencoding=utf-8    " バッファのファイルエンコーディングを指定
set fileencodings=utf-8,euc-jp,sjis " 既存ファイルを開く際の文字コード自動判別

" 検索設定
set hlsearch " 検索結果強調-:nohで解除
set incsearch " インクリメンタルサーチを有効

" 特殊文字表示設定
set list
set listchars=eol:$,tab:>\ ,trail:\|,extends:<,precedes:<

set backspace=2     " Backspaceの動作
set whichwrap=b,s,h,l,<,>,[,] " カーソルを行頭、行末で止まらないようにする
set wildmenu      " コマンドの補完候補を表示
set helplang=ja,en    " ヘルプ検索で日本語を優先
set viewoptions=cursor,folds  " :mkviewで保存する設定

" 折りたたみ関連
set foldenable
set foldmethod=indent
set foldopen=all  " fold内に移動すれば自動で開く
" set foldclose=all  " fold外に移動しfoldlevelより深ければ閉じる
set foldlevel=0   " 折りたたみの具合
set foldnestmax=2  " 最大折りたたみ深度$
set foldcolumn=2  " 左側に折りたたみガイド表示$

" 見た目関連の設定
set ambiwidth=double " マルチバイト文字や記号でずれないようにする
set cmdheight=2   " コマンドラインの行数
set laststatus=2  " ステータスラインを表示する時
set cursorline   " 現在行に下線を引く
set number    " 行番号表示
set showtabline=2  " タブバーを常に表示
set ruler    " カーソルの現在地表示
set showmatch   " 括弧強調
set nowrap    " はみ出しの折り返し設定
syntax on   " 強調表示有効
colorscheme desert
highlight Folded cterm=bold,underline ctermfg=4
" ステータス行の表示内容を設定 PowerLineで置き換え
" set statusline=%<%F\ %m%r%h%w%y%{'['.(&fenc!=''?&fenc:&enc).']['.&fileformat.']'}%=%l/%L,%c%V%8P

"-------------------------------------------------------------------------------"
" Mapping
"-------------------------------------------------------------------------------"
" コマンド       ノーマルモード 挿入モード コマンドラインモード ビジュアルモード
" map /noremap           @            -              -                  @
" nmap / nnoremap        @            -              -                  -
" imap / inoremap        -            @              -                  -
" cmap / cnoremap        -            -              @                  -
" vmap / vnoremap        -            -              -                  @
" map! / noremap!        -            @              @                  -
"-------------------------------------------------------------------------------"
" 自動で括弧内に移動
inoremap {} {}
inoremap [] []
inoremap () ()
inoremap “” “”
inoremap ” ”
inoremap <> <>
inoremap “ “

" tab
nnoremap to :tabnew
nnoremap  tn :tabnext
nnoremap  tp :tabprevious

" 画面分割
noremap   :split
noremap   :vsplit

" 短縮形の設定 マップを展開しない
noreabbrev #b /****************************************
noreabbrev #e ****************************************/

" コマンドラインコマンド設定
command Vimrc :tabnew ~/.vimrc

"-------------------------------------------------------------------------------"
" autocmd
"-------------------------------------------------------------------------------"
" ファイル全般に設定
augroup General
 autocmd!
 " 設定の保存と復元
 autocmd BufWinLeave * silent mkview
 autocmd BufWinEnter * silent loadview
augroup END

" Lisp設定
augroup Lisp
 autocmd!
 function! s:setLispConfig()
  noremap  .li :!sbcl --script %
  iunmap ()
  inoremap  ( ()
  set nocindent
  set nosmartindent
  let lisp_rainbow = 1
  let lisp_instring = 1
  set lispwords=define
 endfunction
 autocmd BufRead *.lisp call s:setLispConfig()
augroup END

" C/C++設定
augroup C_Cpp
 function! s:setC_Cpp()
  nnoremap  .gcc :!gcc %
  set cindent
 endfunction
 autocmd BufRead *.c,*.cpp call s:setC_Cpp()
augroup END

"-------------------------------------------------------------------------------"
" Plugin
"-------------------------------------------------------------------------------"
filetype off
filetype plugin indent off

if has('vim_starting')
 set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

call neobundle#rc(expand('~/.vim/bundle/'))

NeoBundle 'QuickBuf'
NeoBundle 'git://github.com/Shougo/neobundle.vim.git'
NeoBundle 'git://github.com/Shougo/neocomplcache.git'
NeoBundle 'git://github.com/Shougo/vimfiler.git'
NeoBundle 'git://github.com/Shougo/unite.vim.git'
NeoBundle 'git://github.com/vim-jp/vimdoc-ja.git'
NeoBundle 'git://github.com/h1mesuke/vim-alignta.git'
NeoBundle 'git://github.com/t9md/vim-textmanip.git'
NeoBundle 'git://github.com/scrooloose/nerdcommenter.git'
NeoBundle 'git://github.com/Lokaltog/vim-powerline.git'
NeoBundle 'git://github.com/tpope/vim-surround.git'

filetype plugin indent on

" Neocomplcache
" 起動時に有効化
let g:neocomplcache_enable_at_startup = 1

" textmanip
" 選択したテキストの移動
xmap  (textmanip-move-down)
xmap  (textmanip-move-up)
xmap  (textmanip-move-left)
xmap  (textmanip-move-right)
" 行の複製
xmap d (textmanip-duplicate-down)
xmap D (textmanip-duplicate-up)

" vim-powerline
let g:Powerline_symbols = 'unicode'
let g:Powerline_stl_path_style = 'short'

" nerdcommenter
let NERDSpaceDelims = 1
nmap ,, NERDCommenterToggle
vmap ,, NERDCommenterToggle

Mac OS X で ターミナルから関連付けアプリを開く

OS X 固有のコマンドらしいです
存外に便利なのでメモ

# 関連付けられたエディタで開く
open hoge.txt

# TextEditで開く
open -e hoge.txt

# アプリケーションを指定して開く
open -a /Applications/Huga.app ./hoge.txt

# Finderでディレクトリを開く (カレントディレクトリにフォーカスされる)
open .

# Finderでhoge.txtがあるディレクトリを開く (hoge.txtにフォーカスされる)
open -R ./hoge.txt

# 標準入力を標準エディタに新規ファイルとして出力して開く
open -f

# プログラム実行結果を標準エディタに出力
./a.out | open -f

これ以外にもオプションが幾つか用意されてるようです

それにしてもFinderは使いづらい…

2012/10/19

Mac の iTerm2 と Vim の 全角記号の問題について

たまに気になっていた事をふとググってみたら解決したのでメモメモ

普段はMacのiTerm2でVimをいじっているのですが
全角記号が 以下のようになってしまいます。
どう見ても変






Vimのオプションで
>set ambiwidth=double
とすると直るらしい

ですが、iTermではそれだけだと不十分なので
Preferences…>Profile>Text>Double-Width Charactersの
Treat ambiguous-width characters as double width.
にチェック


そうするとちゃんと表示され、移動もできます。

あまり、そういう記号は使う機会はないですが
気になるところではありました。

2012/10/13

reallocで動的メモリ確保

書いたのでメモ書き


#include
#include
#include

int main(void){
 char *str, *strDummy, **data, **dataDummy;
 int i, j, sCnt = 0, lCnt = 0;

 // メモリ確保
 str = (char *)malloc(sizeof(char));
 if(str == NULL){
  fprintf(stderr, "allocation is Faild\n");
  return -1;
 }

 // メモリ確保
 data = (char **)malloc(sizeof(char*));
 if(data == NULL){
  fprintf(stderr, "allocation is Faild\n");
  return -1;
 }

 printf("EOFで入力終了\n");

 while((*(str + sCnt)=getchar()) != EOF){
  // 改行コードが来たら行の終了
  if('\n' == *(str + sCnt)){
   // 改行文字を終端子へ書き換え
   *(str + sCnt) = '\0';

   // メモリを再確保
   dataDummy = (char **)realloc(data, sizeof(char *)*(lCnt+1));
   if(dataDummy == NULL){
    fprintf(stderr, "allocation is Faild\n");
    return -1;
   }else{
    data = dataDummy;
   }

   // メモリを確保
   *(data + lCnt) = (char *)malloc(sizeof(char*)*(sCnt+1));
   if(*(data + lCnt) == NULL){
    fprintf(stderr, "allocation is Faild\n");
    return -1;
   }

   // 文字列格納
   memcpy(*(data + lCnt), str, sCnt+1);

   // 行数を増やす
   ++lCnt;

   // 初期化
   sCnt = 0;
   free(str);
   str = (char *)malloc(sizeof(char));
  }else{
   // メモリを最確保
   strDummy = (char *)realloc(str, sizeof(char *)*(sCnt+1));
   if(strDummy == NULL){
    fprintf(stderr, "allocation is Faild\n");
    return -1;
   }else{
    str = strDummy;
   }

   // 文字数加算
   ++sCnt;
  }
 }

 printf("\nLine Num is %d\n",lCnt);
 for(i=0;i");
  for(j=0;*(*(data + i) + j)!='\0';++j){
   printf("%c", *(*(data + i) + j));
  }
  // それぞれメモリ解放
  free(*(data + i));
  printf("\n");
 }

 // メモリ解放
 free(str);
 free(data);

 return 0;
}


エラー処理が甘い( ゚д゚)!