2012-01-15 1 views
2

vi (vim)과 emacs 사이의 주된 차이점 중 하나는 emacs가 설계되고 종료하지 않고 때때로 실행되도록되어 있습니다. 정력의 빠른로드 시간으로 인해 작업을 종료하고 시작하는 것이 더 쉬워집니다. 나는이 두 편집자 사용자가 문화적으로 차이가 있음을 읽었습니다.vi (vim) 편집기를 종료하고 여는 습관을 바꾸시겠습니까?

편집자가 항상 작동하도록 유지하는 것이 생산성 향상에 도움이된다고 생각하는 경향이 있습니다. 무엇인가 진행 중이므로 다시 시작할 필요가 없습니다. 단일 vim 세션을 실행하고 거기에서 모든 작업을 수행하는 데있어 최고의 트릭과 플러그인은 무엇입니까?

예를 들어 파이썬 프로그램을 편집 한 다음 appengine appcfg를 실행하고 돌아갑니다. 때때로 다른 파일을 열려면 현재 파일을 종료하십시오. 아직 여러 개의 파일을 편집하고 싶다면 버퍼와 탭의 개념에 익숙하지 않고 화면 세션에서 vim을 실행하십시오.

+2

vim을 닫지 마십시오 ... – aqua

+0

another open? Doe는 도움이 안돼. –

+2

화면 세션에서 vim을 실행하여 여러 파일을 편집하는 방법은 무엇입니까? 한 번에 하나의 파일을 편집 중입니다! 플러그인에 대해 물어보기 전에 실제로 버퍼와 탭을 배우려고 노력해야합니다. –

답변

7

그래서 하나를 실행 스크린 세션 당 Vim 파일? 그것은 꽤 나쁜 사람이라고 들린다. Vim에서 여러 파일을 쉽게 사용할 수있는 특별한 플러그인이 필요하지 않습니다. 그냥 내가 자동으로 현재 활성화되어 어떤 버퍼에 현재 작업 디렉토리를 변경 내 .vimrcautochdir을 설정 한

:e /home/project/myfile.py 

을한다. 그래서 당신은 일단 해당 파일은 그냥 BTW 그래서 당신은 그 일을하고 있는지 확인 탭 완성 완료 할 수 있습니다 빔의 모든 파일을 열

:e myfile2.py 
:e myfile3.py 

등을 할 수 엽니 다. 당신은 그냥 할 사이를 전환 할 수 열려있는 버퍼의 무리가 있으면 그냥 :b 1를 입력하고 탭을 치고 그것이 슈퍼 그래서 당신이 myfile1.py 개방을 원하는 알아낼 것입니다 수 있습니다 당신은 또한 탭 완성을 사용할 수 있습니다

:b myfile1.py 

빠른 일반 파일 이름을 기억할 수있는 경우 하나 이상의 비슷한 일치하는 경우 탭을 통해 목록을 제공합니다. 이를 위해 wildmodewildmenu 설정을 살펴보고 향상된 탭 완성 메뉴를 제공하는 설정을 확인하는 것이 좋습니다. 언제든지 당신은 당신이 할 수있는보고 원하는 버퍼가 열려 무엇으로 길을 잃지 시작하면 바로

:ls 

을하고 그것은 당신에게 열려있는 모든 것을 보여줄 것이다.

은 또한 예를 들어 !

:!ls 

으로 명령을 이전하여 외부 명령을 실행할 수 있습니다 기억하십시오. 희망이 좀 도움이되거나 최소한 당신이 올바른 방향으로 찾고 있습니다.

+0

이 팁을 가져 주셔서 감사합니다. 나는 알지 못했습니다 : e 탭 완성 기능. 내가했을 때 : e, 나는 파일 시스템에서 파일을 찾아야했고, vim 내에서 파일 시스템을 탐색하기가 번거로웠다. 때때로 나는 다음을 사용했다 : Explore 또는 : Sexplore –

+0

플러그인 NERDTree와 FuFBuffer를 보라. –

+1

@ ThePosey, 이제 버퍼를 더 효과적으로 사용하기 시작했습니다. 주제에 대해 감사드립니다. 나를 더 나은 vim 사용자로 만듭니다. –

1

쉘에서 물건을 실행하려면 :! 명령을 사용하십시오. 그것은 :cd% 확장에 큰 혼합

bash> vim path/to/ex.c 
... 
:cd %:h. " move to path/ex/ 
:!gcc -o %:r % && %:r " compile ex.c into ex and run it 

현재 버퍼에 명령의 출력을 넣어하려는 경우도 :read와 혼합 할 수 있습니다

