iTerm2 + tmux + vim == Awesome IDE

코딩툴/에디터로 MacVim을 애용하왔는데 Vim and tmux on OSX를 보고 iTerm2에서 Play! 콘솔을 실행하고 MacVim에서 코딩하던 화면을 최적화할 수 있겠다 싶어 전환한다. Vim and tmux on OSX에서 발췌한 할 일은 다음과 같다.

  • 새로운 vim 설치
  • tmux 설치
  • .tmux.conf 설정

새로운 vim 설치

brew install https://raw.github.com/Homebrew/homebrew-dupes/master/vim.rb

Homebrew 공식 저장소에는 vim이 없다. 다른 저장소를 이용하여 vim을 설치할 수 있다. ‘Vim and tmux on OSX’과는 url이 다르다. 이유는 dupes 저장소가 별도로 분리되었기 때문이다.

vim 설치 후 paste(p)할 때 발생하는 register문제를 수정하기 위해 https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard 를 방문하여 설명대로 해법을 적용시켜준다.

Mac OSX에는 이미 vim이 설치되어있다. 이 것 대신 새로이 설치한 vim을 사용하려면

cd /usr/bin
sudo rename vim _vim
sudo ln -s /usr/local/bin/vim vim

tmux 설치

brew install tmux

.tmux.conf 설정

# C-b인 prefix 키를 C-f로 변경한다. 개인적인 취향.
set-option -g prefix C-f
# o 키가 pane(패널)간 전환인데 자꾸 Ctrl키가 함께 눌려진다.
# 그래서 pane 위치를 변경하는 C-o를 꺼버린다.
unbind C-o
# prefix 키를 두번 눌러, 빠르게 pane간 전환
bind-key C-f last-pane

# reload tmux.conf
bind r source-file ~/.tmux.conf

set -g default-terminal "screen-256color"
set -g mode-mouse on

# 기본 키 바인딩을 쉽게 인식되는 키로 변경
unbind %
bind | split-window -h
bind - split-window -v

# 인식성을 높이기 위해
# 현재 윈도우명을 흰색으로 강조
set-window-option -g window-status-current-fg white

# vim 사용시 필요.
# 시스템 클립보드와 연동시킬 때 문제 수정해줌.
set-option -g default-command "reattach-to-user-namespace -l zsh"

tmux 사용법

Terminal vim을 위한 vimrc 변경

" Map to switch tabs
map  <leader>1 :tabn 1<CR>
imap <leader>1 <Esc> :tabn 1<CR>
map  <leader>2 :tabn 2<CR>
imap <leader>2 <Esc> :tabn 2<CR>
map  <leader>3 :tabn 3<CR>
imap <leader>3 <Esc> :tabn 3<CR>
map  <leader>4 :tabn 4<CR>
imap <leader>4 <Esc> :tabn 4<CR>
map  <leader>5 :tabn 5<CR>
imap <leader>5 <Esc> :tabn 5<CR>
map  <leader>6 :tabn 6<CR>
imap <leader>6 <Esc> :tabn 6<CR>
map  <leader>7 :tabn 7<CR>
imap <leader>7 <Esc> :tabn 7<CR>
map  <leader>8 :tabn 8<CR>
imap <leader>8 <Esc> :tabn 8<CR>

MacVim에서는 Command-숫자 조합으로 탭을 선택하도록 사용해왔다. Command-숫자는 iTerm2에서 사용하므로 조합으로 변경한다.

" 모드에 따라 cursorline 보이고 안보이고
set nocursorline
if version >= 700
    au InsertEnter * set cursorline
    au InsertLeave * set nocursorline
endif

MacVim을 사용하다 원래의 vim으로 전환하면서 가장 불편한 점이 모드에 따라 커서가 변하지 않는 점이다. MacVim에서 커서는 insert mode일 때는 실선, 기타 모드에서는 사각형 모양으로 변한다.

아쉬운데로 cursorline을 이용하여 시각적인 변화를 주어 보완한다.


Play framework 2.0 소스 빌드 절차

1:$ git clone git://github.com/playframework/Play20.git
2:$ cd Play20/framework
3:$ clean
4:$ build
5:> publish-local

4: SBT 실행
5: compile, package, publish in local repository


