Livre-se do caractere nulo na variável vim?

6

Estou tentando corrigir o comportamento do Backspace do vim em uma das plataformas que uso. Eu obtive o nome desta plataforma (chame de bad_platform ) do comando get_platform do sistema. Seguindo o conselho em :help fixdelete e combinando-o com o conhecimento de como executar comandos do sistema, adicionei o seguinte ao meu .vimrc:

let platform_name = system("get_platform")
if platform_name == "bad_platform"
  set t_kb=^?
  fixdel
endif

Isso não funcionou. Para descobrir o porquê, abri uma sessão do Vim e fiz :echom platform_name . Isso deu o resultado bad_platform^@ , onde ^@ é eu acho que o caractere NULL, não literalmente os dois caracteres que você obtém digitando "shift-6 shift-2".

Infelizmente, isso apresenta um problema. Eu não posso mudar isso para == "bad_platform^@" , porque quando o .vimrc é originado, parece que ^@ é interpretado como um caractere de fim de linha. Isso significa que adicionar let platform_name = substitute(platform_name,"\^@","","") antes do if também não funciona.

Como posso lidar com isso? Agradecemos antecipadamente.

    
por Sam Rabin 02.07.2015 / 18:46

3 respostas

6

Algumas alternativas:

  1. Remova o \n usando substitute(string, '\n$', '', '') Veja :h NL-used-for-Nul para o background técnico

  2. Remova todos os chars de controle: substitute(string, '[[:cntrl:]]', '', 'g')

  3. Compare usando a operação de correspondência ( =~ ) em vez de igual ( == )

  4. Retira o último byte da saída do comando system ()

    :let a=system('foobar')[:-2]

por 02.07.2015 / 22:09
1

Vim representa novas linhas em strings como um caractere nulo, então o que está acontecendo é que o comando do sistema está retornando uma string com uma nova linha final (como deveria) e o Vim está convertendo-a para um valor nulo. Você só precisa remover essa nova linha (representada como nula) no final:

let platform_name = substitute(system('get_platform'), '\n\+$', '', '')

(Observe que, se você usar aspas duplas em vez de aspas simples, terá de adicionar barras invertidas adicionais na frente das barras invertidas existentes para evitá-las.)

Note que a razão \n é usada no padrão é a mesma razão que expliquei acima; A representação do Vim de novas linhas em strings é nula.

    
por 02.07.2015 / 20:52
1

Como os outros disseram, o vim representa a nova linha como um nulo. Outra maneira de remover a nova linha é no seu comando shell. Qualquer um dos seguintes funcionaria.

let platform_name = system('echo -n "$(get_platform)"')
let platform_name = system('printf "%s" "$(get_platform)"')
let platform_name = system("get_platform | tr -d '\n'")
    
por 09.12.2017 / 06:45

Tags