Vim의 가장 생산적인 지름길은 무엇입니까?


1126

Vim 에 대해 찬반 양론을 많이 들었습니다 . Vim을 사용하면 다른 편집기보다 (개발자로서) 더 빠를 것 같습니다. Vim을 사용하여 몇 가지 기본 작업을 수행하고 있으며 Vim을 사용 하면 생산성 이 10 배 이상 낮습니다 .

속도에 대해 이야기 할 때주의해야 할 두 가지 사항은 다음과 같습니다.

  1. 키보드를 사용하는 가장 빠른 방법 은 왼손과 오른손을 번갈아 사용하는 것입니다.
  2. 마우스를 만지지 마십시오. 가능한 한 빨리 두 번째 방법입니다. 손을 움직이고, 마우스를 잡고, 움직이고, 키보드로 다시 가져 오는 데는 오랜 시간이 걸립니다.

다음은 Vim을 사용하여 생산성이 떨어지는 이유를 보여주는 두 가지 예입니다.

복사 / 잘라 내기 및 붙여 넣기 나는 항상 그것을한다. 현대의 모든 편집기 Shift 에서는 왼손으로 누르고 커서를 오른손으로 움직여 텍스트를 선택합니다. 그런 다음 Ctrl+ C복사, 커서를 이동하고 Ctrl+ V붙여 넣기를합니다.

Vim을 사용하면 끔찍합니다.

  • yy 한 줄을 복사하십시오 (전체 줄을 거의 원하지 않습니다!)
  • [number xx]yyxx버퍼에 라인 을 복사 합니다. 그러나 원하는 것을 선택했는지 정확히 알 수는 없습니다. 나는 종종해야 할 [number xx]dd다음 u취소에!

또 다른 예? 검색 및 교체

  • 에서 PSPad : Ctrl+ f당신은 당신이 다음을 눌러, 검색 할 내용을 입력 Enter.
  • Vim : /에서 검색 할 내용을 입력 한 다음 특수 문자 \앞에 특수 문자가 있으면를 누릅니다 .Enter

그리고 Vim의 모든 것은 그와 같습니다. 올바른 방법으로 처리하는 방법을 모르겠습니다.

NB : Vim 치트 시트를 이미 읽었습니다. :)

내 질문은 :

현대 편집자보다 생산성을 높이는 Vim 사용 방법은 무엇입니까?


"키보드를 사용하는 가장 빠른 방법은 왼손과 오른손을 번갈아 사용하는 것입니다." 나를 위해, 이상하게도. 한 손으로 단어를 입력하면 훨씬 빠릅니다.
벤 Mordecai

답변:


2860

Vim 의 문제점 은 vi 를 좋아하지 않는다는 것 입니다.

절단을 언급 yy하고 거의 모든 라인을 절단하고 싶지 않다고 불평합니다. 실제로 프로그래머, 소스 코드 편집은 종종 전체 라인, 라인 범위 및 코드 블록에서 작업하기를 원합니다. 그러나 yy텍스트를 익명의 복사 버퍼 (또는 vi 에서 호출 된 "register")에 넣을 수있는 여러 방법 중 하나 일뿐 입니다.

vi 의 "젠"은 당신이 언어를 말하는 것입니다. 이니셜 y은 동사입니다. 이 문장 yy은의 동의어입니다 y_. 은 y이 같은 일반적인 작업이기 때문에 쉽게 입력 할 수 있도록 두 배로됩니다.

dd P(현재 행을 삭제하고 사본을 다시 붙여넣고 익명 레지스터에 사본을 부작용으로 남겨 두십시오) 로 표현할 수도 있습니다 . yd"동사"그 같은 움직임을 "될 수 있습니다." 따라서 yW"여기 (커서)에서 현재 / 다음 (큰) 단어의 끝까지"이고 y'a"여기에서 ' a ' 라는 마크를 포함하는 행까지 입니다."

기본 위, 아래, 왼쪽 및 오른쪽 커서 이동 만 이해하면 vi 는 "메모장"복사본보다 더 생산적이지 않습니다. (좋아요, 여전히 구문 강조 표시와 ~ 45KB 정도의 파일보다 큰 파일을 처리하는 기능이 있지만 여기에서 나와 함께 작업하십시오).

vi 에는 26 개의 "마크"및 26 개의 "레지스터"가 있습니다. m명령을 사용하여 마크가 커서 위치로 설정됩니다 . 각 마크는 하나의 소문자로 지정됩니다. 따라서 ma' a '마크를 현재 위치로 mz설정하고 ' z '마크를 설정합니다 . '(작은 따옴표) 명령을 사용하여 마크가 포함 된 줄로 이동할 수 있습니다 . 따라서 'a' a '표시 가있는 줄의 시작 부분으로 이동합니다 . `(backquote) 명령을 사용하여 마크의 정확한 위치로 이동할 수 있습니다 . 따라서 `z' z '표시 의 정확한 위치로 직접 이동 합니다.

이들은 "움직임"이기 때문에 다른 "문"의 주제로 사용될 수도 있습니다.