3. Git Branching

Branch

  • Git의 브랜치는 어떤 한 커밋을 가리키는 40글자의 SHA-1 체크섬 파일에 불과하다.
  • 즉, Branch는 commit 객체를 가리키는 pointer일 뿐이다.

merge 전merge 후

$git branch newbranch
$git checkout newbranch
$git checkout master
$git merge newbranch

Rebase

rebase 전rebase 후

$ git checkout newbranch
$ git rebase master

이미 공개 저장소에 Push한 커밋을 Rebase하지 말라

Merge vs Rebase

  • Rebase를 하든지, Merge를 하든지 최종 결과물은 같고 커밋 히스토리만 다르다.
  • Rebase는 기존의 커밋을 그대로 사용하는 것이 아니라 내용은 같지만 다른 커밋을 새로 만든다.

4. Git on the Server

  • 공동으로 사용할 수 있는 저장소 :
    • Git Server == Remote repository
    • Bare 저장소: 일반 프로젝트와 같으나 .git 디렉토리만 있다.
  • 프로토콜 : Local, SSH, Git, HTTP
  • workflow : clone, push, pull

Protocols

Local Protocol

  • 서버가 없을 때
  • server에 push하기 전, 지역 동료의 한 일 확인. git pull /home/who/project

SSH Protocol

  • common : 읽기/쓰기
  • git clone ssh://user@server:project.git
  • git clone user@server:project.git
  • 익명으로 접근 할 수 없다.

Git Protocol

  • 읽기 전용
  • 인증 절차가 없다.
  • 전송속도 가장 빠르다

HTTP/S Protocol

  • 읽기/쓰기
  • 구축/설정이 정말 쉽다.
  • 비효율. 클라이언트측에서는 상대적으로 느리다.

웹서버의 document root 아래에 bare 저장소를 만든다.

$ cd /var/www/htdocs/
$ git clone --bare /path/to/git_project gitproject.git
$ cd gitproject.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update

Gitosis

기본적으로 authorized_keys 파일을 관리하고 접근제어를 돕는 스크립트 패키지다.

사용자가 수백명을 넘어 관리가 힘뜰 때 사용.

Gitolite

꼼꼼한 접근 제어. 브랜치, 태그에도 권한을 명시 할 수 있다.

Hosted Git

  • github
    • 가장 큰 오픈소스 Git 호스팅 사이트.
    • 비공개(Private) 프로젝트에 대한 호스팅 서비스도 제공

5. Distributed Git

Workflow

중앙집중식 Workflow

  • SVN과 동일
  • 항상 : pull —> merge —> push

Integration-Manager Workflow

  • 저장소를 여러개 운영. manger는 쓸 수 있고 다른 개발자는 읽기만 하는 대표 저장소.
  1. 관리자(통합책임): 메인 저장소 push
  2. 개발자: clone
  3. 개발자: 자신의 저장소에 push
  4. 개발자: pull request
  5. 관리자: merge, 테스트
  6. 관리자: main 저장소 push

Dictator and Lieutenants Workflow

  • 아주 큰 프로젝트
  1. 개발자: rebase (master of lieutenant)
  2. Lieutenants: merge
  3. Dictator: merge
  4. Dictator: push

기여/협업

commit 가이드

  • 불필요한 공백: git diff —check
  • 친절한 커밋 메시지. 현재형으로 작성.

커밋 메시지 예)

영문 50글자 이하의 간략한 수정 요약

자세한 설명. 영문 72글자 이상이 되면 줄 바꿈을 하고 이어지는 내용을
작성한다. 특정 상황에서는 첫 번째 줄이 이메일 메시지의 제목이 되고
나머지는 메일 내용이 된다. 간략한 요약 이후에 넣는 빈 줄은 자세한 
설명을 아예 쓰지 않는 한 매우 중요하다.

이어지는 추가적인 내용은 한 줄 띄우고 쓴다.

 - 목록 표시도 사용할 수 있다.

 - 보통 '-' 나 '*' 표시를 사용해서 목록을 표현하고 표시 앞에 공백
   하나, 각 목록 사이에는 빈 줄을 하나를 넣는데 상황에 따라 다르다.

5.3 프로젝트 관리는 다음에…