2012-11-27 3 views
1

특정 버퍼로 전환해야하는 vimscript가 있습니다. 해당 버퍼는 전체 경로, 부분 경로 또는 이름으로 지정됩니다. 예를 들어vimscript : 파일 이름 경로로 버퍼 전환

:

나는 디렉토리 /home/user/code에, 그리고 난 foo.pysrc/foo.pysrc/bar.py 열린 3 개 정력 버퍼를 가지고있다. 스크립트가 /home/user/code/foo.py 버퍼로 전환했다 경우

  • foo.py 버퍼로 전환한다. 이 user/code/src/foo.py로 전환 들었다 경우는가에 swith를 들었다 경우가 foo.py

  • 버퍼로 전환 할 foo.py로 전환 들었다 경우

  • src/foo.py

  • 버퍼로 전환 할 것 bar.py는 I가 볼 수있는 단순한 솔루션이다 src/bar.py

버퍼로 전환 할 어떻게 든 변수에 저장된 버퍼 목록을 얻고 시행 착오를 사용하십시오.

솔루션이 크로스 플랫폼 인 경우 좋지만 Linux에서 실행해야합니다.

답변

6

bufname()/bufnr() 함수는 부분 파일 이름으로로드 된 버퍼를 검색 할 수 있습니다. 이 같은 $을 추가하여 끝까지 경기를 고정 할 수 있습니다

echo bufnr('/src/foo.py$') 
+0

* 찡그린 미소 * 내가 아는 정력이 작업을 수행하는 기능을 할 것이다. 감사. –

0

vimscript에서 파이썬을 사용하여이 작업을 수행하는 방법을 발견했습니다. 파이썬으로 나는 모든 버퍼의 이름을 vim.buffers[i].name에서 얻을 수 있었고 os.pathos.sep을 사용하여 전환 할 버퍼를 처리했습니다.

마지막으로 전환을 요청한 버퍼가 애매한 경우 아무 것도 수행하지 않는 것이 더 도움이된다고 결정했습니다.

는 여기있다 :

"Given a file, full path, or partial path, this will try to change to the 
"buffer which may match that file. If no buffers match, it returns 1. If 
"multiple buffers match, it returns 2. It returns 0 on success 
function s:GotoBuffer(buf) 
python << EOF 
import vim, os 
buf = vim.eval("a:buf") 

#split the paths into lists of their components and reverse. 
#e.g. foo/bar/baz.py becomes ['foo', 'bar', 'baz.py'] 
buf_path = os.path.normpath(buf).split(os.sep)[::-1] 
buffers = [os.path.normpath(b.name).split(os.sep)[::-1] for b in vim.buffers] 
possible_buffers = range(len(buffers)) 

#start eliminating incorrect buffers by their filenames and paths 
for component in xrange(len(buf_path)): 
    for b in buffers: 
     if len(b)-1 >= component and b[component] != buf_path[component]: 
      #This buffer doesn't match. Eliminate it as a posibility. 
      i = buffers.index(b) 
      if i in possible_buffers: possible_buffers.remove(i) 

if len(possible_buffers) > 1: vim.command("return 2") 
#delete the next line to allow ambiguous switching 
elif not possible_buffers: vim.command("return 1") 
else: 
    vim.command("buffer " + str(possible_buffers[-1] + 1)) 
EOF 
endfunction 

편집 : 위의 코드는 몇 가지 버그를 갖고있는 것 같아요. 훨씬 나은 또 다른 대답이 있기 때문에 나는 그들을 고치려고하지 않습니다.

관련 문제