따라서 임의의 텍스트 선택을 잘라내는 한 가지 방법은 마크를 삭제하는 것입니다 (보통 ' a '를 "첫 번째"마크로, ' z '를 다음 마크로, ' b '를 다른 마크로, ' e '를 또 다른 것 ( vi 를 사용한지 15 년 만에 4 개 이상의 마크를 인터랙티브하게 사용한 적이 있다는 것을 기억하지 못합니다 . 하나는 대화 형 컨텍스트를 방해하지 않는 매크로가 마크와 레지스터를 사용하는 방법에 대한 고유 한 규칙을 만듭니다). 원하는 텍스트의 다른 쪽 끝으로; 우리는 어느쪽에서든 시작해도 상관 없습니다. 단순히 d`a잘라내거나 y`a복사 하는 데 사용할 수 있습니다 . 따라서 전체 프로세스에는 5 번의 키 입력 오버 헤드가 있습니다 ( "삽입에서 시작하면 6 번 "모드와 필요한Esc아웃 명령 모드). 잘라내거나 복사 한 후 사본에 붙여 넣는 것은 한 번의 키 입력 p입니다.

나는 이것이 텍스트를 자르거나 복사하는 한 가지 방법이라고 말합니다. 그러나 그것은 많은 것 중 하나 일뿐입니다. 종종 커서를 움직이거나 마크를 떨어 뜨리지 않고 텍스트 범위를 더 간결하게 설명 할 수 있습니다. 예를 들어 내가 사용할 수있는 텍스트의 단락에있어 경우 {}각각 단락의 처음이나 끝으로 이동. 따라서 텍스트 단락을 이동하려면 { d}(3 키 누름)을 사용하여 잘라 냅니다. (문단의 첫 번째 또는 마지막 줄에 이미있는 경우 간단히 d}또는 d{각각을 사용할 수 있습니다 .

"문단"의 개념은 일반적으로 직관적으로 합리적인 것으로 기본 설정됩니다. 따라서 종종 코드뿐만 아니라 산문에서도 작동합니다.

우리는 종종 관심있는 텍스트의 한쪽 끝을 나타내는 패턴 (정규 표현식)을 알고 있습니다. 앞으로 또는 뒤로 검색은 vi 에서 이동 합니다. 따라서 그것들은 또한 우리의 "명명 서"에서 "대상"으로 사용될 수 있습니다. 따라서 d/foo현재 줄에서 문자열 "foo"를 포함하는 다음 줄로 잘라 내고 현재 줄에서 y?bar"bar"를 포함하는 가장 최근 (이전) 줄로 복사하는 데 사용할 수 있습니다. 전체 줄을 원하지 않으면 여전히 검색 동작을 사용할 수 있습니다 (자신의 진술로). 내 마크를 삭제하고 `x앞에서 설명한 명령을 사용하십시오 .

"동사"와 "대상" 이외에도 vi 에는 "개체"(용어의 문법적 의미)가 있습니다. 지금까지는 익명 레지스터 사용에 대해서만 설명했습니다. 그러나 "object"참조 접두사" (큰 따옴표 수정 자)로 26 개의 "명명 된"레지스터 중 하나를 사용할 수 있습니다 . 따라서 내가 사용 "add하면 현재 줄을 ' a '레지스터 로 자르고 사용 "by/foo하면 텍스트의 사본을 여기에서 ' b '레지스터에 "foo"를 포함하는 다음 줄로 가져갑니다 . 레지스터에서 붙여 넣기하려면 붙여 넣기에 동일한 수정 자 시퀀스를 붙여 넣기 만하면됩니다. "ap' a '레지스터 ' 의 복사본을 붙여 넣기"bP' b '에서 현재 행 앞에 사본을 붙여 넣습니다 .

"접두사"라는 개념은 문법 조작법 "형용사"와 "부사"를 텍스트 조작 "언어"에 추가합니다. 대부분의 명령 (동사)과 움직임 (상황에 따라 동사 나 사물)도 숫자 접두사를 사용할 수 있습니다. 3J"다음 세 줄에 합류"를 d5}의미하고 "여기에서 다섯 번째 단락 끝까지 현재 줄에서 삭제 "를 의미합니다.

이것은 모든 중간 레벨 vi 입니다. Vim 에만 해당되는 것은 없으며 vi 를 배울 준비가 되었다면 vi 에는 훨씬 더 고급 트릭 이 있습니다. 이러한 중간 개념을 숙달했다면 텍스트 조작 언어가 편집기의 "네이티브"언어를 사용하여 대부분의 작업을 쉽게 수행 할 수있을만큼 간결하고 표현 적이기 때문에 매크로를 작성할 필요가 거의 없을 것입니다.


더 고급 트릭의 샘플링 :

많은 :명령, 특히 :% s/foo/bar/g전역 대체 기술이 있습니다. (고급 기능은 아니지만 다른 :명령도 가능합니다). vi 의 이전 화신에 :의해 전체 명령 세트는 역사적 으로 ed (라인 편집기) 및 나중에 ex (확장 라인 편집기) 유틸리티로 상속되었습니다 . 사실 viex 의 시각적 인터페이스이기 때문에 그렇게 명명되었습니다 .

:명령은 일반적으로 텍스트 줄에서 작동합니다. edex 는 터미널 화면이 흔하지 않았고 많은 터미널이 "TTY (teletype)"장치였던 시대에 쓰여졌습니다. 따라서 매우 간결한 인터페이스를 통해 명령을 사용하여 인쇄 된 텍스트 사본으로 작업하는 것이 일반적이었습니다 (일반적인 연결 속도는 110 보드 또는 대략 11 자 (초당 11 자)). 빠른 타이피스트보다 느립니다. 다중 사용자 대화식 세션; 또한 종이를 절약하려는 동기가 종종있었습니다).

따라서 대부분의 :명령 구문 에는 주소 또는 주소 범위 (행 번호)와 명령이 포함됩니다. 자연스럽게 리터럴 행 번호를 사용할 수있다 : :127,215 s/foo/bar또한 일부 약어를 사용할 수있는 하나의 127 내지 215 각각의 행에 "바"로 "foo는"처음 발견을 변경 .하거나 $각각 현재 및 마지막 라인. 하나는 상대 접두사를 사용할 수 +-각각 후 또는 curent 라인 전에 오프셋 (offset)를 참조하십시오. 따라서 :.,$j"현재 줄에서 마지막 줄까지 모두 한 줄로 연결"을 의미합니다. (모든 줄) :%과 동의어입니다 :1,$.

:... g:... v그들이 믿을 수 없을만큼 강력한으로 명령은 몇 가지 설명을 부담. :... g는 패턴 (정규 표현식)과 일치하는 모든 행에 후속 명령을 적용하는 "전역 적으로"접두어이며 :... v, 지정된 패턴 ( "conVerse"의 "v")과 일치하지 않는 모든 행에 이러한 명령을 적용합니다. 다른 ex 명령과 마찬가지로 주소 / 범위 참조로 접두사를 붙일 수 있습니다. 따라서 :.,+21g/foo/d"현재 줄에서 다음 21 줄까지"foo "문자열을 포함하는 모든 줄을 삭제함"을 :.,$v/bar/d의미하고 "여기에서 파일 끝까지 문자열"bar "를 포함하지 않는 모든 줄을 삭제하십시오.

일반적인 Unix 명령 grep 이 실제로이 ex 명령에서 영감을 얻은 것입니다 (그리고 문서화 된 방식에 따라 이름이 지정됨). 전직 명령 :g/re/p(GREP은)가 "세계", "정규 표현식"(재) "는이 포함 된 라인"을 인쇄하는 방법을 설명 된 방법이었다. 시 에드전이 사용되었다의 :p명령은 사람이 배운 모든 파일을 편집 할 때 종종 처음 사용하는 최초의 하나였다. 그것은 당신이 현재 내용을 인쇄하는 방법이었습니다 (보통 한 번에 한 페이지 씩 가득 채 :.,+25p웁니다).

참고 :% g/.../d하거나 (그 역 / CONVERSE 대응 : :% v/.../d가장 일반적인 사용 패턴이다 그러나 다른 몇 가지가 있습니다. ex가치가 기억하는있는 명령 :

우리는 m라인을 이동하고 라인 j을 결합 하는데 사용할 수 있습니다 . 예를 들어 목록이 있고 모든 물건 일치 (또는 일부 패턴과 일치하지 않는)를 삭제하지 않고 분리하고 싶다면 다음과 같이 사용할 수 있습니다 : :% g/foo/m$... 모든 "foo"줄이 파일의 끝. 파일 끝을 스크래치 공간으로 사용하는 방법에 대한 다른 팁을 참고하십시오. 이것은 모든 "foo"라인의 상대적 순서를 유지하면서리스트의 나머지 부분에서 추출합니다. (이것은 다음과 같은 작업과 같습니다. 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d(파일을 자체 꼬리에 복사하고 꼬리를 필터링 grep하여 머리에서 모든 것을 삭제하십시오).

일반적으로 선을 결합하려면 선행 작업에 결합해야하는 모든 선 (예 : 일부 글 머리 기호 목록에서 "^ *"가 아닌 "^"로 시작하는 모든 선)에 대한 패턴을 찾을 수 있습니다. 이 경우에는 다음을 사용합니다. :% g/^ /-1j(일치하는 모든 줄마다 한 줄 위로 올라가서 합류하십시오). (BTW : 글 머리 기호 목록을 ... 또 다른 하나 개의 총알 라인을 몇 가지 이유로하지 작업에 가입 할 수 있습니다 않는 총알 라인을 검색하고 다음에 가입을 시도하고 것이 어떤 총알 라인에 가입하지 않습니다 모두 의 그 연속; 경기에서만 쌍으로 작동합니다).

거의 말할 것도없이 옛 친구 s(대체)를 gand v(global / converse-global) 명령 과 함께 사용할 수 있습니다 . 일반적으로 그렇게 할 필요는 없습니다. 그러나 다른 패턴과 일치하는 행에서만 대체를 수행하려는 경우를 고려하십시오. 종종 캡처와 함께 복잡한 패턴을 사용하고 변경하지 않으려는 라인 부분을 보존하기 위해 역 참조를 사용할 수 있습니다. 그러나, :% g/foo/s/bar/zzz/g"foo"를 포함하는 모든 줄에 대해 "zzz"로 모든 "bar"를 대체하십시오. (같은 것:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g같은 줄에서 "foo"에 의해 선행 된 "bar"인스턴스의 경우에만 작동합니다. 이미 충분하지 않으며 "bar"가 "foo"앞에있는 모든 경우를 잡으려면 더 엉망이되어야합니다.)

요점은보다 더 있다는 것입니다 p, s그리고 d에서 선 ex명령 세트를.

:주소는 표시를 참조 할 수 있습니다. 따라서 :'a,'bg/foo/j' a '와 ' b '표시 사이의 행 사이에 있으면 문자열 foo를 포함하는 모든 행을 후속 행에 결합 할 수 있습니다 . (예, 위의 모든 ex명령 예제는 이러한 종류의 주소 지정 표현식을 접두어로 사용하여 파일 행의 서브 세트로 제한 될 수 있습니다).

그것은 꽤 모호합니다 (지난 15 년 동안 몇 번만 그런 것을 사용했습니다). 그러나 올바른 수정을 생각하기 위해 시간을 내면 더 효율적으로 수행되었을 수있는 반복적이고 대화식으로 자주 작업을 수행했음을 자유롭게 인정할 것입니다.

또 다른 매우 유용한 vi 또는 ex 명령은 :r다른 파일의 내용을 읽는 것입니다. 따라서 : :r foo"foo"라는 파일의 내용을 현재 행에 삽입합니다.

:r!명령 이 더 강력합니다 . 명령 결과를 읽습니다. vi 세션 일시 중단, 명령 실행, 출력을 임시 파일로 경로 재 지정, vi 세션 재개 및 임시 컨텐츠를 읽는 것과 동일합니다. 파일.

!(bang) 및 :... !( ex bang) 명령 이 더 강력 합니다. 또한 외부 명령을 실행하고 결과를 현재 텍스트로 읽습니다. 그러나 명령을 통해 텍스트 선택을 필터링합니다! 이것은 우리가 사용하는 우리의 파일의 모든 라인을 정렬 할 수 있습니다 1G!Gsort( G는 IS VI , 파일의 마지막 줄에 가기가 기본값 있지만, 이러한 일, 첫 번째 줄, 줄 번호 접두어 할 수있다 "고토"명령). 이것은 ex 변형 과 동일합니다 :1,$!sort. 작가는 종종 텍스트 선택을 재구성하거나 "단어 줄 바꿈"하기 위해 !Unix fmt 또는 fold 유틸리티 와 함께 사용 합니다. 매우 일반적인 매크로는{!}fmt(현재 단락을 다시 포맷하십시오). 프로그래머는 때때로 들여 쓰기 또는 다른 코드 재 형식화 도구를 통해 코드를 실행하거나 코드의 일부만 실행하기 위해이 코드를 사용합니다.

:r!and !명령을 사용하면 외부 유틸리티 나 필터를 편집기의 확장으로 취급 할 수 있습니다. 데이터베이스에서 데이터를 가져 오는 스크립트 나 웹 사이트에서 데이터를 가져 오는 wget 또는 lynx 명령 또는 원격 시스템에서 데이터를 가져 오는 ssh 명령과 함께 사용했습니다.

또 다른 유용한 ex 명령은 :so(약칭 :source)입니다. 파일 내용을 일련의 명령으로 읽습니다. vi 를 정상적으로 시작하면 암시 적으로 :sourceon ~/.exinitrc파일을 수행 합니다 ( Vim은 보통 ~/.vimrc자연스럽게 충분합니다). 이를 사용하면 새로운 매크로, 약어 및 편집기 설정을 소싱하여 편집기 프로파일을 즉석에서 변경할 수 있습니다. 비열한 사람이라면 필요 에 따라 파일에 적용하기 위해 일련의 ex 편집 명령을 저장하는 트릭으로 사용할 수도 있습니다 .

예를 들어 wc 통해 파일을 실행하는 7 줄 파일 (36 자)이 있고 해당 단어 수 데이터가 포함 된 파일 맨 위에 C 스타일 주석을 삽입합니다. 다음과 같은 명령을 사용하여 해당 "매크로"를 파일에 적용 할 수 있습니다.vim +'so mymacro.ex' ./mytarget

( viVim에 대한 +명령 행 옵션 은 일반적으로 주어진 행 번호에서 편집 세션을 시작하는 데 사용됩니다. 그러나 "source"명령과 같은 유효한 ex 명령 / 표현식을 사용할 수 있다는 것은 알려진 사실이 아닙니다. 간단한 예제를 위해 다음 과 같이 호출하는 스크립트 가 있습니다. 서버 세트를 다시 이미징하는 동안 SSH 알려진 호스트 파일에서 비 대화식으로 항목을 제거합니다.+vi +'/foo/d|wq!' ~/.ssh/known_hosts

일반적으로 Perl, AWK, sed를 사용하여 이러한 "매크로"를 작성하는 것이 훨씬 쉽습니다 (실제로 ed 명령에서 영감을 얻은 유틸리티 grep 과 같습니다 ).

@명령은 아마도 가장 모호한 vi 명령 일 것입니다. 때때로 10 년 가까이에 고급 시스템 관리 과정을 가르 칠 때 나는 그것을 사용해 본 사람이 거의 없었습니다. @레지스터 내용을 마치 vi 또는 ex 명령 인 것처럼 실행합니다 .
예 : 나는 종종 :r!locate ...시스템에서 파일을 찾아 내 이름을 문서로 읽는 데 사용합니다. 거기에서 불필요한 히트를 삭제하고 관심있는 파일의 전체 경로 만 남겨 둡니다. Tab경로의 각 구성 요소를 힘들게 사용하지 않고 (또는 탭 완성 지원이없는 컴퓨터에 붙어있는 경우 더 나빠집니다) vi 의 사본에서 ) 나는 다음을 사용합니다.

  1. 0i:r(현재 줄을 유효한 : r 명령 으로 바꾸려면 )
  2. "cdd ( "c"레지스터의 행을 삭제하기 위해)
  3. @c 해당 명령을 실행하십시오.

그것은 10 "cdd @c번의 키 입력입니다 (그리고 표현 은 사실상 손가락 매크로입니다. 그래서 일반적인 6 글자만큼 빨리 입력 할 수 있습니다).


냉정한 생각

나는 vi 의 힘의 표면에 흠집을 냈으며 여기에서 설명 한 것은 vim 이라는 이름 의 "개선"의 일부조차 아닙니다 ! 여기에 설명 된 모든 내용 은 20 년 또는 30 년 전에 vi의 오래된 사본에서 작동해야합니다 .

내가 할 것보다 vi 의 힘을 훨씬 더 많이 사용한 사람들이 있습니다 .


440
거룩한 코드 원숭이 .. 그것은 심층 답변입니다. 가장 좋은 점은 약 10 번의 키 입력으로 vim에 썼을 것입니다.
EightyOne Unite

48
@Wahnfieden - grok 수 나가 의미 정확히 무엇 : en.wikipedia.org/wiki/Grok을 (그것은 --- 심지어 OED에 분명히 우리가에 정식 사전 anglophones 가장 가까운입니다). 편집자를 "탐색"하는 것은 자신의 명령을 자연스럽게 사용하는 것처럼 유창하게 자신을 찾는 것입니다.
Jim Dennis

22
와우, 잘 작성된 답변입니다! @명령을 많이 사용하지만 ( q레코드 매크로 와 함께 )
knittl

63
정말 끔찍한 질문을 완전히 구속하는 훌륭한 답변. 나는 보통이 질문에 대한 답을 찾기 위해이 질문에 찬성 투표를 할 것입니다. (그리고 저는 이맥스 사람입니다! 그러나이 방법으로 vi 파워 유저가 vi에 대해 재미를 느끼는 것에 대한 좋은 설명을 원하는 새로운 사람들을 가리킬 것입니다. 그러면 그들에게 Emacs에 대해 말하고 결정할 수 있습니다.)
Brandon Rhodes

8
웹 사이트를 만들고이 자습서를 거기에 넣을 수 있으므로 여기에서 스택 오버플로에 묻히지 않습니다. 나는 vi에 대한 더 나은 소개를 아직 읽지 않았다.
Marko

504

텍스트 선택 및 복사에 대해 이야기하고 있습니다 . Vim Visual Mode를 살펴 봐야한다고 생각합니다 .

비주얼 모드에서는 Vim 명령을 사용하여 텍스트를 선택한 다음 원하는 항목을 선택하여 수행 할 수 있습니다.

다음과 같은 일반적인 시나리오를 고려하십시오.

다음으로 일치하는 괄호를 선택해야합니다.

당신은 할 수 있습니다 :

  • v% 커서가 시작 / 끝 괄호에있는 경우
  • vib 커서가 괄호 블록 안에있는 경우

따옴표 사이에서 텍스트를 선택하려고합니다.

  • 큰 따옴표는 vi "
  • 작은 따옴표는 vi '

중괄호 블록을 선택하려고합니다 (C 스타일 언어에서 매우 일반적).

  • viB
  • vi{

전체 파일을 선택하려고합니다.

  • ggVG

비주얼 블록 선택은 당신이 텍스트의 사각형 영역을 선택할 수 있습니다, 다른 정말 유용한 기능입니다, 당신은 단지 언론에이 Ctrl- V삭제, 원하는 텍스트 블록을 선택하고 같은 십중팔구 같은 작업의 모든 유형을 수행 한 다음 시작하고, 붙여 넣기, 편집 등 . 열 방향 텍스트 를 편집하는 것이 좋습니다 .


2
모든 편집기에는 이와 같은 것이 있으며 vim에만 국한된 것은 아닙니다.
finnw

22
예, 그러나 이것은 포스터에 대한 구체적인 불만이었습니다. 비주얼 모드는 Vim이 직접 텍스트를 직접 선택하고 조작하는 최고의 방법입니다. 그리고 vim의 버퍼 탐색 방법이 훌륭하기 때문에 vim의 텍스트 선택이 매우 즐겁습니다.

9
블록 (즉, 임의의 텍스트 사각형)을 선택하려면 Ctrl-V를 언급 할 가치가 있다고 생각합니다. 필요할 때 그것은 생명의 은인입니다.
Hamish Downer

6
@viksit : Camtasia를 사용하고 있지만 많은 대안이 있습니다 : codinghorror.com/blog/2006/11/screencasting-for-windows.html
CMS

3
또한 시각적으로 선택하여 조정하려는 o경우 다른쪽으로 이동합니다. 따라서 원하는만큼 선택의 시작과 끝을 모두 이동할 수 있습니다.
Nathan Long

207

일부 생산성 팁 :

똑똑한 움직임

  • *그리고 #앞으로 커서 / 뒤로 아래의 단어를 검색합니다.
  • w 다음 단어로
  • W 공백으로 구분 된 다음 단어로
  • b/ e현재 단어의 시작 / 끝에. ( B/ E공간 분리 전용)
  • gg/ G파일의 시작 / 끝으로 이동합니다.
  • % 일치하는 {..} 또는 (..) 등으로 이동하십시오.
  • {/ }다음 단락으로 이동
  • '. 마지막으로 편집 한 줄로 되돌아갑니다.
  • g; 마지막으로 편집 한 위치로 되돌아갑니다.

빠른 편집 명령

  • I 처음에 삽입하십시오.
  • A 끝에 추가하십시오.
  • o/ O현재 다음 / 이전에 새 줄을 엽니 다.
  • v/ V/ Ctrl+V시각 모드 (텍스트를 선택하십시오!)
  • Shift+R 텍스트를 교체
  • C 줄의 나머지 부분을 변경하십시오.

명령 결합

대부분의 명령은 다음과 같이 양과 방향을 받아들입니다.

  • cW = 단어 끝까지 변경
  • 3cW = 3 단어 변경
  • BcW = 전체 단어를 시작하려면 전체 단어를 변경하십시오.
  • ciW = 내부 단어를 변경하십시오.
  • ci" = ".."사이의 내부 변경
  • ci( = (..) 사이에서 텍스트 변경
  • ci<= <..> 사이에 텍스트 변경 ( set matchpairs+=<:>vimrc 필요 )
  • 4dd = 4 줄 삭제
  • 3x = 3 자 삭제
  • 3s = 대체 3 자

유용한 프로그래머 명령

  • r한 문자를 rd바꿉니다 (예 : 현재 문자를으로 바꿉니다 d).
  • ~ 대소 문자를 변경합니다.
  • J 두 줄을 결합
  • Ctrl + A / Ctrl + X는 숫자를 증가 / 감소시킵니다.
  • . 마지막 명령 반복 (간단한 매크로)
  • == 줄 들여 쓰기 수정
  • > 들여 쓰기 블록 (시각적 모드)
  • < 들여 쓰기 블록 (시각적 모드)

매크로 기록

  • 을 눌러 q[ key ]녹음을 시작합니다.
  • 그런 다음 기록 q을 중지하려면 누르십시오 .
  • 매크로는로 재생할 수 있습니다 @[ key ].

VIM은 매우 구체적인 명령과 동작을 사용하여 다음 행에 대해 정확한 동작을 재생할 수 있습니다. (예 : 단어 를 추가하기위한 A , 커서를 단어의 시작 또는 끝으로 각각 이동시키기위한 b/ e)

잘 구성된 설정의 예

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

설정은에 저장 ~/.vimrc하거나 시스템 전체에 저장 /etc/vimrc.local한 후 다음을 /etc/vimrc사용 하여 파일 에서 읽을 수 있습니다 .

source /etc/vimrc.local

( #주석 문자를 "VIM에서 작동하게 하려면 주석 문자 를 바꿔야합니다 . 여기에서 올바른 구문 강조 표시를 원했습니다).

여기에 나열된 명령은 매우 기본적이고 지금까지 사용 된 주요 명령입니다. 그들은 모든 멋진 것들을 알 필요없이 이미 나를 훨씬 더 생산적으로 만듭니다.


4
보다 더 '.IS g;관통 다시 점프 changelist. 마지막 편집 된 줄 대신 마지막 편집 된 위치로 이동
naught101

98

그만큼 Control+의 R메커니즘은 매우 유용합니다 :-)에서 두 모드 삽입 또는 명령 모드 (온 즉 :, 번호가 매겨진 또는 명명 된 레지스터를 계속 입력 명령 줄) :

  • a- z명명 된 레지스터
  • " 마지막 삭제 또는 yank의 텍스트를 포함하는 이름이없는 레지스터
  • % 현재 파일 이름
  • # 대체 파일 이름
  • * 클립 보드 내용 (X11 : 기본 선택)
  • + 클립 보드 내용
  • / 마지막 검색 패턴
  • : 마지막 명령 줄
  • . 마지막으로 삽입 된 텍스트
  • - 마지막 작은 (한 줄 미만) 삭제
  • =5*5 텍스트에 25를 삽입하십시오 (미니 계산기)

자세한 내용 은를 참조 :help i_CTRL-R하고 :help c_CTRL-RCTRL-R의 장점을 얻으려면 주변을 스누핑하십시오.


10
참고로, 이것은 삽입 모드의 Ctrl + R을 나타냅니다 . 일반 모드에서 Ctrl + R은 다시 실행됩니다.
vdboor

2
현재 / 대체 파일 이름의 경우 +1 Control-A또한 마지막으로 삽입 된 텍스트에 대해 삽입 모드에서 작동하며 마지막으로 삽입 된 텍스트를 Control-@삽입하고 즉시 일반 모드로 전환합니다.
Aryeh Leib Taurog

91

Vim 플러그인

여기에 많은 좋은 답변이 있으며 vi의 선에 관한 놀라운 답변이 있습니다. 내가 언급하지 않은 한 가지는 vim이 플러그인을 통해 매우 확장 가능하다는 것입니다. 원래 작성자가 고려하지 않은 모든 종류의 미친 일을 수행 할 수있는 스크립트와 플러그인이 있습니다. 매우 유용한 vim 플러그인의 예는 다음과 같습니다.

rails.vim

Rails.vim은 tpope가 작성한 플러그인입니다. 레일 개발을하는 사람들을위한 놀라운 도구입니다. 컨트롤러의 메소드에서 관련 뷰로, 모델로, 해당 모델의 단위 테스트로 쉽게 이동할 수있는 상황에 맞는 마법 같은 작업을 수행합니다. Rails 개발자로서 수백 시간이 아니더라도 수십 시간을 절약했습니다.

gist.vim

이 플러그인을 사용하면 비주얼 모드에서 텍스트 영역을 선택하고 빠른 명령을 입력하여 gist.github.com 에 게시 할 수 있습니다 . 이를 통해 페이스트 빈 액세스가 용이 해져 IRC 또는 IM을 통해 다른 사람과 공동 작업 할 때 매우 편리합니다.

space.vim

이 플러그인은 스페이스 바에 특별한 기능을 제공합니다. 스페이스 바를 마침표와 비슷한 것으로 바꾸지 만 동작을 반복하는 대신 동작을 반복합니다. 이것은 사용자가 즉석에서 정의하는 방식으로 파일을 빠르게 이동하는 데 매우 유용 할 수 있습니다.

Surround.vim

이 플러그인은 어떤 방식으로 구분 된 텍스트로 작업 할 수있는 기능을 제공합니다. 그것은 당신에게 괄호 안의 것들, 따옴표 안의 것들 등을 나타내는 객체를 제공합니다. 그것은 구분 된 텍스트를 조작하는데 편리 할 수 ​​있습니다.

supertab.vim

이 스크립트는 멋진 탭 완성 기능을 vim에 제공합니다. 자동 완성 기능은 이미 vim의 핵심에 있지만 여러 다중 키 바로 가기가 아닌 빠른 탭으로 가져옵니다. 사용하기 매우 편리하고 믿을 수 없을 정도로 재미 있습니다. VS의 인텔리전스가 아니지만 훌륭한 단계이며 탭 완성 도구에서 기대할 수있는 많은 기능을 제공합니다.

syntastic.vim

이 도구는 외부 구문 검사 명령을 vim으로 가져옵니다. 나는 그것을 개인적으로 사용하지는 않았지만 그것에 대해 큰 것을 들었고 그 개념은 이기기가 어렵습니다. 수동으로 수행하지 않고 구문을 검사하면 시간을 절약 할 수 있으며 테스트를 중단 할 때가 아니라 도입 할 때 구문 버그를 발견하는 데 도움이됩니다.

fugitive.vim

vim 내부에서 git에 직접 액세스합니다. 다시 한 번이 플러그인을 사용하지는 않았지만 유틸리티를 볼 수 있습니다. 불행히도 나는 svn이 "새로운"것으로 여겨지는 문화에있어서 꽤 오랫동안 직장에서 자식을 볼 수는 없습니다.

nerdtree.vim

vim을위한 트리 브라우저. 최근에 이것을 사용하기 시작했으며 정말 편리합니다. 트 리뷰를 수직 분할로 배치하고 파일을 쉽게 열 수 있습니다. 자주 사용하는 소스 파일이 많은 프로젝트에 유용합니다.

FuzzyFinderTextmate.vim

이것은 유지 관리되지 않은 플러그인이지만 여전히 매우 유용합니다. "퍼지"설명 구문을 사용하여 파일을 여는 기능을 제공합니다. 이는 드문 드문 파일 트리에서 관심있는 파일을 나머지 부서에서 명확하게하기에 충분한 문자 만 입력하면됨을 의미합니다.

결론

vim에 사용할 수있는 놀라운 도구가 많이 있습니다. 여기서는 표면 만 긁었으므로 도메인에 적용 할 수있는 도구를 검색하는 것이 좋습니다. 전통적인 vi의 강력한 툴셋, vim의 개선 사항 및 vim을 더욱 확장하는 플러그인의 조합은 텍스트를 편집하는 가장 강력한 방법 중 하나입니다. Vim은 emacs, eclipse, visual studio 및 textmate만큼이나 강력합니다.

감사

그의 vim 설정에 대한 duwanis 덕분에 많은 것을 배우고 여기에 나열된 대부분의 플러그인을 빌 렸습니다.


rails.vim의 마법 테스트 대 클래스 탐색은 Vim이 TextMate가 모든 언어에서 절대적으로 문제를 해결하기를 원했던 가장 일반적인 것 중 하나입니다. 목록에 PersonTest.scala가 있습니다.
Tom Morris

5
FuzzyFinderTextmate가 github.com/wincent/Command-T
Gavin Gilmour

2
Syntastic의 경우 +1 JSLint와 결합하면 Javascript가 훨씬 덜 오류가 발생합니다. Syntastic과 함께 작동하도록 JSLint를 설정하는 방법에 대해서는 superuser.com/questions/247012/… 를 참조하십시오 .
Nathan Long

1
@Benson 위대한 목록! 나는 또한 snipMate 를 던질 것입니다. 일반적인 코딩 작업에 매우 유용한 자동화. if <tab> instant if 블록 등
AlG

2
nerdcommenter도 좋은 플러그인이라고 생각합니다 : here . 이름에서 알 수 있듯이 코드 주석 처리를위한 것입니다.
Stephan

53

. 마지막 텍스트 변경 명령 ​​반복

나는 이것으로 많은 시간을 절약합니다.

비주얼 모드는 이전에 언급되었지만 텍스트 파일에서 고정 크기 열을 편집 할 때 블록 비주얼 모드를 사용하면 많은 시간을 절약 할 수 있습니다. (Ctrl-V로 액세스).


3
또한 간결한 명령을 사용하여 텍스트를 편집하는 경우 vim은 .키 를 누른 다음 줄에 대해 동일한 동작을 반복 할 수 있습니다 .
vdboor

48

미군 병사

마지막으로 편집 한 위치로 이동

^ P와 ^ N

이전 (^ P) 또는 다음 (^ N) 텍스트를 완성하십시오.

^ O와 ^ I

이전 ( ^O- "O"이전) 위치 또는 다음 ( ^I- "I"가까이 "O")으로 이동하십시오. 검색, 파일 편집 등을 수행 할 때 이러한 "점프"를 앞뒤로 탐색 할 수 있습니다.


4
@Kungi`. ``마지막 편집으로 이동합니다``마지막 '점프'이전 위치로 돌아갑니다.
Grant McLean

46

나는 최근 에이 사이트를 발견했다 : http://vimcasts.org/

꽤 새롭고 정말 좋습니다. 사이트를 운영하는 사람은 textmate에서 vim으로 전환했으며 특정 vim 주제에 대해 매우 훌륭하고 간결한 캐스트를 주최했습니다. 확인 해봐!


3
vim 튜토리얼을 좋아한다면 Derek Wyatt의 vim 비디오 도 확인하십시오 . 그들은 우수합니다.
Jeromy Anglim

42

CTRL+A 서있는 숫자를 증가시킵니다.


19
... 및 CTRL-X가 감소합니다.
innaM

9
깔끔한 지름길이지만 지금까지 나는 그 용도를 찾지 못했습니다.
SolutionYogi

8
화면에서 vim을 실행하고 왜 이것이 작동하지 않는지 궁금
하다면-ctrl

13
@SolutionYogi : 각 줄의 시작 부분에 줄 번호를 추가한다고 가정하십시오. 해결 방법 : ggI1 <space> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42

10
Vimperator에 매우 유용합니다. URL에서 마지막 숫자를 늘리거나 줄입니다 (Ctrl-X). 이미지 갤러리 등을 빠르게 서핑하는 데 유용
blueyed

38

일반 모드에서 모두 :

현재 행에서 특정 문자의 다음 인스턴스로 이동하려면 f <char>; 반복합니다.

현재 행에서 특정 문자의 이전 인스턴스로 이동하려면 F <char>; 반복합니다.

지능적으로 사용하면 위의 두 가지를 사용하면 한 줄로 빠르게 킬러를 움직일 수 있습니다.

* 단어에 다음 인스턴스를 검색하십시오.

# 이전 단어를 검색 할 단어


6
우와, * 및 # (커서 아래 단어 검색 / 뒤로) 바인딩에 대해 몰랐습니다. 좀 멋지다. f / F 및 t / T 및; 명령은 현재 줄의 문자로 빠르게 이동합니다. f / F는 커서를 표시된 문자에 놓고 t / T는 문자를 "문자"바로 위에 놓습니다 (선택된 방향에 따라 문자 바로 앞 또는 뒤의 문자). 가장 최근의 f / F / t / T를 반복합니다.
Jim Dennis

10
:) vim.org의 팁 페이지 상단에있는 태그 라인 : "시간에"* "명령 만 알고 있었다면 얼마나 많은 키 입력을 저장할 수 있었는지 상상할 수 있습니까?"
-Juergen

1
Jim이 언급했듯이, "t / T"콤보는 종종 예를 들어, ct(단어를 지우고 삽입 모드로 전환하지만 패러 틴 사람들을 유지하는 것만 큼 ​​좋습니다 .
puk

34

세션

ㅏ. 세션 저장

: mks 세션 이름

비. 강제 저장 세션

: mks! 세션 이름

씨. 세션로드

gvim 또는 vim -S 세션 이름


더하기와 빼기

ㅏ. 더하기와 빼기

CTRL-A; 커서 또는 그 이후의 숫자 또는 알파벳 문자에 [count]를 추가하십시오. {vi가 아님

CTRL-X; 커서 또는 그 뒤의 숫자 또는 알파벳 문자에서 [count]를 뺍니다. {가 아닌 Vi}

비. 창 키 매핑 해제

창에서 Ctrl-A는 rc 파일에서 매핑 해제해야하는 전체 파일 선택에 대해 이미 매핑되었습니다. mswin.vim CTRL-A 매핑 부분을 주석으로 표시하거나 unmap으로 rc 파일 추가

씨. 매크로 사용

CTRL-A 명령은 매크로에서 매우 유용합니다. 예 : 번호가 매겨진 목록을 만들려면 다음 단계를 사용하십시오.

  1. 첫 번째 목록 항목을 작성하고 숫자로 시작하는지 확인하십시오.
  2. qa-버퍼 'a'에 기록 시작
  3. Y-항목을 잡아 당기다
  4. p-첫 번째 항목 아래에 항목 사본을 넣습니다.
  5. CTRL-A-숫자 증가
  6. q-녹음 중지
  7. @a-yank를 반복하고 시간을 넣고 증가시킵니다.

1
Windows의 단축키가 무엇인지 아십니까?
Don Reba

32

지난주 직장에서 우리 프로젝트는 다른 프로젝트에서 많은 파이썬 코드를 물려 받았습니다. 불행히도 코드는 기존 아키텍처에 맞지 않았습니다.이 코드는 전역 변수와 함수로 수행되었으므로 멀티 스레드 환경에서는 작동하지 않습니다.

우리는 ~ 80 개의 파일을 객체 지향으로 재 작업해야했습니다. 모든 기능은 클래스로 이동하고 매개 변수가 변경되었으며 import 문이 추가되었습니다. 각 파일에 대해 수행해야 할 약 20 가지 유형의 수정 목록이있었습니다. 나는 한 사람이 손으로 직접하는 것이 하루에 2-4 일을 할 수 있다고 추정합니다.

그래서 첫 번째 작업을 한 다음 변경 사항을 자동화하는 vim 스크립트를 작성했습니다. 그것은 대부분 vim 명령어들의리스트였습니다.

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

마지막 것은 약간의 설명이 필요합니다.

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

모든 import 문 생성과 같은 좀 더 복잡한 변환을 위해 vim 스크립트에 파이썬을 포함 시켰습니다.

몇 시간 동안 작업 한 후 최소 95 %의 변환을 수행하는 스크립트가있었습니다. 방금 vim에서 파일을 연 다음 실행 :source fixit.vim하면 파일이 눈을 깜박입니다.

우리는 여전히 자동화하고 결과를 테스트 할 가치가없는 나머지 5 %를 변경하는 작업을 수행하고 있지만이 스크립트를 작성하는 데 하루를 소비함으로써 몇 주 동안의 작업을 절약 한 것으로 추정됩니다.

물론 파이썬이나 루비와 같은 스크립팅 언어로 이것을 자동화하는 것이 가능했지만, 작성하는데 훨씬 더 오래 걸리고 덜 융통성이있을 것입니다-마지막 예제는 정규식만으로는 처리 할 수 ​​없었기 때문에 어려웠을 것입니다 중첩 된 괄호, 예를 들어, 변환 bar(foo(xxx))foo(xxx).bar(). Vim은이 작업에 완벽했습니다.


1
"유용하고 클래식하지 않은"매크로에서 배우는 것이 정말 좋은 공유에 감사드립니다.
Olivier Pons

%s/\(bar\)(\(.\+\))/\2.\1()/그렇게 할 것입니다. (이스케이프는와 호환됩니다 :set magic.) 레코드 용입니다. :)
Ipsquiggle

1
vim 스타일의 탈출을 좋아하지 않는다면 \ v를 사용하여 Very Magic을 켜십시오.%s/\v(bar)\((.+)\)/\2.\1()/
Ipsquiggle

@lpsquiggle : 제안은 둘 이상의 대괄호 세트로 복잡한 표현식을 처리하지 않습니다. 예를 들면 if bar(foo(xxx)) or wibble(xxx): 하게 if foo(xxx)) or wibble(xxx.bar(): 완전히 잘못이다.
Dave Kirby

28

내장 파일 탐색기를 사용하십시오! 이 명령 :Explore을 사용하면 소스 코드를 매우 빠르게 탐색 할 수 있습니다. 내 매핑 에이 있습니다 .vimrc.

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

탐색기를 사용하면 파일을 수정할 수도 있습니다. 내가 좋아하는 키를 게시 <F1>할 것입니다 .를 누르면 전체 목록이 표시됩니다.

  • - : 가장 유용한 정보 : 상위 디렉토리로 변경 ( cd ..)
  • mf : 파일 표시
  • D : 표시된 파일이 없으면 표시된 파일 또는 커서가있는 파일을 삭제합니다.
  • R : 커서가있는 파일의 이름을 바꿉니다.
  • d : 현재 디렉토리에 새 디렉토리를 만듭니다
  • % : 현재 디렉토리에 새 파일을 만듭니다

1
나는 항상 브라우징을위한 기본 방법이 대부분의 물건을 빨아 들였다고 생각했습니다. 가고 싶은 곳을 알면 탐색 속도가 느립니다. vim.org의 스크립트 섹션에있는 LustyExplorer는 크게 개선되어야합니다.
Svend

두 번째 매핑이 더 간단 할 수 있습니다. map <silent> <S-F8> : Sexplore <CR>
황소 자리 Olson

8
내장 탐색기 대신 NERDtree를 권장합니다. 프로젝트에 vim을 사용하는 방식이 바뀌었고 생산성이 훨씬 높아졌습니다. 그냥 구글.
kprobst

난 그냥 사용, 소스 트리를 탐색 할 필요를 느끼지 않는다 :find, :tag그리고 다양한 관련 키 입력은 주위 이동합니다. (아마도 이것은 내가 작업하는 소스 트리가 크고 다른 방식으로 구성 되었기 때문입니까? :))
dash-tom-bang

25

저는 미국 암호화 협회의 회원입니다. 격월간 잡지에는 다양한 종류의 100 가지가 넘는 암호가 포함되어 있습니다. 이 중 대략 15 개는 "암호화"입니다. 숫자로 대체 된 문자의 다양한 유형의 산술 문제입니다. 이 중 두세 개는 숫자 대신 문자를 제외하고 스도쿠입니다. 격자가 완성되면, 9 개의 별개의 문자가 격자의 어딘가에 선, 대각선, 나선 등의 단어를 철자합니다.

연필로 작업하거나 직접 문제를 입력하는 대신 웹 사이트의 멤버 영역에서 문제를 다운로드합니다.

이 스도쿠로 작업 할 때 vi는 다른 편집자가 거의없는 vi를 가진 기능을 사용하기 때문에 vi를 사용합니다. 해결하기가 더 쉽기 때문에 문자 그리드를 숫자 그리드로 변환 한 다음 완성 된 숫자 그리드를 다시 문자 그리드로 다시 변환하여 솔루션 단어를 찾습니다.

문제는 9 개의 문자로 구성된 9 개의 그룹으로 구성되며 -s는 공백을 나타내며 두 ​​줄로 작성됩니다. 첫 번째 단계는 이들을 각각 9 자의 9 행으로 형식화하는 것입니다. 특별한 장소는 없습니다. 적절한 곳에 8 개의 줄 바꿈 만 삽입하면됩니다.

결과는 다음과 같습니다.

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

따라서 이것을 숫자로 변환하는 첫 단계는 고유 문자 목록을 만드는 것입니다. 먼저 블록의 사본을 만듭니다. 커서를 블록 상단에 놓고을 입력 :y}}p합니다. :명령 모드로 전환 y하고 다음 이동 명령을 취소합니다. }다음 단락의 끝으로 이동 하므로 단락을 y}취소합니다. }그런 다음 커서를 단락의 끝으로 이동하고 커서 p바로 다음에 눌린 것을 붙여 넣습니다. 따라서 y}}p다음 단락의 사본을 작성하고 두 사본 사이의 커서로 끝납니다.

