파일 히스토리에서 안정적으로 앞뒤로 이동할 수있는 방법이 있습니까


15

방금 편집 한 파일과 MRU 플러그인과 같은 다음 종류의 파일로 가고 싶습니다.

:bnext그리고 :bprev가끔 작동하지만, 가장 자주는 아니지만 난 그냥 편집 및 MRU 플러그인에 다시 떨어질 수 밖에 기억하지 않는 일부 모호한 파일에 끝낸다.

그것을 고칠 수있는 방법이 있습니까?

Ctrl-^마지막 두 파일 사이를 교환합니다. 더 많이 탐색하는 가장 좋은 방법은 무엇입니까?

나는 그것이 까다로울 수 있음을 이해하지만 현재 :bn :bp행동을 향상시킬 수있는 것에 동의합니다 . 내가 자주 보는 버퍼는 완전히 제자리에 없습니다. 어쩌면 최근 파일을 추적하고 후크를 제공하여 매핑을 만들 수있는 플러그인이 있습니까?

댓글에 답하면 내 생각이 약간 정리되었습니다. 내가 원하는 것은 최신 저장 순서로 파일을 이동할 수 있다는 것입니다. 그런 식으로 내가 역사에 되돌아 가면 파일을 저장할 때까지 순서가 바뀌지 않고 마지막 파일이되고 그 직전에 저장된 파일, 즉 내가 시작한 파일로 한 단계 "뒤로"를 만들 수 있습니다.

Ctrl-O Ctrl-I현재 버퍼를 뛰어 넘지 않고 파일을 즉시 전환하는 쌍 과 같은 것 . 정렬 등을 u하고 Unetrw에서 :

   u    Change to recently-visited directory                 |netrw-u|
   U    Change to subsequently-visited directory             |netrw-U|

"마지막으로 편집 한 파일"이란 말은 "가장 최근에 편집 한 파일"을 의미합니까? 아니면 Vim에서 마지막으로 본 것을 의미합니까?
Rich

2
후자의 경우, 나는 개인적으로 그냥 매쉬 Ctrl-O(또는 가끔 Ctrl-T) 내가 거기까지.
Rich

네, 저도 그렇게 Ctrl-O하고 Ctrl-I있습니다. 그러나 편집 점 사이를 이동하여 흐름을 중단시킵니다. 액세스 순서대로 버퍼간에 앞뒤로 가고 싶습니다. 플러그인이 최신 파일 목록을 표시하는 방법 내부적으로 추적합니까?
firedev

Ctrl-^마지막 두 파일 사이를 교환합니다. 그러나 더 많은 것을 탐색하는 가장 좋은 방법은 무엇입니까?
firedev

액세스하여 주문이 열렸거나, 쓰거나, 집중된 창에서 또는 변경된 순서를 의미하는지 여부는 여전히 명확하지 않습니다. Ctrl-O/IMRU는 일반적으로 전역적인 반면, 창 특정 문제입니다. 가장 최근에 액세스 한 순서대로 주문하려면 한 번 뒤로 이동하자마자 목록의 순서가 변경되어 상황이 더 복잡해집니다.
Matt Boehm 2016 년

답변:


7

버퍼가 바뀔 때까지 CTRL-O를 반복해서 누르는 작은 함수를 작성했습니다.

여기에서 찾을 수 있습니다 . CTRL-U에 매핑했지만 원하는 경우 CTRL-O를 무시할 수 있습니다.

function! GoBackToRecentBuffer()
  let startName = bufname('%')
  while 1
    exe "normal! \<c-o>"
    let nowName = bufname('%')
    if nowName != startName
      break
    endif
  endwhile
endfunction

nnoremap <silent> <C-U> :call GoBackToRecentBuffer()<Enter>

아마도 비슷한 것을 쓸 수 <C-I>있습니다.

이슈 :

  • 이전 버퍼가없는 경우 CTRL-C를 누를 때까지 계속 자동 반복됩니다.

관련 :

  • :jumps CTRL-O가 뒤로 물러 설 역사적인 위치를 나열합니다.
  • Vim의 기본 CTRL-T는 더 거칠기 때문에 CTRL-O를 매쉬하는 좋은 대안입니다. 태그 점프만으로 다시 이동합니다.

