2011-08-29 11 views
6

Czy można wyświetlić listę wszystkich otwartych buforów w vim? Chciałbym zobaczyć pełną ścieżkę do każdego otwartego bufora i zapisać listę do zewnętrznego pliku lub wkleić go do wklejenia do innego dokumentu tekstowego.Jak mogę wyświetlić ścieżki do wszystkich otwartych buforów vima?

Rozwiązanie

To był bardzo trudny konkurs! Wszystkie 3 poniższe sugestie działały dobrze. Poszedłem z Luc Hermitte's i dodaje to do mojego vimrc:

noremap <silent> <leader>so :call writefile(map(filter(range(0,bufnr('$')), 'buflisted(v:val)'), 'fnamemodify(bufname(v:val), ":p")'), 'open_buffers.txt')<CR>

Więc teraz, wpisując ,so uratuje cały pełną ścieżkę wszystkich otwartych buforach do bieżącego katalogu w pliku open_buffers.txt

Odpowiedz

7

Musiałbym użyć "prostą":

echo map(filter(range(0,bufnr('$')), 'buflisted(v:val)'), 'fnamemodify(bufname(v:val), ":p")') 

Z:

  • range(0,bufnr('$')) mieć | listę | wszystkich możliwych liczb buforowych
  • filter(possible_buffers, 'buflisted(v:val)') ograniczyć listę do buforów, które są faktycznie wymienione - może wolisz bufexist() że będzie również pokazać bufory pomoc, itp
  • map(listed_buffer, 'nr_to_fullpath(v:val)') aby przekształcić wszystkie numery buforowe do pełnych ścieżek
  • bufname() przekształcać jeden numer do bufora (-i) ścieżki
  • fnamemodify(pathname, ':p') mieć pełny bezwzględnej ścieżki od względnej ścieżki.

Zmień :echo do call writefile(pathname_list, 'filename'), i to wszystko, albo :put= itp

2

notować absolutny ścieżka dla bufora można użyć:

:!echo %:p 

Jeśli owinąć że w nagraniu dostaniesz to, czego potrzebujesz, np:

qq 
:!echo %:p >> my_buffers 
:bnext 
q 

Teraz wykonać szereg makro razy, jak masz bufory, np:

[email protected] 

i trzeba będzie wynik w pliku my_buffers

prawdopodobnie lepszy sposób jednak :-)

0

Skrypt bufexplorer pokazuje ścieżkę wszystkich otwartych buforów, ale pokazuje również inne informacje, więc nie jest idealny do szarpania i wklejania do innego dokumentu. Oto screenshot

2

To powinno działać:

:redi @"|ls|redi END 
:new +pu 
:%s/[^"]*"\([^"]*\)".*/\=fnamemodify(submatch(1), ":p")/e 
:g/^$/d 

Objaśnienie:

  • :redi przekieruje wiadomości
  • :redi @" przekieruje wiadomość @" aka bezimiennego rejestru
  • :redi END przystanki przekierowanie
  • :ls drukuje wszystkie nie-ukryte bufory
  • :new stworzyć bufor w ułamku
  • :new +{cmd}+cmd będzie wykonywał polecenia dla nowego bufora.
  • :new +pu wykonanie europejskiego :pu lub umieścić polecenia na nowym buforze
  • regex w zasadzie zgodny z całą linię i przechwytuje zawartość między cytatami
  • \= w ramach zastępczej :s/ wykona wyrazem
  • fnamemodify(submatch(1), ":p") poszerzy złapanych dane aka submatch(1)
  • :g/^$/d usunąć wszystkie puste linie

Więcej informacji:

:h /\= 
:h :g 
:h :new 
:h :pu 
:h :redi 
:h :ls 
:h fnamemodify() 
:h :d 
+0

Kocham redir i stwierdzili, że to bardzo przydatny w wielu sytuacjach. –

Powiązane problemy