2013年3月21日木曜日

vimのキーマッピングを学ぶ

ここまでの.vimrcはただ先人たちのモノをコピペする簡単なお仕事だったので、とりあえず少しづつ学習していこうと思います。
キーマッピング
コマンド ノーマルモード 挿入モード コマンドラインモード ビジュアルモード
map/noremap
nmap/nnoremap
imap/inoremap
cmap/cnoremap
vmap/vnoremap
map!/noremap!

mapとnoremap

  • map系
  • キーシーケンスを展開したあと、さらに別のマップを適応しようとする
  • noremap系
  • 一度だけ展開する

Vimのキーマッピング

キーマッピングの設定は各モードごとに独立しています。
上記の様にモードごとに設定します。 例)ノーマルモードで設定したものは、コマンドモードでは適応されないとか。

特殊なキーの指定

方向キーや修飾キー付きのキーなど、特殊なキーをキーマッピングで指定したい場合は、<>記法を使うそうです。
mapのオプション
オプション 説明
<silent> コマンドラインへの表示を抑制。キーマッピングからコマンドを実行する場合に指定
<unique> すでにキーマッピングが存在する場合、エラーにします。通常は上書きされる
<buffer> バッファローカルなキーマッピングを定義
<expr> マップ先の文字列をVim式とみなして、評価した結果を文字列のマップ先とする
ここで、IDEの機能でよくある括弧の自動挿入の機能を実現してみます。
したのようにしてみました。
今回は、挿入モードの時の設定なので、inoremapと使います。(一度しか展開されないやつですね。)
それぞれの括弧を入力したら、遂になる括弧の閉じる方を自動的に挿入して、で←を押して括弧のなかに移動しています。
長々と書いて来ましたが、今回はこのへんで失礼します。

最後までお読み頂きありがとうございました。

2013年3月18日月曜日

jsl.vimの導入する

Node.jsの本にはjsl.vimいいよ書いてあったので、入れてみようと思います。

