vimrc – Establecer opción solo para un comando

Pregunta:

Estaba buscando una manera de establecer virtualedit=block antes de ejecutar la selección visual de bloque con un enlace adicional g<Cv> y luego apagarlo.

Hay pocas cosas en mi flujo de trabajo que requieran ese comportamiento. No encontré nada después de investigar un poco. Entonces, actualmente tengo esto en mi vimrc.

nnoremap g<C-v> :setl virtualedit=block<CR><C-v>
nnoremap <C-v> :setl virtualedit=<CR><C-v>

Otro ejemplo es deshabilitar incsearch para un comando personalizado

nnoremap <silent> K :setl nois<CR>:grep! "\b<C-R><C-W>\b"<CR>:setl is<CR> 

Entonces, mi pregunta es, ¿existe la forma correcta o simplemente mejor que la que se me ocurrió para configurar la opción solo para un comando y volver a cambiarla después de que el comando haya terminado?

Actualizar Aquí hay un ejemplo de función que puede ayudar con el segundo caso

function! Example()
  let &l:virtualedit="block"
  exe "normal \<C-v>"
  let &l:virtualedit=""
endfunction

Pero de esta manera no funciona para casos como en el primer ejemplo.

Respuesta:

Puede intentar llamar a una función desde sus asignaciones, que guardaría el valor actual de la opción relevante, cambiaría la opción, establecería un autocmd (con eventos como ShellCmdPost / QuickFixCmdPost para grep / vimgrep y CursorMoved / CursorMoved para el bloque visual) y luego ejecute el comando original.

Pero tenga en cuenta que puede haber mejores alternativas que cambiar esas opciones. Por ejemplo, si está creando un mapeo para :grep y desea deshabilitar 'ignorecase' (porque, según tengo entendido, 'incsearch' no afectará este comando) entonces podría agregar \C al principio del patrón y dejar el opción sin cambios.

También hay algunas opciones que se cambian comúnmente durante un flujo de trabajo. Para esos, puede intentar usar un complemento sin problemas :

OPTION TOGGLING                                 unimpaired-toggling

On      Off     Toggle  Option
[ob     ]ob     cob     'background' (dark is off, light is on)
[oc     ]oc     coc     'cursorline'
[od     ]od     cod     'diff' (actually |:diffthis| / |:diffoff|)
[oh     ]oh     coh     'hlsearch' (coh: first |:nohlsearch|, then |'nohlsearch'|)
[oi     ]oi     coi     'ignorecase'
[ol     ]ol     col     'list'
[on     ]on     con     'number'
[or     ]or     cor     'relativenumber'
[os     ]os     cos     'spell'
[ou     ]ou     cou     'cursorcolumn'
[ov     ]ov     cov     'virtualedit'
[ow     ]ow     cow     'wrap'
[ox     ]ox     cox     'cursorline' 'cursorcolumn' (x as in crosshairs)

Editar:

Si está buscando soluciones nativas , debe buscarlas en la documentación incorporada. Hay algunos comandos para algunas opciones, como :noswapfile :

:nos[wapfile]   {command}           *:nos* *:noswapfile*
        Execute {command}. If it contains a command that loads a new
        buffer, it will be loaded without creating a swapfile and the
        'swapfile' option will be reset.  If a buffer already had a
        swapfile it is not removed and 'swapfile' is not reset.

También está :noautocmd , que deshabilita autocmds. Para buscar más, puede probar :help :no<ctrl-d> para enumerar las posibles coincidencias en la documentación que comienza con :no , o use :helpgrep .

Además de la solución alternativa de mapeo + función sugerida anteriormente, puede implementar comandos personalizados para opciones no cubiertas por la funcionalidad incorporada; este enfoque es utilizado por algunos complementos, como ProjectRoot .

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım