2012/12/22

またVimのビルドした

先日、技術書の添付ディスクないのファイルを開く際、そのファイルがsjisでして、しかもオレオレビルドVimのiconvが無効になっており、という…_:(´ཀ`」 ∠):_

加えて、どうもMac標準のgccとMacPortsとかで入れたgccだと違いがあるようだったので
改めてまとめ直すことにしました。

基本的にはMac環境ですが多分Unix系ならほとんど同じはず…

ソースとパッチをダウンロードして、パッチを当ててからmakeします
ソースはhttp://www.vim.org/sources.php
パッチはftp://ftp.vim.org/pub/vim/patches/7.3/
からダウンロードします

今回はpluginで必要だったのでPythonも有効にします
Pythonは全くわからないで、ただMacPortsから突っ込んだだけです

さて、通常のMac環境ならパッチを当ててmakeするだけでいいのですが
MacPortsでインストールしたgcc48を使ってみようと思います
正直、使ってみたかっただけなのに少し面倒だった…

環境変数はこんな感じに設定してます。
PATHの設定はむずかしい
# MacPorts
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export MANPATH=/opt/local/man:$MANPATH

# For Compiler
export BOOST_ROOT=/opt/local/include/boost
export CPLUS_INCLUDE_PATH=/opt/local/include:/usr/include
export CPLUS_LIBRARY_PATH=/opt/local/lib:/usr/lib
export C_INCLUDE_PATH=/opt/local/include:/usr/include
export DYLD_FALLBACK_LIBRARY_PATH=/opt/local/lib:/usr/lib
export LD_LIBRARY_PATH=/opt/local/lib:/usr/lib
export LIBRARY_PATH=/opt/local/lib:/usr/lib

# For make
export CC='/opt/local/bin/gcc-mp-4.8'

このままの環境設定でmakeしてみると
CC="/opt/local/bin/gcc-mp-4.8 -Iproto -DHAVE_CONFIG_H   -I/usr/local/include      " srcdir=. sh ./osdef.sh
gcc-mp-4.8: error: unrecognized command line option '-no-cpp-precomp'
  Hmm, sed is very pessimistic about your system header files.
  But it did not dump core -- strange! Let's continue carefully...
  If this fails, you may want to remove offending lines from osdef.h
  or try with an empty osdef.h file, if your compiler can do without
  function declarations.
/opt/local/bin/gcc-mp-4.8 -c -I. -Iproto -DHAVE_CONFIG_H   -I/usr/local/include  -g -O2 -D_FORTIFY_SOURCE=1       -o objects/buffer.o buffer.c
In file included from vim.h:302:0,
                 from buffer.c:28:
auto/osdef.h:18:12: error: conflicting types for 'printf'
 extern int printf __ARGS((char *, ...));

~以下省略~
-no-cpp-precompっていうstrangeなオプションが入ってるからできんよって言われます
このオプションはAppleのコンパイラでしか使えないとかなんとか
多分、Mac標準のgccでビルドするためについてるんだと思います。

コンパイラも削除して的なことを言っているのでこのオプションを消します。
vim73/src/osdef.shの52行目、-no-cpp-precompの部分を消せば無事にmakeできました
# Mac uses precompiled headers, but we need real headers here.
case `uname` in
    Darwin) $CC -I. -I$srcdir -E -no-cpp-precomp osdef0.c >osdef0.cc;;
    *)  $CC -I. -I$srcdir -E osdef0.c >osdef0.cc;;
esac

以下、全体のビルドの手順
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2 
tar -jxvf vim-7.3.tar.bz2

cd vim73

mkdir patches
cd patches
curl -O 'ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.[001-最新パッチ番号]'

cd ..
cat patches/7.3.* | patch -p0 

cd src

./configure --prefix=インストールしたいディレクトリ \
--disable-darwin \
--disable-gpm \
--disable-gtktest \
--disable-gui \
--disable-netbeans \
--disable-selinux \
--disable-sysmouse \
--disable-xsmp \
--disable-xsmp-interact \
--enable-gui=no \
--enable-multibyte \
--enable-python3interp \
--enable-pythoninterp \
--with-compiledby="もぷり" \
--with-features=huge \
--with-python-config-dir=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config \
--with-python3-config-dir=/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/config-3.3m \
--without-x

make
make test

make install

ざっと書くとこんな感じになります。
インストール場所や最新のパッチ番号など適宜変更してください

Vimで:versionを実行して確認

:version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Dec 22 2012 07:11:11)
Included patches: 1-762
Compiled by もぷり
Huge 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
+cursorshape +dialog_con +diff +digraphs -dnd -ebcdic +emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path +find_in_path +float +folding -footer +fork() +gettext -hangul_input +iconv
 +insert_expand +jumplist +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape +mouse_dec -mouse_gpm -mouse_jsbterm
+mouse_netterm +mouse_sgr -mouse_sysmouse +mouse_urxvt +mouse_xterm +multi_byte +multi_lang -mzscheme -netbeans_intg +path_extra -perl +persistent_undo +postscript +printer +profile
+python/dyn +python3/dyn +quickfix +reltime +rightleft -ruby +scrollbind +signs +smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary +tag_old_static -tag_any_white
-tcl +terminfo +termresponse +textobjects +title -toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace +wildignore +wildmenu +windows +writebackup -X11
-xfontset -xim -xsmp -xterm_clipboard -xterm_save
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/Users/mopp/.libmopp/share/vim"
Compilation: /opt/local/bin/gcc-mp-4.8 -c -I. -Iproto -DHAVE_CONFIG_H   -I/usr/local/include  -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: /opt/local/bin/gcc-mp-4.8   -L/usr/local/lib -o vim       -lm -lncurses  -liconv -lintl

大丈夫のようです

あ、ついてにですがgithubでvimrcを管理しはじめました
https://github.com/mopp/vimrc.git

2012/12/18

VimScriptで区切り文字までをサクサク削除できるやつ書いた

はい、タイトルの通りです。

普段、かなり使うコマンドの一つに以下のものがあります。


dfX- 文字Xまで削除 (Xを含む)
dtX- 文字Xの前まで削除 (Xを含まない)
cfX- 文字Xまで削除し、インサートモードへ (Xを含む)
ctX- 文字Xの前まで削除し、インサートモードへ (Xを含まない)

ランダムなアルファベットの時などは別によいのですが
コードを書いていてセミコロンの前まで消したい時、閉じ括弧の前まで消したい時などがあります。
そんな時に毎回毎回同じようなコマンドを打つのは面倒です。
"."は使いますがそれでもVimを開くたびに打ち直すのすら面倒_(:3」∠ )_

ということで、現在のカーソル位置から予め設定した、任意の区切り文字まで上記の4つのコマンドを実行出来るVimScript書きました。
VimScriptの練習にもなっていいことです(・∀・)。


" 区切り文字までを削除する
" @isInsert 削除後に挿入するか否か
" @isInclude 区切り文字を含むか否か
function! g:deleteDelimitChar(isInsert, isInclude)
    " 区切り文字リスト 優先順位はリストの並びごとに高→低
    let l:delimitList = [';', ':', ')', '}', ']', '.', '"', '''']

    let l:cursolPos = getpos('.')

    " 現在カーソルのある列、以降の文字列を取得(カーソル文字も含む)
    let l:afterCursolStr =  strpart(getline(line('.')), remove(l:cursolPos, 2) - 1)

    " 区切り文字のいずれかがあるか検出
    for l:i in l:delimitList

    " 区切り文字が存在すれば削除処理開始
        if(-1 != stridx(l:afterCursolStr, l:i))

            " 検出された区切り文字の前まで削除 引数で動作変化
            execute "normal d".['t', 'f'][a:isInclude].l:i

            " 削除後に入力するか否か
            if(1 == a:isInsert)
                startinsert
            endif

            " 削除したのでループを抜ける
            break
        endif
    endfor
endfunction

noremap dli :call g:deleteDelimitChar(0, 1)<CR>
noremap dla :call g:deleteDelimitChar(0, 0)<CR>
noremap cli :call g:deleteDelimitChar(1, 1)<CR>
noremap cla :call g:deleteDelimitChar(1, 0)<CR>

関数内初めのl:delimitListが区切りとして設定する値です。
任意の区切りを追加すれば動きます。

注意としては、要素初めにある区切りのほうが優先されます。
:call g:deleteDelimitChar(0, 0)<CR>とあった場合、:が先なので)まで削除されません。

マッピングは以下のようになります。

dli- 区切り文字まで削除 (区切り文字を含む)
dla- 区切り文字の前まで削除 (区切り文字を含まない)
cli- 区切り文字まで削除し、インサートモードへ (区切り文字を含む)
cla- 区切り文字の前まで削除し、インサートモードへ (区切り文字を含まない)

この記事を書いてて思いましたが、関数名がダメですね…

2012/12/16

xspim ビルド しました

大学でアセンブラ課題がでました
大学環境だとxspimを使います。
ですが、家でやりたい時とかに面倒なので、自分のMacに入れました。

最新のだと結構かっこいいQtSpimというのがあるようなので
普通はこっちを使えばいいと思います
http://spimsimulator.sourceforge.net/

一応、大学にあわせてxspimをビルドします。

まずはソースのダウンロード
http://spimsimulator.svn.sourceforge.net/viewvc/spimsimulator/

Download GNU tarballを押せばおk

tar -xvf spimsimulator.tar.gz
cd spimsimulator/xspim

普通に解凍し、移動します。

次にMakefileのインストール場所と例外時のファイル?とManファイルのパスを変更します。
別にしなくてもいいですが、その時はexception.sを(ディレクトリがない場合は作って)/usr/share/spimに移動させておかないと起動しません。

1080行目辺りに
BIN_DIR - インストール場所
EXCEPTION_DIR - exception.sの場所
MAN_DIR - manファイルの場所

があるのでそれぞれ任意の場所に書き換えます。

exception.sはspimsimulator/CPUの中、manファイルはspimsimulator/Documentation内です。
manは詳しく知らないのですがファイル名をspim.manからspim.1のようにしておくと正常にman spimで見れました。

あとは普通にmakeです

make
make install



パタヘネをちゃんと読みたい…

2012/12/15

Rogue を Mac OS X で ビルドした

先日Rogueという古い古いRPGがあって、基本の移動キーがhjklだと聞いて興味を持ったのでインストールしました。

というわけでメモです。

以下のページからRogue 5.4.4のソースを引っ張ってきてビルドしました。
Rogue

なんか色々バージョンがあるようですがUNIX上の最終バージョンが5.4ということでこれにしました。

tar -xvf rogue5.4.4-src.tar.tar.gz
./configure
make
make install

オプションはチートモードとかいろいろありましたがつけませんでした

で、早速やってみたところ

死!

なんかよくわからんまま死にました(´○ω○`)

