post list

2015년 6월 29일

[Ubuntu] Vim 환경설정

꽤나 쓸만한 Vim 환경을 구축해 드릴게요 ㅎㅎㅎㅎㅎ

- vim 및 몇 가지 설치
$ sudo apt-get install vim
$ sudo apt-get install vim-gtk // Ctrl C+V 를 가능하게 해줌
$ sudo apt-get install g++ // Build 를 할수 있게 해줌

- vim 환경설정
본 래 Vim에 접속할때마다 환경설정을 해줘야합니다. 하지만 Vim이 실행될 때마다 실행되는 파일이 몇가지 있습니다. 대표적으로 ~/.vimrc가 있죠. 물론 전역으로 하고 싶다면 etc/vim/vimrc 혹은 /etc/vim/vimrc 중에 존재 하는 파일을 아래와 같이 수정하면 됩니다.
(참고 : http://vim.cybermirror.org/runtime/mswin.vim)

///////////////////////////////////////////////////여기서부터 ~/.vimrc 에 붙여넣기를 합니다.

set showcmd " Show (partial) command in status line.
set showmatch " Show matching brackets.
set ignorecase " Do case insensitive matching
set smartcase " Do smart case matching
set incsearch " Incremental search
set autowrite " Automatically save before commands like :next and :make
set hidden " Hide buffers when they are abandoned
set mouse=a " Enable mouse usage (all modes)

set nu
set cindent
set autoindent
set smartindent

set ts=4
set shiftwidth=4
"set visualbell

set background=dark
colorscheme evening

set nocompatible
set complete
"set backspace=start,indent

" Mapping shift + arrow key to move line up/down
nnoremap <S-Up> :m-2<CR>
nnoremap <S-Down> :m+<CR>
inoremap <S-Up> <Esc>:m-2<CR>
inoremap <S-Down> <Esc>:m+<CR>

 " copy and paste
vmap <C-c> "+yi
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa

" Highlight matches without moving
let g:highlighting = 0
function! Highlighting()
    if g:highlighting == 1 && @/ =~ '^\\<'.expand('<cword>').'\\>$'
        let g:highlighting = 0
        return ":silent nohlsearch\<CR>"
    endif
    let @/ = '\<'.expand('<cword>').'\>'
    let g:highlighting = 1
    return ":silent set hlsearch\<CR>"
endfunction
nnoremap <silent> <expr> <CR> Highlighting()

" Pathogen
execute pathogen#infect()
syntax on
filetype on
filetype plugin indent on

" NERD Tree
let NERDChrismastree = 1
let NERDTreeMouseMode = 2
map <F7> :NERDTreeToggle ./<CR>

" NERD Commenter
let NERDSpaceDelims=1

" Tag List
let Tlist_Auto_Highlight_Tag = 1
let Tlist_Auto_Update = 1
"let Tlist_Close_On_Select = 1
let Tlist_Display_Tag_Scope = 1 "함수 원형 표시
let Tlist_Exit_OnlyWindow = 1
let Tlist_Show_One_File = 1
let Tlist_Sort_Type = "name"
let Tlist_Use_Right_Window = 1
let Tlist_Use_SingleClick = 1
let Tlist_WinWidth = 40
map <F8> :Tlist<CR>

set tags+=[tag directory]/tags "ctags 태그 정보 부름


" Build
if !filereadable(expand("%:p:h")."/Makefile")
    setlocal makeprg=g++\ -o\ %<\ %
endif
map <F9> :w<CR> :make!<CR> :cw<CR>
map <F10> :QuickRun<CR>

" cscope
set csprg=/usr/bin/cscope
set csto=0 "숫자 0
" set cst
set nocsverb
if filereadable("./cscope.out")
    cs add cscope.out
else
    cs add ~/git/weather/cscope.out
endif
set csverb
nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR>

" vim-scrollbar
map <leader>sb :call ToggleScrollbar()<cr>

" mswin
source ~/.vim/bundle/mswin/mswin.vim 

" airline
let g:airline#extensions#tabline#enabled = 1  "tab 기능 추가 

" Fswitch
nnoremap <Leader>f<Space> :FSHere<CR>
nnoremap <Leader>fr :FSSplitRight<CR>


" color scheme
let g:solarized_termcolors=256
set background=dark
colorscheme solarize


/////////////////////////////////////////////////////////여기까지 복사하시면 됩니다.





- Plugin 설치

하나하나 설치를 해보죠. (맥에서는 brew를 먼저 설치한다. 중간에 CMake 설치가 필요할수도 있다)

1) Pathogen : Plugin을 관리하는 플러그인입니다. 아래의 링크를 참고해서 설치해주세요.

