Chinmay Kanchi
Chinmay Kanchi

Reputation: 65903

Adding a command to Vim

I finally decided to try out Vim, as I am getting increasingly frustrated by GUI editors. So far, I'm loving it, but I can't find any help for a issue I'm having...

I am trying to map the command :Pyrun to :!python % in Vim using cmap. The mapping shows up fine if I type :cmap. However, on typing :Pyrun, I get this error message:

Not an editor command: Pyrun.

Here is what I'm trying in .vimrc:

:autocmd FileType python :cmap Pyrun<cr> !python %<cr>
:autocmd FileType python :cmap Intpyrun<cr> !python -i %<cr>

What can I do to solve this problem?

Upvotes: 42

Views: 39870

Answers (4)

Anton Abrosimov
Anton Abrosimov

Reputation: 359

With new LUA api:

vim.api.nvim_create_user_command('Hello', 'echo "Hello World!"', {})
vim.api.nvim_create_user_command('HelloLua', function ()
    print('Hello LUA!')
end, {})

NeoVIM API reference

Upvotes: 0

Raoul Supercopter
Raoul Supercopter

Reputation: 5114

I personally prefer another approach. First create a function receiving the command arguments and then create a command to call the function:

fun! DoSomething( arg ) "{{{
    echo a:arg
    " Do something with your arg here
endfunction "}}}

command! -nargs=* Meh call DoSomething( '<args>' )

So it would be like

fun! Pyrun( arg ) "{{{
    execute '!python ' . expand( '%' )
endfunction "}}}

command! -nargs=* Pyrun call Pyrun( '<args>' )

But, there's a better way to do it in Vim. Use makeprg:

makeprg=python\ %

Just type :make to run your current Python file. Use :copen to show error list.

Upvotes: 30

Rob Wells
Rob Wells

Reputation: 37103

G'day,

Similar to karoberts answer, I prefer the more direct:

:map <F9> :!python %<CR>

If my script is creating some output I also like to capture it in a temp file and then autoread that files content into another buffer, e.g.

:map <F9> :!python % 2>&1 \| tee /tmp/results

I then set autoread by entering :set autoread and opening the results file in another buffer

:split /tmp/results<CR>

Then I can easily see the results of the run in the buffer that auto refreshes when the results file is updated by running the script under development.

HTH

cheers,

Upvotes: 12

karoberts
karoberts

Reputation: 9938

I would try something like this in your .vimrc or your ftplugin/python_ft.vim

command Pyrun execute "!python %"
command Intpyrun execute "!python -i %"

Then :Pyrun and :Intpyrun should work

You could then map a function key to each

map <F5> :Pyrun<CR>
map <F6> :Intpyrun<CR>

Upvotes: 45

Related Questions