다음으로, 그 사본 중 하나를 별개의 문자 목록으로 바꾸겠습니다. 이 명령은 조금 더 복잡합니다.

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:다시 명령 모드로 전환합니다. !다음 yank의 내용이 명령 행을 통해 파이프되어야 함을 나타냅니다. }다음 단락을 tr잡아 당기고 명령 행은 명령을 사용하여 대문자를 제외한 모든 것을 제거하고, sed각 문자를 한 줄에 인쇄하는 sort명령 과 해당 행을 정렬하고, 중복을 제거한 다음 tr제거합니다. 한 줄에 9 개의 별개의 문자를 남기고 원래 단락을 구성했던 9 개의 줄을 대체하는 줄 바꿈. 이 경우 글자는 다음과 같습니다 ACELNOPST.

다음 단계는 그리드의 다른 사본을 만드는 것입니다. 그런 다음 방금 식별 한 문자를 사용하여 각 문자를 1에서 9까지의 숫자로 바꿉니다 :!}tr ACELNOPST 0-9. 간단 합니다. 결과는 다음과 같습니다.

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

그런 다음 일반적인 방법으로 해결하거나 원하는 스도쿠 솔버에 입력 할 수 있습니다. 그런 다음 완성 된 솔루션을로 문자로 다시 변환 할 수 있습니다 :!}tr 1-9 ACELNOPST.

