플러그인 - Vim과 함께 가장 생산적인 지름길은 무엇입니까?




맥 vim 사용법 (20)

저는 Vim 에 대해 찬반 양론 모두에 대해 많이 들었습니다. Vim을 사용하면 다른 편집기보다 (개발자로서) 더 빨리 수행해야합니다. 저는 Vim을 사용하여 기본적인 것들을하고 있으며 Vim을 사용 하면 생산성 이 10 배나 떨어 집니다.

속도에 관해서 이야기 할 때주의해야 할 두 가지 사항 만 있습니다 (충분히 신경 쓰지는 않을지라도) :

  1. 왼손과 오른손을 번갈아 사용하는 것이 키보드를 사용하는 가장 빠른 방법입니다.
  2. 마우스를 만지지 않는 것이 가장 빠른 두 번째 방법입니다. 손을 움직이거나, 마우스를 움켜 잡고, 움직이거나, 키보드로 가져 오는 데 오랜 시간이 걸립니다. (그리고 종종 올바른 장소로 손을 돌려 놓았는지 확인하기 위해 키보드를 봐야합니다.)

왜 내가 Vim과 생산성이 덜 떨어진지 보여주는 두 가지 예가 있습니다.

복사 / 잘라 내기 및 붙여 넣기. 나는 항상 그렇게한다. 현대의 모든 편집자들과 함께 왼손으로 Shift 를 누르고 오른손으로 커서를 움직여 텍스트를 선택하십시오. 그런 다음 Ctrl + C를 복사하면 커서와 Ctrl + V 붙여 넣기가 이동합니다.

Vim을 사용하면 끔찍할 수 있습니다.

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

다른 예시? 검색 및 바꾸기.

  • PSPad : Ctrl + f를 누른 다음 검색 할 내용을 입력하고 Enter 키를 누릅니다 .
  • Vim : / 에 검색 할 내용을 입력 한 다음 특수 문자 앞에 \ 를 붙이면 Enter 키를 누릅니다 .

그리고 Vim을 가진 모든 것은 이와 같습니다 : 나는 그것을 올바른 방법으로 처리하는 방법을 모른다.

주의 : 이미 Vim cheat sheet 읽었습니다. :)

내 질문은 :

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


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

매우 적은 키 스트로크 (종종 macros 사용 )로 복잡하고 반복적 인 편집을 실행할 수 있습니다. VimGolf 를 보고 Vim의 힘을 확인하십시오!

10 년 이상 거의 매일 사용하고 나면 다른 편집기를 사용하여 상상하기가 어렵습니다.


Vim 플러그인

여기에는 많은 좋은 해답이 있고, vi의 선 (zen)에 관한 놀라운 대답이 하나 있습니다. 내가 언급하지 않은 한 가지는 vim이 플러그인을 통해 매우 확장 가능하다는 것입니다. 원저자가 전혀 고려하지 않은 모든 종류의 미친 짓을하는 스크립트와 플러그인이 있습니다. 다음은 믿을 수 없을만큼 편리한 vim 플러그인의 몇 가지 예입니다.

rails.vim

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

gist.vim

이 플러그인을 사용하면 비주얼 모드에서 텍스트 영역을 선택하고 빠른 명령을 입력하여 gist.github.com 에 게시 할 수 있습니다 . 이렇게하면 쉽게 붙여 넣기 작업을 할 수 있으며 IRC 또는 IM을 통해 누군가와 공동 작업을하는 경우 매우 편리합니다.

space.vim

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

surround.vim

이 플러그인은 어떤 방식 으로든 구분 된 텍스트로 작업 할 수있는 기능을 제공합니다. 그것은 괄호 안에있는 것들, 따옴표 안에있는 것들을 나타내는 객체를 제공합니다. 구분 된 텍스트를 다루기 위해 유용 할 수 있습니다.

supertab.vim

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

syntastic.vim

이 도구는 외부 구문 확인 명령을 vim에 제공합니다. 나는 그것을 개인적으로 사용하지 않았지만 그것에 대해 훌륭한 것을 들었고 개념을 깨기가 어렵습니다. 수동으로 수행하지 않고 구문을 검사하는 것은 시간을 크게 절약 해 주며 구문 버그를 잡는 데 도움이됩니다.

