Vim ejecutar el acceso directo

Básicamente, lo que quiero es un método abreviado de teclado en vim que me permita [comstackr y] ejecutar el progtwig C, C ++ o Python que se está editando actualmente. En psuedocode:

when a shortcut key is pressed: if current_extension == 'c' then shell: gcc this_filename.c -o this_filename_without_extension if retcode == 0 then shell: ./this_filename_without_extension else if current_extension == 'cpp' then shell: g++ this_filename.cpp -o this_filename_without_extension if retcode == 0 then shell: ./this_filename_without_extension else if current_extension == 'py' then shell: python this_filename.py end if end key 

¡Me doy cuenta de que podría estar preguntando mucho pero me encantaría si esto fuera posible!

Algo como esto funcionaría. Simplemente cree el tipo de archivo autocmd que mapea o lo que quiera guardar, compile y ejecute el progtwig. Utiliza exec para construir la cadena y usa shellescape para escapar del nombre del archivo.

 autocmd filetype python nnoremap  :w  exec '!python '.shellescape('%') autocmd filetype c nnoremap  :w  exec '!gcc '.shellescape('%').' -o '.shellescape('%:r').' && ./'.shellescape('%:r') autocmd filetype cpp nnoremap  :w  exec '!g++ '.shellescape('%').' -o '.shellescape('%:r').' && ./'.shellescape('%:r') 

% es el nombre de archivo del búfer actual. %:r es el nombre de archivo del búfer sin extensión

http://singlecompile.topbug.net parece hacer más de lo que quieres. Para una solución más simple, también puede agregar lo siguiente a su vimrc

 au BufEnter *.cpp set makeprg=g++\ -g\ %\ -o\ %< au BufEnter *.c set makeprg=gcc\ -g\ %\ -o\ %< au BufEnter *.py set makeprg=python\ % au BufEnter *.[rR] set makeprg=Rscript\ % map  :call CompileGcc() func! CompileGcc() exec "w" silent make endfunc 

HTH

Ahora es 2018, vim 8 se lanzó durante 2 años y se distribuyó con todas las distribuciones de Linux media y Mac OS X. Pero muchos tutoriales de vim todavía enseñan algo a la gente hace diez años.

Puede comstackr sus progtwigs de C ++ / Java en vim tan conveniente como Sublime Text o NotePad ++ con algunos complementos dedicados para Vim 8 o NeoVim.

Por ejemplo, el complemento AsyncRun le permitirá ejecutar comandos de shell en segundo plano y leer el resultado de la ventana de revisión rápida en tiempo real. Ver la captura de pantalla .

Al igual que la comstackción de progtwigs en IDE, los errores de comstackción se compararán con errorformat y se resaltarán y serán seleccionables. Puede navegar por los errores en la ventana de revisión rápida o continuar editando mientras comstack.

Configuración rápida

Copie y pegue las siguientes líneas en su vimrc:

 Plug 'skywind3000/asyncrun.vim' " open quickfix window automatically when AsyncRun is executed " set the quickfix window 6 lines height. let g:asyncrun_open = 6 " ring the bell to notify you job finished let g:asyncrun_bell = 1 " F10 to toggle quickfix window nnoremap  :call asyncrun#quickfix_toggle(6) 

Cuando ingresa “: AsyncRun echo hello” en la línea de comando:

ver la captura aquí

Verá la salida del comando en tiempo real en la ventana abierta de revisión rápida.

Comstack y ejecuta un solo archivo

La comstackción de un solo archivo con AsyncRun es mucho más simple que el sistema de comstackción de Sublime Text. Podemos configurar F9 para esto:

 noremap   :AsyncRun gcc -Wall -O2 "$(VIM_FILEPATH)" -o "$(VIM_FILEDIR)/$(VIM_FILENOEXT)"  

Las macros en forma de $(..) se expandirán como el nombre real del archivo o directorio, y luego tendremos F5 para ejecutar el ejecutable:

 noremap   :AsyncRun -raw -cwd=$(VIM_FILEDIR) "$(VIM_FILEDIR)/$(VIM_FILENOEXT)"  

La comilla doble se utiliza para manejar nombres de ruta que contienen espacios. La opción -cwd=$(VIM_FILEDIR) significa ejecutar el archivo en el directorio del archivo. El nombre de ruta absoluto $(VIM_FILEDIR)/$(VIM_FILENOEXT) se usa porque linux necesita un prefijo ./ para ejecutar los ejecutables en el directorio actual, pero Windows no. El uso del nombre de ruta absoluto del archivo binario puede manejar este problema de la plataforma de cruce.

Otra opción -raw significa que la salida no se corresponderá con el formato de error de vim, y se mostrará en quickfix como lo que es. Ahora puede comstackr su archivo con F9, verifique los errores de comstackción en la ventana de revisión rápida y presione F5 para ejecutar el binario.

Construir proyectos C / C ++

Independientemente de la herramienta de comstackción que esté utilizando, haga o cree, la creación de proyectos significa actuar en un grupo de archivos. Requiere ubicar el directorio raíz del proyecto. AsyncRun utiliza un método simple llamado marcadores de raíz para identificar la raíz del proyecto. La raíz del proyecto se identifica como el directorio de antepasado más cercano del archivo actual que contiene uno de estos directorios o archivos:

 let g:asyncrun_rootmarks = ['.svn', '.git', '.root', '_darcs'] 

Si ninguno de los directorios principales contiene estos marcadores de raíz, el directorio del archivo actual se utiliza como la raíz del proyecto. Esto nos permite usar o $(VIM_ROOT) para representar la raíz del proyecto. y F7 se puede configurar para construir el proyecto actual:

 noremap   :AsyncRun -cwd= make  

