vim에서 명령 앨리어싱


151

Vim 내가 프로그래밍 할 때 선호하는 텍스트 편집기이므로 항상 성가신 문제가 발생합니다.

종종 버퍼를 빠르게 저장하고 다른 기타 작업을 계속해야 할 때 일반적으로

:w

그러나, 시간의 50 % 이상인 것처럼 보이는 나는 항상 그것을 활용합니다 :w. 당연히, vim W은 잘못된 명령 이기 때문에 소리를 지 릅니다.

E492: Not an editor command: W

내 질문은 어떻게 vim에서 하나의 별칭 콜론 명령을 사용할 수 있는지 입니다. 특히에 별칭 W을 지정 하는 방법을 예시 해 주시겠습니까 w?

를 특정 명령매핑 하는 프로세스를 알고 있습니다. 불행히도, 그것은 내가 찾고있는 것이 아닙니다.



1
피하기 위해 :W저장을 수행하기위한 키를 맵핑 할 수 있습니다. Ctrl-s로 저장하는 일부 프로그램에 익숙한 경우 $ VIM / mswin.vim에서 다음과 같은 매핑이 있습니다." Use CTRL-S for saving, also in Insert mode noremap <C-S> :update<CR> vnoremap <C-S> <C-C>:update<CR> inoremap <C-S> <C-O>:update<CR>
mMontu

Vi 스택 교환에 관한 비슷한 질문 : vi.stackexchange.com/q/2665/7244
Flimm

답변:


127

완성을 그대로 두려면

cnoreabbrev W w

, W는 명령 행에서으로 대체 w되지만 단어 문자가 앞에 오지 않고 앞에 오는 경우에만이므로 :W<CR>로 대체 :w<CR>되지만 :Write그렇지 않습니다. (예를 들어 명령 :saveas W Z이로 대체 될 수 있으므로 예상하지 못한 명령을 포함하여 일치하는 모든 명령에 영향을 미치 :saveas w Z므로주의하십시오.)

최신 정보

다음은 내가 지금 쓰는 방법입니다 .