vi에는 다른 사람과 거의 일치하지 않는 힘이 있습니다. 가장 큰 문제는 vi 튜토리얼 서적, 웹 사이트, 도움말 파일 등 만이 가능한 것의 표면을 간신히 다루는 것 이상을 수행한다는 것입니다.


그리고 우분투와 같은 일부 배포판에는 단어 "vi"에서 "vim"까지의 별칭이 있으므로 사람들은 실제로 vi를 볼 수 없습니다. 훌륭한 예, 시도해야 ... +1
hhh

1
vim이 올바른 '모드'에 나타날 수 있도록 시작된 이름을 확인하지 않습니까?
dash-tom-bang

3
이 반복되는 오류로 당황합니다. :명령 모드로 들어가야하지만 명령 모드에서 작동하지 않는 일반 모드 명령 (예 :)을 지정 해야합니까 y}}p?!
sehe

나는 독특한 문자 도전에 도전 : :se tw=1 fo=(준비) VG:s/./& /g(공백 삽입), gvgq(별도의 줄에 쪼개), V{:sort u(중복 정렬 및 제거)
sehe

23

대량 텍스트 조작!

매크로를 통해 :

  • 녹음으로 시작하십시오. qq
  • 물건을
  • 녹화 중지 : q
  • 그 후 @q(처음으로) 반복하십시오 @@.
  • 20 회 반복 : 20@@

또는 정규식을 통해 :

  • 물건 교체 : :%s/[fo]+/bar/g

(그러나 경고 : 후자를 수행하면 두 가지 문제가 있습니다.)


5
대한 +1 제이미 자윈 스키를 참조. (연결되지 않은 경우에도 포인트가 회수되지 않습니다). :)
Jim Dennis