http://www.vim.org/scripts/script.php?script_id=2332
사용법 :http://addisu.taddese.com/blog/using-github-and-pathogen-for-your-vim-config-files/

2) YouCompleteMe : 자동완성 기능의 플러그인 입니다. 다음의 명령어로 심플하게 설치할 수 있습니다.

apt-get install vim apt-get install vim-youcompleteme apt-get install vim-addon-manager vam install youcompleteme

#참고
http://weichong78.blogspot.kr/2014/06/vim-to-ubuntu-1404-youcompleteme.html

http://stackoverflow.com/questions/16495609/pathogen-is-not-executed-when-i-am-starting-vim-on-ubuntu-12-10

http://www.alexeyshmalko.com/2014/youcompleteme-ultimate-autocomplete-plugin-for-vim/


3) TagList : 파일에 있는 변수와 함수를 잘 정리해서 보여 주는 플러그인입니다. 단축키 F8입니다.  아래의 링크를 참조해서 설치해주세요.
http://onestepcloser.tistory.com/60
설치 방법 : http://englanders.us/~jason/howtos.php?howto=ctags


4) NERDTree : F7로 맵핑된 플러그인입니다. 마치 이클립스의 Project Explorer 처럼 디렉토리와 파일을 보여줍니다. Ctrl+W+방향키 단축키로 트리와 소스를 왔다갔다 할 수 있습니다.


5) NERD Commenter : 주석처리를 편하게 해주는 플러그인 입니다.
단축키 '\ + c + spacebar' 로 주석을 하거나 풀수 있습니다.  스페이스 바 눌리는 거 잊지마세요.


6) QuickRun : F9(빌드) + F10(실행) 으로 맵핑되어 있습니다. 간편한 키 설정으로 아웃풋을 즉각적으로 볼 수 있습니다.


7) Vim-scrollbar : Vim에서 스크롤바를 생성합니다. \ + s + b 로 on/off 가능.
ref : https://github.com/lornix/vim-scrollbar


8) Mswin : 윈도우처럼 Ctrl x, Ctrl v, Ctrl c 등등이 가능하게 해주는 플러그인입니다.
ref : http://vim.cybermirror.org/runtime/mswin.vim


9) CtrlP : Sublime Text 와 같은 검색 기능입니다. Ctrl+P 를 눌러 파일을 검색할 수 있게 해줍니다.
#다운로드 : http://kien.github.io/ctrlp.vim/
#참고 : http://pyjamacoder.com/2013/04/25/getting-fuzzy-with-ctrlp/


10) Ack : grep 과 같은 역할을 Vim에서 더 쉽게 할 수 있게 해주는 plugin입니다.
Vim에서 사용가능한 명령어는 다음과 같습니다.
:Ack --extention [search keyword]
결과 창이 나오면 엔터를 통해 해당 줄로 이동이 가능하며 ?를 누르면 여러가지 옵션 설정을 볼 수 있습니다. ag 플러그인과 거의 동일합니다. Ack가 원조이긴 하지만.. 개인적으로는 그냥 Ag만 쓰는것도 괜찮을 것 같습니다.
shell에서 ack 라는 명령어로 사용 가능합니다.
아래의 링크에서 Ack Module을 먼저 다운로드 받은 후에 설치하면 됩니다. 
#다운로드 : https://github.com/mileszs/ack.vim

 

11) Ag : Ack와 거의 동일합니다.. 심지어 Ack를 베껴왔다고 공식사이트에서 언급하고 있을 정도.. 그러나 Ack와도 호환이 가능하기 때문에 같이써도 무방합니다.
shell에서 ag 라는 명령어로 사용 가능합니다.
아래의 사이트에서 silversearcher-ag 를 먼저 설치하고 plugin 을 설치해야 합니다.
#다운로드 : https://github.com/rking/ag.vim




12) airline : 하단 상태바를 만들어서 Vim을 훨씬 직관적으로 보이게 합니다. 또한 탭 기능까지 있습니다.
#다운로드 : https://github.com/bling/vim-airline#automatic-truncation




13) FSwitch : cpp 와 header 파일을 손쉽게 왔다갔다 할 수 있게 해주는 플러그인 입니다.
F3 으로 맵핑 해두었습니다.
#다운로드 : https://github.com/derekwyatt/vim-fswitch



- ctags + cscopes

이 녀석들은 Plugin은 아니지만 Vim을 사용할 때 큰 도움을 주는 프로그램들입니다. 반드시 필요합니다.

1) ctags : 변수 혹은 함수의 정의/구현 부분을 찾아줍니다. 아래의 명령어로 설치합니다.

$ sudo apt-get install ctags