fugitive.vim

vim 내부에서 git에 직접 액세스. 다시 말하지만,이 플러그인을 사용하지는 않았지만 유틸리티를 볼 수 있습니다. 불행히도 나는 svn이 "새로운"것으로 간주되는 문화에 있기 때문에 꽤 오랫동안 직장에서 git을 보지 못할 것이다.

nerdtree.vim

vim을위한 트리 브라우저. 나는 이것을 최근에 사용하기 시작했고, 정말 편리합니다. 그것은 당신이 수직 분할에 나무보기를 넣고 쉽게 파일을 열 수 있습니다. 이것은 자주 건너 뛰는 소스 파일이 많은 프로젝트에 유용합니다.

FuzzyFinderTextmate.vim

이 플러그인은 유지 보수가되지 않았지만 여전히 유용합니다. 그것은 "퍼지"서술 구문을 사용하여 파일을 열 수있는 기능을 제공합니다. 그것은 파일의 드문 드문 한 나무에서 당신이 cruft의 나머지 부분에서 관심있는 파일을 모호하게 할만큼 충분한 문자를 입력해야한다는 것을 의미합니다.

결론

vim에는 많은 도구가 있습니다. 여기에서만 표면을 긁었을뿐입니다. 도메인에 적용 할 수있는 도구를 검색해 볼 가치가 있습니다. 전통적인 vi의 강력한 도구 모음, vim의 개선 된 기능 및 vim을 더욱 확장하는 플러그인의 조합은 지금까지 생각한 텍스트를 편집하는 가장 강력한 방법 중 하나입니다. Vim은 emacs, eclipse, visual studio 및 textmate만큼 강력합니다.

감사

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


Vim에 대한 문제는 당신이 바이올린을하지 않는다는 것입니다.

당신은 yy 커팅 언급하고 거의 모든 라인을 자르고 싶지 않아 불평. 실제로 프로그래머, 소스 코드 편집은 전체 라인, 라인 범위 및 코드 블록에서 작업하기를 원합니다. 그러나 yy 는 텍스트를 익명 복사본 버퍼 (또는 vi 에서 호출 할 때 "등록")로 가져 오는 많은 방법 중 하나입니다.

vi 의 "Zen"은 언어를 말하고있는 것입니다. 초기 y 는 동사입니다. yy 명령문은 y_ 와 동의어입니다. y 는 일반적인 조작이므로 입력하기 쉽도록 두 배가됩니다.

이것은 dd P (현재 행을 삭제하고 사본을 제자리에 붙여 넣기, 부작용으로 사본을 익명 레지스터에 남겨두기)로 표현 될 수도 있습니다. yd "동사"는 움직임을 "주제"로 사용합니다. 따라서 yW 는 "여기 (커서)에서 현재 / 다음 (큰) 단어의 끝"으로 yank하고 y'a 는 "여기서 a '라는 표시가있는 줄까지 홱 잡아 y'a ."

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

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

이들이 "움직임"이므로 다른 "진술"의 주제로 사용할 수도 있습니다.