¿Qué pasa si su proyecto actual no está en ningún repository git o subversion? ¿Cómo saber dónde está mi raíz de proyecto? La solución es muy simple, simplemente coloque un archivo .root vacío en la raíz de su proyecto, se ubicará fácilmente.

Continuemos, configura F8 para ejecutar el proyecto actual:

 noremap   :AsyncRun -cwd= -raw make run  

El proyecto se ejecutará en su directorio raíz. Por supuesto, necesita definir la regla de ejecución en su propio makefile. luego reasignar F6 para probar:

 noremap   :AsyncRun -cwd= -raw make test  

Si está utilizando cmake, F4 se puede asignar para actualizar su Makefile:

 nnoremap   :AsyncRun -cwd= cmake .  

Debido a la implementación de c runtime, si el proceso se está ejecutando en un entorno no tty, todos los datos en la salida estándar se almacenarán en búfer hasta que el proceso salga. Por lo tanto, debe haber un fflush(stdout) después de su statement printf si desea ver la salida en tiempo real. o puede cerrar el buffer stdout al principio por

 setbuf(stdout, NULL); 

Mientras tanto, si está escribiendo código C ++, se puede agregar un std :: endl al final de std :: cout. Puede forzar la descarga del búfer stdout. Si está desarrollando en Windows, AsyncRun puede abrir una nueva ventana cmd para el proceso hijo:

 nnoremap   :AsyncRun -cwd=$(VIM_FILEDIR) -mode=4 "$(VIM_FILEDIR)/$(VIM_FILENOEXT)"  nnoremap   :AsyncRun -cwd= -mode=4 make run  

El uso de la opción -mode=4 en Windows abrirá una nueva ventana de solicitud para ejecutar el comando, al igual que la ejecución de progtwigs de línea de comandos en Visual Studio. Finalmente, tenemos estos mapeos clave a continuación:

  • F4: actualizar Makefile con cmake.
  • F5: ejecutar el archivo único
  • F6: ejecutar proyecto de prueba
  • F7: proyecto de comstackción
  • F8: ejecutar proyecto
  • F9: comstackr el archivo único
  • F10: alternar ventana de quickfix

Es más como un sistema de comstackción en NotePad ++ y GEdit. Si está utilizando cmake en gran medida, puede escribir un script de shell simple ubicado en ~/.vim/script/build.sh para combinar F4 y F7 juntos: actualizará Makefile si CMakeList.txt ha sido cambiado, luego exectute make.

Uso avanzado

También puede definir scripts de shell en su repository de archivos de puntos y ejecutar el script con F3:

 nnoremap  :AsyncRun -cwd= sh /path/to/your/dotfiles/script/build_advanced.sh  

Las siguientes variables de entorno de shell están definidas por AsyncRun:

 $VIM_FILEPATH - File name of current buffer with full path $VIM_FILENAME - File name of current buffer without path $VIM_FILEDIR - Full path of current buffer without the file name $VIM_FILEEXT - File extension of current buffer $VIM_FILENOEXT - File name of current buffer without path and extension $VIM_CWD - Current directory $VIM_RELDIR - File path relativize to current directory $VIM_RELNAME - File name relativize to current directory $VIM_ROOT - Project root directory $VIM_CWORD - Current word under cursor $VIM_CFILE - Current filename under cursor $VIM_GUI - Is running under gui ? $VIM_VERSION - Value of v:version $VIM_COLUMNS - How many columns in vim's screen $VIM_LINES - How many lines in vim's screen $VIM_SVRNAME - Value of v:servername for +clientserver usage 

Todas las variables de entorno anteriores se pueden utilizar en su build_advanced.sh . El uso del archivo de script de shell externo puede hacer un trabajo más complejo que un solo comando.

Símbolos de grep

A veces, si no tiene un entorno de configuración en su caja de Linux remoto, grep es la forma más económica de buscar definiciones de símbolos y referencias entre las fonts. Ahora tendremos F2 para buscar la palabra clave bajo el cursor:

 if has('win32') || has('win64') noremap  :AsyncRun! -cwd= grep -n -s -R  --include='*.h' --include='*.c*' ''  else noremap  :AsyncRun! -cwd= findstr /n /s /C:"" "\%CD\%\*.h" "\%CD\%\*.c*"  endif 

La secuencia de comandos anterior ejecutará grep o findstr en el directorio raíz de su proyecto, y encontrará símbolos solo en los .c , .cpp y .h . Ahora nos movemos alrededor del cursor y presionamos F2, las referencias de los símbolos en el proyecto actual se mostrarán en la ventana de corrección rápida inmediatamente.

Este simple mapa de teclas es suficiente para la mayoría del tiempo. Y puede mejorar este script para admitir más tipos de archivos u otras herramientas grep en su vimrc.

Esa es la forma práctica de crear / ejecutar proyectos C / C ++ en Vim 8 o NeoVim. Al igual que el sistema de comstackción de Sublime Text y el NppExec de NotePad ++.

No más tutoriales vim obsoletos de nuevo, intente algo nuevo.

este es mi mapa realmente funciona puedes actualizarlo a cualquier idioma:

 "  autocmd filetype c nnoremap c :w :!gcc % -o %:r && ./%:r "  autocmd filetype java nnoremap c :w :!javac % :r&& java %:r "  autocmd filetype php nnoremap c :w :!clear && php % 

Ahora, si está en uno de esos archivos en vim, simplemente hágalo en modo normal:

 c