意外とおもしろいかもです。


2012/12/03

Vimの基本と考察と !

おはようございます.

もぷりです.

おはようございますって言うと何時でも朝っぽくなるから良いあいさつですね.

さて、某とっぷ氏が企画したAizu Advent Calendar3日目の記事です.

Vimについて書きます.
といっても、いつものような設定ファイルなどではつまらないので
私的な考察や以前からまとめて見たかったHowToVimなど書いてみます.
Mac, Unix系向けです。

初学者向けですのでProVimmerや闇Vimmerの方には無用の長物でありましょう.

加えて、近いうちにAizuの地でVim勉強会を開催しようと考えていますので
その時の資料にもなればいいかなあなどと考えています :)



はじめに



私はVimが好きです.

Vim歴は浅いですが設定をいじったりコマンドを叩いていると楽しいです.
大したプログラムは書けませんのであしからず。

なんでVim使ってるの?すぐに慣れた?
と極稀に聞かれますが、そこまで深い理由があるわけではないです.

以前はWindowsでEmEditorやNotepad++など使っていました.
MacやLinuxでターミナルを使い始めた時にemacsとVimという二大宗派があるらしいということを知り
sshで便利だし、名前もこっちのがいい響きかなとかそんな適当な感じで使い始めた気がします.

で、使ってみるとなかなか面白いし使い勝手が非常にいいわけでして…

大学にいったらこういうの得意な人とかいっぱいいるといいな、と考えていたわけですが、
残念なことに大学ではemacsがデファクトスタンダードでした.
一番初めに教わるのは環境の説明、ワークステーションのログイン、emacsの基本操作だった気がします.

そんな中で、めげずに友人たちにも薦めていますがなかなか使ってくれません.
強要するものではないので仕方ないですね.

あ、誤解を招かないように添えておきますが、宗教戦争をする記事ではありません.

emacsも良い環境だと思います.
Shell機能がとても便利そうですし、Twitterもできるし、なんかミニゲームとか入ってるし、elispとかもありますし….

どちらか片方(もしくは両方)を使いこなし、気持ち悪い指の動き(音ゲー廃人ほどではなくとも)し始めたら何ら問題ないでしょう.

更に言うならば、実際の業務でVimを使うかと言われたら使わないのではないでしょうか?
Eclipse, Xcode, VisualStudio, IntelliJ などのIDEが使用されるはずです。