따라서 텍스트를 임의로 자르는 한 가지 방법은 마크를 없애는 것입니다 (보통 ' a '를 첫 번째 마크, ' z '를 다음 마크, b 를 다른 것으로, ' e '를 다음 마크로 사용합니다). 또 다른 한가지 ( vi 를 사용하여 15 년 동안 대화 형으로 4 개 이상의 마크를 대화식으로 사용했던 기억은 없지만 대화식 문맥을 방해하지 않는 매크로로 마크와 레지스터를 사용하는 방법에 관한 고유 한 규칙을 만듭니다). 우리가 원하는 텍스트의 다른 쪽 끝으로, 우리는 양쪽 끝에서 시작할 수 있습니다. 중요하지 않습니다. 그런 다음 d`a 를 사용하여 잘라내거나 복사 할 수 있습니다. 따라서 전체 프로세스에는 5 개의 키 입력 오버 헤드가 있습니다 (6 개 "삽입"모드에서 시작하여 명령 모드를 종료해야하는 경우) 일단 잘라내거나 복사 한 다음 복사본에 붙여 넣는 것은 단일 키 입력입니다.

나는 이것이 텍스트를 자르고 복사하는 한 가지 방법이라고 말한다. 그러나 그것은 단지 많은 것 중 하나입니다. 종종 우리는 커서를 움직이거나 마크를 없애지 않고도 텍스트의 범위를보다 간결하게 기술 할 수 있습니다. 예를 들어 내가 텍스트 단락에 있다면 나는 단락의 처음이나 끝까지 {} 이동을 각각 사용할 수 있습니다. 텍스트의 단락을 이동하려면 { d} (3 개의 키 입력)을 사용하여 자릅니다. (단락의 첫 번째 줄 또는 마지막 줄에 이미있을 경우 간단히 d} 또는 d{ 를 사용할 수 있습니다.

"단락"개념은 일반적으로 직관적으로 합리적인 무언가를 기본값으로합니다. 따라서 그것은 종종 산문뿐만 아니라 코드에서도 작동합니다.

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

"동사"와 "과목"외에도 "개체"도 있습니다 (용어의 문법적 의미에서). 지금까지 익명의 레지스터 사용에 대해서만 설명했습니다. 그러나 "개체"참조 앞에 " (이중 인용 부호 한정 기호)" 접두사를 붙임으로써 26 개의 "명명 된"레지스터 중 하나를 사용할 수 있습니다. 따라서 "add 사용하면 현재 줄을 ' a '레지스터로 잘라서 if 나는 "by/foo 를 사용하여 여기에서" b "레지스터에"foo "가 들어있는 다음 줄까지 텍스트의 복사본을 잡아 당긴다. 레지스터에서 붙여 넣기 위해 붙여 넣기에 단순히 동일한 수정 자 시퀀스를 붙인다. "ap 는 ' a '레지스터의 내용을 커서 뒤의 텍스트에 붙여 넣고 "bP 는' b '에서 현재 줄 앞에 복사본을 붙여 "bP 습니다.

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

이것은 모두 중급 레벨 vi 입니다. 그 중 어느 것도 Vim 에만 국한되는 것은 아니며 , vi 를 배우려는 경우 vi에 훨씬 더 진보 된 기술이 있습니다. 이러한 중간 개념을 마스터한다면, 텍스트 조작 언어가 편집기의 "기본"언어를 사용하여 대부분의 일을 쉽게 수행하기에 충분히 간결하고 표현력이 많기 때문에 매크로를 작성할 필요가 거의 없음을 알 수 있습니다.

보다 진보 된 트릭의 예 :

많은 명령이 있습니다 : 특히 :% s/foo/bar/g 전역 대체 기술. (고급은 아니지만 다른 : 명령이 될 수 있습니다). 전체 : 명령 세트는 vi 의 이전 버전 인 ed (행 편집기)와 나중에 ex (확장 된 행 편집기) 유틸리티로 역사적으로 계승되었습니다. 실제로 vi예를 들어 시각적 인 인터페이스이기 때문에 그렇게 명명되었습니다.

: 명령은 일반적으로 텍스트 행에 대해 작동합니다. edex 는 터미널 화면이 흔하지 않았고 많은 터미널이 "teletype"(TTY) 장치였던 시대에 작성되었습니다. 따라서 매우 간결한 인터페이스를 통해 명령을 사용하여 텍스트의 인쇄 된 사본에서 작업하는 것이 일반적이었습니다 (일반적인 연결 속도는 초당 11 보 또는 약 11 자였습니다 - 빠른 타이피스트보다 느리며 느린 것이 일반적입니다). 다중 사용자 인터랙티브 세션, 또한 종이를 보존하려는 동기가 있음).

따라서 most : 명령의 구문에는 주소 또는 주소 범위 (줄 번호)와 명령이 포함됩니다. 물론 :127,215 s/foo/bar 리터럴 라인 번호를 사용하여 127과 215 사이의 각 줄에서 "foo"의 첫 번째 항목을 "bar"로 변경할 수 있습니다. 또한 다음과 같은 약어를 사용할 수도 있습니다 . 현재 줄과 마지막 줄은 각각 $ 입니다. 또한 상대 접두어 +- 를 사용하여 curent 줄 뒤 또는 앞의 오프셋을 참조 할 수 있습니다. 그러므로 : :.,$j 는 "현재 줄에서 마지막 줄까지 모두 한 줄로 묶는다"를 의미합니다. :%:1,$ (모든 행)과 동의어입니다.

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

흥미있는 것은 일반적인 유닉스 명령 인 grep 이 실제로이 ex 명령에 영감을 받았다는 것입니다 (그리고이 명령은 문서화 된 방식으로 명명되었습니다). ex 명령 :g/re/p (grep)는 "정규 표현식"(re)을 포함하는 행을 "전역 적으로" "인쇄"하는 방법을 문서화 한 방법이었습니다. edex 를 사용했을 때, :p 명령은 누구나 배운 첫 번째 명령이었고, 파일을 편집 할 때 처음 사용 된 명령이었습니다. 그것은 현재 내용을 인쇄 한 방법입니다 (대개 한 페이지 씩 :.,+25p 또는 일부 사용).

참고 :% g/.../d 또는 그 reVerse / conVerse 카운터 파트 : :% v/.../d 는 가장 일반적인 사용 패턴입니다. 그러나 기억해야 할 몇 가지 다른 ex 명령이 있습니다.

m 을 사용하여 줄을 옮기고 j 를 줄을 줄 수 있습니다. 예를 들어 목록이 있고 일치하는 모든 항목을 분리하려는 경우 (또는 반대로 일부 패턴과 일치하지 않는 경우) 삭제하지 않고 다음과 같이 사용할 수 있습니다. :% g/foo/m$ ... 그리고 모든 " foo "행은 파일의 끝으로 이동되었습니다. (파일의 끝을 스크래치 공간으로 사용하는 것에 대한 다른 팁을 주목하십시오). 이렇게하면 모든 "foo"라인의 상대적인 순서가 나머지리스트에서 추출되는 동안 보존됩니다. (이것은 1G!GGmap!Ggrep foo<ENTER>1G:1,'ag/foo'/d (파일을 자신의 꼬리에 복사하고 grep 통해 꼬리를 필터링하고 모든 것을 삭제하는 것과 같습니다. 머리에서).

행을 조인하기 위해 일반적으로 전신 (예 : 일부 글 머리 기호 목록에서 "^ *"대신 "^"로 시작하는 모든 행)에 조인해야하는 모든 행에 대한 패턴을 찾을 수 있습니다. 그 경우에는 :% g/^ /-1j (모든 일치하는 줄에 대해 한 줄 위로 가서 결합하십시오.)를 사용하십시오. (BTW : 글 머리 기호 목록을 찾고 다음 글에 검색하려고하는 글 머리 기호 목록은 몇 가지 이유로 작동하지 않습니다 ... 하나의 글 머리 기호 행을 다른 글 머리 기호 행에 결합 할 수 있으며 모든 글 머리 기호 행을 모두 에 가입시키지 않습니다 그것의 연속, 그것은 성냥에 쌍으로 만 작동 할 것이다).

gv (global / versse-global) 명령으로 우리의 오랜 친구 (대용품)를 사용할 수 있다는 것은 거의 말할 필요도 없습니다. 일반적으로 그렇게 할 필요는 없습니다. 그러나 다른 패턴과 일치하는 행에서만 대체를 수행하려는 경우를 고려하십시오. 흔히 캡처와 함께 복잡한 패턴을 사용할 수 있으며 변경하지 않으려는 라인 부분을 보존하기 위해 역 참조를 사용할 수 있습니다. 그러나, 대체 : :% g/foo/s/bar/zzz/g 에서 매치를 분리하는 것이 더 쉬울 것입니다. "foo"를 포함하는 모든 줄에서 모든 "bar"를 "zzz"로 대체하십시오. (예 :% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g 는 "foo"로 미리 정해진 "bar"의 경우에만 작동합니다. 같은 줄로, 이미 충분히 좋지는 않습니다. "bar"가 "foo"앞에 오는 모든 경우를 잡으려면 더 맹 글링해야합니다.)

요점은 ex 명령 세트에 p , sd 행 이상이 있다는 것입니다.

: 주소는 마크를 나타낼 수도 있습니다. 그러므로 :'a,'bg/foo/j '를 사용하면 ' a '와 ' b '사이의 줄 사이에있는 문자열 foo를 포함하는 모든 행을 후속 행과 연결할 수 있습니다. (예, 위의 모든 ex 명령 예제는 이러한 종류의 주소 지정 표현식을 접두사로 사용하여 파일 행의 서브 세트로 제한 될 수 있습니다).

그것은 꽤 불분명합니다. (나는 지난 15 년 동안 몇 번 그런 것을 사용했습니다.) 그러나 필자는 필자가 올바른 주문을 생각할 시간을 가지면 더 효율적으로 수행되었을 수있는 일들을 반복적으로 반복적으로 반복 해왔다는 것을 자유롭게 인정할 것이다.

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

더 강력한 :r! 명령. 이것은 명령의 결과를 읽습니다. 이것은 vi 세션을 일시 중단하고, 명령을 실행하고, 출력을 임시 파일로 재지 정하고, vi 세션을 다시 시작하고, 임시 파일에서 내용을 읽는 것과 같습니다. 파일.

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

사용 :r! 그리고 ! 명령은 외부 유틸리티 또는 필터를 편집기의 확장으로 취급 할 수 있음을 의미합니다. 필자는 데이터베이스에서 데이터를 가져온 스크립트 나 웹 사이트에서 데이터를 가져온 wget 또는 lynx 명령 또는 원격 시스템에서 데이터를 가져온 ssh 명령을 사용하여 이들을 가끔 사용했습니다.

또 다른 유용한 ex 명령은 :so (short for :source )입니다. 이 명령은 파일의 내용을 일련의 명령으로 읽습니다. vi 를 시작하면 ~/.exinitrc 파일에서 암시 적으로 a :source 를 수행합니다 (일반적으로 Vim~/.vimrc 에서이 작업을 수행합니다). 이 기능을 사용하면 새로운 매크로, 약어 및 편집기 설정을 간단하게 사용하여 편집기 프로필을 변경할 수 있습니다. 부끄러워하는 사람이라면 필요에 따라 파일에 적용 할 수있는 ex 편집 명령 시퀀스를 저장하는 트릭으로 사용할 수도 있습니다.

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

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

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

@ 명령은 아마도 가장 모호한 vi 명령 일 것입니다. 10 년 가까이 첨단 시스템 관리 교육 과정을 가르치면서 나는 거의 사용하지 않은 사람들을 거의 만났습니다. @vi 또는 ex 명령 인 것처럼 레지스터 내용을 실행합니다.
예 : 자주 : :r!locate ... 를 사용하여 내 시스템에서 파일을 찾고 이름을 내 문서로 읽습니다. 그곳에서 내가 관심있는 파일에 대한 전체 경로 만 남겨둔 채 불필요한 히트를 삭제합니다. 힘들이지 않고 경로의 각 구성 요소를 탭 처리 합니다 (또는 탭 완성없이 컴퓨터에 고정되어있는 경우 악화됩니다. vi 의 복사본에서 지원) 나는 다음을 사용합니다.

  1. 0i:r (현재 줄을 유효한 : r 명령으로 변환),
  2. "cdd ("c "레지스터에 줄을 지우려면) 그리고
  3. @c 그 명령을 실행하십시오.

이것은 단지 10 개의 키 스트로크입니다 (그리고 "cdd @c 는 효과적으로 나를위한 핑거 매크로입니다. 그래서 거의 6 글자의 단어처럼 빨리 입력 할 수 있습니다).

냉정한 생각

나는 오직 vi 의 힘을 비 겼고, 여기서 설명한 것은 vim의 이름이 붙여진 "개선"의 부분조차도 아닙니다! 여기에 설명 된 모든 내용은 20 년 또는 30 년 전의 vi의 이전 사본에서 작동합니다.

vi 보다 훨씬 많은 것을 사용했던 사람들이 있습니다.


당신은 텍스트 선택 및 복사에 대해 이야기하고 있습니다. 저는 Vim Visual 모드를 살펴 봐야한다고 생각합니다.

비주얼 모드에서는 Vim 명령을 사용하여 텍스트를 선택할 수 있습니다. 그러면 원하는대로 원하는대로 선택할 수 있습니다.

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

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

할 수있는 일 :

  • v% 커서가 시작 / 끝 괄호에 있으면 v%
  • 커서가 괄호 블록 안에 있으면 vib

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

  • vi " 큰 따옴표 사용
  • 작은 따옴표를 붙이려면 'vi'

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

  • viB
  • vi{

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

  • ggVG

시각적 블록 선택 은 또 다른 유용한 기능 중 하나입니다. 텍스트의 직사각형 영역을 선택할 수있게하려면 Ctrl - V 를 눌러 시작한 다음 원하는 텍스트 블록을 선택하고 yank, 삭제, 붙여 넣기, 편집 등을 할 수 있습니다. 열 기반 텍스트를 편집하는 것이 좋습니다.


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

나는 이걸로 많은 시간을 절약 할 수있다.

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


Control + R 메커니즘은 매우 유용합니다 :-) 삽입 모드 또는 명령 모드 (즉, 명령을 입력 할 때 : 행)에서 번호가 매겨진 또는 이름이 지정된 레지스터로 계속하십시오.

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

참조 :help i_CTRL-R:help c_CTRL-R 자세한 내용 :help c_CTRL-R 을 참조하십시오.


미군 병사

마지막으로 수정 한 위치로 이동 (일부 검색을 수행 한 후 다시 돌아가 편집을 원할 경우 매우 유용합니다)

^ P와 ^ N

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

^ O 및 ^ I

이전 ( ^O- "O"오래된 위치) 또는 다음 ( ^I- "I"바로 근처 ) 위치로 이동하십시오 "O". 검색을 수행하거나 파일을 편집 할 때 이러한 "점프"를 앞뒤로 탐색 할 수 있습니다.


단축키는 아니지만 관련이 있습니다.

  1. capslock을 추가 ESC (또는 Ctrl)
  2. 맵 리더를 ","(쉼표)로 바꾸려면 다음 명령을 사용하십시오. let mapleader = ","

그들은 생산성을 높여줍니다.


모두 정상 모드에서 :

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

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

지능적으로 사용하면 위의 두 가지가 당신을 살인자로 만들 수 있습니다.

* 다음 인스턴스를 검색 할 단어.

이전 인스턴스를 검색 할 단어를 # 표시 합니다.


비주얼 모드

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

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

이런 식으로 비주얼 모드를 광범위하게 사용하는 것은 항상 새로운 버팀대가되어 더 효율적으로 작업을 수행 할 수있는 새로운 vi (m) 명령을 배울 수 없다는 단점이 있습니다. 그러나 vi (m)의 새로운 측면을 배우는 것에 대해 매우 능동적 인 사람이라면 이것은 아마도 여러분에게 많은 영향을 미치지 않을 것입니다.

나는 또한 시각적 인 선과 시각적 블록 모드가 매우 강력한이 같은 주제, 특히 시각적 블록 모드를 제공한다는 점을 다시 강조 할 것입니다.

키보드의 효율적인 사용에 대하여

나는 또한 번갈아 사용하는 것이 키보드를 사용하는 가장 빠른 방법이라는 주장에 동의하지 않습니다. 그것에는 진리의 요소가 있습니다. 매우 일반적으로 말하면, 동일한 것을 반복해서 사용하는 것은 느립니다. 이 원칙의 가장 중요한 예는 동일한 손가락으로 입력 된 연속 키 입력이 매우 느립니다. 당신의 주장은 아마도이 패턴에서 s / fing / hand / transformation을 사용하는 자연스러운 경향 때문일 것입니다. 어느 정도는 정확하지만 효율 스펙트럼의 극단적 인 끝 부분에서는 정확하지 않습니다.

피아니스트에게 물어보십시오. 손을 교대로 반복하거나 한 손의 연속 손가락을 순서대로 사용하는 것이 더 빠르지 않은지 물어보십시오. 가장 빠른 방법은 4 개의 키 스트로크를 입력 할 때 손을 대치하는 것이 아니라 동일한 손의 손가락 4 개를 오름차순 또는 내림차순으로 입력하는 것입니다 (이를 "실행"이라고 함). 이 가능성을 고려한 후에는이를 분명히해야합니다.

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

이맥스에서

이맥스의 열렬한 지지자들이 마지막 괄호 안에 달린 논평 때문에 내 게시물 전체를 완전히 무시하지 않도록 나는 이맥스와 vim 종교 간의 차이점의 근원을 설명해야한다고 생각한다. 나는 편집자 전쟁에서 한 번도 말한 적이 없으며 아마 다시는하지 않을 것이지만, 다른 사람들이 이런 식으로 차이점을 설명하는 것을 들어 본 적이 없으므로 여기에 설명되어 있습니다. 그 차이점은 다음과 같습니다.

Vim은 원시 텍스트 편집 효율성을 제공합니다. Emacs는 편집기를 사용자 정의하고 프로그래밍 할 수있는 독보적 인 기능을 제공합니다.

맹목적인 vim 열렬한 사람들은 vim에 스크립팅 언어가 있다고 주장 할 것입니다. 그러나 편집기를 제공하도록 설계된 애매한 언어입니다. 이맥스는 Lisp을 가지고있다! 충분했다. 만약 당신이 그 마지막 두 문장의 중요성을 이해하지 못하거나 그 감사를 발전시키기 위해 함수형 프로그래밍과 Lisp에 대해 충분히 배우고 싶다면 vim을 사용해야합니다.

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

내 의견으로는 이러한 차이는 직각이다. 나는 vim과 emacs의 이점이 모두 유효하다는 것을 진술 한 것처럼 믿습니다. 이것은 궁극의 편집자가 아직 존재하지 않는다는 것을 의미합니다. 이맥스는 궁극적 인 편집기를 기반으로하는 가장 쉬운 플랫폼이 될 것입니다. 그러나 모 다르 편집은 이맥스 사고 방식에 확고하지 않습니다. 이맥스 커뮤니티는 미래에 그런 식으로 움직일 수 있지만 그럴 가능성은 희박합니다.

따라서 편집 효율을 높이려면 vim을 사용하십시오. 스크립팅과 에디터 프로그래밍을위한 궁극적 인 환경을 원한다면 emacs를 사용하십시오. 프로그래머 빌리티에 중점을두고 두 가지를 모두 원한다면, 바이퍼 모드와 함께 emacs를 사용하거나 자신의 모드를 프로그래밍하십시오. 당신이 두 세계의 장점을 원한다면, 지금은 운이 없다.


<Ctrl> + W, V를 누르면 화면이 세로로 분할됩니다.
<Ctrl> + W, W는 창 사이를 이동합니다

!이 창에서 편집하고있는 스크립트를 실행하기위한 python % [args]

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


vim 튜토리얼을 30 분 사용하십시오 (터미널에서 vim 대신 vimtutor를 실행하십시오). 기본 동작과 일부 키 스트로크를 배우게 될 것입니다. 그러면 이전에 사용한 텍스트 편집기 에서처럼 vim에서 생산성을 발휘할 수 있습니다. 그 후, 짐 데니스 (Jim Dennis)의 대답을 다시 읽어보십시오 :)


나는 최근에 발견했다 q:. "명령 창"을 열고 가장 최근의 전 모드 (명령 모드) 명령을 보여줍니다. 창 내에서 평소와 같이 이동할 수 있으며, 키를 누르면 <CR>명령이 실행됩니다. 당신도 편집 할 수 있습니다. 복잡한 명령이나 정규식으로 주위를 어지럽히고 모든 것을 다시 입력하고 싶지 않거나 원하는 복잡한 작업이 3 개의 명령 인 경우에 가격이 책정됩니다. 그것은 bash와 거의 set -o vi같지만 vim 자체 (heh!)와 같습니다.

:help q:앞뒤로가는 것에 대해 더 재미있는 부분을 보십시오 .


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

그것은 꽤 새롭고 정말로 좋은 것입니다. 사이트를 운영하는 사람은 textmate에서 vim으로 전환하고 특정 vim 주제에 대한 매우 우수하고 간결한 캐스트를 호스팅합니다. 확인 해봐!


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

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

탐색기를 사용하여 파일을 수정할 수도 있습니다. 나는 내가 좋아하는 열쇠 몇 개를 게시 <F1>할 것이고 , 누르면 전체 목록을 줄 것이다.

  • - : 가장 유용 : 상위 디렉토리로 변경 ( cd ..)
  • mf : 파일에 표시
  • D : 아무 것도 표시되지 않으면 표시된 파일이나 커서가있는 파일을 삭제합니다.
  • R : 커서가있는 파일의 이름을 바꿉니다.
  • d : 현재 디렉토리에 새 디렉토리 만들기
  • % : 현재 디렉토리에 새 파일 만들기

당신은 생산적인 지름길에 대해 물어 보았습니다. 그러나 나는 당신의 진정한 질문은 다음과 같습니다 : vim은 가치가 있습니까? 이 질문에 대한 대답은 -> "예"입니다.

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

vim에 투자 한 모든 투자금은 천 배를 지불하게됩니다. 당신은 죽기 전에 많은 시간 동안 텍스트 편집기 안에있게 될 것입니다. Vim이 당신의 동반자가 될 것입니다.


얼마 전에 Vim의 omnicompletion을 발견했는데, 어떤 점에서 제가 약간 흐릿하다는 것을 인정하지만, 삽입 모드에서 Ctrl+ x Ctrl+ u또는 Ctrl+ n/ Ctrl+ p를 매시 켰을 때 놀랍도록 좋은 결과를 얻었습니다 . 그것은 확실히 아니다 IntelliSense , 그러나 나는 아직도 배우고있다.

그것을 밖으로 시도하십시오! :help ins-completion


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

vimdiff 모드 (2 개의 수직 버퍼로 분할 해, 차이를 나타내는 컬러로)

영역 복사 Ctrl+v

마지막으로 식별자의 탭 완성 ( "mosh_tab_or_complete"검색). 그것은 삶의 변화 요인입니다.


저는 American Cryptogram Association의 회원입니다. 격월간 잡지에는 다양한 종류의 암호문이 100 개 이상 포함되어 있습니다. 이 중 약 15 개는 "cryptarithm"입니다 - 숫자 대신 숫자로 대체 된 다양한 유형의 산술 문제. 이들 중 2 ~ 3 개는 숫자 대신 문자로 표시되는 스도쿠입니다. 격자가 완료되면, 9 개의 별개의 문자가 단어 나 단어, 일부 선, 대각선, 나선형 등을 그리드의 어딘가에 기입합니다.

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

이 스도쿠스로 작업 할 때 vi를 사용합니다. 왜냐하면 vi는 다른 편집자가 거의없는 편의 시설을 사용하기 때문입니다. 문자로 된 격자를 번호 매기기 그리드로 변환하는 것은 주로 해결하기가 쉽기 때문에 가능합니다. 그런 다음 완성 된 번호가 매겨진 그리드를 문자로 된 단어로 바꿔보십시오.

이 문제는 9 개의 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 튜토리얼 서적, 웹 사이트, 도움말 파일 등 거의 모든 것이 가능할 수있는 것의 표면을 간신히 만지는 것 이상을 수행한다는 것입니다.


지난 주 직장에서이 프로젝트는 다른 프로젝트에서 많은 Python 코드를 상속 받았다. 불행하게도이 코드는 기존 아키텍처에 적합하지 않았습니다. 모든 것이 글로벌 변수 및 함수로 완료되었으므로 멀티 스레드 환경에서는 작동하지 않습니다.

우리는 객체 지향형으로 재 작성해야했던 ~ 80 개의 파일을 가지고있었습니다. 모든 함수가 클래스로 옮겨졌고, 매개 변수가 변경되었으며, import statements가 추가되었습니다. 각 파일에 대해 수행해야하는 약 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 %를 변경하고 결과를 테스트하는 작업을하고 있습니다. 그러나이 스크립트를 작성하는 데 하루를 소비함으로써 우리는 몇 주 동안의 작업을 저장했다고 평가합니다.

물론 Python이나 Ruby 같은 스크립팅 언어로 이것을 자동화하는 것이 가능할 수도 있지만, 작성하는 데 시간이 오래 걸리고 유연성이 떨어집니다. 정규 표현식만으로는 처리 할 수 ​​없으므로 마지막 예제는 어려울 것입니다 중첩 된 대괄호 (예 : 변환 bar(foo(xxx))대상) foo(xxx).bar(). Vim은 작업에 완벽했습니다.





vi