Preciso disponibilizar o texto retornado por echo $(which bash)
para colar em um arquivo de texto aberto no Vim.
A causa da minha confusão é que parece que existem pelo menos três pranchetas:
- área de transferência do sistema (por exemplo, Command-C > Command-V)
- área de transferência do shell (por exemplo, Control-U > Control-Y)
- Área de transferência do Vim (por exemplo, yy > p)
Então, para cumprir minha tarefa, posso, por exemplo, digitar echo $(which bash) | pbcopy
, abrir o Vim e pressionar Command-V.
Isso funciona, mas não tenho certeza se é assim que os usuários não novatos do Vim prefeririam fazê-lo, porque nesse caso o Vim lê da área de transferência do sistema, e a leitura da área de transferência do sistema tem muitas nuances: por exemplo, se o seu Vim é compilado com uma opção específica, se você tiver configuração apropriada em seu arquivo .vimrc
, etc.
Qual é a maneira mais correta de fazer isso?
Em vez de usar a prancheta, este caso de uso é perfeito para
:r!
:
entra no modo de comandor
significa que leremos algo (se não incluirmos!
, ele lerá um arquivo).!
significa que executaremos um processo. O stdout será alimentador
e inserido em nosso documento.Observe que, na melhor das hipóteses,
echo
não é muito útil aqui.which bash
já retorna algo como/usr/bin/bash
, então estamos apenas executandoecho /usr/bin/bash
quais saídas/usr/bin/bash
. Na pior das hipóteses, o processo executado pode gerar opções de eco, como-e
ou algumas sequências de escape como\b
, ou gerar algo com umIFS=
caractere. Isso poderia fazer comecho
que interpretasse sua entrada e tomasse ações em vez de imprimi-la literalmente. Portanto, eu recomendo descartarecho
(ou pelo menos substituí-lo porprintf
).Aqui está um exemplo de como uso
:r!
no meu dia a dia. Se estou tentando adicionar arquivos não versionadossvn:ignore
(uma propriedade do subversion semelhante a.gitignore
), farei o seguinte:Então, em
vim
, posso:Isso chamará
svn status
which lista todos os arquivos modificados, ausentes, não versionados, novos e excluídos. Então eu costumoawk
focar em qualquer coisa que comece com a?
(indicando não versionado) e depois imprimo o nome do arquivo.vim
insere o resultado em meusvn:ignore
arquivo temporário e:wq
sai do editor e define a propriedade.Se você estiver no macOS de acordo com as tags de perguntas, o Vim padrão terá suporte para área de transferência:
Portanto, se o conteúdo já estiver copiado para a área de transferência do sistema (usando
pbcopy
, CmdC, ou algum outro meio), use"+p
ou"*p
(ouP
, dependendo de como você deseja colar). No macOS, ambos+
e*
são equivalentes. Isso funciona sem qualquer configuração adicional do vimrc (por exemplo, ao executarvim -u NONE
ouvim --clean
).Não tenho um mapeamento de versões do Vim para versões do macOS, mas qualquer macOS recente deve ter uma versão do Vim com o
:terminal
comando (adicionado em 2017), com o qual você pode executar um terminal dentro do Vim e acessar o conteúdo desse terminal para copiar e colar no Vim. Use:term
para iniciar um terminal, executar comandos, useC-w N
para entrar no modo Terminal-Normal , copiar e selecionar o texto como faria normalmente no modo Normal, mudar para o buffer que deseja colar como faria normalmente e colar como faria normalmente .