1
@ Jim 나는 심지어 Jamie Zawinski 인용문조차 몰랐습니다 :). 나는 지금부터 그것을 기억하려고 노력할 것입니다.
jqno

다음과 같은 트릭이 점점 더 유용하다는 것을 알았습니다 ... 일부 패턴과 일치하는 (또는 일치하지 않는) 라인을 이전 라인과 결합하려는 경우 :% g/foo/-1j또는 :'a,'z v/bar/-1j예를 들어 (이전은 "모든 라인과 패턴 일치" 후자는 "패턴과 일치하지 않는 마크 a와 마크 z 사이의 라인")이다. g또는 vex 명령 에서 패턴 후의 부분은 다른 ex 명령 일 수 있으며, -1j는 상대적인 선 이동 및 결합 명령입니다.
Jim Dennis

물론 매크로 이름을 '2'로 지정하면 사용할 때가 오면 '@'키에서 'q'키로 손가락을 움직일 필요조차 없습니다. 아마도 매번 50에서 100 밀리 초를 절약 할 수 있습니다. = P
JustJeff

@JustJeff 키보드 레이아웃에 전적으로 의존하므로, @ 키는 2 키에서 키보드의 다른쪽에 있습니다.
Simon Steele

23

나는 최근에 발견했다 q:. "명령 창"이 열리고 가장 최근의 전 모드 (명령 모드) 명령이 표시됩니다. 창 내에서 평소대로 이동할 수 있으며를 누르면 <CR>명령이 실행됩니다. 당신도 편집 할 수 있습니다. 복잡한 명령이나 정규 표현식으로 혼란 스러울 때 전체를 다시 입력하고 싶지 않거나 복잡한 명령이 3 명령으로 돌아 가면 귀중합니다. 그것은 거의 bash와 비슷 set -o vi하지만 vim 자체 (heh!)입니다.

