-
:range!command
escreve o texto do intervalo para um pipe (excluindo-o do buffer de arquivo), executa o comando no pipe, lê a saída padrão do comando e insere-o no buffer onde o intervalo era. Essa é a função
vimque você está usando. Esta função é muito útil com o comandosort. Não me lembro de ter visto outra situação onde esta funçãovimé útil; isso não parece ser um.Você quer
:range w !command
que grava o intervalo em um canal (mas não o exclui do buffer de arquivo), executa o comando no pipe, e deixa a saída padrão do comando (se houver) basta ir para a tela (ou seja, a saída padrão devim). (O espaço entre o intervalo e owsão opcionais.) - O intervalo pode ser de uma marca para outra
(
'<e'>são efetivamente marcas), uma linha para outra ou apenas uma linha. Contanto que você tenha apenas um{{…}}em uma linha, você pode simplesmente ir até a linha (você não precisa realçá-lo) e use.como seu intervalo. Se você tiver apenas um{{…}}no arquivo, você pode usar/{{.*}}/(ou até/{{/, se for exclusivo) como seu intervalo. Então seu comando se torna:/{{/w !sed blah blah blah - Eu prefiro citar strings que precisam ser citadas com aspas , em vez de jogar um milhão de barras invertidas para eles. Eu acho que é apenas uma preferência pessoal; Se as barras invertidas funcionarem para você, use-as.
- Expressões regulares extravagantes
(usando
|para procurar um padrão ou outro) tem o seu lugar no mundo. Eu me inclino para usar vários comandossed. Mais uma vez, qualquer que seja. - Então, minha versão do que você está fazendo agora seria algo como isto:
:/{{/w !sed -e 's/.*{{//' -e 's/}}.*//' | xargs xdg-open, que remove o{{e tudo antes dele e remove o}}e tudo depois dele. Mas isso ainda requer que você esteja no diretório onde está o arquivo PNG. -
O arquivo PNG está no mesmo diretório do arquivo de texto. É útil notar que, quando você executa um comando shell com
!devim, um%sem escape na linha de comando é substituído pelo nome do arquivo que você está editando no momento. (Experimente: digite:!echo abc%def.) Podemos usar isso para determinar o nome do caminho para o diretório onde estão os arquivos. Assim, podemos melhorar o comando acima para::/{{/w !sed -e 's|.*{{|%{{|' -e 's|[^/]*{{||' -e 's|}}.*||' | xargs xdg-openO primeiro subcomando sed,s|.*{{|%{{|, remove tudo antes do{{e o substitui pelo nome do arquivo, e deixa o{{. Note que este subcomando deve usar um delimitador (não em branco) que não aparecerá no caminho / nome de arquivo, por isso não podemos usar/. Se você tiver nomes de diretório ou nomes de arquivos com barras verticais, escolha outro caractere para usar como seu delimitador. O segundo subcomando,s|[^/]*{{||, remove a parte nome do arquivo do nome do arquivo%, deixando a parte do diretório (se houver) e remove o{{. O terceiro subcomando,s|}}.*||, é o mesmo que o segundo subcomando (s/}}.*//) do comando anterior; remove o}}e tudo depois dele.Enquanto os comandos
s/pattern/replacement/sempre precisa usar um delimitador que não aparece no textopatternoureplacement(ou escape do caractere delimitador quando ele aparecer), isso é um problema apenas para o primeiro comandos. Eu usei|em todos os três apenas por consistência.
TL; DR
Uso:
:/{{/w !sed -e 's|.*{{|%{{|' -e 's|[^/]*{{||' -e 's|}}.*||' | xargs xdg-open
P.S. Eu presumo que você perceba que isso não vai funcionar se o nome do arquivo contém espaço (s).