cnoreabbrev <expr> W ((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W'))

기능으로서 :

fun! SetupCommandAlias(from, to)
  exec 'cnoreabbrev <expr> '.a:from
        \ .' ((getcmdtype() is# ":" && getcmdline() is# "'.a:from.'")'
        \ .'? ("'.a:to.'") : ("'.a:from.'"))'
endfun
call SetupCommandAlias("W","w")

명령 유형이 :이고 명령이 W이므로 확인하는 것보다 안전 cnoreabbrev W w합니다.


2
이 답변은 가장 안전하고 신뢰할 수 있습니다.
Sean

2
권장 솔루션을 사용하는 경우 아래의 두 명령이 모두 실제 버퍼 내용 및 VIM 설정에 따라 예기치 않은 결과를 초래할 수있는 하위 명령으로 작동 :%s/W/foo/g<CR> :%s/w/foo/g<CR>
한다는 점에 유의하십시오

2
실제로 이것은 예를 들어 검색을 포함하여 명령 모음의 어느 곳에서나 W가 바뀌 므로 s / W foo / bar / g는 s / w foo / bar / g 로 바뀝니다 . 이것은 정말 성 가실 수 있습니다. 포괄적 인 솔루션에 대한 내 대답을 참조하십시오.
airstrike

4
물론; 이것은 끔찍한 생각입니다. 당신이해야 결코 , 이제까지 , 지금까지 이 작업을 수행.
Chris Morgan

4
:cnoreabbrev <expr> W getcmdtype()==':'&&getcmdline()=~#'^W'?'w':'W'
kev

97

보충 검색을 통해 누군가가 나와 거의 같은 질문 을 한 것을 발견했습니다 .

:command <AliasName> <string of command to be aliased>

트릭을 할 것입니다.

로, 양해하여 주시기 바랍니다 Richo는 지적, 사용자 명령은 대문자로 시작해야합니다.


5
: command를 사용하는 것이 좋습니다. : cnoreabbrev는 cmd1 | cmd2를 이해하지 못하고 : command는 이해합니다.
Pavel Strakhov

1
이것을 작성하는 덜 혼란스러운 방법은 다음과 같습니다.:command AliasName string of command to be aliased
Alec Jacobson

8
이 / 앞으로 어떤 처리하지 않습니다 command인수, 같은 -nargs, -complete
blueyed

무엇에 대해 :Q!:W!?
Jack

5
매우 문자 그대로 : 파일에 넣 :command W w습니다 .vimrc.
동 형사상

20

;키를 매핑 :하는 것이 더 나은 솔루션이며 다른 명령을 입력하는 데 생산성이 높아질 것입니다.

nnoremap ; :
vnoremap ; :

이것은 vim을위한 최고의 팁입니다. 나는 정상적인 행동을 겪을 때마다 마음이 재 훈련되는 데 몇 번의 노력이 필요하므로 지금은 그것에 익숙합니다.
airstrike

이것은 질문에 대한 답변이 아닙니다.
Flimm

5
@Flimm 아니요, 그러나 OP의 문제는 사라집니다.
던컨 X 심슨

1
사용하는 경우 t또는 f, 하나는 일반적으로 사용할 수있는 ;다음 항목으로 이동합니다. 세미콜론을 콜론에 매핑 한 경우에도 다른 방법으로 안전하게 매핑 할 수 있습니다. 별칭 루프가 없습니다. nnoremap : ;
Luc

9

가장 좋은 해결책은 명령 모음의 시작 부분에서만 발생하는 약어를 처리하기위한 사용자 지정 함수작성하는 것 입니다.

이를 위해 vimrc 파일 또는 다른 곳에 다음을 추가하십시오.

" cabs - less stupidity                                                      {{{
fu! Single_quote(str)
  return "'" . substitute(copy(a:str), "'", "''", 'g') . "'"
endfu
fu! Cabbrev(key, value)
  exe printf('cabbrev <expr> %s (getcmdtype() == ":" && getcmdpos() <= %d) ? %s : %s',
    \ a:key, 1+len(a:key), Single_quote(a:value), Single_quote(a:key))
endfu
"}}}

 

" use this custom function for cabbrevations. This makes sure that they only
" apply in the beginning of a command. Else we might end up with stuff like
"   :%s/\vfoo/\v/\vbar/
" if we happen to move backwards in the pattern.

" For example:
call Cabbrev('W', 'w')

몇 가지 소스 자료에서 유용한 약어 나는이 물건을 발견 :

call Cabbrev('/',   '/\v')
call Cabbrev('?',   '?\v')

call Cabbrev('s/',  's/\v')
call Cabbrev('%s/', '%s/\v')

call Cabbrev('s#',  's#\v')
call Cabbrev('%s#', '%s#\v')

call Cabbrev('s@',  's@\v')
call Cabbrev('%s@', '%s@\v')

call Cabbrev('s!',  's!\v')
call Cabbrev('%s!', '%s!\v')

call Cabbrev('s%',  's%\v')
call Cabbrev('%s%', '%s%\v')

call Cabbrev("'<,'>s/", "'<,'>s/\v")
call Cabbrev("'<,'>s#", "'<,'>s#\v")
call Cabbrev("'<,'>s@", "'<,'>s@\v")
call Cabbrev("'<,'>s!", "'<,'>s!\v")

1
string()당신과 같은 기능 을 하는 내장 함수 가 있습니다 Single_quote().
ZyX

6

기능 키 (F1..F12) 중 하나를 : w? 그런 다음 이것을 .vimrc에 넣으십시오.

noremap  <f1> :w<return>
inoremap <f1> <c-o>:w<return>

(삽입 모드의 Ctrl-o는 일시적으로 일반 모드로 전환됩니다).


6

gvim에서 tabnew 명령에 대한 별칭을 추가한다고 가정합니다. .vimrc 파일에 다음 명령을 입력하면됩니다 (홈 폴더에없는 경우 파일을 생성하는 것보다)

cabbrev t tabnew

1
이로 인해 다음과 같은 명령 :saveas t example이 대체 될 것입니다.:saveas tabnew example
Flimm

5

가장 안전하고 쉬운 방법은 cmdalias.vim 과 같은 플러그인 또는 최근에 업데이트 한 vim-alias 입니다.

  • 예컨대 공백 또는 개질제 항 :sil(ent)(!)또는 :redi(r),
  • '<,'>현재 시각적 선택 과 같은 범위 수정 자
  • 따옴표와 같은 특수 문자를 피하고
  • 선택한 별칭이 유효한 명령 줄 약어인지 확인하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.