:help q:앞뒤로 더 흥미로운 비트를 참조하십시오 .


22

나는 얼마 전 Vim의 전능성을 발견했고, 내가하는 일에 약간 흐릿함을 인정하면서 삽입 모드에서 Ctrl+ x Ctrl+ u또는 Ctrl+ n/ Ctrl+ p를 매시하는 놀랍도록 좋은 결과를 얻었습니다 . 꽤 IntelliSense 는 아니지만 여전히 배우고 있습니다.

사용해보십시오! :help ins-completion


20

이것들은 지름길이 아니지만 관련이 있습니다.

  1. Capslock을 추가 ESC (또는 Ctrl)로 만듭니다.
  2. 다음 명령을 사용하여 지시선을 ","(쉼표)로 매핑하십시오. let mapleader = ","

그들은 내 생산성을 향상시킵니다.


"\"에 대한 좋은 힌트! "\"보다 ","를 입력하는 것이 훨씬 좋습니다.
Olivier Pons 2016 년

2
Windows에서 Caps Lock을 추가 Esc로 만들려면 (caps lock 키란
R. Martinho Fernandes

Mac의 경우 PCKeyboardHack이 필요합니다. superuser.com/questions/34223/…
Tom Morris

1
Windows에서는 다음과 함께 AutoHotKey를 사용합니다.Capslock::Escape
Jeromy Anglim

19

내가 자주 사용하는 또 다른 유용한 vi "단축키"는 'xp'입니다. 커서 아래의 문자가 다음 문자로 바뀝니다.


3
Xp다른 길을 갈
테스터

5
Windows XP가 나올 무렵, 나는 이것이 유일하게 좋은 사용법이라고 농담했습니다.
kguest

18

<Ctrl> + W, V 화면을 세로로 나누려면
<Ctrl> + W, W 창 사이를 이동

! python % [args]이 창에서 편집중인 스크립트를 실행합니다

임의의 선을 접는 비주얼 모드의 ZF


2
<Ctrl> + W 및 j / k를 사용하면 절대적으로 탐색 할 수 있습니다 (일반 vim에서와 같이 j 위로, k 아래로). 3 개 이상의 스플릿이있을 때 좋습니다.
Andrew Scagnelli

1
비주얼 모드에서 zf +1, 코드 접기를 좋아하지만 그것에 대해 몰랐습니다.
coder_tim

2
내 키보드를 두들겨 후 나는 추론했다 <C-w>n거나 <C-w>s, 새로운 수평 창은 <C-w>b오른쪽 아래 창은, <C-w>c또는 <C-w>q창 닫기는, <C-w>x, 증가하고 다음 창 너비를 (??) 감소 <C-w>p, 마지막 창은 <C-w>backspace왼쪽으로 이동 (틱) 창입니다
PUK

:help ctrl-wFTW ... 자신에게 호의를 베풀고 15 분 이상 이러한 일을 시도하도록 강요하십시오!
sjas

18

시각 모드

다른 사람들이 말했듯이 시각적 모드는 복사 / 잘라 내기 및 붙여 넣기 문제에 대한 해답입니다. Vim은 'v', 'V'및 Cv를 제공합니다. vim의 소문자 'v'는 기본적으로 메모장의 Shift 키와 동일합니다. 좋은 점은 그것을 붙잡을 필요가 없다는 것입니다. 이동 기술을 사용하여 선택한 시작 (또는 끝) 지점으로 효율적으로 탐색 할 수 있습니다. 그런 다음 'v'를 누르고 효율적인 이동 기술을 다시 사용하여 선택한 다른 쪽 끝으로 이동하십시오. 그런 다음 'd'또는 'y'를 사용하면 해당 선택을 잘라내거나 복사 할 수 있습니다.

vim의 시각적 모드가 vi에서 잘라 내기 / 복사 / 붙여 넣기에 대한 Jim Dennis의 설명보다 장점은 정확한 위치를 얻을 필요가 없다는 것입니다. 때로는 빠른 이동을 사용하여 가고 싶은 곳의 일반적인 주변에 도착한 다음 이동하려는 곳으로 정확하게 이동하는 더 복잡한 단일 이동 명령을 생각하는 것보다 다른 이동으로이를 수정하는 것이 더 효율적입니다.

이러한 방식으로 시각적 모드를 광범위하게 사용하는 단점은 항상 사용하는 버팀목이되어 더 효율적으로 작업을 수행 할 수있는 새로운 vi (m) 명령을 배우지 못하게한다는 것입니다. 그러나 vi (m)의 새로운 측면을 배우는 데 매우 적극적이라면, 이것은 당신에게 큰 영향을 미치지 않을 것입니다.

또한 비주얼 라인 및 비주얼 블록 모드는 동일한 시각적 테마, 특히 비주얼 블록 모드와 같은 동일한 테마를 변형 할 수 있음을 다시 강조합니다.

효율적인 키보드 사용

또한 교대하는 손이 키보드를 사용하는 가장 빠른 방법이라는 주장에 동의하지 않습니다. 그것은 진실의 요소를 가지고 있습니다. 매우 일반적으로 말하면, 같은 것을 반복적으로 사용하는 것은 느립니다. 이 원리의 가장 중요한 예는 동일한 손가락으로 입력 한 연속 키 입력이 매우 느리다는 것입니다. 어설 션은 아마도이 패턴에서 s / finger / hand / 변환을 사용하는 자연스러운 경향에서 비롯된 것입니다. 어느 정도는 맞지만 효율성 스펙트럼의 극단적 인 끝에서는 올바르지 않습니다.

피아니스트에게 물어보세요. 그들에게 손을 번갈아 가며 연속적으로 한 손의 연속 된 손가락을 사용하는 몇 개의 음표를 연속적으로 연주하는 것이 더 빠른지 물어보십시오. 4 번의 키 입력을 입력하는 가장 빠른 방법은 손을 번갈아가는 것이 아니라 같은 손의 4 손가락으로 오름차순 또는 내림차순으로 입력하는 것입니다 ( "실행"이라고 함). 이 가능성을 고려한 후에는 자명해야합니다.

더 어려운 문제는 이것을 최적화하는 것입니다. 키보드의 절대 거리를 최적화하는 것은 매우 쉽습니다. Vim은 그렇게합니다. "실행"레벨에서 최적화하는 것이 훨씬 어렵지만, 모달 편집 기능이있는 vi (m)을 사용하면 모달이 아닌 접근 방식 (ahem, emacs)보다 더 나은 기회를 얻을 수 있습니다.

이맥스

이멕스 열광 자들이 그 마지막 괄호에 대한 언급으로 내 글 전체를 완전히 무시하지 않도록, 나는 이멕스와 Vim 종교의 차이의 근본을 설명해야한다고 느낍니다. 나는 에디터 전쟁에서 한 번도 말한 적이 없으며 아마도 다시는하지 않을 것입니다. 그러나 아무도 이런 식으로 차이점을 설명하는 것을들은 적이 없습니다. 차이점은 다음과 같습니다.

Vim은 탁월한 텍스트 편집 효율성을 제공합니다. Emacs는 편집기를 사용자 정의하고 프로그래밍 할 수있는 최고의 기능을 제공합니다.

맹인 vim 열광자는 vim에 스크립팅 언어가 있다고 주장합니다. 그러나 편집자를 제공하도록 설계된 모호한 임시 언어입니다. 이맥스는 Lisp을 가지고 있습니다! 충분했다. 마지막 두 문장의 중요성을 이해하지 못하거나 기능 프로그래밍과 Lisp에 대해 충분히 배우고 싶은 마음이 있다면 vim을 사용해야합니다.

이맥스 열광 자들은 이맥스가 독사 모드를 가지고 있다고 주장 할 것이고, 그래서 그것은 vim의 슈퍼 세트입니다. 그러나 독사 모드는 표준이 아닙니다. 내 이해는 대부분의 emacs 사용자가 바이퍼 모드를 사용하지 않는다는 것입니다. 기본값이 아니기 때문에 대부분의 emacs 사용자는 모달 패러다임의 이점에 대한 진정한 감사를 개발하지 않을 것입니다.

제 생각에는 이러한 차이는 직교입니다. vim과 emacs의 장점은 모두 유효하다고 생각합니다. 이것은 최고의 편집기가 아직 존재하지 않음을 의미합니다. 아마도 emacs가 최고의 에디터를 만드는 가장 쉬운 플랫폼 일 것입니다. 그러나 이멕스 사고 방식에서는 모달 편집이 보장되지 않습니다. 이맥스 커뮤니티는 미래에 그런 식으로 움직일 수 있지만 그럴 것 같지는 않습니다.

따라서 원시 편집 효율성을 원하면 vim을 사용하십시오. 편집기를 스크립팅하고 프로그래밍하기위한 최고의 환경을 원한다면 emacs를 사용하십시오. 프로그래밍 기능에 중점을 둔 둘 다 원하는 경우 viper 모드로 emacs를 사용하십시오 (또는 사용자 고유의 모드를 프로그래밍하십시오). 두 세계의 최고를 원한다면 지금은 운이 없습니다.


17

vim 튜토리얼을 수행하면서 30 분을 보내십시오 (터미널에서 vim 대신 vimtutor를 실행하십시오). 기본적인 동작과 일부 키 입력에 대해 배우게되므로, 이전에 사용한 텍스트 편집기에서와 마찬가지로 vim에서도 생산성이 높아집니다. 그 후 Jim Dennis의 답변을 다시 읽으십시오. :)