:read !ls " read in the names of all the files in the current directory 
3

: 쉬를하고, 쉘에서 exit를 사용하여 Vim으로 돌아 간다. 동일한 Vim에서 여러 파일을 편집하려면 다음을 사용할 수 있습니다. vsplit filename 또는 : 파일 이름 분리 (세로 및 가로 분할의 경우). 그런 다음 Esc + Ctrl + w + 화살표 키를 사용하여 여러 가지 분할을 탐색합니다. 이렇게하면 탭이 필요하지 않습니다. 작은 코드 조각으로 작업하는 경우 특히 효과적입니다.

5

모든 다른 세 더한 말했다 : set hidden

  • 당신이 그것을 저장 아니에요 경우에도 현재의 장소에 새로운 버퍼를 열 수 있습니다. Vim을 닫을 필요없이 수십 개의 버퍼를 열 수 있습니다! :help windows 또는 Vimwiki을 참조하십시오.

  • Vim이 올바른 플래그 (+clientserver)로 컴파일되었다고 가정하면, 단일 Vim을 "서버"(터미널 창 A)로 실행하고 단일 Vim에서 모든 파일을 열 수 있습니다 (터미널 창 B에서) .

    1. $ vim --servername WHATEVER

    파일이 터미널 창 (A)에 빔에서 열립니다 파일을 열

  • $ vim --remote file.js
  • 을 시작하고 당신은 여전히 ​​터미널 창 B에서 프롬프트를 가지고 : 두 단계로 이루어집니다

  • 탭을 만지지 마십시오. 그들은 몹시 틀리게 지명되고 탭 같이 전혀 작동하지 않는다.

+0

+1 탭을 사용하지 않는 경우. 나는 그것을 얻을 수 없었다. 그것이 공개되었을 때부터 나는 그것을 따라 갔다. 파이어 폭스의 탭이나 터미널의 탭과 비교하면 피타입니다. 감사합니다 servername과 원격 명령, 나는 그들이 대단히 유용하다고 생각합니다. 나는 버퍼 개념을 읽을 것이고 그래서 버퍼를 저장하지 않고 전환 할 수있을 것이다. 내 질문이 맞았다 고 생각해! :) –

+0

기본 탭을 얻으면 예 탭을 쓸모 없게됩니다. – ThePosey

1

나는 (I 독점적으로 SSH를 사용하기 때문에 리눅스에서 할) 콘솔에서 정력을 실행하고있어 경우에, 나는 종종 정력을 중단 CTRL-Z를 사용합니다. 그럼 내 껍질 물건을하고 fg를 vim로 돌아갑니다.

vim에서 ctags을 사용하면 매우 유용합니다. - help tags 자세한 내용.

매우 강력한 퍼포 플러그인을 사용합니다 : http://www.vim.org/scripts/script.php?script_id=240. diff 지원은 열려있는 모든 파일을 검토하거나 파일 기록을보고 이전 버전 2 개를 비교할 수 있기 때문에 놀랍습니다. 을보십시오 : PVDiff, : PFilelog: POpened을 시도하십시오.

검색 및 버퍼 창 조작과 같은 많은 매크로를 정의합니다. vim에서 살기 위해 여기에 나열된 흥미로운 매크로/함수가 있습니다.


클립 보드 :

let mapleader="," 
" put from clipboard 
nmap ,p "*p 
" yank to clipboard 
nmap ,y "*y 

태그 :

" jump to tag in other window 
map t :call TagJumpOtherWindow()<cr> 
function! TagJumpOtherWindow() 
    let cw = expand("<cword>") 
    winc p 
    exec "tjump " . cw 
    let @/ = cw 
    normal z. 
    winc p 
endfunction 

스크래치 :

let mapleader="," 
nmap ,x0 :e e:/work/scratch0.txt<CR> 
nmap ,x1 :e e:/work/scratch1.txt<CR> 
nmap ,x2 :e e:/work/scratch2.txt<CR> 
nmap ,x3 :e e:/work/scratch3.txt<CR> 
nmap ,x4 :e e:/work/scratch4.txt<CR> 
nmap ,x5 :e e:/work/scratch5.txt<CR> 
nmap ,x6 :e e:/work/scratch6.txt<CR> 
nmap ,x7 :e e:/work/scratch7.txt<CR> 
nmap ,x8 :e e:/work/scratch8.txt<CR> 
nmap ,x9 :e e:/work/scratch9.txt<CR> 

IDE : 나는 한 번에 일 오픈 한 정력 창을 유지

