printf e backspace

0

Pensei em brincar um pouco com find -fprintf . Caso você não saiba o que o -fprintf faz, é o mesmo que -printf , mas escrevendo para um arquivo que você especifica seu nome.

Agora, quando eu executo um comando assim:

find -maxdepth 1 -type d  -fprintf output "%p\b\n"

Eu recebo o seguinte em output (usando vim e praticamente qualquer editor de texto):

.^H
./directory-1^H
./directory-2^H
./directory-3^H

Eu entendo que ^H é o caractere de retrocesso. Abrindo output com less :

./directory-
./directory-
./directory-

Então, a questão é:

  1. Por que vim e outros editores de texto (tentou nano e emacs ) exibem o backspace sem interpretá-lo removendo o caractere anterior, mas less faz?
  2. Por que os editores não imprimem um caractere para \n em vez de irem para uma nova linha?
  3. Qual é a diferença entre imprimir um backspace e bater no backspace no teclado (um personagem é realmente excluído ao bater no backspace no teclado)?

Estou executando isso na minha máquina (laptop) sem conectar em nenhum lugar. Usando o GNU / Linux Ubuntu 16.04 LTS com o konsole e o tmux.

    
por joker 16.10.2018 / 20:25

2 respostas

3

Why do vim and other text editors (tried nano, and emacs) display the backspace without interpreting it by removing the character before it but less does?

Por que eles deveriam? FWIW, nem os navegadores: -)

$ printf "<html>foo\bbar</html>" > /tmp/foo.html
$ firefox /tmp/foo.html

Os editores também devem interpretar outro tipo de marcação, como o mini-Markdown *foo* ou **bar** ?

Observe que o retrocesso não é apenas "excluir" o caractere anterior em less , mas é usado como um caractere de formatação bruto. x\bx imprimirá x em negrito e x\b_ irá sublinhar (o que em alguns terminais fará com que seja impresso com uma cor diferente):

printf "H\b_e\b_r\b_e\b_'s\bs Johnny!" | less

Why don't the editors print a character for \n instead of going down for a new line?

Eles poderiam fazer isso. Por exemplo, se você usar :set list em vi , as novas linhas serão impressas como $ e as guias como ^I .

What is the difference between printing a backspace and hitting backspace on the keyboard (a character gets actually deleted on hitting backspace on the keyboard)?

Em um terminal do tipo físico (impressão em papel), a impressão de um backspace fazia com que o carro fosse para uma posição à esquerda, para que um caractere subseqüente sobrescrevesse , não excluísse o que já estava o papel. No vidro (CRT) e nos terminais emulados, mover uma posição para a esquerda e escrever um caractere cria um efeito de 'apagar' porque a sobrescrita de um caractere o substitui completamente. Mas o \b por si só não remove nada: printf "123\b\n" imprimirá 123 não 12 .

O último é uma função do driver tty, que interpreta alguns caracteres de entrada como comandos de edição / controle ( erase , werase , intr , kill - veja o stty(1) ou termios(3) manpages para a lista completa).

E a tecla backspace não sempre gera um caractere \b / ^H (BS). A maior parte do tempo é \x7f / ^? (DEL).

Mas você pode configurá-lo para o que quiser:

$ stty erase @

Agora, pressionar @ apagará o caractere anterior, como no unix v7.

    
por 17.10.2018 / 10:32
1

O conteúdo dos arquivos é o que os aplicativos fazem deles.

Uma das características do design do Unix é que os arquivos são sequências de caracteres sem distinção, e cabe aos aplicativos colocar qualquer interpretação que quiserem sobre eles. Os aplicativos podem interpretar o conteúdo do arquivo de maneira diferente e você está experimentando as conseqüências disso.

O VIM está interpretando o conteúdo do arquivo de acordo com a noção da Única Especificação Unix de um Arquivo de Texto , que é um arquivo que contém zero ou mais linhas terminadas por e não contendo caracteres . Transforma caracteres não imprimíveis em várias representações imprimíveis, mas é sempre o fim de uma linha porque isso faz parte do conceito.

Outros utilitários interpretam o conteúdo do arquivo de maneira diferente. Uma família deles interpreta o conteúdo do arquivo como um fluxo de dados de saída do Teletipo Modelo 37 (TTY-37). Esta família compreende vários programas Unix e GNU convencionais: less , more , most , ul , colcrt , ncal , grotty no modo não padrão e outros. Nessa interpretação, o caractere move a cabeça de impressão (conceitual) uma posição para trás e ultrapassa o o que havia antes. Como esses programas não são TTY-37s físicos com tinta no papel, eles implementam suas próprias idéias em software do que significam overstriking. Overstriking pode resultar em várias tentativas de usar os atributos negrito e sublinhado, em substituição completa de um caractere por outro, em caracteres combinados, ou em nada.

Leitura adicional

por 13.12.2018 / 16:05