“E488: Trailing Characters” erro no Vim depois de digitar: F7

1

Escrevi o seguinte em vimrc.vim

:filetype plugin on
:let s:save_cpo = &cpo
:set cpo&vim
:let &cpo = s:save_cpo
:set runtimepath = ~/home/nikcha/.vim/plugin
:set fileformat = unix
:function! print_hi()
:echo "Hi..its done"
:endfunction
:map <F7> : call print_hi()<CR>

Ao abrir um arquivo e digitar :F7 , o erro E488:Trailing Characters O que poderia ter dado errado?

    
por Nikita 23.01.2015 / 11:31

3 respostas

2

Usando :map , você torna o mapeamento F7 disponível para os modos Normal, Visual, Select, Operador pendente . Ao pressionar : , você está entrando no modo de linha de comando , que não é coberto .

Veja :help map-modes para uma visão geral.

Como o modo de operador pendente é bastante especial e sua função de exemplo também não faz sentido em uma seleção, é melhor restringi-lo ao modo normal (padrão) via :nmap .

Além disso, você deve usar :noremap ; torna o mapeamento imune ao remapeamento e à recursão: :nnoremap .

Se você quiser um atalho para o modo de linha de comando, defina um comando personalizado :

:command! Hi call print_hi()
    
por 23.01.2015 / 12:14
2

Colons

Os dois pontos no início de suas linhas são opcionais. Para scripts, eles geralmente são omitidos, pois tornam o código mais limpo / fácil de ler. O cólon é necessário, no entanto, dentro do mapeamento, conforme explicado posteriormente.

Definir valores para opções

Quando você define valores de opção como fileformat e runtimepath , não é possível ter um espaço entre = e o valor. Deve ser:

set fileformat =unix
" or
set fileformat=unix

observe que esse não é o caso de let , que você usa para atribuir valores a variáveis ou ao consultar uma opção. Tudo bem:

let s:foo = "bar"
let &fileformat = "unix"

Funções de nomenclatura

Quando você escreve suas próprias funções, o nome precisa começar com uma letra maiúscula. No seu caso, algo como:

function! Print_hi()
"         |
"         +----------- Capital

Modo compatível

Sua rotina de salvar e restaurar cpo não faz muito. A coisa “normal” é salvá-lo, depois ter seu script e, no final, restaurá-lo.

let s:save_cpo = &cpo
set cpo&vim

" Rest of script

let &cpo = s:save_cpo

Como seu script é agora, ele apenas salva, configura e restaura em uma sequência adjacente. Em outras palavras, pode ser omitido como um todo ou você usa o padrão como mostrado acima.

O motivo dessa rotina é que, no seu script, você não sabe se o usuário está no modo compatível, (mais como vi, menos como vim) ou não. Portanto, é normal salvar o modo, definir o modo para vim e restaurá-lo no final. Desta forma, você pode usar a funcionalidade específica do Vim sem problemas.

Script reescrito

Como um todo, isso deve estar mais na direção que você deseja:

let s:save_cpo = &cpo
set cpo&vim

function! Print_hi()
    echo "Hi..its done"
endfunction

map <F7> :call Print_hi()<CR>
"        |
"        +-------------------- Note; here we use colon.

let &cpo = s:save_cpo

O mapeamento, E488

As outras respostas deram uma boa explicação sobre por que você recebe o

E488:Trailing Characters

erro. Em suma: quando mapeado como este, apenas pressione F7 . Não pressione dois pontos primeiro. Ingo Karkat tem alguns bons conselhos sobre a função do mapa para usar.

Os dois pontos : no seu mapeamento dizem ao Vim para entrar no modo de linha de comando. Em seguida, o comando é impresso call Print_hi() . Finalmente <CR> é adicionado para executar a linha de comando. O mesmo que Enter se você escreveu o comando manualmente. Com efeito, torna-se uma sequência automatizada de teclado.

Escrita mais eficaz

Geralmente é melhor adicionar scripts aos seus próprios arquivos e, em seguida, carregar os scripts em .vimrc . Não escreve muitos scripts / funções em .vimrc . Quando você escreve em um script e quer testá-lo, basta dizer:

  • :so % Enter

Eu tenho esses mapeamentos no meu arquivo rc para carregamento rápido:

"^O is CTRL-O (i: Ctrl-V Ctrl-S-O; to prevent cursor movement
" Save + Source
inoremap    <silent>    <C-S-F12>  ^O:w<CR>^O:so %<CR>
nnoremap    <silent>    <C-S-F12>    :w<CR>:so %<CR>
" Source
inoremap    <silent>    <C-F12>  ^O:so %<CR>
nnoremap    <silent>    <C-F12>    :so %<CR>

Também tem uma função para apenas obter código selecionado, mas como este post está ficando um pouco longo ...

    
por 23.01.2015 / 12:59
0

Você não deve digitar :<F7> , mas pressionar a tecla F7. Isso é o que o :map <F7> : call print_hi()<CR> significa:

:map        # Map the following printable characters:
<F7>        # # How F7 is seen by vim
:           # to
call        # call a function:
print_hi()  # # previously defined function print_hi
<CR>        # and print a new line.

Se você quiser chamar a função no modo visual (digitando: bla) você não deve usar as teclas, mas digite :call print_hi() .

    
por 23.01.2015 / 11:56

Tags