function! GetMsdevFile(line) 
    let mx = '^\s*\([a-zA-Z_/\.0-9:\- ]*\)' 
    let line = matchstr(a:line, mx) 
    let file = substitute(line, mx, '\1', '') 
    let file = substitute(line, '\\', '/', '') 
    return file 
endfunction 

function! GetMsdevLineNumber(line) 
    let mx = '^\s*\([a-zA-Z_/\.0-9:\- ]*\)(\(\d\+\))' 
    let line = matchstr(a:line, mx) 
    let linenumber = substitute(line, mx, '\2', '') 
    return linenumber 
endfunction 

function! GetMsdevFile2(line) 
    let file = expand("%:p:h") . "/" . GetMsdevFile(a:line) 
    let file 
    return file 
endfunction 

function! GetMsdevFile2(line) 
    let file = expand("%:p:h") . "/../" . GetMsdevFile(a:line) 
    let file 
    return file 
endfunction 

function! GotoMsdevMake(thiswin, version) 
    exec "cd ".$DIRECTORY."\\.." 
    let l = getline(".") 
    if a:version==0 
     let file = GetMsdevFile(l) 
     let linenumber = GetMsdevLineNumber(l) 
    elseif a:version==1 
     let file = GetMsdevFile2(l) 
     let linenumber = GetMsdevLineNumber(l) 
    else 
     let file = GetMsdevFile3(l) 
     let linenumber = GetMsdevLineNumber(l) 
    endif 
    if a:thiswin==1 
    winc p 
    endif 
    exec "e +" . linenumber. " " . file 
    exec "cd -" 
endfunction 

function! GetGCCFile(line) 
    let mx = '^\([a-zA-Z_/\.0-9:\- ]*\):[0-9]\+: .*' 
    let line = matchstr(a:line, mx) 
    let file = substitute(line, mx, '\1', '') 
    let file = substitute(file, '\\', '/', '') 
    return file 
endfunction 

function! GetGCCLineNumber(line) 
    let mx = '^\([a-zA-Z_/\.0-9:\- ]*\):\([0-9]\+\):.*' 
    let line = matchstr(a:line, mx) 
    let linenumber = substitute(line, mx, '\2', '') 
    return linenumber 
endfunction 


function! GotoGCCMake() 
    exec "cd ".$DIRECTORY."\\.." 
    let l = getline(".") 
    let file = GetGCCFile(l) 
    let linenumber = GetGCCLineNumber(l) 
    winc p 
    exec "e +" . linenumber. " " . file 
    exec "cd -" 
endfunction 

function! MakeOut(filename) 
    exec ":e " . a:filename 
    call MakeBuffer() 
    normal zz 

endfunction 

" use the current buffer into a Visual Studio build output buffer to jump to errors 
function! MakeBuffer() 
    normal! gg 
    exec "/).*error\\|failed" 
    nnoremap <buffer> <cr> :call GotoMsdevMake(1, 0)<cr> 
    nnoremap <buffer> :call GotoMsdevMake(1, 1)<cr> 
    nnoremap <buffer> o :call GotoMsdevMake(1, 1)<cr> 
    " nnoremap <buffer> :call GotoMsdevMake(0, 0)<cr> 
endfunction 

" use the current buffer into a GCC build output buffer to jump to errors 
function! MakeGCCErr() 
    normal! gg 
    exec "/: error:" 
    nnoremap <buffer> <cr> :call GotoGCCMake()<cr> 
    nnoremap <buffer> :call GotoGCCMake()<cr> 
    nnoremap <buffer> o :call GotoGCCMake()<cr> 
endfunction 

function! MakeGCCOut(filename) 
    exec ":e " . a:filename 
    call MakeGCCErr() 
endfunction 

nmap ,mr :call MakeOut("e:/perforce/branch/obj/release/BuildLog.htm")<cr> 
nmap ,md :call MakeOut("e:/perforce/branch/obj/debug/BuildLog.htm")<cr> 
nmap ,mm :call MakeBuffer()<CR> 
nmap ,mq :call MakeGCCErr()<cr> 
+0

CTRL-z와 fg 트릭이 정말 유용합니다. –

0

. 분할 된 창은 큰 화면에서 정말 잘 작동합니다. 나는 또한 탭을 좋아한다. 탭에서 단일 프로젝트에 대한 분할을 클러스터하지만 내 계획, vim wiki, 중단 될 때의 스크래치 노트에 대해 다른 탭을 유지합니다. 필자는 여러 개의 창보다 탭을 더 쉽게 사용할 수 있습니다.

관련 문제