엄마가 말하지 않은 Vim의 어두운 구석은 무엇입니까? [닫은]


799

사람들이 일반적인 트릭, 특히 " Vim + ctags 팁과 트릭 "에 대해 이야기하는 많은 질문이 있습니다.

그러나 나는 Vim을 처음 접하는 사람이 멋지게 사용할 수있는 일반적으로 사용되는 바로 가기를 언급하지 않습니다. 저는 유닉스 사용자 (개발자, 관리자 등)가 우리 중 99 %가들은 적이 있거나 꿈꿔 본 적이없는 것을 알고 있다고 생각합니다. 작업을 더 쉽게 할뿐만 아니라 COOL 및 hackish 입니다. 결국, Vim 은 세계에서 가장 어두운 구석이 많은 OS에 상주하므로 소수의 특권 자만 알고 공유하고 싶어하는 복잡성을 가져야합니다.


10
: 섹스 분할 창 및 통합 파일 탐색기 열기 (가로 분할)
user3218088 2016 년

2
이 질문은 공감할 수있는 투표 수를 살펴보면 상당히 건설적인 것처럼 보입니다. 투표로 답변을 주문하면 단 5 분 만에 많은 멋진 것들을 배웠습니다. 여기 정말 귀중한 것들, 왜이 귀중한 것을 닫을까요? 이것은 어떻게 건설적이지 않습니까?
jhegedus

7
이 질문이 끝났다는 것은 말도 안됩니다. 법률에 대해 이야기하십시오.
Lepidopterist

2
이 질문은 매우 건설적이지만 Quora에서는 더 적절하다고 생각합니다.
Diogo Melo

2
이 질문을 삭제하기 위해 2 (현재)의 투표가 필요한 이유는 무엇입니까? 어떻게하면 좋을까요?
Akavall

답변:


782

Vim 사용자의 99 %가 알지 못하는 것일 수도 있지만 매일 사용하는 것으로 Linux + Vim 파워 유저가 알아야 할 사항입니다.

기본 명령이지만 매우 유용합니다.

:w !sudo tee %

쓰기 권한이없는 파일을 편집하기 전에 sudo를 잊는 경우가 종종 있습니다. 해당 파일을 저장하고 권한 오류가 발생하면 임시 파일에 파일을 저장하지 않고 파일을 저장 한 다음 다시 복사하기 위해 해당 vim 명령을 실행하면됩니다.

sudo가 설치되어 있고 sudo 권한이있는 시스템에 있어야합니다.


116
아마도 vim을 루트로 실행하는 것보다 습니다! 공감!
Arafangion

27
멍청한 놈, 티는 정확히 무엇을 하는가? 누군가 나를 위해이 명령을 파싱 할 수 있습니까?
AndyL

41
cmap w !! w! 스도 티 %
jm666

58
당신은 절대로 실행해서는 안됩니다 sudo vim. 대신 EDITORvim으로 내보내고 실행 해야 합니다 sudoedit.
Gerardo Marset

8
@maximus : vim은 %를 현재 버퍼 / 파일 이름으로 대체합니다.
migu

617

최근에 내가 발견 한 것이 매우 멋졌다는 것을 발견했습니다.

:earlier 15m

문서를 15 분 전의 상태로 되돌립니다. 롤백하려는 시간 동안 다양한 인수를 취할 수 있으며 실행 취소 레벨에 따라 다릅니다. 반대 명령으로 되돌릴 수 있습니다:later


6
@skinp : 실행 취소 한 후 실행 취소 상태에서 추가로 변경하면 다시 실행 기록이 손실됩니다. 이를 통해 더 이상 실행 취소 스택에없는 상태로 돌아갈 수 있습니다.
ephemient

39
또한 시간에 따라 앞뒤로 이동하는 g +와 g-도 매우 유용합니다. 실행 취소 후 무언가를 할 때 히스토리를 잃지 않기 때문에 실행 취소 / 다시 실행 스택보다 훨씬 강력합니다.
Etienne PIERRE

9
실행 취소 후 변경을하면 다시 실행 기록을 잃지 않습니다. 쉽게 접근 할 수 없습니다. Gundo.vim 같은 당신이 시각화에 플러그인이 있습니다
Ehtesh Choudhury의

559
와우, 이제 할 수 있고 :later 8h오늘 끝났어요? : P
Igor Popov

7
귀하의 명령은 vim 에서 최소 15 분을 소비한다고 가정합니다 !
e2-e4

411

:! [command] Vim에있는 동안 외부 명령을 실행합니다.

그러나 콜론 뒤에 점을 추가 :.! [command]하면 명령의 출력이 현재 창에 덤프됩니다. 그게: . !

예를 들면 다음과 같습니다.

:.! ls

입력하는 문서에 현재 날짜를 추가하는 것과 같은 작업에 이것을 많이 사용합니다.

:.! date

74
이것은 : r과 매우 유사합니다! 내가 알 수있는 한 유일한 차이점은 : r! 새 줄을 엽니 다 :.! 현재 줄을 덮어 씁니다.
2009 년

