De :h :set
nós sabemos que
:se[t]
Mostrar todas as opções que diferem do valor padrão.
Em um vimscript, eu gostaria de salvar todas essas opções que foram modificadas pelo usuário, modificá-las e depois restaurá-las para o valor definido pelo usuário.
Como posso fazer isso facilmente?
Eu tenho uma maneira de simplesmente armazenar o resultado :set
(ou um comando semelhante) em uma variável que eu poderia originar ou passar para outro comando posteriormente para restaurar o que ele contém?
Ou tenho que analisar manualmente a saída do comando (o que posso fazer, mas é muito trabalhoso, se existir uma alternativa mais simples)?
:option
comando e umOptionSet
evento de comando automático, portanto, pode haver interesse suficiente para um recurso "salvar / restaurar estado". Perguntevim_dev
.:option
comando, é muito legal! Você está certo, talvez eu acerte vim_dev. @ Christian: Sim eu recebo que este não é um fluxo de trabalho commom, na verdade eu estou juste tentando implementar uma ideia minha, mas talvez isso não é tão boa :-)selection
possui um local ? versão Um tem que ler as fontes para descobrir).Respostas:
1
:mkexrc
A maneira mais fácil é usar o
:mkexrc
comando. Com este comando, podemos salvar todas as opções alteradas em um arquivo. Quando você precisar restaurar todas as opções salvas do arquivo, apenas:source
isso.2.
:set
e:redir
O
:mkexrc
comando necessariamente usa um arquivo para conter todas as opções (e também salva os mapeamentos de teclas atuais.) Quando não queremos usar nenhum arquivo, podemos redirecionar a saída do:set
comando para a variável vim com:redir
.Em seguida, podemos restaurar todas as opções do instantâneo da seguinte maneira.
A abordagem acima é rápida e fácil de usar. Mas a abordagem tem dois problemas. Primeiro, precisamos escapar de alguns caracteres, incluindo espaços em branco da captura instantânea (
:help option-backslash
) . Caso contrário, poderemos encontrar erros quando esses caracteres não estiverem sendo escapados. Por exemplo,gera o erro 'E518' mas,
funciona bem.
E o segundo problema é que todas as chaves especiais são alteradas para caracteres normais quando redirecionamos a saída para o instantâneo. Por exemplo,
^I
(guia) é literalmente alterado para^
eI
. A solução alternativa pode ser um pouco complicada.3)
:setlocal
Também podemos salvar uma opção de restauração manualmente com
:setlocal
.:setlocal
afeta apenas o buffer ou a janela atual. Se alterarmos as opções com:setlocal
,:setlocal {option}<
ou:set {option}<
podemos restaurar as opções alteradas. O primeiro define o valor local de {option} do seu valor global e o último remove todas as opções locais para que todos os valores das opções retornem aos seus valores globais. Por exemplo,fonte
Você pode acessar o valor de uma configuração usando
let option_val = &option
um script. O que eu vi feito é usar um dict para armazenar as opções que você deseja alterar. Você itera sobre o dict para armazenar o valor antigo e definir o novo.Exemplo
Essa é uma abordagem mais direta. Eu usaria isso se as configurações fossem conhecidas antecipadamente.
A
plugin_options
variável tem um escopo definido para a função, para que possa ser reutilizada para armazenar os valores das opções antigas.Exemplo Avançado
O script abaixo permitirá que você altere as configurações em qualquer lugar do seu script, mantendo as configurações originais até você ligar
s:restore_settings()
s:set()
é um pouco semelhante aset
. Ele salvará o valor da configuração original, se ainda não tiver sido salvo, e use o valor da configuração.Ligar
s:restore_settings()
sem argumentos fará uma restauração completa de suas alterações. Com argumentos, ele os restaurará parcialmente. Se você decidir usar isso, vale a pena ligars:restore_settings()
antes da chamada inicials:set()
, caso o script tenha ocorrido um erro antes da restauração.fonte
'set statusline='.a:value
. Como está usando atribuição de variável, não é um problema. Você pode testá-lo coms:set('statusline', 'pipe | test')
ous:set('errorformat', '%A testing %m%Z')
let &{option}=a.value
poderia causar problemas como'set {option}'=a.value
poderia. Mas sua menção ainda é valiosa para as pessoas (inclusive eu) que provavelmente usaram apenas'set {option}='a.value
.No lh-vim-lib , forneço uma
lh#on#exit()
função que permite restaurar várias coisas ao seu valor anterior.Em relação às opções, em essência, apenas registra (para mais tarde) a
exe 'let &opt='.&opt
. Eu uso desta maneira:Podemos registrar quantas restaurações desejarmos. Podemos direcionar explicitamente uma opção local tampão com, por exemplo:
l:&efm
. No entanto, não conheço nenhuma maneira de dizer: "retorno ao valor da opção global".Observe que a
finally
cláusula é importante. Se alguma operação falhar, sem ela, a opção não será restaurada para a configuração do usuário final.Não forneci uma maneira de restaurar nenhuma opção possível - consulte a resposta do @ MS.Kim para ver como podemos obter sua lista. Ou podemos ouvir a opção de evento alterado ou brincar com o velho
c_CTRL-A_HOME
truque (1). Mas, honestamente, eu realmente não entendo o ponto. Quando, localmente (em uma função), altero os valores das opções, sei exatamente quais opções ajustarei.Note que eu também posso:
.restore_option(varname)
.register(':q')
.restore_buffer_mapping('<c-y>', 'i')
(1) Que eu fatorei em lh-vim-lib (como sempre) ->
echo lh#command#matching_askvim('option', '')
fonte
I haven't provided a way to restore any possible option [...]. I don't see the point. When, locally (in a function), I change option values, I exactly know which options I'll tweak.
para ser justo, não me lembro por que precisava disso, mas concordo que é melhor mudar apenas as opções que você precisa alterar.c_CTRL-A_HOME
truque e precisarei de algum tempo para inserir seu código, mas muito obrigado por fornecer uma solução! (PS Eu ficaria feliz em conhecê-lo em uma próxima tuppervim!)get(g:,
- o que levou algum tempo para descobrir. É ainda útil para o material exposto não-oficialmente como opções, variáveis de ambiente, etc.