O que o vim considera ser uma palavra? [duplicado]

8

Eu não entendo a definição vim s de uma palavra. Da ajuda para o movimento w ( :h w ):

w [count] words forward. |exclusive| motion. These commands move over words or WORDS.

   *word*

A word consists of a sequence of letters, digits and underscores, or a sequence of other non-blank characters, separated with white space (spaces, tabs, ). This can be changed with the 'iskeyword' option.

Isso significa que quando invoco o w motion, o vim precisa verificar quais caracteres pode inventar uma palavra com a ajuda da opção iskeyword . Então vamos verificar de quais personagens uma palavra pode ser composta:

:set iskeyword?
iskeyword=@,48-57,_,192-255

Vamos testar isso com caracteres não incluídos nos personagens listado na opção iskeyword , por ex. %código%. Pressionando U+015B LATIN SMALL LETTER S WITH ACUTE on ga nos informa que tem o decimal valor 347, que é maior que 255 e, portanto, fora da faixa de %código%. O cursor é colocado no ś of treść e eu pressiono iskeyword :

treść bar
^ (cursor)

O resultado:

treść bar
      ^ (cursor)

Se uma palavra puder ser composta de letras, dígitos, sublinhados e outros caracteres, a única possibilidade é que o vim trate o t como uma carta , já que obviamente não é um dígito ou um sublinhado. Vamos verificar como descobrir se um personagem é uma carta. De w :

The following character classes are supported: [:alpha:] [:alpha:] letters

Um teste com

/[[:alpha]]

mostra que ś não é considerado uma carta.

Por que o cursor pulou para :h :alpha: if ś não é uma letra, nem um dígito, nem um sublinhado e não listado em b ?

Testado no VIM - Vi IMproved 7.3 (2010 Ago 15, compilado em Dez 27 2012 21:21:18) Patches incluídos: 1-762 no Debian GNU / Linux com locale definido como ś .

    
por Marco 08.01.2013 / 12:07

1 resposta

1

Como Ulrich mencionou em seu comentário, a razão é que os caracteres multi-byte são sempre considerados como parte de uma palavra. Eles não precisam ser especificados em iskeyword . Para citar a ajuda :h iskeyword , que aponta para :h isfname :

Multi-byte characters 256 and above are always included, only the characters up to 255 are specified with this option. For UTF-8 the characters 0xa0 to 0xff are included as well.

    
por 08.01.2013 / 19:53

Tags