6
다른 방법 :.!date은 줄에 "날짜"를 쓴 다음 실행하는 것입니다 !$sh(또는 명령 뒤에 빈 줄을 붙여서 실행하는 것 !jsh). 이것은 라인을 "sh"쉘로 파이프하고 명령의 출력으로 대체합니다.
hlovdal

43
:.!실제로는의 특수한 경우로 :{range}!, .명령을 통해 범위의 라인 (범위가 현재 라인 인 경우)을 필터링하고 해당 라인을 출력으로 바꿉니다. 나는 찾을 :%!전체 버퍼를 필터링하는 데 유용합니다.
Nefrubyr

2
@ sundar : sed비슷한 내장 ed/ ex명령을 사용할 수 있는데 왜 줄을 전달 합니까? :.s/old/new/g;-) 실행
jabirali

4
또한 '!' 'y', 'd', 'c'등과 같습니다. 예를 들어 다음과 같이 할 수 있습니다 : !!, number !!,! motion (예 :! Gshell_command <cr> 현재 줄에서 파일의 끝 ( 'G')으로 대체) shell_command의 출력).
aqn

312

정확히 모호하지는 않지만 다음과 같이 매우 유용한 몇 가지 "삭제"명령이 있습니다.

  • diw 현재 단어를 삭제
  • di( 현재 Parens 내에서 삭제
  • di" 따옴표 사이의 텍스트를 삭제하려면

다른 곳에서 찾을 수 있습니다 :help text-objects


8
dab "대괄호 삭제", 중괄호 주위의 daB, xml 유형 태그의 경우 t, 일반 명령과의 조합은 예상대로 cib / yaB / dit / vat 등
sjh

15
@Masi : yi (va (p는 대괄호 만 삭제합니다.
Don Reba

42
이것이 내가 Vim에 머무는 가장 큰 이유 일 것입니다. 그와 동등한 "변경"명령 : ciw, ci (, ci ", dt <space> 및 ct <space>
thomasrutter

4
@ Thomasrutter : 왜 dt <space> 대신 dW / cW가 아닌가?

9
@Masi : 서라운드 플러그인 사용 : ds (.

237

de 를 눌러 단어 끝까지 모든 것을 삭제합니다. 당신의 마음의 소원에.

ci (xyz [Esc] -이것은 이상합니다. 여기에서 'i'는 삽입 모드를 의미하지 않습니다. 대신 괄호 안의 의미이므로이 순서는 괄호 안의 텍스트를 잘라 내고 . "XYZ"는 또한 내부 광장과 그림 괄호를 작동 -.. 단지 CI [또는 CI를 {방금 입력 아무것도하지 않고 모든 텍스트를 삭제하려면 상응 당연히, 당신은 (디를 할 수있는 당신도 할 수있는 할 a대신에 i당신이 경우 내부의 텍스트뿐만 아니라 괄호도 삭제하려고합니다.

ci " -현재 따옴표로 텍스트를 자릅니다.

ciw- 현재 단어를 잘라냅니다. 이것은 (로 대체되는 것을 제외하고 는 이전과 동일하게 작동합니다 w.

C- 나머지 줄을 자르고 삽입 모드로 전환하십시오.

ZZ- 현재 파일을 저장하고 닫습니다 (현재 탭을 닫으려면 Ctrl-F4보다 빠름)!

ddp- 현재 행을 한 행 아래로 이동

xp- 현재 문자를 한 위치 오른쪽으로 이동

U- 대문자이므로 viwU단어를 대문자

~ -대 / 소문자를 전환하므로 viw~전체 단어의 대 / 소문자 를 반대로 바꿉니다.

Ctrl + u / Ctrl + d를 누르면 화면이 반 화면 위로 또는 아래로 스크롤됩니다. 두 화면의 관계를보다 쉽게 ​​확인할 수 있기 때문에 일반적인 전체 화면 페이징보다 더 유용한 것 같습니다. 한 번에 전체 화면을 계속 스크롤하려는 경우 앞으로는 Ctrl + f, 뒤로는 Ctrl + b를 사용하십시오. Ctrl + Y와 Ctrl + E는 한 번에 한 줄씩 아래로 스크롤합니다.

미친하지만 매우 유용한 명령은 zz 입니다.이 줄이 가운데에 표시되도록 화면을 스크롤합니다. 이것은 작업중 인 코드를 관심의 중심에 두는 데 탁월합니다. 형제 명령 (zt 및 zb)은이 라인을 sreen에서 맨 위 또는 맨 아래로 만듭니다.

% 는 일치하는 괄호를 찾아서 점프합니다.

de- 커서에서 단어 끝까지 dE삭제 (다음 공간까지 삭제할 수도 있음 )

bde- 현재 단어를 왼쪽에서 오른쪽으로 구분 기호를 삭제

df [space] -다음 공간을 포함하여 다음 공간을 포함하여 삭제

dt. -다음 점까지 삭제

dd- 이 전체 줄을 삭제

ye (또는 yE) -여기에서 단어의 끝까지 텍스트를 잡아 당깁니다.

ce- 단어의 끝을 자른다

bye- 현재 단어를 복사합니다 ( "hi"가 무엇을하는지 궁금하게 만듭니다!)

yy- 현재 줄을 복사

cc- 현재 줄을 자르고 S대신 할 수도 있습니다 . 또한 s현재 캐릭터를 자르고 삽입 모드로 전환하는 캡 이 더 낮습니다 .

viwy 또는 viwc . 양키 또는 현재 단어를 변경하십시오. 히트 w이후의 각 단어를 선택 유지하기 위해 여러 번 사용이 b뒤쪽으로 이동

vi { -괄호 안의 모든 텍스트를 선택하십시오. va {-{}을 포함하여 모든 텍스트를 선택하십시오.

vi (p- () 안의 모든 것을 강조 표시하고 붙여 넣은 텍스트로 바꿉니다.

b와 e는 Ctrl + 화살표가 일반적으로하는 것과 비슷하게 커서를 한 단어 씩 움직 입니다. 단어의 정의는 약간의 연속 된 delmiters가 하나의 단어로 취급되므로 약간 다릅니다. 단어 중간에서 시작하는 경우 b를 누르면 항상 현재 단어의 시작 부분으로 이동하고 연속 된 각 b는 다음 단어의 시작 부분으로 이동합니다. 마찬가지로 기억하기 쉬운 e커서는 현재 단어와 그 다음 단어의 끝으로 커서를 가져옵니다.

비슷한에 b/ e자본 BE커서를 단어 구분 기호로 단지 공백을 사용하여 이동합니다.

대문자 D (심호흡) 일반 편집기의 Shift + End / Del과 같이 커서 오른쪽에있는 나머지 행을 삭제합니다 (키 대신 3 번 누르기-Shift + D 참고).


15
zt 는 함수 또는 클래스 정의의 시작 부분에서 사용할 경우 매우 유용합니다.
Nick Lewis

9
vityvitc단축 할 수 yitcit각각.
Nathan Fellman

33
"cut"이라고 부르는 모든 것은 "change"입니다. 예 : C는 줄 끝까지 변경됩니다. Vim의 "cut"은 "삭제"이며 d / D로 수행됩니다. 변경과 삭제의 주요 차이점은 삭제는 일반 모드를 유지하지만 변경으로 인해 일종의 삽입 모드로 전환된다는 점입니다 (변경 명령은 여전히이지만 전체 변경을 반복 할 수 있으므로 편리합니다 .).
Laurence Gonsalves

11
나는 이것이 많은 사람들이 알지 못하는 것들의 목록이라고 생각했다. yy는 매우 일반적입니다.
Almo

19
bye당신이 단어의 첫 문자에있을 때 작동하지 않습니다. yiw항상 그렇습니다.
Andrea Francia

204

대부분의 Vim 튜토리얼에서 거의 찾지 못했지만 매우 유용합니다 (적어도 나에게는).

g; and g,

변경 목록을 통해 (앞으로, 뒤로) 이동합니다.

어떻게 사용하는지 보여 드리겠습니다. 때로는 CSS 파일에 16 진수 색상 코드와 같은 코드 나 문자열을 복사하여 붙여 넣어야하므로 검색, 점프 (일치하는 부분은 신경 쓰지 않음), 복사 한 다음 뒤로 이동 (g;) 마지막으로 붙여 넣기 위해 코드를 편집하고있었습니다. 마크를 만들 필요가 없습니다. 더 간단합니다.

내 2 센트 만.


29
유사하게, '.마지막 편집 라인에 갈 것, 그리고 `.마지막 편집 위치로 이동합니다
aehlke

8
Ctrl-O와 Ctrl-I (탭)는 비슷하게 작동하지만 동일하지는 않습니다. "jump list"에서 앞뒤로 이동합니다. : jumps 또는 : ju 자세한 내용은 : help jumplist를 참조하십시오.
Kimball Robinson

17
다음을 수행하여 변경 목록을 나열 할 수 있습니다.
Kimball Robinson

유용한 핫 댕. 나는 이것을 위해 <C-o>/ <C-i>를 항상 사용 하거나 내 장소를 표시합니다.
Wayne Werner

187
:%!xxd

vim을 16 진 편집기로 만드십시오.

:%!xxd -r

돌아가다.

경고 : 이진 (-b)으로 편집하지 않으면 파일이 손상 될 수 있습니다. – 코멘트에서 조쉬 리.


9
어떻게 되돌릴 수 있습니까?
Christian

40
:! xxd -r // HEX에서 되돌리려면
Naga Kiran

21
나는 실제로 생각 :%!xxd -r다시 되돌리려
안드레아스 GRECH

@ JoshLee : 개행을 통과하지 않도록 조심한다면 -b 옵션을 사용하지 않는 것이 안전합니까? 때로는 16 진수 변경을 원하기 때문에 묻지 만 그렇게하기 위해 파일을 닫았다가 다시 열고 싶지 않습니다.
dotancohen 2016 년

4
@dotancohen : 파일을 닫거나 다시 열지 않으려면 다음을 수행하십시오. 바이너리 설정
Bambu

129
gv

마지막 시각적 선택을 다시 선택합니다.


119

때로는 .vimrc의 설정이 플러그인 또는 자동 명령으로 재정의되는 경우가 있습니다. 이를 디버깅하려면 : verbose 명령을 : set과 함께 사용하는 것이 좋습니다. 예를 들어, cindent가 설정 / 설정 해제 된 위치를 파악하려면 다음을 수행하십시오.

:verbose set cindent?

이것은 다음과 같이 출력됩니다 :

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

이것은지도와 하이라이트에서도 작동합니다. (이를 지적 해준 joeytwiddle에게 감사합니다.) 예를 들면 다음과 같습니다.

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim

8
훌륭한 팁-오늘 내가 찾던 것.
Artem Russakovskii

훌륭한 팁 맨! 이 괴짜들을 어떻게 알게됩니까?
Rafid

1
:verbose키맵 또는 강조 표시가 마지막으로 정의 된 위치를 찾 nmap l거나 highlight Normal찾기 전에 사용할 수도 있습니다 . 디버깅에 매우 유용합니다! lNormal
joeytwiddle

감사합니다! 그 정보를 답변에 추가했습니다.
Laurence Gonsalves

사용자 지정 매핑을 만들면 엉덩이가 너무 많이 절약되며 아마도 가장 유용한 것 중 하나 일 것입니다 (IMO)!
SidOfc


98

이것이 어둡게 계산되는지 확실하지 않지만, 나는 단지 그것을 배웠습니다 ...

:g/match/y A

"match"를 포함하는 모든 행을 "a/ @aregister에 적시 (복사)합니다 . Avim 으로 인해 이전 등록 내용을 바꾸지 않고 vim이 yanking을 추가 합니다. Internet Explorer 스타일 시트를 만들 때 최근에 많이 사용했습니다.


세, 내가 이것을 보지 못한 것으로 계산 :)

좋은데 들어 본 적이 없다 ... 유용 할 수 있습니다 : P
skinp

5
사용할 수 있습니다 : g! 패턴과 일치하지 않는 행을 찾으려면 ex : g! / set / normal dd (세트를 포함하지 않는 모든 행 삭제)
tsukimi

3
때로는 tsukimi가 말한 것을 수행하고 패턴과 일치하지 않는 행을 필터링하는 것이 좋습니다. 이 명령에 생각의 축약 버전 :v/PATTERN/d설명 : :v의 약어입니다 :g!, 그리고 :g명령 라인에 어떤 전직 명령을 적용합니다. :y[ank]효과가 있습니다 :normal. 그러나 여기서 가장 자연스럽게해야 할 일은 바로 그 것 :d[elete]입니다.
pandubear

당신은 또한 할 수 :g/match/normal "Ayy- normal키워드 당신이 (당신은 아마 더 잘 알고있는) 정상 모드 명령을 실행하도록 지시 할 수 있습니다.
Kimball Robinson

93

: 명령 기록을보고 싶으십니까?

q:

그런 다음 찾아보기, 편집 및 마지막으로 명령을 실행하십시오.

두 파일을 비슷하게 변경 한 후 파일간에 앞뒤로 전환 한 적이 있습니까? (소스, 헤더 및 파일은 무엇입니까?)

:set hidden
:map <TAB> :e#<CR>

그런 다음 해당 파일 사이를왔다 갔다하십시오.


131
나는 q:항상 우연히 쳤다 ...
Josh Lee

11
또는 ex 편집기 (:)에서 CTRL-f를 사용하여 명령 기록 창을 표시 할 수 있습니다.
제이슨 다운

6
@jleedev 나도. 실수로 너무 많이 사용했기 때문에 나는이 명령을 거의 싫어합니다.
bradlis7

9
q /와 q? 검색 패턴과 유사한 작업을 수행하는 데 사용할 수 있습니다.
bpw1621

5
: 또는 / 또는 <또는 명령 모드에있을 때마다 <Cf>를 누르면 동일한 기록 메뉴가 나타납니다. q를 다시 매핑 할 수 있습니다. 실수로 많이 쳤을 때 여전히이 멋진 모드에 액세스 할 수 있습니다.
idbrii

82

Vim은 예를 들어 URL을 엽니 다

vim http://stackoverflow.com/

참조를 위해 페이지 소스를 가져와야 할 때 좋습니다.


2
나에게 그것은 소스를 열지 않았다. 대신 elink를 사용하여 렌더링 된 페이지를 버퍼에 덤프 한 다음 열었습니다.
Ivan Vučica

이 명령을 실행할 때 오류가 발생했습니다
Dzung Nguyen

5
끝에 슬래시가 더 잘 작동합니다. 깔끔한 트릭!
Thomas

@ Vdt : 오류를 게시하면 유용합니다. 이것이 " 오류 (netrw) 인 경우 wget이나 fetch 명령을 사용할 수 없음"인 경우 PATH 환경 변수에서 해당 도구 중 하나를 사용할 수있게해야합니다.
Isaac Nequittepas 2016 년

사람들이 붙여 넣기 서비스에 대한 링크를 보내고 구문 강조를 선택하는 것을 잊었을 때 특히 유용한 것으로, 일반적으로 "& raw"를 추가 한 후 vim에서 링크를 열어야합니다.
Dettorer

68

매크로는 다른 매크로를 호출 할 수도 있고 자체 호출 할 수도 있습니다.

예 :

qq0dwj@qq@q

... 파일 끝까지 모든 줄에서 첫 번째 단어를 삭제합니다.

이것은 매우 간단한 예이지만 vim의 매우 강력한 기능을 보여줍니다.


2
나는 매크로가 스스로 반복 될 수 있다는 것을 몰랐다. 멋있는. 참고 : qx는 레지스터 x에 기록을 시작합니다 (레지스터 q에 qq를 사용). 0은 줄의 시작으로 이동합니다. dw는 단어를 삭제합니다. j는 한 줄 아래로 이동합니다. @q는 매크로를 다시 실행합니다 (루프 정의). 그러나 최종 "q"로 기록을 종료 한 다음 @q를 입력하여 실제로 매크로를 실행하는 것을 잊었습니다.
Kimball Robinson

2
중첩 된 재귀 매크로로서 의도적이라고 생각합니다.
Yktula

7
qqqqqifuu<Esc>h@qq@q
제라르도 마르 셋

6
이것을 달성하는 또 다른 방법은 매크로를 레지스터에 기록하여 단일 라인으로 약간의 변환을 수행 한 다음 V로 여러 줄을 강조 표시하고 :normal! @a선택의 모든 라인에 매크로를 적용하는 유형 입니다.
Nathan Long

이 게시물 인터넷 검색 재귀 VIM 매크로를 발견했습니다. VIM 프로세스를 종료하는 것 외에는 매크로를 중지 할 방법을 찾을 수 없었습니다.
dotancohen

55

펄 및 / 또는 루비 지원이 컴파일이, 가정 :rubydo:perldo과, 범위 (전체 버퍼 기본값)의 모든 라인에 루비 나 펄 한 줄을 실행할 $_현재 행의 텍스트 (마이너스 줄 바꿈)에 바인딩. 조작 $_하면 해당 줄의 텍스트가 변경됩니다.

이를 사용하여 스크립팅 언어로하기 쉽지만 Vim 내장을 사용하여 그렇게 분명하지 않은 특정 작업을 수행 할 수 있습니다. 예를 들어 한 줄에서 단어의 순서를 바꾸려면 :

:perldo $_ = join ' ', reverse split

모든 줄의 끝에 임의의 8 자 (AZ) 문자열을 삽입하려면 다음을 수행하십시오.

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

한 번에 한 줄 씩만 작업 할 수 있으며 줄 바꿈을 추가 할 수 없습니다.


perldo를 지정된 라인에서만 실행하려면 어떻게해야합니까? 또는 선택한 몇 줄?
Sujoy

5
다른 명령과 마찬가지로 범위를 지정할 수 있습니다. 예를 들어 : 1,5perldo는 1-5 행에서만 작동합니다.
Brian Carper

$ _ + = '\ nNEWLINE !!!'을 할 수 있습니까? 현재 줄 이후 줄 바꿈을 얻으려면?
Greg

안타깝게도 줄 끝에 펑키 한 컨트롤 캐릭터를 추가합니다. 그런 다음 Vim 검색 / 바꾸기를 사용하여 모든 제어 문자를 실제 줄 바꿈으로 변경할 수 있습니다.
Brian Carper

3
이와 유사하게, pydo그리고 py3do파이썬에 대한 작업 당신은 필요한 지원 옵션으로 컴파일해야한다.
Derecho

54

^ O와 ^ I

더 오래된 / 새로운 위치로 이동하십시오. 파일을 탐색 할 때 (탐색, 명령 이동 등을 통해) 이러한 "점프"를 삭제하면 이러한 점프를 뒤로 (오래된 경우 ^ O-O) 앞뒤로 (^ I-키보드에서 I 바로 옆에) 반복 할 수 있습니다 ). 코드를 작성하고 많은 검색을 수행 할 때 매우 유용합니다.

미군 병사

삽입 모드가 마지막으로 중지 된 위치로 이동하십시오. 나는 종종 자신이 무언가를 편집하고 검색하는 것을 발견한다. 편집 장소로 돌아가려면 gi를 누릅니다.

gf

파일 이름에 커서를 놓고 (예 : 헤더 파일 포함) gf를 누르면 파일이 열립니다.

gF

gf와 비슷하지만 "[파일 이름] : [행 번호]"형식을 인식합니다. gF를 누르면 [파일 이름]이 열리고 커서가 [행 번호]로 설정됩니다.

^ P와 ^ N

편집 중 자동 완성 텍스트 (^ P-이전 일치 및 ^ N 다음 일치)

^ X ^ L

편집이 동일한 행으로 완료되는 동안 (프로그래밍에 유용). 코드를 작성하면 파일 어딘가에 동일한 코드가 있다는 것을 기억합니다. ^ X ^ L을 누르면 전체 라인이 완성됩니다.

^ X ^ F

완전한 파일 이름. "/ etc / pass"흠을 쓴다. 파일 이름을 잊어 버렸습니다. ^ X ^ F를 누르면 파일 이름이 완성됩니다.

^ Z 또는 : sh

쉘로 임시 이동하십시오. 빠른 강타가 필요한 경우 :

  • ^ Z (vi를 백그라운드로 놓으려면)를 누르고 원래 쉘로 돌아가고 fg를 누르면 vim으로 돌아갑니다.
  • : sh를 눌러 하위 쉘로 이동하고 ^ D / exit를 눌러 vi로 돌아갑니다.

^X^F내 애완 동물 친구 와 함께 파일 이름에는 =표시가 포함 되어있어 많은 경우에 썩은 일을합니다 (ini 파일, makefile 등). 나는 se isfname-==그 성가신 끝을 사용 합니다
sehe

3
+1 내장 자동 완성 기능이 발견되기를 기다리는 중입니다.
joeytwiddle

48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor

2
이것이 농담 답변처럼 보이는 것이 무엇인지 잘 모르겠습니다. 다른 사람이 나를 밝힐 수 있습니까?
Ryan Edwards

2
vim을 열고 ": for i in range (1,255) | .put = '10 .0.0. '. i | endfor"
codygman

2
@RyanEdwards / etc / hosts 작성 가능
Ruslan

26
이것은 훌륭한 답변입니다. IP 주소 생성에 대한 내용이 아니라 VIM이 명령의 루프에 사용할 수 있음을 의미하는 비트 .
dotancohen

4
전 모드없이 :i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap

47

이것은 다른 인코딩으로 현재 파일을 다시 여는 좋은 방법입니다.

:e ++enc=cp1250 %:p

레거시 인코딩으로 작업해야 할 때 유용합니다. 지원되는 인코딩은 아래 표에 나와 있습니다 encoding-values(참조 help encoding-values). ++ffWindows / Unix 줄 끝으로 파일을 처음 다시 잘못했을 때 파일을 다시 열 수 있도록 에도 비슷한 기능이 작동합니다 (참조 help ff).


이런 종류의 물건을 사용하지 않아도, 우리는 확실히 내 트릭의 무기고에 추가합니다 ...

좋은 팁, 감사합니다. 보너스 포인트의 경우 일반적인 유효한 인코딩 목록을 추가하십시오.
Adriano Varoli Piazza

2
오늘 이것을 사용했지만 "% : p"를 지정할 필요가 없다고 생각합니다. 파일을 열기 만하면 : e ++ enc = cp1250이면 충분합니다. I
Ivan Vučica

: set encoding = cp1250과 같은 효과가 있습니까?
라즈

1
`: E + B %는 '바이너리 모드 (줄 바꿈의 더 munging) 재개하지 비슷하게 유용합니다
직관

47

== 를 입력 하면 위의 줄을 기준으로 현재 줄의 들여 쓰기가 수정됩니다.

실제로, 하나의 = 부호 다음에 이동 명령을 수행 할 수 있습니다. = {운동}

예를 들어, 일치하는 괄호 사이를 이동하는 % 이동을 사용할 수 있습니다. 다음 코드에서 {에 커서를 놓습니다.

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

그리고 = % 를 즉시 얻을 수 있습니다 :

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

또는 {문자 바로 위에 위치하는 대신 코드 블록 내에서 = a {를 수행 할 수 있습니다.


흠, 나는 들여 쓰기에 대해 이것을 몰랐습니다.
Ehtesh Choudhury

일반적으로 정확히 교정기에있을 필요는 없습니다. 자주 생각 =}하거나 vaBaB=덜 의존적 이라고 생각 했습니다. 또한, v}}:!astyle -bj더 나은 내 코드 스타일을 일치하지만 나는 간단한으로 나만의 스타일로 그것을 다시 얻을 수 있습니다%!astyle -aj
sehe을

7
gg=G붙여 넣기 할 때 아주 깔끔합니다.
kyrias


@kyrias 아, 나는 그렇게하고있다 ggVG=.
브 래든 베스트

42
imap jj <esc>

7
그러면 jj를 어떻게 입력하겠습니까? : P
has

6
jj를 얼마나 자주 입력하십니까? 영어로 최소한?
ojblass

50
쓸모없는 키이기 때문에 대신 esc로 capslock을 다시 매핑했습니다. 내 매핑은 OS 전체이므로 실수로 부딪 칠 염려가 없다는 추가 이점이 있습니다. 유일한 단점은 사람들에게 고함을 지르는 것입니다. :)
Alex

7
@Alex : 확실히, capslock은 죽음입니다. "잠깐, wtf? 아, 그건 ZZ? .... crap."
intuited

5
@ojblass : 확실하지 얼마나 많은 사람들이 지금 바로 matlab에 빔 코드 만 ii하고 jj있기 때문에 일반적으로, 카운터 변수에 사용되는 ij복소수를 위해 예약되어 있습니다.
brianmearns

37

꽤 작은 IDE 편집기가 열 전치를 수행하는 것을 보자.

:%s/\(.*\)^I\(.*\)/\2^I\1/

설명

\(그리고 정규식에서 물건 \)기억 하는 방법 입니다. 그리고 \1,\2 등은 기억 물건을 검색하는 방법입니다.

>>> \(.*\)^I\(.*\)

뒤에 오는 모든 것을 기억하십시오 ^I (탭).

>>> \2^I\1

위의 내용을 "기억 한 두 번째 내용"으로 바꾸고 "기억 한 첫 번째 내용"으로 바꾸십시오.


4
탭으로 구분 된 한 쌍의 열 (분리 자 임의, 모두 정규식)을 서로 전환합니다.
혼돈

39
이것은 단지 정규 표현식입니다. 많은 IDE에는 정규식 검색 및 교체 기능이 있습니다.
rlbond

7
@rlbond-IDE에서 정규식 엔진이 얼마나 좋은지 알려줍니다. Vim의 정규식은 매우 강력합니다. 다른 사람들은 .. 때때로 그렇게 많지 않습니다.
romandas

3
*는 욕심이 많으므로이 정규식에서는 단 두 개의 열이 있다고 가정합니다. 욕심이 아니라면 * 대신 {-}를 사용하십시오 ({} 배율에 대한 자세한 내용은 : 욕심없는 욕구 도움말 참조)
Kimball Robinson

4
이것은 실제로 매우 간단한 정규식이며 그룹 괄호를 이스케이프 처리하여 복잡하게 만듭니다.
mk12

30

정확히 암흑의 비밀은 아니지만 다음 매핑을 .vimrc 파일에 넣기를 좋아하므로 언제든지 "-"(빼기)를 눌러 파일 탐색기를 열어 방금 편집 한 파일 과 인접한 파일을 표시 할 수 있습니다. 파일 탐색기에서 다른 "-"를 눌러 하나의 디렉토리로 이동하여 복잡한 디렉토리 구조 (현재 MVC 프레임 워크에서 사용하는 구조)를 원활하게 탐색 할 수 있습니다.

map - :Explore<cr>

이것들은 누군가에게도 유용 할 수 있습니다. 화면을 스크롤하고 동시에 커서를 진행하고 싶습니다.

map <c-j> j<c-e>
map <c-k> k<c-y>

탭 탐색-탭이 마음에 들며 탭 사이를 쉽게 이동해야합니다.

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Mac OS X에서만 : Safari와 같은 탭 탐색 :

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>

: Explore
Roman Plášil

로마자, 이것이 바로이 매핑이하는 일이지만 "핫 키"에 할당합니다. :)
KKovacs

27

'sudo bash'를 사용하고 싶습니다. 시스템 관리자가 이것을 싫어합니다. 그는 'sudo'를 잠갔으므로 소수의 명령 (ls, chmod, chown, vi 등)에만 사용할 수 있었지만 어쨌든 vim을 사용하여 루트 쉘을 얻을 수있었습니다.

bash$ sudo vi +'silent !bash' +q
Password: ******
root#

9
FWIW, sudoedit (또는 sudo -e)는 권한있는 파일을 편집하지만 편집기를 일반 사용자로 실행합니다.
RJHunter

12
예 ... 나도 당신을 미워할 것입니다.) 루트로 너무 많은 명령을 실행하는 습관이 없다면 루트 셸이 매우 드물게 필요합니다.
우리는 모두 모니카

5
왜 sysadmin이 루트를 제공합니까? : D
d33tah

26

종종 편집하는 동안 현재 디렉토리를 변경하는 것을 좋아하므로 경로를 덜 지정해야합니다.

cd %:h

이것은 무엇을 하는가? 그리고 그것은 autchdir과 함께 작동합니까?
Leonard

2
버퍼를 다시 전환 할 때까지 autochdir을 일시적으로 무시한다고 가정합니다. 기본적으로 디렉토리를 현재 파일의 루트 디렉토리로 변경합니다. 그것은 autochdir보다 약간 더 수동 제어를 제공합니다.
rampion

1
: set autochdir // 이것은 동일한 기능을 제공하며 현재 디렉토리를 버퍼에있는 파일의 디렉토리로 변경합니다
Naga Kiran

25

프로젝트 작업을 할 때 종종 많은 창을 사용하며 때로는 크기를 조정해야합니다. 내가 사용하는 것은 다음과 같습니다.

map + <C-W>+
map - <C-W>-

이러한 매핑을 통해 현재 창의 크기를 늘리거나 줄일 수 있습니다. 아주 간단하지만 빠릅니다.


16
Ctrl-W =도 있는데, 이는 창의 너비를 동일하게 만듭니다.
Bill Lynch

2
Vim에서 숫자를 앞에 추가하여 동작을 여러 번 수행 할 수 있습니다. 현재 창 높이를 8 줄씩 늘리려면 : 8 <CW> +
joeytwiddle

23

모호한 기능은 아니지만 매우 유용하고 시간을 절약합니다.

열린 버퍼, 탭, 마커 및 기타 설정의 세션을 저장하려는 경우 다음을 발행 할 수 있습니다.

mksession session.vim

다음을 사용하여 세션을 열 수 있습니다.

vim -S session.vim

5
:so session.vimvim 내부 에서도 가능 합니다.
TankorSmash

22
:r! <command>

외부 명령의 출력을 버퍼에 붙여 넣습니다.

수학을하고 텍스트로 직접 결과를 얻으십시오.

:r! echo $((3 + 5 + 8))

Makefile을 작성할 때 컴파일 할 파일 목록을 가져옵니다.

:r! ls *.c

Wikipedia에서 읽은 사실을 찾지 말고 작성중인 문서에 직접 붙여 넣으십시오.

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever

14
삽입 모드의 ^ R = 3 + 5 + 8을 사용하면 키 입력이 적은 텍스트에 표현식 값 (3 + 5 + 8)을 삽입 할 수 있습니다.
Sudhanshu

전류와 다른 버퍼로 결과 / 출력을 얻는 방법은 무엇입니까?
dcn


21

버퍼를 빠르게 ROT13하려면 F5를 매핑하십시오.

map <F5> ggg?G``

보스 키로 사용할 수 있습니다 :).


14
나는 당신이 무엇 을 쓰고 있는지 모르겠다 . 그러나 확실히, 나의 상사는 그가 나를 ROT13 뒤죽박죽이라고 쓴 것을 보았을 때 더 호기심이 많을 것이다 :)
sehe

또는 친구를 속일 수 있습니다 : nmap i ggg?G`` . 또는 악마 : nmap i ggg?G``i!
romeovs 2016 년

1
@romeovs 2 번째는 무한 루프입니다. nnoremap을 사용하십시오
Amit Gold

19

오늘 NSFAQ 를 통해 이것을 발견했습니다 .

주석 코드 블록.

CTRL-V를 쳐서 Blockwise Visual 모드로 들어갑니다.

댓글을 남기고 싶은 블록을 표시하십시오.

I (자본 I)를 누르고 줄의 시작 부분에 주석 문자열을 입력하십시오. (C ++의 경우 //)

ESC 키를 누르면 선택된 모든 줄이 // 줄 앞에 붙습니다.


루비로 코드 블록을 주석 처리하기 위해 #을 추가했습니다. 실행 취소하려면 어떻게해야합니까?
Neeraj Singh

3
ctrl + v를 다시 누르고 //를 표시하고 x를 "주석 해제"로 표시
nos

6
NERDCommenter를 사용합니다.
ZyX

1
주석 처리 된 코드는 아마도 코드에 넣을 수있는 최악의 주석 중 하나 일 것입니다. 멋진 블록 인서트를 더 잘 사용합니다.
Braden Best

1
주석 처리 된 코드는 죽은 코드 이기 때문에 @Pie . 데드 코드는 유용한 목적을 제공하지 않으며 혼란을 유발합니다. 당신이 생각하는 당신이 나중에 다시 가져올로 할 수 있습니다 코드를 유지하고 있지만 더 좋은 방법은 항상있다. 실행 취소 기록을 사용하거나 파일을 삭제하거나이 기능이 내장 된 git을 사용할 수 있습니다 ( git checkout). 블록 인서트를 더 잘 사용하기 위해 석재가 없습니다. 동일한 위치에 동일한 문자 시퀀스를 삽입하려는 여러 줄이있을 때마다 사용하십시오.
Braden Best

17

나는 거의 모든 텍스트 편집에 vim을 사용하므로 종종 복사 및 붙여 넣기를 사용합니다. 문제는 기본적으로 vim은 종종 붙여 넣기를 통해 가져온 텍스트를 왜곡하는 것입니다. 이것을 막는 방법은 사용하는 것입니다

:set paste

데이터를 붙여 넣기 전에 이렇게하면 엉망이되지 않습니다.

:set nopaste자동 들여 쓰기를 복구 하려면 발행해야합니다 . 사전 서식이 지정된 텍스트를 붙여 넣는 다른 방법은 클립 보드 레지스터 ( *+)이며 :r!cat붙여 넣은 조각을 ^ D로 끝내야합니다.

고 대비 색상 구성표를 켜는 것도 도움이됩니다. 이것은 할 수 있습니다

:color blue

내가 사용하는 모든 버전의 vim에서 작동하지는 않지만 가장 많이 사용되는 것으로 나타났습니다.


10
어떤 형태의 자동 들여 쓰기가 활성화되어 있기 때문에 "왜곡"이 발생합니다. 옵션에 set paste키를 사용 하거나 지정하는 pastetoggle것이이 문제를 해결하는 일반적인 방법이지만 set mouse=aVim이 텍스트의 플러드가 마우스에 의해 트리거 된 페이스트라는 것을 알고 Vim이 알고 있는 것과 동일한 효과를 얻을 수 있습니다 .
jamessan 2009

1
gvim을 설치했다면 종종 배포판이 vim을 컴파일하는 옵션에 따라 다르지만 vim에서 * 레지스터를 통해 X 클립 보드를 직접 사용할 수 있습니다. 예를 들어 "*pX xlipboard에서 붙여 넣을 수 있습니다. (터미널 vim에서도 작동합니다. 별도의 경우 gvim 패키지가 필요할 수도 있습니다)
kyrias

2
기록을 위해 @kyrias *PRIMARY ( "중간 클릭") 레지스터입니다. 클립 보드 입니다+
브레이든 최저
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.