1
이것이 OP를 읽을 때 가장 먼저 생각한 것입니다. 포스터가 이것을 실행 한 적이 없다는 것은 명백합니다. 나는 2 년 전에 vim을 처음 배울 때 그것을 살펴 보았고 Vim이 내가 사용했던 다른 편집자보다 우월하다고 생각했습니다. .
dash-tom-bang

16

현대 편집자보다 생산성을 높이는 Vim 사용 방법은 무엇입니까?

키를 거의 사용하지 않고 복잡하고 반복적 인 편집을 수행 할 수 있습니다 (종종 매크로 사용 ). VimGolf 를 살펴보면 Vim의 힘을 목격 할 수 있습니다!

거의 매일 10 년 이상 사용한 후 다른 편집기를 사용하는 것은 상상하기 어렵습니다.


16

사용 \c(당신의 IGNORECASE 또는 SmartCase로 설정을 무시) 케이스를 무시하는 검색의 아무 곳. 예 /\cfoo또는 /foo\c일치 foo, Foo, fOO, FOO, 등

\C검색의 아무 곳이나 사용 하여 대소 문자를 강제로 일치시킵니다. 예를 들어 /\Cfoo또는 /foo\Cfoo 와만 일치합니다.


16

나는 그 t운동에 대해 아무도 언급하지 않은 것에 놀랐다 . 나는 종종 dt,또는 의 형태로 매개 변수 목록과 함께 사용합니다.yt,


