Vim - statusline e links

1

Dada esta situação:

cd ~/temp
ln -s /var/lib/alsa alsa
cd alsa
pwd -> /home/<username>/temp/alsa

Mas se eu abrir algum arquivo na saída do diretório pwd , a vim statusline me dará:

/var/lib/alsa/asound.state

Como posso mostrar o resultado pwd e não seguir o link?

Estou usando:

set statusline=%F%=%m\ %y\ \%r\ %1*\ \%l\:\%c\ \%2*\ \ \%p%%\ \ 
    
por user1101 12.09.2014 / 06:05

2 respostas

2

@ A resposta do Gnouc vai na direção certa, mas você não deve invocar um comando externo de dentro da avaliação statusline ! Isso gerará um novo processo em cada movimento do cursor e caractere digitado, e arrastará o desempenho do Vim (como você já experimentou).

Melhor dividir isso em duas partes: um :autocmd que atualiza uma variável sempre que o buffer atual é alterado e um consumo muito eficiente dessa variável na própria linha de status:

set statusline=%{exists('b:actualCwd')?b:actualCwd:getcwd()}/%f%=%m\ %y\ \%r\ %1*\ \%l\:\%c\ \%2*\ \ \%p%%\ \ 
autocmd BufEnter * let b:actualCwd = system('echo -n $(pwd -L)')
    
por 15.09.2014 / 12:05
5

Você não pode fazer isso diretamente com o vim, o vim sempre resolve os links para encontrar o nome do arquivo atual.

De :h E773 :

For symbolic links Vim resolves the links to find the name of the actual file.  
The swap file name is based on that name.  Thus it doesn't matter by what name  
you edit the file, the swap file name will normally be the same.

Você pode usar o comando externo para obter o diretório de trabalho atual, além de %f da linha de status.

Tente:

set statusline=%{system('echo\ -n\ $\(pwd\ -L\)')}/%f%=%m\ %y\ \%r\ %1*\ \%l\:\%c\ \%2*\ \ \%p%%\ \ 

Para mais informações:

:h E773
:h todo.txt
:h version7.txt
    
por 12.09.2014 / 07:04

Tags