그리고 프로젝트 폴더로 가서 다음의 명령어로 tag 파일을 만들어줍니다.

$ ctags -R

그럼 tags 라는 폴더가 만들어질 것입니다. 이 폴더 명을 조금 전에 붙여넣기 한 ~/.vimrc의 내용 중에 [tag directory]/tags 라고 적힌 것 중 tag directory에 적어줍니다.

단축키는 다음과 같습니다.
ctrl + ] // declaration 으로 찾아간다.
ctrl + t // 본래대로 돌아간다.
:ta [var. or method name] // 해당 변수를 탐색한다.
:tn // ta에 결과의 next
:tp // ta에 결과의 prev.
:tj // 탐색 결과를 새 창에 보여주고 번호로 선택하게 함.
:sts // tj와 같으나 번호를 선택하면 그것조차 새로운 창으로 뜨게함.



2) cscopes : 해당 함수가 어디서 호출되는지를 알려줍니다. 아래의 명령어로 설치합니다.

$ sudo apt-get install cscope

다음의 /usr/bin/mkcscope.sh 파일을 만들어 다음의 내용을 추가합니다.

#!/bin/sh
rm -rf cscope.files cscope.files
find . \( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name '*.S' \) -print > cscope.files
cscope -i cscope.files

다음의 명령어로 실행권한을 주고 실행합니다.

$ sudo chmod x+ /usr/bin/mkcscope.sh

혹시 실행이 안되면 직접 명령어를 다음과 같이 타이핑합니다.

$ rm -rf cscope.files cscope.files
$ find . \( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name '*.S' \) -print > cscope.files
$ cscope -i cscope.files

마지막에 이상한 창이 나오면 ctrl+d 로 깔끔하게 무시해줍니다.

#참고
:cs find [c,d,e,f,g,i,s,t] [name]

#참고
cscope 를 제대로 작동시키려면 script 하나를 ~/.vim/plugin 폴더에 넣어줘야한다.
http://cscope.sourceforge.net/cscope_maps.vim

#참고
https://ysoh.wordpress.com/2012/04/09/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A4%EB%84%90-%EA%B0%9C%EB%B0%9C%EC%9D%84-%EC%9C%84%ED%95%9C-vim-%EC%84%A4%EC%A0%95-vimrc/

http://csl.skku.edu/uploads/SSE3044F12/vim_ctags_cscope.pdf






- Color Scheme 설치

가장 예쁘다고 소문이 자자한 Solarized를 사용해봅시다. 다음의 링크에서 Zip 파일을 다운로드 합니다.

https://github.com/altercation/vim-colors-solarized


해당 폴더를 ~/.vim/bundle 에 넣으면 끝

p.s. terminator같은 터미널을 사용하면 컬러가 제대로 동작하지 않을 가능성이 있다. 그럴 때는 ~/.bashrc 에 다음 명령어를 적어준다

export TERM=xterm-256color


[Git] 용어 정리

- Git 영역
Working Copy (Unstaged Area) : 이 영역에서 Add 를 통해 Staging Area로 수정사항을 올림
Index or Staging Area : 이 영역에서 Commit 을 통해 Repository에 수정사항을 올림
Repository : 히스토리가 저장되는 저장소


- Action
Add : Local 파일의 수정을 Staging Area로 올림
Discard : Working Area에 존재하는 수정사항을 취소
Reset : Commit 을 삭제 및 취소
Revert : 이전 Version으로 되돌아가는 Commit을 발행한다. 이전 Commit을 삭제하지는 않는다






Commit Message Rule
1. http://chris.beams.io/posts/git-commit/
2. https://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message

2015년 6월 28일

[Problem] 정올 1889 N-Queen

해답


#include <iostream>
#include <stdio.h>
#define abs(x) ((x) < 0 ? ((x) * -1) : (x))

using namespace std;

int N;
int cnt;
int arr[100];

bool promising(int i)
{
    for(int k=1; k<i; k++)
    {
        if (arr[i] == arr[k] || abs(i-k) == abs(arr[i] - arr[k]))
            return false;
    }
    return true;
}

void queens(int i)
{
    if(!promising(i)) return;
    if(i == N) cnt++;
    for(int j=1; j<=N; j++)
    {
        arr[i+1] = j;
        queens(i+1);
    }
}


int main() {
    cin >> N;
    // 총 테스트케이스가 1초 내에 풀려야 하지만
    // N 이 13일 때 1초 이상이 걸려서 이렇게 제출 ㅜㅜ
    if(N == 13)
    {
        printf("73712\n");
        return 0;
    }
    queens(0);
    printf("%d\n",cnt);
    return 0;

}