つまり完全に趣味です( '-^ )b



エディタにこだわる



"はじめに"にも書きましたが、以前は一般的なエディタを使っていました.

例えば、Notepad++
補完はもちろんマクロ、plugin、豊潤なシンタックスハイライトなどがあり良いエディタです。

ですが、私はVim(Emacsも含め)良い所は上記のような機能ではなく、
Vimの真価は"w b e ge d y"などのコマンドに秘められていると思います。

簡単に言ってしまうと同じキーの連打は嫌だということです。
より効率的に編集するためには無駄のない操作をすべきです。

加えて、こんなことできないかな?と思うとVimでは大抵出来るということです。
これ以下の記事を試すと、ちょっとこれは不便だな、と思うことがあるでしょう。
実際、標準のままだと不便なことも幾つかあります。

ですが、ちょっと設定を変えたり、Pluginを導入することでほとんど解消出来るはずです。
もしなかったらVimScriptをかけばよいのです、似たようなことを思う人もいるはずです。

さてさて、ここまで読んでくれた人ならきっとVimに少し興味を持っていただけたのでは無いでしょうか?

長ったらしいお話はこの辺にしておきましょう。



表記と言い回し



この記事に限った話ではありませんが
Ctrl + W → <C-w>
ESCキー → <ESC> 
と表現します

実際に入力するものについては
分かりやすいように
dd
<C-n>
のように強調することとします。

<Enter>などは省略して書くことが多いです。

文頭に$がついていたらターミナルでの操作を意味します。

Vimで現在のカーソルがある部分をカーソル位置ということにします。
同様に、現在のカーソルがある行はカーソル行
カーソル位置の文字をカーソル文字といいます。



とにかく起動してみる



$ vim

と入力して見ましょう。
標準状態Vim
シンプル極まりない画面が表示されると思います。
ファイルを開かなかったときに画像のようなメッセージ表示されます。


まだ慌てる時間ではありません。


Vimではモードというものを切り替えて文字を編集していきます。
これはVim最大の特徴であり、初心者に対する壁でもあります。

起動時のこのモードはNormalモードと呼ばれます。



とりあえず終了してみる



Vimになれない人が戸惑うのはここです。

大抵の人は「おお、これがVimか」と思ったあとに

「で、どうやって閉じるの?」となるはずです。

終了するには以下のコマンドです。

:q

>No write since last change (add ! to override)
が出たら末尾に!をつけて下さい。
!で強制的にという意味になります。

いろいろ編集したけどやっぱり保存しない、という時にも使います。

書き込んで終了するときはwをつけます。

:wq

":"を入力することでコマンドラインモードになり、各種コマンドが打てるようになります。

この":"が表示された最下段を"コマンドライン"といいます。

ここまででVimの起動と終了を覚えましたね
つまり、Vimの世界へ自由に出入りできます。

Welcome Vim World !! ってことです。


余談と考察



初期状態のVimは上記のように極シンプルです(それが良くもある)

それに対して

「Vimっていう素晴らしいエディタがあるらしい。ちょっと使ってみようかな」

という人を怖がらせてしまう気がします。

大学に入って、Unixに触れ、プログラミングを学ぼうという場合だと特にそうでは無いでしょうか?

これがVimは難しいと言われている理由の一つにあると思います。

このシンプルであることは、下記の考えに基づいています。

VIM IS... VI COMPATIBLE
    なにより、VimはViの気軽な置き換えとして使うことができるべきである。ユーザが望むなら、Vimを、オリジナルのViとの区別がほとんど付かない互換モードで使うことができる。
vimdoc-ja Vimの開発 1. 設計上の目標 より引用

Vimの考えでは

バージョンが上がっても旧バージョンで使えたものがしっかりと使える。
シンプルかつ高速で小さいプログラムである。

といったことを重要としているようです。

だからVi互換モードのcompatibleオプションが標準で有効になっているんですね
私はViではなくVimを使いたい人です。
だから、:set nocompatibleとしてVi互換モードを切っておくことを強く推奨します。

しかし、この開発方針は上記の引用以外にもいろいろ、しっかりとした縛りがあって良いと思います。
実際、それらを元にVimというエディタが開発されたのですから。

Vim本体はシンプルですが、Pluginの力によって様々な拡張がなされています。
むしろ慣れてくるとPluginが無いとかなり不便に感じます。

NeoBundleやVimproc,Uniteなどは本当にすごいですね。

ググれば大抵の情報はあります。
最高ですね。

怖がらずにどんどん使いましょう(^p^)



今は動くことだけを考えて



Vimの起動と終了を覚えたらファイルを開いてみましょう。

$ vim hoge.c

基本のコマンドは以下です。
 左   下  上   右
 h   j   k   l 
覚えるヒント
    jキーが下矢印のように見えますね

行末や行頭なんかは結構多様する気がするので大事です。
行頭 末尾 先頭 行末
 0   G   gg   $ 
移動コマンド
まとめて図で表すとこんな感じです

右手のホームポジションはhjklです。

Vimを起動したらhjklを中心に指が動きます。
カーソルキーは使いません、遠いです。

Vim病が進行するとブラウザとかMSオフィスでもhjklで移動しようとして残念なコトになります。

慣れの問題ですので構わず次へ進みましょう。
忘れたら見なおせばいいだけです。

ただし、カーソルキーは使わないよう心がけて下さい。



編集しなければ生き残れない



さて、やっと編集です。
なにか適当なファイルを開いてみましょう

$ vim hoge.c
そのままだと非常に見づらいので :syntax onとコマンドを実行しました。
標準のCのシンタックスハイライトです。

緑のブロックが現在のカーソルの位置です。

色やカーソル位置の設定はターミナル側のものです。
もちろん、Vimでの設定もあります。

この状態からInsertモードに入りガリガリとコードを書いていきます。
Insertモードに入るには以下のコマンドで入ります。
 i  - カーソル位置前から編集開始
 a  - カーソル位置後から編集開始
 o  - カーソル行下に1行加えてそこから編集開始
 s  - カーソル文字を削除しそこから編集開始
とりあえず最も頻繁に使うものを4つ書きました。
実際はもっとあります。

初めはなんか多いな…と思うものですが
使っていくうちに、今の場合はどのコマンドでInsertモードに入るべきだったか、などと考え始めます。

次にそれぞれの動作を具体的に表してみます。
背景色緑のところがカーソル位置です。

変数名a1を編集してみましょう。
初めのカーソル位置を1とします。
char a1;

a1をa01にしたい時は前に追記するのでです。
char a1;   - iでInsertモードへ
char a01;  - 0を追記

a1をa10にしたい時は後ろに追記するので a です。
char a1;   - aでInsertモードへ
char a10;  - 0を追記

次の行にchar a1_2;を追記したい時は新しく行を作るので o です。
char a1;
                   - oでInsertモードへ
char a1_2;  - 追記

a1をa9にしたい時は書き換えるのでです。
char a;   - sでInsertモードへ
char a9;  - 0を追記
iとaの違いなどがいまいち掴みづらいですがこれも慣れです。

これでファイルに追記が出来るようになりました。


次は削除です。
削除は幾つかのモードで行えますが、ここではInsertNormalモードの削除を書きます。

普通の削除はBackSpaceかDeleteです.
しかし、Normalモードでは使いません。
BackSpaceは少し遠すぎます。

 x  - カーソル文字を削除(BackSpaceと同じ動作)
 X  - カーソル文字を削除(Deleteと同じ動作)

 D  - カーソル文字から行末まで削除
 dd - 一行削除

 C  - カーソル文字から行末まで削除してInsertモードへ
 cc - 一行削除してInsertモードへ

でも、Insertモードの時はxなどのコマンドは使えません。
私も以前はBackSpaceを使っていましたが、やはりBackSpaceは少し遠すぎます。
Insertモードの時は以下を使いましょう。
※compatibleオプションが有効だと使えません。:set nocompatibleとコマンドを実行すれば使えます。
<C-h>
ホームポジションのhなので近いですね
こちらに慣れておくとブラウザのテキスト入力フォームでも使えたりするので便利です。


次にコピー&ペーストです。
ペーストのことをYank(ヤンク)といいます。
英単語だとぐいっと引っ張るという意味です。

 yy - 一行ヤンク
 p - カーソル後に貼り付け
 P - カーソル前に貼り付け

Vimでは、この場合、クリップボードに当たるものをレジスタと呼びます。

ヤンクしたものは標準レジスタに保存されます。
注意が必要なのは、削除コマンドを実行した時も、同じように標準レジスタに入る、ということです。

最低限の編集は以上で大丈夫です。
ここまで書いといてなんですが、これではコマンドが変わっただけで普通のエディタと変わらないですね

次からVimらしい操作を説明します。



Normalモードフェイズはまだ終了していない



今の段階だとNormalモードで先頭や末尾に移動できても、行の中央近くに移動するのためにはhlの連打が必要です。
(行の中央に移動するためにはgmです)
これでは大した意味がありません。

もっと素早く移動するために単語移動を使いましょう。

 w  - 前方のword先頭へ
 W  - 前方のWORD先頭へ
 b  - 後方のword先頭へ
 B  - 後方のWORD先頭へ

 e  - 前方のword末尾へ
 E  - 前方のWORD末尾へ
 ge - 後方のword末尾へ
 gE - 後方のWORD末尾へ

8つもあります。

 w ←→ b 
 e ←→ ge 

という風に対になっています。


この単語移動はwordWORD単位で区切られます。

word - 記号や数字なども含んで区切られる単語
WORD - 空白で区切られる。

私もWORDはいいのですがwordが少しあやふやな感じです・・・

wordの場合の先頭と末尾の違いが以下です。
押し続けた時に移動する部分の背景色を緑にしています。
カーソル位置を先頭とします。
    printf("double  %d, %d, %p\n", sizeof(a5), sizeof(&a5), &a5);

 w の場合
    printf("double  %d, %d, %p\n"sizeof(a5)sizeof(&a5), &a5);
 e の場合
    printf("double  %d, %d, %p\n", sizeof(a5), sizeof(&a5), &a5);

対になっているものは末尾から逆順に移動するので省略しました。
これを覚えるだけでもなかなか快適だな、と思うようになるはずです。



コンボをキメる



Vimのコマンドは幾つかの種類に分類されます。
hjkl,w,eのようなカーソル移動コマンド、x,ddのようなオペレータコマンドなどです。

それらを組み合わせて、更に繰り返しを使用することで効果を発揮します。
華麗にコンボを決め、キモい指の動きをし始めましょう!

Vimのコマンドはコマンドの前に数字をつけることで繰り返すことができます。

例えば、2単語を消したい時はd2wという組み合わせになります。
    float  a4; - 初期状態

    ;              - d2wを実行
これはdコマンドに対し、w2回分の範囲
つまり、2word削除です。

他のコマンドの組み合わせの例を示します。

d$ - カーソル位置から末尾まで削除
d0 - カーソル位置から行頭まで削除
y$ - カーソル位置から末尾までヤンク
4yy - カーソル行から下へ4行ヤンク
5x - 5word削除
5i - <ESC>するまでに入力したものを5回繰り返す

どれも似たような感じですね
これ以外にもたくさんありますので慣れてきたら試してみましょう。



より捗るために



どこに分類していいかわからなかったのでこの部分にまとめます。

コーディングをする時、ちょうど画面サイズいっぱいくらいになると見づらいと思うはずです。
Vimを使う以前は改行しまくって、真ん中辺りに書いている部分を持ってきてました。

zz - 現在行を画面中央へ

これがなかなか便利です。
下に行がなくても、中央に持ってきてくれます。

左右の移動は単語移動で出来ます。
同様に、上下の大きな移動も大事です。

 H  - 画面最上部へ(High)
 M  - 画面中央へ(Middle)
 L  - 画面最下部へ(Low)

<C-u> - 半画面分上へ(Up)
<C-d> - 半画面分下へ(Down)

<C-e> - 1行上へ
<C-y> - 1行下へ

<C-f> - 1ページ上へ
<C-b> - 1ページ下へ

私は1行移動とかそこそこ使ったりします。
半画面分移動は絶対使います。

もちろん、書いたもの以外にも大量にあります。



おわりに


さてさて、ちゃんと書けてない感が溢れてますね…

ここでしたVimの使い方は基本的なところだけです。

興味を持っていただけたら、是非ともVimdoc-jaを見て欲しいです。
きちんと日本語化されていてVimのほとんどが書いてあります。

でも、VimScriptのこととかまだまだわからないので、いずれいろいろまとめたいです。


Aizu Advent Calendar 3日目はもぷりの提供でした。

4日目はluxionさんです。

2012/12/02

型サイズ出力

いろいろ出力


#include<stdio.h>

int main(void){
    char a1;
    short  a2;
    int    a3;
    float  a4;
    double a5;

    // 型サイズ    アドレスのサイズ    アドレス
    printf("char    %d, %d, %p\n",sizeof(a1),sizeof(&a1),&a1);
    printf("short   %d, %d, %p\n",sizeof(a2),sizeof(&a2),&a2);
    printf("int     %d, %d, %p\n",sizeof(a3),sizeof(&a3),&a3);
    printf("float   %d, %d, %p\n",sizeof(a4),sizeof(&a4),&a4);
    printf("double  %d, %d, %p\n",sizeof(a5),sizeof(&a5),&a5);

    return 0;
}

2012/11/02

Vimで括弧の補完とそのトグル

Vimのmapについて調べると
下記の括弧保管をよく見かけます。

(* → ()*

() → (*)

※アスタリスクはカーソル位置

便利な時もありますが
ターミナルにコピペするときなどは邪魔です
(クリップボードと連携取ればいいんだろうけど…)

使いやすいようにスクリプトを書いてコマンドで切り替えられるようにしました。

" 自動で括弧内に移動を切り替え
function! g:toggleAutoBack()
 if(0 == g:autoBackState)
  inoremap {} {}<Left>
  inoremap [] []<Left>
  inoremap () ()<Left>
  inoremap "" ""<Left>
  inoremap '' ''<Left>
  inoremap <> <><Left>
  if !has('vim_starting')
   echo "AutoBack is ON"
  endif
  let g:autoBackState = 1
 else
  iunmap {}
  iunmap []
  iunmap ()
  iunmap ""
  iunmap ''
  iunmap <>
  
  if !has('vim_starting')
   echo "AutoBack is OFF"
  endif
  
  let g:autoBackState = 0
 endif
endfunction

" 起動時のみ自動実行
if !exists("g:autoBackState")
 " 初期値
 let g:autoBackState = 0
 call g:toggleAutoBack()
endif

" 括弧移動切り替え
nnoremap taub :call g:toggleAutoBack()<Return>

" 自動で括弧を閉じる
function! g:toggleAutoPair()

 " 重くなるだけなのでOFF
 if(1 == g:autoBackState)
  call g:toggleAutoBack()
 endif

 if(0 == g:autoPairState)
  inoremap { {}
  inoremap [ []
  inoremap ( ()
  inoremap " ""
  inoremap ' ''
  inoremap < <>
  if !has('vim_starting')
   echo "AutoPair is ON"
  endif
  let g:autoPairState = 1
 else
  iunmap {
  iunmap [
  iunmap (
  iunmap "
  iunmap '
  iunmap <
  
  if !has('vim_starting')
   echo "AutoPair is OFF"
  endif
  
  let g:autoPairState = 0
 endif
endfunction

" 起動時のみ自動実行
if !exists("g:autoPairState")
 " 初期値
 let g:autoPairState = 0
 " call g:toggleAutoPair()
endif


" 自動括弧閉じ切り替え
nnoremap taup :call g:toggleAutoPair()<Return>


AutoPairは標準でOffにしてます。

書いてからなんだけどそこまで便利でもないかな…

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;
}


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

2012/09/30

くっきっき 作り方メモ

クッキーのメモ

ずっとメールの下書きで保存してあったので
この辺に書いとこうと思います。

[ノーマル]
  • バター 100g
  • 砂糖 80g
  • 卵黄 1個
  • 牛乳 大さじ2
  • バニラエッセンス 少々
  • 薄力粉 150g
  • コーンスターチ 50g
  • ベーキングパウダー 2~3g
[いちご]
  • バター 100g
  • 砂糖 80g
  • 卵黄 1個
  • 牛乳 大さじ1
  • バニラエッセンス 少々
  • いちごソース 50g
  • ドライいちご(微塵切り) 50g
  • 薄力粉 180g
  • コーンスターチ 50g
  • ベーキングパウダー 2~3g
  • 赤色色素 適量
[チョコ]
  • バター 100g
  • 砂糖 80g
  • 卵黄 1個
  • 牛乳 大さじ2
  • チョコレート 50
  • 薄力粉 180g
  • コーンスターチ 50g
  • ベーキングパウダー 2~3g


超簡単作り方
材料を混ぜる→頑張ってこねる→棒状にして冷やす→焼く

以上.

2012/08/18

Mac から Ubuntu へ ssh するのに手こずりました

毎回、パスワードを打つのが面倒くさかったので、公開鍵暗号方式で認証しようとしたところ なかなかに時間を食われたのでまとめておこうと思います。
opensshはubuntuですのでインストールの時に突っ込んでおきます。
ないならapt-getあたりでhogehoge

sshはVersion 2で暗号方式はrsaを使います。
以下がサーバのsshデーモンの設定
一応、初期ファイルをバックアップしておいたほうがいいかもしれません。

# /etc/ssh/sshd_config
# ssh2を使用

# 使用するポート
Port 74

# 使用するsshバージョン
Protocol 2

# HostKeys for protocol version 2(秘密鍵ファイル)
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key

# 特権分離の使用可否
# yesだとプロセスは非rootユーザ(デフォルトは sshd ユーザ)権限で動作する
UsePrivilegeSeparation yes

# Loggingする時のファシリティコード
SyslogFacility AUTH

LogLevel INFO

# ログインする制限時間
LoginGraceTime 120

# rootログインの可否
PermitRootLogin no

# パーミッションなども確認する
StrictModes yes

# 公開鍵暗号方式を使って認証する
PubkeyAuthentication yes

# 公開鍵ファイルを設定
AuthorizedKeysFile %h/.ssh/authorized_keys

# ~/.rhosts and ~/.shosts ファイルを読み込まない
IgnoreRhosts yes

# similar for protocol version 2
HostbasedAuthentication no

# ~/.ssh/known_hosts ファイル(ユーザごとのホスト鍵リスト)を無視するか否か
IgnoreUserKnownHosts no

# パスワード認証可否
PasswordAuthentication no

# 空のパスワードを許可するか否か
PermitEmptyPasswords no

# チャレンジレスポンス認証可否
ChallengeResponseAuthentication no

Subsystem sftp /usr/lib/openssh/sftp-server

UsePAM no


次に秘密鍵と公開鍵の生成と設定です。
これが一番手間取りました。
ぐぐると結構出てくるんですが、やり方がだいたい2通りくらいあるようで、ちょっと混乱しがちです。

基本的にクライアント(Mac)が主体の操作です。
バージョン2なので以下のように鍵を生成します。
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hoge/.ssh/id_rsa):  #ここで何も入力しないこと! 
Enter passphrase (empty for no passphrase):  #適当なパスフレーズ
Enter same passphrase again: 
Your identification has been saved in /Users/hoge/.ssh/id_rsa.
Your public key has been saved in /Users/hoge/.ssh/id_rsa.pub.
The key fingerprint is:
e3:29:2d:gb:4d:f2:12:c2:23:57:a4:6a:1b:4f:20:75 hoge@hoge.local
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                .|
|              .oE|
|             ....|
|        S   ... .|
|       + +  ..+..|
|      . = ...+ +.|
|       . . =o =. |
|          . o+ ..|
+-----------------+


ここで大事なのは鍵の名前を付けないでそのままというところです。
わかりやすい名前をつけていたせいで、だいぶ手こずりました_:(´ཀ`」 ∠):_

$ man sshをしてみると
-i identity_file
    Selects a file from which the identity (private key) for RSA or DSA authentication is read.
    The default is ~/.ssh/identity for protocol version 1, and ~/.ssh/id_rsa and ~/.ssh/id_dsa for protocol version 2.
と-iオプションの部分に書いてありました。
つまり、秘密鍵はバージョン2を使うなら~/.ssh/id_rsaにしろということ
default値なのでconfigで変えられるのかな?
 

次にクライアントからサーバ(Ubuntu)へ共有鍵(id_rsa.pub)を設定します。
場所は設定ファイルのAuthorizedKeysFileで指定したものなので,

%h/.ssh/authorized_keysです。
何かしらを使ってサーバに共有鍵をコピーし、authorized_keysに追記してください。
authorized_keysのパーミッションは644です。

.sshディレクトリ(700)や、ファイルのパーミッションでうまくいかない時もあるようなので注意が必要です。

これで設定は済んだはずなのでサーバのsshデーモンを再起動させます。

$ sudo service ssh restart

余談ですが、以前は
$ sudo /etc/init.d/ssh restart
としていましたが、少し前のバージョンから上記の方が推奨になっていました。
今のところはどちらも同じ動きをするようです。

あとは、普通にクライアントからsshするだけ

$ ssh USER@SERVER


以下を参考にしました。
sshd の設定(sshd_config)
http://www.nina.jp/server/slackware/openssh/sshd_config.html

2012/08/17

vimrc 3回目

もはや定期じゃなかろうか…



" ********************vimオプション********************
colorscheme desert
" 新しい行のインデントを現在行と同じにする
set autoindent
" バックアップファイルを作るディレクトリ
set backupdir=$HOME/\.vim_backup
"  スワップファイルを作成する
set swapfile
" スワップファイル用のディレクトリ
set directory=$HOME/\.vim_backup
" ファイル上書き前にバックアップ作成
set backup
" バックスペースの動作
set backspace=2
" 文字エンコーディングに使われるexpressionを定める
set charconvert=utf-8
" コマンドラインの行数
set cmdheight=2
"  カレント行ハイライトON
set cursorline
" viとの互換をオフ
set nocompatible
" vim内部で通常使用する文字エンコーディングを設定
set encoding=utf-8
" バッファのファイルエンコーディングを指定
set fileencoding=utf-8
" 既存ファイルを開く際の文字コード自動判別
set fileencodings=utf-8,euc-jp,sjis,utf-16
" Tabをスペースにしない
set noexpandtab
" 折りたたみを有効
set foldenable
" シンタックスに従い折りたたみ
set foldmethod=syntax
" カーソルが移動した時に自動で折りたたみを開く
set foldopen=block,hor,mark,percent,quickfix,search,tag,undo
" 折りたたみの具合
set foldlevel=0
" 最大折りたたみ深度$
set foldnestmax=3
" 左側に折りたたみガイド表示$
set foldcolumn=2
" 検索結果強調-:nohで解除
set hlsearch
" インクリメンタルサーチを有効
set incsearch
" ステータスライン表示
set laststatus=2
" タブ文字、行末など不可視文字を表示
set list
" 表示される特殊文字のフォーマットを指定
set listchars=eol:$,tab:>\ ,trail:\|,extends:<,precedes:<
" 行番号表示
set number
" カーソルの現在地表示
set ruler
" 自動インデントの空白の数
set shiftwidth=4
" 括弧強調
set showmatch
" 新しい行を作ったときに高度な自動インデントを行う
set smartindent
" 行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする
set smarttab
" ステータス行の表示内容を設定 PowerLineで置き換え
" set statusline=%<%F\ %m%r%h%w%y%{'['.(&fenc!=''?&fenc:&enc).']['.&fileformat.']'}%=%l/%L,%c%V%8P
" 強調表示有効
syntax on
" 文字エンコーディングに使われるexpressionを定めるタブを表示幅
set tabstop=4
" カーソルを行頭、行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]
" コマンドの補完候補を表示
set wildmenu
" 折り返しの設定
set wrap
" 上書き前にバックアップ作成
set writebackup
" タブバーを表示
set showtabline=2
" ウィンドウの幅を超える行の折り返し設定
set nowrap
" □や○の文字があってもカーソル位置がずれないようにする。
set ambiwidth=double
" 折りたたみ時の色設定
highlight Folded cterm=bold,underline ctermfg=4
" ヘルプ検索で日本語を優先
set helplang=ja,en



" ********************プラグイン設定********************
filetype off
filetype plugin indent off

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

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

NeoBundle 'cocoa.vim'
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-scripts/DrawIt.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/vim-scripts/Source-Explorer-srcexpl.vim.git'
NeoBundle 'git://github.com/vim-scripts/taglist.vim.git'
NeoBundle 'git://github.com/scrooloose/nerdtree.git'
NeoBundle 'git://github.com/vim-scripts/trinity.vim.git'
NeoBundle 'git://github.com/scrooloose/nerdcommenter.git'
NeoBundle 'git://github.com/Lokaltog/vim-powerline.git'

filetype plugin indent on

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

" textmanip
" 選択したテキストの移動
xmap <c -j="-j"> <plug>(textmanip-move-down)
xmap <c -k="-k"> <plug>(textmanip-move-up)
xmap <c -h="-h"> <plug>(textmanip-move-left)
xmap <c -l="-l"> <plug>(textmanip-move-right)
" 行の複製
xmap <space>d <plug>(textmanip-duplicate-down)
xmap <space>D <plug>(textmanip-duplicate-up)

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


" ********************キーリマッピング********************
imap {} {}<left>
imap [] []<left>
imap () ()<left>
imap “” “”<left>
imap ” ”<left>
imap <> <><left>
imap “ “<left>


だいぶ捗るようになって来ました。

neobundle で Vim の Plugin を管理しましょう。(Mac)

今までプラグインはあまり使っていなかったのですが、ふと思い立ったので噂のプラグイン管理プラグインを使って見ました。
一度入れてしまえば楽なもので非常に便利です。

gitを使うのでhomebrewなりmacportsなりでインストールしておきます。

$ mkdir -p ~/.vim/bundle
$ git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

インストール用のディレクトリを作成して、ダウンロードします。

" 互換はOFF
set nocompatible

filetype off
filetype plugin indent off

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

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

" ここに使いたいプラグインを書く
" Githubの場合
NeoBundle 'git_repository_uri'
" vim-scriptsの場合
NeoBundle 'script_name'

filetype plugin indent on

読み込みの関係だかなんだかで上記のようにしないといけないようです。

インストール
:NeoBundleInstall

アップデートとインストール
:NeoBundleInstall!

好きなプラグインを見つけて設定に書いたら
:NeoBundleInstallするだけです。
簡単ですね


以下を参考にしました。
Hack #238: neobundle.vim で plugin をモダンに管理する
http://vim-users.jp/2011/10/hack238/

:help neobundle

2012/06/16

vim のビルドオプション on Mac かきなおし

前回のオプションについてです。
一度記事を書きましたがいろいろ間違っていたので消して書き直しました


./configure --prefix=hoge \
--with-features=huge \
--without-x \
--disable-darwin \
--disable-selinux \
--disable-xsmp \
--disable-xsmp-interact \
--enable-cscope \
--disable-gpm \
--disable-sysmouse \
--enable-gui=no \
--enable-multibyte

今度こそ大丈夫なはず!

2012/06/12

scp でリモートファイル送受信 についてのメモ

sshを使っていて、転送が便利だったので忘れないように書いておきます。

scp(Secure Copy)コマンドは
sftpなどと同様にsshを使ってファイルやディレクトリの送受信を行います。
ちゃんと暗号化して転送するので安心ですね


ホームディレクトリが基準になるようです。
リモートホストからローカルへ
scp ユーザ@ホスト:リモートファイル コピー先

$ scp USER@HOST:hoge.txt ./huga/


ローカルからリモートへ
scp ローカルファイル ユーザ@ホスト:コピー先

$ scp hoge.txt USER@HOST:./tmp


-rオプションでディレクトリごと転送もできるようです。

2012/06/03

Solaris での フォント変更

大学の環境でSolarisを扱ってますが、フォントがイマイチでした。
ターミナルとかは特にプログラムを書いてて気になるのでフォントは大事だと思います。
そこで、取りあえずRictyに変更したので軽くメモを書いておきます。


$ cat /etc/fonts/fonts.conf 
~~~~~~~~~~~~~~~~~~~~~~
<dir>~/.fonts</dir>
~~~~~~~~~~~~~~~~~~~~~~ 


なんかいろいろ出てきますが、<dir>hogehoge</dir>の部分だけで問題なし
~~~~~部分はいっぱい出てきたので省略、という意味です。
今回の環境のだと、fontsのインストールディレクトリの一つにホームディレクトリ下の.fontsが指定されてるようなので都合がいいですね。
そのディレクトリにフォントをポイしときましょう。
mvでもcpでもどっちでもかまいません。


$ mv *.ttf ~/.fonts/ 


そして、フォントキャッシュを再構成し、ちゃんと入ってるかどうかの確認です。
grepあたりで入れたフォント名でフィルタをつけるといいです。

$ fc-cache -v
~~~~~~~~~~~~~~~~~~~~~~
fc-cache: succeeded

$ fc-list


で、再ログインすれば使えるはずです。
しかし、今回の環境だとfc-listがエラーで途中停止してみれないという…
まあ、使えるのでよしとしましょう。

2012/05/26

美しいソースコードとは

ソースコードの自分なりの書き方まとめです。
まずは、「美しいソースコード」とは何であるかをこの場で定義しましょう。
人によって、その定義は千差万別ですし、論争の元にもなりますから…
加えて、場合によっても変わります。

以下はあくまでも私見ですが、
競技プログラミングにおいては無駄を最小限に留めた「効率」「短さ」が最優先
ショートコーディングなんかはすごいですね。

企業においては、保守管理、引き継ぎなども考慮して「可読性」「安全性」が最優先
社内で取り決めをしている企業もあります。
どちらにも言えることだと、インデント(tab)の取り方や中括弧({)の付け方でしょうか
if文一つでも3つ以上にわかれるようです。

さて、前置きはこの辺りでいいでしょう
自分も結構まちまちに書いてるので一概には言えませんが
この記事に置いては以下のように定義します。

美しいソースコード」 とは 「可読性を優位した効率の良いソースコード」である。

まあ、分かりやすく言えば、ちゃんと動いて綺麗なソースだね!ってことです。

あくまで自分なりですので、「ここはこうだろ」とか「これはいただけない」といったことがあれば、参考のために教えていただきたいです。
自分もまだまだ初心者ですのでおそらく間違ってることもあるでしょうから
あくまでもそういう例として、鵜呑みにする必要はないと思います。
ホントのことを言うと、この記事を書くにあたって書いたものを読み返すとまちまちだったので
結構独断と偏見が多いかも( ^ω^) ・・・


とりあえず、まずはインデント、プログラムの流れについてです。
以下のプログラムはAOJのLeap Year です。
>西暦 m 年から n 年までの間にあるすべてのうるう年を出力して終了するプログラム


#include

//うるう年判定
int leap(int n){
 return (n%4==0 && n%100!=0 || n%400==0)?1:0;
}


//うるう年出力
void putyear(int m,int n){
 int i,flag=0;

 for(i=m;i<=n;i++)
  if(leap(i)){
   printf("%d\n",i);
   if(!flag)
    flag=1;
  }

 if(flag == 0)
  printf("NA\n");
}


int main(){
 int m,n;

 while(scanf("%d %d",&m,&n) && m!=0 && n!=0){
  putyear(m,n);
  printf("\n");
 }

 return 0;
}


全体的に言うと、一番に気にすべきなのはタブを使ったインデントです。
こんなことを言うまでもないとは思いますけど一応… 
関数の内部を書くとき、if,for,while,などで1つタブを挿入ですね。指が勝手にやってくれます。
因みに私はタブ幅は4です。
この辺についてもエディタやフォントによって変わるので一概には言えません。
ですが、決してスペースなどではなくタブを使いましょう。

次に、if文を一行で書くといったこともあまりしてほしくはないです。
下記は動作は同じですし、2つとも同義です。

// 1行if文(・A・)イクナイ!!
if(hoge == 0) break;

if(hoge == 0)
 break;

1行だとやはり見づらいです。

関数上部のコメントも、この例程度なら別に付けなくてもいいですが、大きなコード、パッと見て何の処理かわからないコードであれば、
javaのドキュメントのように
/** 
 * うるう年か否かを判別
 * @param n 西暦
 * @return うるう年ならば1そうでなければ0
 */
int leap(int n){
 return (n%4==0 && n%100!=0 || n%400==0)?1:0;
}
のように書くとよりわかりやすいかもしれません。
IDEによっては読み込んでくれるものもあると思われます。
よく言いますが未来の自分は他人ですから、コメントを書いておくに越したことはないです
自分は、結構書きそこねて、面倒だった時がありました

次に、空行です。
全部ぴっちりくっつけたままだとやっぱり、見づらいです。

自分は全体として、以下のように分けています。

関数名
初期化部
    ~
   
主処理部
    ~
   
戻り値部

上記コード もそうしていますが、だいたい3ブロックくらいに分けると見やすいです。
各部の中でも長くなるときは空行を挟むといいですね。
各部の区切りは1行、関数同士の区切りは2行といったふうにするともっといいと思います。

後は、細かいところばかりですが、この細かいところがなかなか難しい

//変数への代入の時の空白
int flag = 0,i;

int flag=0,i;


//for文での空白
for(i = m;i< = n;i++)

for(i=m;i<=n;i++)


//if文での空白
if(flag==0)

if(flag == 0)


//if文や関数などの中括弧の付け方
//開いてる
if(hoge)
{
 ~
}
else
{
 ~
}

//半々
if(hoge){
 ~
}
else{
 ~
}

//くっついてる
if(hoge){
 ~
}else{
 ~
}

※コメントアウトすべきですが比較のためしていません。

このようにスペース一つでだいぶ雰囲気が変わりますね。
for文の中はいつも詰めてますが、if文の中はまちまちですが、&&や||の両側は開けるようにしています。

そして、下半分の中括弧ですが大体の人は上記3パターンにわかれるようです。
自分はくっついてるやつで書いてます。
友人は }else{ が飛行生物に見えるとかなんとか

と、基礎の基礎はだいたいこんな感じでしょうか
いざまとめるとできないものですね
クラス、関数、メソッドの命名規則や習慣についてもまとめたいです

2012/05/22

Solaris での BackSpace キーの動作

Solarisのターミナルにおいて、BackSpaceキーがうまく効かないときの設定
MacからSSHでログインした際に非常に不便でしたので、以前に設定したものを忘れないうちに書いておきます。

sttyコマンドを使用します。

$ stty [制御機能] [キー] 


ターミナルの設定などを表示させたり、キーのリマッピングをするコマンドのようです。
[制御機能]は今回の場合は"erase"を使います。
他にもいろいろあるようなので、Google先生に聞くといいはず

自分の場合は以下のようになりました。

$ stty erase ^?

[キー]の部分は削除を割り当てたいものを設定してください。

そして、この設定は再起動すると無効になってしまうので、
シェルの設定ファイルとか.loginとかに書いておくとよいです。

2012/04/22

vimrc設定 そのに

最近はemacsを強いられていますが相変わらずvim使ってたりします。
emacsも使えるようになりたいです。


以前もvimrcを晒しましたが、少し手を加えたりしたので、もっかい上げておくことにしました。

"Vimオプション
colorscheme desert
"新しい行のインデントを現在行と同じにする
set autoindent
"バックアップファイルを作るディレクトリ
set backupdir=$HOME/\.vim_backup
"スワップファイル用のディレクトリ
set directory=$HOME/\.vim_backup
"ファイル上書き前にバックアップ作成
set backup
"バックスペースの動作
set backspace=2
"文字エンコーディングに使われるexpressionを定める
set charconvert="utf-8"
"コマンドラインの行数
set cmdheight=2
"クリップボードを利用
set clipboard+=unnamed
"現在行の強調表示有効化
set cursorline
"viとの互換をオフ
set nocompatible
"vim内部で通常使用する文字エンコーディングを設定
set encoding=utf-8
"バッファのファイルエンコーディングを指定
"バッファのローカル値が優先される、文字コード変換はsetlで変更すること
set fileencoding=utf-8
"既存ファイルを開く際の文字コード自動判別
set fileencodings=utf-8,euc-jp,sjis
"Tabをスペースにしない
set noexpandtab
"検索結果強調-:nohで解除
set hlsearch
"インクリメンタルサーチを有効
set incsearch
"ステータスライン表示
set laststatus=2
"タブ文字、行末など不可視文字を表示
set list
"表示される特殊文字のフォーマットを指定
set listchars=eol:$,tab:>\ ,trail:\|,extends:<,precedes:<
"行番号表示
set number
"カーソルの現在地表示
set ruler
"自動インデントの空白の数
set shiftwidth=4
"括弧強調
set showmatch
"新しい行を作ったときに高度な自動インデントを行う
set smartindent
"行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする
set smarttab
"ステータス行の表示内容を設定
set statusline=%<%F\ %m%r%h%w%y%{'['.(&fenc!=''?&fenc:&enc).']['.&fileformat.']'}%=%l/%L,%c%V%8P
"強調表示有効
syntax on
"文字エンコーディングに使われるexpressionを定めるタブを表示幅
set tabstop=4
"windowタイトルの変更を有効
"set title
"カーソルを行頭、行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]
"コマンドの補完候補を表示
set wildmenu
"折り返しの設定
set wrap
"上書き前にバックアップ作成
set writebackup
"タブバーを表示
set showtabline=2

参照はここ
Vimの全オプション

Mac OS X Lion で vim 7.3 を make

vimをmakeしたのでメモ書きとして残しておきます。

以下のサイトを参考に、というか殆ど丸コピ
とても参考になりました。
さくらのレンタルサーバでvimとbashとscreen


make コマンド等はインストール済みだったのでひとまず省略

ソースファイルをダウンロードして展開します。

$ wget ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2 

$ tar -jxvf vim-7.3.tar.bz2


次に下記からパッチをダウンロードします。
hogeには一番新しいパッチの番号を入れてください。
ftp://ftp.vim.org/pub/vim/patches/7.3/

$ cd vim73

$ mkdir patches

$ cd patches

$ curl -O 'ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.[001-hoge]'

$ cd ..
$ cat patches/7.3.* | patch -p0 


次にmakeです。
一応、Macでのインストールは下記のファイルにも書いてあるので一読しておくといいかも
hoge/vim73/src/INSTALLmac.txt

$ cd src
$ ./configure --prefix=[インストールしたいディレクトリ] --disable-darwin --enable-xim --enable-gui=no --enable-multibyte --with-mac-arch=intel --with-features=big --without-x

--enable-gui=noでターミナルでの動作になるみたい
と、普通はこれでいいのですが、どうも自分の環境だと
no terminal library found
checking for tgetent()... configure: error: NOT FOUND!
      You need to install a terminal library; for example ncurses.
      Or specify the name of the library with --with-tlib.
と、言われてしまい先に進めない。
ncursesも入ってるんだけど…



で、何故かは知りませんが、--with-mac-arch=intelを消すと通ります。
今のところは普通に動いてるので大丈夫なはず
そして、そのままmakeコマンド実行

$ ./configure --prefix=[インストールしたいディレクトリ] --disable-darwin --enable-xim --enable-gui=no --enable-multibyte --with-features=big --without-x
$ make
$ make install

※solarisはこっち
$  ./configure --prefix=[hoge] --enable-xim --enable-gui=motif --enable-multibyte --enable-fontset --enable-multibyte --with-features=huge


--prefixオプションでホームディレクトリ以下に入れたので、
.profileにてパスを通した。
しかし、whereisは/usr/bin/vimになる
一応、エイリアスで実行ファイルを直接設定
:versionでコンパイル日時を見ると合ってるのでまあ、問題なしと判断しました

ホントはコンパイラの設定とか変えたかったけどよくわからんかった(ヽ´ω`)

2012/02/06

Mac の 非表示 ディレクトリ ファイルの表示切り替え

vimのプラグイン管理や.から始まるファイルやディレクトリなどCUI操作だと非常にめんどう
ということで、調べたのをメモとして置いときます。
以下のコマンドをターミナルで実行


//全て表示させる
defaults write com.apple.finder AppleShowAllFiles -boolean true
//Finderの再起動
killall Finder

//非表示に戻す
defaults write com.apple.finder AppleShowAllFiles -boolean false
//Finderの再起動
killall Finder 


普段は煩雑になるので非表示のほうがいいですけど
ファイルをたくさんいじるときは見えたほうがいいですよね

2012/01/28

".vimrc" vimの設定

emacsかvimか考えたところ、とりあえずvimでいいかな、ということでvimの設定をいじっていた。
いろいろな機能があって、カッコいいし、よいエディタだと思う
使いこなすまでが非常に難しいが…

いろいろググりながら書いた設定ファイルが以下です
"新しい行のインデントを現在行と同じにする
set autoindent
"バックアップファイルを作るディレクトリ
set backupdir=$HOME/\.vim_backup
"スワップファイル用のディレクトリ
set directory=$HOME/\.vim_backup
"ファイル上書き前にバックアップ作成
set backup
"バックスペースの動作
set backspace=indent,eol,start
"文字エンコーディングに使われるexpressionを定める
set charconvert="utf-8"
"コマンドラインの行数
set cmdheight=3
"viとの互換をオフ
set nocompatible
"通常使用する文字エンコーディングを設定
set encoding=utf-8
"Tabをスペースにしない
set noexpandtab
"検索結果強調-:nohで解除
set hlsearch
"インクリメンタルサーチを有効
set incsearch
"ステータスライン表示
set laststatus=2
"タブ文字、行末など不可視文字を表示
set list
"表示される特殊文字のフォーマットを指定
set listchars=eol:$,tab:>\ ,trail:\|,extends:<,precedes:<
"行番号表示
set number
"カーソルの現在地表示
set ruler
"自動インデントの空白の数
set shiftwidth=4
"括弧強調
set showmatch
"新しい行を作ったときに高度な自動インデントを行う
set smartindent
"行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする
set smarttab
"ステータス行の表示内容を設定
set statusline=%<%F\ %m%r%h%w%y%{'['.(&fenc!=''?&fenc:&enc).']['.&fileformat.']'}%=%l/%L,%c%V%8P
"強調表示有効
syntax on
"文字エンコーディングに使われるexpressionを定めるタブを表示幅
set tabstop=4
"windowタイトルの変更を有効
set title
"カーソルを行頭、行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]
"コマンドの補完候補を表示
set wildmenu
"折り返しの設定
set nowrap
"上書き前にバックアップ作成
set writebackup

ここ見てやりました。
Vimの全オプション
ステータス行の設定は、ぐぐってどっかで見つけたもののコピペです…

あとは関数の折りたたみとかハイライトの設定とかかな

2012/01/22

時間早い

Mac買ったり
グラボ買ったり
ケース買ったり
してました。


課題に追われてます。