参考サイト様

  • 最新の JavaScript Lint をインストールする -mollifier delta blog-

    環境

    • Ubuntu12.04LTS
    • python 2.7.3

    下準備

    以下のパッケージをインストールする
    $ sudo apt-get install build-essential
    $ sudo apt-get install python-dev
    

    JavaScript Lintのインストール

    $ svn co https://javascriptlint.svn.sourceforge.net/svnroot/javascriptlint javascriptlint
    
    いろいろ落としてきます。 最新を使いたいので、trunkを使います。
    $ cd javascriptlint/trunk
    では、ビルドしてインストールしていきます。
    $ python setup.py build
    $ sudo python setup.py install
    ...
    changing mode of /usr/local/bin/jsl to 775
    ..
    /usr/local/bin/jslが本体みたいですね。

    動作確認

    tests にテスト用ファイルがあるので、試してみます。
    $ jsl jsl tests/errors/syntax_error.js
    
    ちなみに、こんなコードでした。
    function syntax_error() {
        &; /*warning:syntax_error*/
    }
    実行結果
    JavaScript Lint
    Developed by Matthias Miller (http://www.JavaScriptLint.com)
    /home/typosterr/javascriptlint/trunk/tests/errors/syntax_error.js
    /home/typosterr/javascriptlint/trunk/tests/errors/syntax_error.js(2): warning: s
    yntax_error
    
    0 error(s), 1 warnings(s)
    
    うまくいったみたいです。 ここで、jslのヘルプを見てみましょう。
    $ jsl -h
    Usage: jsl [options] [files]
    
    Options:
      -h, --help          show this help message and exit
      --conf=CONF         set the conf file
      --profile           turn on hotshot profiling
      --recurse           recursively search directories on the command line
      --enable-wildcards  resolve wildcards in the command line
      --dump              dump this script
      --unittest          run the python unittests
      --quiet             minimal output
      --verbose           verbose output
      --nologo            suppress version information
      --nofilelisting     suppress file names
      --nosummary         suppress lint summary
      --help:conf         display the default configuration file
    
    なので、さくっと見たいときは
    $ jsl --nologo --nosummary --nofilelisting tests/errors/syntax_error.js
    /home/typosterr/javascriptlint/trunk/tests/errors/syntax_error.js(2): warning: syntax_error
    
    こんな感じになります。

    vimの設定

    vimで開いているファイルのチェックを可能に。
    ~/.vim/compiler/jsl.vim に記述。
    if exists("current_compiler")
        finish
    endif
    
    let current_compiler = "jsl"
    
    if exists(":CompilerSet") != 2
        command -nargs=* CompilerSet setlocal 
    endif
    
    let s:cpo_save = &cpo
    set cpo-=C
    
    CompilerSet makeprg=jsl\ --nologo\ --nofilelisting\ --nosummary\ %
    CompilerSet errorformat=%f(%l):\ %m
    
    let &cpo = s:cpo_save
    unlet s:cpo_save
    
    ~/.vim/after/ftplugin/jsl.vim に以下を記述。
    compiler jsl
    
    if !exists('b:undo_ftplugin')
        let b:undo_ftplugin = ''
    endif
    
    let b:undo_ftplugin .= '
    \ | setlocal makeprg<
    \ | setlocal errorformat<
    \'
    
    .vimrcに以下を記述
    " JavaScript Lint
    if !exist('b:current_compiler')
      compiler jsl
    endif
    autocmd QuickFixCmdPost make copen
    
    これで、準備が整いました。
    サンプルとして以下のようなファイルを作って、実行したいと思います。
    [1, 2, 3, 4, 5].forEach(function (n) {
        console.log(n * n)
    })
    
    これをSample.jsとかにしてvimで開きます。
    其の状態で:makeを打つと

    quickfixウィンドウを消すときは:ccloseと打ちます。
    とりあえず、できたみたいだけど設定ファイルがわけがわからないよ。

    追記

    Google Closure Linter gjslint
    googleさんのGoogle JavaScript Style Guideにあわせたものもあるみたいです。

    最後までお読みいただきありがとうございました。

  • vimの基本的な設定をする

    ついに、IDE厨な僕もvimを使うことを強いられたので、巷で流行の設定くらい出来ないといけないなと思い、筆をとりました。

    環境

    • Ubuntu12.04LTS
    • vim@7.3.429

    やること

    • NeoBundleの導入
    • チョコっとキーバインディングの設定
    • カラースキームの変更

    NeoBundleとは

    Hack #238: neobundle.vim で plugin をモダンに管理する -vim-users.jp-

    NeoBundleの導入

    vimのプラグインは、こいつを使ってみたいと思います。

    インストール

    インストールは簡単で以下の通りです。
    mkdir -p ~/.vim/bundle
    git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
    git clone https://github.com/Shougo/vimproc ~/.vim/bundle/vimproc
    以下は、作者様のgithubからの.vimrcのSampleです。
    set nocompatible               " Be iMproved
    
     if has('vim_starting')
       set runtimepath+=~/.vim/bundle/neobundle.vim/
     endif
    
     call neobundle#rc(expand('~/.vim/bundle/'))
    
     " Let NeoBundle manage NeoBundle
     NeoBundleFetch 'Shougo/neobundle.vim'
    
     " Recommended to install
     " After install, turn shell ~/.vim/bundle/vimproc, (n,g)make -f your_machines_makefile
     NeoBundle 'Shougo/vimproc'
    
     " My Bundles here:
     "
     " Note: You don't set neobundle setting in .gvimrc!
     " Original repos on github
     NeoBundle 'tpope/vim-fugitive'
     NeoBundle 'Lokaltog/vim-easymotion'
     NeoBundle 'rstacruz/sparkup', {'rtp': 'vim/'}
     " vim-scripts repos
     NeoBundle 'L9'
     NeoBundle 'FuzzyFinder'
     NeoBundle 'rails.vim'
     " Non github repos
     NeoBundle 'git://git.wincent.com/command-t.git'
     " Non git repos
     NeoBundle 'http://svn.macports.org/repository/macports/contrib/mpvim/'
     NeoBundle 'https://bitbucket.org/ns9tks/vim-fuzzyfinder'
    
     " ...
    
     filetype plugin indent on     " Required!
     "
     " Brief help
     " :NeoBundleList          - list configured bundles
     " :NeoBundleInstall(!)    - install(update) bundles
     " :NeoBundleClean(!)      - confirm(or auto-approve) removal of unused bundles
    
     " Installation check.
     NeoBundleCheck
    
    この状態で、vimを立ち上げて:NeoBundeInstallで.vimrcに記述したプラグインがインストールされます。
    簡単ですね。
    また、上記のように削除したい場合は、.vimrcから記述を削除して:NeoBundleCleanとすればアンインストールされます。

    チョコっとキーバインディングの設定

    hjklの移動も良いのですが、Insertモードの時にEmacs風のキー移動がしたいと思ったので、設定してみました。
    .vimrcにこんな記述をしました。
  • 参考:cocopon / dotfiles

    カラースキームの変更


    参考サイト様
  • [vim] 黒背景好きの僕の心を揺さぶるカラースキーム「hybrid」
  • 題名とは異なるのですが、jellybeansにしてみます。
    とはいっても、これもNeoBundleで管理できるみたいですね。

    必要なplugin

    NeoBundle 'ujihisa/unite-colorscheme'

    を追加して、好きなカラースキームのリポジトリも追加します。
    今回なら、

    NeoBundle 'nanotech/jellybeans.vim'

    ですね。
    deaultでカラースキームの指定する場合は、

    colorscheme jellybeans[カラースキーム名]

    をそれぞれ、.vimrcに追加します。
    要は、
    NeoBundle 'nanotech/jellybeans.vim'
    " color scheme
    colorscheme jellybeans
    こんな感じになるのでしょうか?
    後は、NeoBundleInstallでプラグインをインストールして、vimを再起動させればOKですかね。
    また、ujihisa/unite-colorscheme(Shougo/unite.vimが必要)を使用すると、vimの起動中にカラースキームを変更できます。

    :Unite colorscheme -auto-preview

    と、コマンドモードで入力すると
    カラースキームの一覧が表示され、インタラクティブにプレビューすることができ、変更できます。
    便利ですね。

    これから、vimを使用する機会が増えそうなので、もっともっと精進していきます。


    最後まで、お読み頂きありがとうございました。

    2013年3月16日土曜日

    Ubuntu12.04LTSにNode環境を構築する

    久々の更新になってしまいました。
    今回は、Nodeの勉強がてら開発環境を構築していきます。

    Nodeとは

    Ryan Dahlという開発者が作った、サーバサイドのプラットフォーム。
    プログラミング言語でも、ライブラリでも、フレームワークでもない。
    現在のstatableはv0.10.0
    http://nodejs.org

    経緯

    アイディアは元からあったのですが、一人だと怠けてしまいますよね。なので、出来る先輩と、出来る後輩が興味があるとわかったので巻き込んでみました。
    サーバの手配は言い出しっぺの自分がやって、ユーザの登録とか、GitLabのリポジトリの登録とかしました。
    折角なので、継続的デリバリーを盛り込んで、Jenkins,TDD,BDD,を組み合わせみたいと思ってます。
    って、まずはJavaScriptから勉強しないとなぁ。
    その前に、nodeのバージョン管理マネージャであるnodebrewをインストールしたいと思います。
    $ curl https://raw.github.com/hokaccha/nodebrew/master/nodebrew | perl - setup
    プログラム 'curl' はまだインストールされていません。  次のように入力することでインストールできます:
    sudo apt-get install curl
    $ sudo apt-get install curl
    [sudo] password for typosterr: 
    パッケージリストを読み込んでいます... 完了
    依存関係ツリーを作成しています                
    状態情報を読み取っています... 完了
    以下のパッケージが自動でインストールされましたが、もう必要とされていません:
      linux-headers-3.2.0-36-generic-pae linux-headers-3.2.0-30
      linux-headers-3.2.0-30-generic-pae linux-headers-3.2.0-36
    これらを削除するには 'apt-get autoremove' を利用してください。
    以下のパッケージが新たにインストールされます:
      curl
    アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
    137 kB のアーカイブを取得する必要があります。
    この操作後に追加で 346 kB のディスク容量が消費されます。
    警告: 以下のパッケージは認証されていません!
      curl
    検証なしにこれらのパッケージをインストールしますか [y/N]? y
    取得:1 http://jp.archive.ubuntu.com/ubuntu/ precise/main curl i386 7.22.0-3ubuntu4 [137 kB]
    137 kB を 0秒 で取得しました (425 kB/s)
    以前に未選択のパッケージ curl を選択しています。
    (データベースを読み込んでいます ... 現在 206702 個のファイルとディレクトリがインストールされています。)
    (.../curl_7.22.0-3ubuntu4_i386.deb から) curl を展開しています...
    man-db のトリガを処理しています ...
    curl (7.22.0-3ubuntu4) を設定しています ...
    typosterr@Ptolemaios:~$ curl https://raw.github.com/hokaccha/nodebrew/master/nodebrew | perl - setup
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 18289  100 18289    0     0  21188      0 --:--:-- --:--:-- --:--:-- 26015
    fetching nodebrew...
    install nodebrew in $HOME/.nodebrew
    
    ========================================
    Add path:
    
    export PATH=$HOME/.nodebrew/current/bin:$PATH
    ========================================
    $
    
    あと、お好きなリソースファイルにパスを通すだけです。
    $ vim .bashrc 
    $ source .bashrc 
    
    簡単ですね。
    では、実際に使ってみましょう。
    $ nodebrew ls-remote # インストールできるバージョンを表示
    v0.0.1    v0.0.2    v0.0.3    v0.0.4    v0.0.5    v0.0.6    
    
    v0.1.0    v0.1.1    v0.1.2    v0.1.3    v0.1.4    v0.1.5    v0.1.6    v0.1.7
    v0.1.8    v0.1.9    v0.1.10   v0.1.11   v0.1.12   v0.1.13   v0.1.14   v0.1.15
    v0.1.16   v0.1.17   v0.1.18   v0.1.19   v0.1.20   v0.1.21   v0.1.22   v0.1.23
    v0.1.24   v0.1.25   v0.1.26   v0.1.27   v0.1.28   v0.1.29   v0.1.30   v0.1.31
    v0.1.32   v0.1.33   v0.1.90   v0.1.91   v0.1.92   v0.1.93   v0.1.94   v0.1.95
    v0.1.96   v0.1.97   v0.1.98   v0.1.99   v0.1.100  v0.1.101  v0.1.102  v0.1.103
    v0.1.104  
    
    v0.2.0    v0.2.1    v0.2.2    v0.2.3    v0.2.4    v0.2.5    v0.2.6    
    
    v0.3.0    v0.3.1    v0.3.2    v0.3.3    v0.3.4    v0.3.5    v0.3.6    v0.3.7
    v0.3.8    
    
    v0.4.0    v0.4.1    v0.4.2    v0.4.3    v0.4.4    v0.4.5    v0.4.6    v0.4.7
    v0.4.8    v0.4.9    v0.4.10   v0.4.11   v0.4.12   
    
    v0.5.0    v0.5.1    v0.5.2    v0.5.3    v0.5.4    v0.5.5    v0.5.6    v0.5.7
    v0.5.8    v0.5.9    v0.5.10   
    
    v0.6.0    v0.6.1    v0.6.2    v0.6.3    v0.6.4    v0.6.5    v0.6.6    v0.6.7
    v0.6.8    v0.6.9    v0.6.10   v0.6.11   v0.6.12   v0.6.13   v0.6.14   v0.6.15
    v0.6.16   v0.6.17   v0.6.18   v0.6.19   v0.6.20   v0.6.21   
    
    v0.7.0    v0.7.1    v0.7.2    v0.7.3    v0.7.4    v0.7.5    v0.7.6    v0.7.7
    v0.7.8    v0.7.9    v0.7.10   v0.7.11   v0.7.12   
    
    v0.8.0    v0.8.1    v0.8.2    v0.8.3    v0.8.4    v0.8.5    v0.8.6    v0.8.7
    v0.8.8    v0.8.9    v0.8.10   v0.8.11   v0.8.12   v0.8.13   v0.8.14   v0.8.15
    v0.8.16   v0.8.17   v0.8.18   v0.8.19   v0.8.20   v0.8.21   v0.8.22   
    
    v0.9.0    v0.9.1    v0.9.2    v0.9.3    v0.9.4    v0.9.5    v0.9.6    v0.9.7
    v0.9.8    v0.9.9    v0.9.10   v0.9.11   v0.9.12   
    
    v0.10.0  
    
    $ nodebrew install 0.8.22 0.10.0
    
    コンパイラが無いのをおもいだしたので、、
    $ sudo apt-get install build-essential
    パッケージリストを読み込んでいます... 完了
    依存関係ツリーを作成しています                
    状態情報を読み取っています... 完了
    以下のパッケージが自動でインストールされましたが、もう必要とされていません:
      linux-headers-3.2.0-36-generic-pae linux-headers-3.2.0-30 linux-headers-3.2.0-30-generic-pae linux-headers-3.2.0-36
    これらを削除するには 'apt-get autoremove' を利用してください。
    以下の特別パッケージがインストールされます:
      dpkg-dev fakeroot g++ g++-4.6 libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libdpkg-perl libstdc++6-4.6-dev libtimedate-perl
    提案パッケージ:
      debian-keyring g++-multilib g++-4.6-multilib gcc-4.6-doc libstdc++6-4.6-dbg libstdc++6-4.6-doc
    以下のパッケージが新たにインストールされます:
      build-essential dpkg-dev fakeroot g++ g++-4.6 libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libdpkg-perl libstdc++6-4.6-dev libtimedate-perl
    アップグレード: 0 個、新規インストール: 11 個、削除: 0 個、保留: 0 個。
    9,250 kB のアーカイブを取得する必要があります。
    この操作後に追加で 27.4 MB のディスク容量が消費されます。
    続行しますか [Y/n]? y
    警告: 以下のパッケージは認証されていません!
      libstdc++6-4.6-dev g++-4.6 g++ libtimedate-perl libdpkg-perl dpkg-dev build-essential fakeroot libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl
    検証なしにこれらのパッケージをインストールしますか [y/N]? y
    取得:1 http://jp.archive.ubuntu.com/ubuntu/ precise/main libstdc++6-4.6-dev i386 4.6.3-1ubuntu5 [1,643 kB]
    取得:2 http://jp.archive.ubuntu.com/ubuntu/ precise/main g++-4.6 i386 4.6.3-1ubuntu5 [6,745 kB]
    取得:3 http://jp.archive.ubuntu.com/ubuntu/ precise/main g++ i386 4:4.6.3-1ubuntu5 [1,444 B]
    取得:4 http://jp.archive.ubuntu.com/ubuntu/ precise/main libtimedate-perl all 1.2000-1 [41.6 kB]
    取得:5 http://jp.archive.ubuntu.com/ubuntu/ precise-updates/main libdpkg-perl all 1.16.1.2ubuntu7.1 [180 kB]
    取得:6 http://jp.archive.ubuntu.com/ubuntu/ precise-updates/main dpkg-dev all 1.16.1.2ubuntu7.1 [469 kB]
    取得:7 http://jp.archive.ubuntu.com/ubuntu/ precise-updates/main build-essential i386 11.5ubuntu2.1 [5,796 B]
    取得:8 http://jp.archive.ubuntu.com/ubuntu/ precise/main fakeroot i386 1.18.2-1 [87.9 kB]
    取得:9 http://jp.archive.ubuntu.com/ubuntu/ precise/main libalgorithm-diff-perl all 1.19.02-2 [50.7 kB]
    取得:10 http://jp.archive.ubuntu.com/ubuntu/ precise/main libalgorithm-diff-xs-perl i386 0.04-2build2 [12.9 kB]
    取得:11 http://jp.archive.ubuntu.com/ubuntu/ precise/main libalgorithm-merge-perl all 0.08-2 [12.7 kB]
    9,250 kB を 5秒 で取得しました (1,699 kB/s)     
    以前に未選択のパッケージ libstdc++6-4.6-dev を選択しています。
    (データベースを読み込んでいます ... 現在 206718 個のファイルとディレクトリがインストールされています。)
    (.../libstdc++6-4.6-dev_4.6.3-1ubuntu5_i386.deb から) libstdc++6-4.6-dev を展開しています...
    以前に未選択のパッケージ g++-4.6 を選択しています。
    (.../g++-4.6_4.6.3-1ubuntu5_i386.deb から) g++-4.6 を展開しています...
    以前に未選択のパッケージ g++ を選択しています。
    (.../g++_4%3a4.6.3-1ubuntu5_i386.deb から) g++ を展開しています...
    以前に未選択のパッケージ libtimedate-perl を選択しています。
    (.../libtimedate-perl_1.2000-1_all.deb から) libtimedate-perl を展開しています...
    以前に未選択のパッケージ libdpkg-perl を選択しています。
    (.../libdpkg-perl_1.16.1.2ubuntu7.1_all.deb から) libdpkg-perl を展開しています...
    以前に未選択のパッケージ dpkg-dev を選択しています。
    (.../dpkg-dev_1.16.1.2ubuntu7.1_all.deb から) dpkg-dev を展開しています...
    以前に未選択のパッケージ build-essential を選択しています。
    (.../build-essential_11.5ubuntu2.1_i386.deb から) build-essential を展開しています...
    以前に未選択のパッケージ fakeroot を選択しています。
    (.../fakeroot_1.18.2-1_i386.deb から) fakeroot を展開しています...
    以前に未選択のパッケージ libalgorithm-diff-perl を選択しています。
    (.../libalgorithm-diff-perl_1.19.02-2_all.deb から) libalgorithm-diff-perl を展開しています...
    以前に未選択のパッケージ libalgorithm-diff-xs-perl を選択しています。
    (.../libalgorithm-diff-xs-perl_0.04-2build2_i386.deb から) libalgorithm-diff-xs-perl を展開しています...
    以前に未選択のパッケージ libalgorithm-merge-perl を選択しています。
    (.../libalgorithm-merge-perl_0.08-2_all.deb から) libalgorithm-merge-perl を展開しています...
    man-db のトリガを処理しています ...
    libtimedate-perl (1.2000-1) を設定しています ...
    libdpkg-perl (1.16.1.2ubuntu7.1) を設定しています ...
    dpkg-dev (1.16.1.2ubuntu7.1) を設定しています ...
    fakeroot (1.18.2-1) を設定しています ...
    update-alternatives: /usr/bin/fakeroot (fakeroot) を提供するために 自動モード で /usr/bin/fakeroot-sysv を使います。
    libalgorithm-diff-perl (1.19.02-2) を設定しています ...
    libalgorithm-diff-xs-perl (0.04-2build2) を設定しています ...
    libalgorithm-merge-perl (0.08-2) を設定しています ...
    libstdc++6-4.6-dev (4.6.3-1ubuntu5) を設定しています ...
    g++-4.6 (4.6.3-1ubuntu5) を設定しています ...
    g++ (4:4.6.3-1ubuntu5) を設定しています ...
    update-alternatives: /usr/bin/c++ (c++) を提供するために 自動モード で /usr/bin/g++ を使います。
    build-essential (11.5ubuntu2.1) を設定しています ...
    いよいよ、インストールしていきます。
    $ nodebrew install 0.8.22 0.10.0 #引数は1つまでらしいです。なので、再度0.10.0をインストール
    
    $ nodebrew list #nodebrewでインストール済みのnodeのバージョンを表示
    v0.8.22
    v0.10.0
    
    current: none
    $ nodebrew use 0.8.22 #採用するnodeのバージョンを指定
    use v0.8.22
    $ npm --version #npmはnodeのパッケージ管理マネージャ
    1.2.14
    
    簡単ですね。

    2013/03/16 追記

    TODO

    Better JavaScript Indentation
    jsl.vim ->書きました
    quickrun
    これら3つのvimのプラグインの導入をする。

    最後までお読みいただきありがとうございました。