2
또는 dfx, dFx, dtx, ytx 등 여기서 x는 문자, +1
hhh

예! 그리고 ct를 잊지 마십시오 (로 변경).
markle976

16

홀수 아무도 언급 한 ctags. "풍부한 ctags"를 다운로드하고 검색 경로에 이미있는 엉터리 사전 설치된 버전보다 우선합니다. 당신이 작업하고있는 것의 근원에 CD를; 예를 들어 Android 커널 배포. "ctags -R"을 입력하십시오. "dirs"라는 파일에서 해당 디렉토리 아래의 소스 파일 색인을 빌드합니다. 여기에는 언어 나 디렉토리의 위치에 관계없이 모든 태그가 하나의 파일에 포함되므로 언어 ​​간 작업이 쉽습니다.

그런 다음 해당 폴더에서 vim을 열고 일부 명령에 대해서는 : help ctags를 읽으십시오. 자주 사용하는 몇 가지 :

  • 메소드 호출에 커서를 놓고 CTRL-]을 입력하여 메소드 정의로 이동하십시오.

  • : ta name을 입력하여 이름 정의로 이동하십시오.


14

자동 들여 쓰기 :

gg(문서 시작으로 이동)
=(들여 쓰기!)
shift-g(문서 끝으로 이동)

파일에 'filetype plugin indent on'이 필요 .vimrc하고 적절한 'shiftwidth'및 'expandtab'설정이 필요할 것입니다.


4
또는 처음부터 vi에 있었던 ": set ai"(자동 들여 쓰기) 기능을 사용하십시오.
xcramps

14

생산적인 지름길에 대해 물었지만 실제 질문은 다음과 같습니다. vim은 그만한 가치가 있습니까? 이 stackoverflow 질문에 대한 답변은-> "예"입니다.

두 가지를 눈치 채 셨을 것입니다. Vim은 강력하고 vim은 배우기가 어렵습니다. 그 능력의 대부분은 확장 성과 끝없는 명령 조합에 있습니다. 압도 당하지 마십시오. 천천히 가시오. 한 번에 하나의 명령, 하나의 플러그인. 과용하지 마십시오.

vim에 투자 한 모든 금액은 천 배를 상환합니다. 당신은 죽기 전에 많은 시간 동안 텍스트 편집기 안에있을 것입니다. Vim은 당신의 동반자가 될 것입니다.


13

여러 버퍼, 특히 두 파일 사이를 빠르게 비교하여 두 파일을 비교 :bp하고 :bn(단일 Shift+ p또는 Shift+로 올바르게 다시 매핑)n )

vimdiff 모드 (두 가지 세로 버퍼로 분할하여 차이를 표시하는 색상)

와 지역 복사 Ctrl+를v

마지막으로 식별자의 탭 완성 ( "mosh_tab_or_complete"검색) 그것은 인생의 전환기입니다.


12

최고의 포스터- : r! 명령은 매우 유용합니다.

가장 자주 나는 그것을 "붙여 넣기"하기 위해 사용합니다 :

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

이 방법으로 나는 바이올린을 사용할 필요가 없습니다 :set paste.


3
시스템 클립 보드를 기본적으로 사용하려면 clipboard옵션을 unnamed( set clipboard=unnamed.vimrc에서) 로 설정하는 것이 좋습니다 . 또는 시스템 클립 보드를 명명되지 않은 레지스터와 분리하려면 원하는 이름을 가진 클립 보드 레지스터를 사용하십시오 "*p.
R. Martinho Fernandes

2
그것을 사랑하십시오! 웹에서 코드 예제를 붙여 넣어 격분한 후 vim에 능숙 해지기 시작했습니다. 그것이 바로 그 자리에서 꿈꿔 왔던 명령이었습니다. 이것은 vim이 완전히 나를 때렸을 때였 다.
kevpie

Mac에서 개발중인 경우 Command + C 및 Command + V는 시스템 클립 보드를 사용하여 복사하여 붙여 넣을 필요가 없습니다.
벤 Mordecai

GVIm 만 사용… :set paste자동 들여 쓰기가 활성화 된 경우 콘솔에서 붙여 넣기 가 제대로 작동하지 않습니다.
David Wolever
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.