마지막 UI 명령을 반복 할 수 있습니까?


17

.마지막 편집 명령을 반복하는 데 사용할 수 있다는 것을 알고 있습니다 .

마지막 UI 조작 명령을 반복하는 방법이 있습니까? 예를 들어, 10<C-W>-10 줄씩 창을 축소하도록 쓸 수 있습니다 . 이 명령을 더 축소하려면 ⟨ 일부 키 ⟩를 눌러이 명령을 쉽게 반복 할 수 있다는 것이 좋습니다.


관련 : stackoverflow.com/q/6952636/2072269 ( 이미 크기를 조정 한 후에 사용할 수있는 응답이 없습니다 ).
muru

@muru : 좋았지 만,이 특별한 경우입니다. 내가 좋아하는 뭔가를 수행 한 경우 fz다음과 10;? 무엇에 대해 :tabm +1? 이것들은 모두 특별한 경우 여야합니까?
wchargin

당신이 나를 오해 한 것 같아요 연결된 게시물에 쓸모없는 답변이 있다고 말합니다 (다른 사람이 와서 제안하기 전에).
muru

오! 좋아, 우리는 같은 페이지에 @muru :)
wchargin

답변:


12

점 명령 .은 Vim이 버퍼의 내용을 변경하는 명령을 "추적"하기 때문에 작동합니다. 를 실행 :echo b:changedtick하면 현재 버퍼가 변경 될 때마다 증가하는 것을 볼 수 있습니다.

그러나 Vim은 편집하지 않는 명령을 "추적"하지 않습니다. 따라서, 당신이 요구하는 것은 할 수 없습니다.


8

vim은 이전에 실행 된 wincmd를 추적하지 않기 때문에 vim에서는 기본적으로이 작업을 수행 할 수있는 방법이 없습니다. 그러나 몇 가지 영리한 매핑을 통해이 작업을 수행 할 수 있습니다.

function! s:Wincmd(count, key)
    " If count is not zero, use the original count.  If otherwise, don't
    " include a count.
    let if_count = a:count ? a:count : ""
    " This builds a wincmd from the given key, and saves it so
    " it can be repeated.
    let g:last_wincmd = "wincmd " . nr2char(a:key)
    " Execute the built wincmd
    execute if_count . g:last_wincmd
endfunction

function! s:WincmdRepeat(count)
    " If no wincmd has been executed yet, don't do anything
    if !exists('g:last_wincmd') | return | endif
    " If a count is given, repeat the last wincmd that amount of times.
    " If otherwise, just repeat once.
    let if_count = a:count ? a:count : ""
    execute if_count . g:last_wincmd
endfunction

" Overwrite the default <C-w> mapping so that the last wincmd can be kept
" track of.  The getchar function is what captures the key pressed
" directly afterwards.  The <C-u> is to remove any cmdline range that vim
" automatically inserted.
nnoremap <silent> <C-w> :<C-u>call <SID>Wincmd(v:count, getchar())<CR>

" This just calls the function which repeats the previous wincmd.  It
" does accept a count, which is the number of times it should repeat the
" previous wincmd.  You can also replace Q with whatever key you want. 
nnoremap <silent> Q :<C-u> call <SID>WincmdRepeat(v:count)<CR>

사용하는 매핑이있는 경우 매핑이 다양 <C-w>하지 않은 경우에만 반복 할 수 있습니다 nore. 를 사용하여 발행 된 wincmd는 :wincmd반복되지 않습니다. 또한, 하나 개 이상의 문자를 포함하는 모든 wincmds는 수행 될 수 없다 (예로서 <C-w>gf) .

관련 도움말 주제

  • :help v:count
  • :help getchar()
  • :help nr2char()
  • :help expr1
  • :help :wincmd
  • :help :execute
  • :help :for
  • :help :map-<silent>
  • :help c_CTRL-U
  • :help <SID>

1
이것은 훌륭하고 잘 작성된 VimScript의 훌륭한 예입니다! 일부 경미한 (아마도 까다로운) 피드백 :이 반복 명령은 내장 .동작이 카운트와 다르게 동작합니다 . 에 개수가 제공 .되면 이전 개수는 무시됩니다. 그래서 2dd다음 3.2 선 다음 3 개 행을 삭제 것입니다; 대조적으로, 사용자의 매핑과, 2<C-w>-이어서 3Q도 6 (= 2 × 3)에 의해 다음 2 명 행 선으로 윈도우를 축소하고있다. 이 동작은 문제가 없지만 사용자 지정 명령의 동작 방식을 선택할 때 유사한 내장 Vim 명령을 사용하는 것이 좋습니다.
tommcdo

감사! 또한 카운트 작동 방식에 대한 의미를 알 수 있습니다. 그런 식으로 작동하도록 변경할 수 있습니다.
EvergreenTree

4

서브 모드의 플러그인이 도움이 될 수 있습니다. 을 입력하여 입력하는 "하위 모드"를 정의 할 수 있습니다. 여기서 창의 크기를 계속 조정하기 위해 <C-W>-정의한 -(및 아마도 +)가 있습니다.


2

원하는 것을 수행 할 수있는 repmo.vim ( "반복 모션") 이라는 또 다른 플러그인 이 있습니다.

그러나 반복하려는 동작 (또는 일반적인 동작)을 지정해야합니다 . 광산은 현재 다음과 같이 구성되어 있습니다 :

let g:repmo_mapmotions = "j|k h|l zh|zl g;|g, <C-w>w|<C-w>W"
let g:repmo_mapmotions .= " <C-w>+|<C-w>- <C-w>>|<C-w><"
let g:repmo_key = ";" 
let g:repmo_revkey = "," 

그렇게 한 후에 5 CTRL-W +나는 ;그것을 여러 번 반복하도록 칠 수 있습니다 .

플러그인은 지정된 각 키에 대한 맵핑을 작성하여 작동합니다.

f또는 t사용의 ;,매핑은 기본 동작으로 다시 삭제됩니다.

g;이전 편집 지점으로 돌아가는 데 특히 유용한 매핑을 찾습니다 . g; ; ; ;


@ albfan 나는 당신의 질문을 이해하지 못하지만, 나를 위해 ,즉시 행동을 누르면 5,예상대로 작동합니다. 당신은 당신의 설정이 가능인가 mapleader에를 ,?
joeytwiddle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.