Vim은 CTRL- ^에 노출 된 한 수준의 MRU 파일 기록 만 제공하는 것으로 보입니다. 그러나 :kwbd몇 개의 버퍼를 닫을 때 Vim이 역순으로 예상되는 이전 버퍼로 돌아가는 것을 알았 습니다. 아마도 Vim은 우리와 공유하지 않는 MRU 목록을 가지고 있거나 CTRL-O 위치 기록 ( :jumps) 에 따라 어떤 버퍼로 대체할지 선택합니다 .
joeytwiddle

1
또는 autocmd InsertLeave * normal mZ글로벌 마크 Z 에서 마지막으로 편집 된 파일을 기억합니다 . 으로 다시 돌아올 수 있습니다 g'Z. // nmap <C-y> g'Z그래도 여전히 Ctrl-U를 더 자주 사용하는 경향이 있습니다.
joeytwiddle

6

:ls모든 버퍼를 표시 하는 데 사용할 수 있습니다 . 예를 들면 다음과 같습니다.

:ls
  1      "vim.markdown"                 line 160
  2      "ext.markdown"                 line 0
  3 #    "~/to"                         line 1
  4 %a   "~/TODO"                       line 68

buffer로 돌아가려면를 ext.markdown사용하십시오 :e +Nbuf. 여기서 N첫 번째 열의 버퍼 번호입니다. 예를 들면 다음과 같습니다 :e +2buf..

보다 대화식 환경을위한 간단한 기능을 만들 수 있습니다.

fun! ChooseBuf()
    redir => buffers
        silent ls
    redir end

    echo l:buffers
    let l:choice = input('Which one: ')
    execute ':edit +' . l:choice . 'buf'
endfun
command! ChooseBuf call ChooseBuf()
nnoremap <Leader>b :call ChooseBuf()<CR>

사용 후 :ChooseBuf또는 <Leader>b편집하려는 버퍼 수를 입력하면됩니다.

이 작업은하지 않는 매우 순서가 "가장 최근에 열었던"때문에 (또한 이유는 아마도, "가장 최근에 사용 된" :bnext/ :bprev예상대로 작동하지 않습니다).


4

<C-6>필요한 것입니다. 현재 버퍼 이전에 열었던 이전 버퍼로 돌아갑니다. 같은 것에 사용할 수있는 :bprev& 도 있습니다 :bnext.


<C-6>나쁘지는 않지만 두 버퍼를 뒤로 이동시키는 데 사용할 수는 없습니다. bprev그리고 bnext점프의 순서에 있지 않습니다.
Praxeolitic 2019

그러나 나는 역사 속으로 깊이 들어가는 좋은 기본 방법이 없다고 생각합니다. 일부 MRU 플러그인을 사용해야합니다. 심지어 CtrlP에도 플러그인이 있습니다. 다른 플러그인이 있어야합니다.
Dhruva Sagar

2
참고 : 아니에요 <C-6>, 그건 <C-^>. 많은 터미널 에뮬레이터에는 구별이 없지만 일부 (OS X와 ​​함께 제공되는 것을 포함하여)에는 차이가 있습니다. 후자의 경우 Shift키를 사용해야합니다 (Qwerty 레이아웃 가정).
tommcdo

@tommcdo 흥미, 나는 osx에 있지만 terminal.app 대신 iterm을 사용하면 나에게도 동일하게 작동합니다. Shift 키를 요구하면 번거로울 수 있습니다.
Dhruva Sagar

내 OS가 키 바인딩을 잡고 Vim에 전파하지 않는 것일 수도 있습니다. 내 OS를 중지해야합니다!
tommcdo

2

:oldfiles편집 한 파일 목록을 얻는 데 사용할 수도 있습니다 .

목록에는 파일 이름과 관련된 숫자가 있습니다. 파일을 고르고 번호 (14 번)를 기록한 후:edit #<14

해당 파일에서 다른 명령을 실행하거나 한 번에 여러 파일을 명령에 전달할 수도 있습니다. 여기 에 대한 자세한 내용


1
링크 의 다른 답변 은 저에게 가르쳐주었습니다:bro[wse] ol[dfiles][!]
Steve
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.