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


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.