1 votos

Vim: ¿puedo pasar múltiples argumentos a un comando personalizado sin escribir una función?

He escrito el siguiente comando personalizado en mi archivo .vimrc:

 command! -nargs=+ Sub :%s/<args>/g
 

Me permite sustituir una palabra por otra y se ejecuta así:

 :Sub <word>/<new word>
 

Preferiría escribir comandos con múltiples argumentos, como este:

 :Sub <word> <new word>
 

¿Puedo reescribir el comando para aceptar múltiples argumentos?

Idealmente me gustaría algo como esto:

 command! -nargs=+ Sub :%s/<arg1>/<arg2>/g
 

Gracias de antemano.

1voto

jopa Puntos 800

Hacer el análisis en su propio

Si utilizas :help <q-args>, se obtiene una cadena entre comillas que usted puede split() en los dos separados por espacios partes:

command! -nargs=+ Sub execute '%substitute/' . split(<q-args>, ' ')[0] . '/' . split(<q-args>, ' ')[1] . '/g'

Podemos evitar el análisis de esta dos veces con un poco de metaprogramación (call()) y printf():

command! -nargs=+ Sub execute call('printf', ['%%substitute/%s/%s/g'] + split(<q-args>, ' '))

Esto funciona, pero el manejo de errores todavía no es buena (si sólo pasar un arg, va a quejarse con E766: Insufficient arguments for printf()). Tendrás más control de extraer el código en un :function.

Vim puede analizar argumentos

Separada :function también permite Vim para hacer el argumento de análisis para que, a través de la :help <f-args>.

command! -nargs=+ Sub call Sub(<f-args>)
function! Sub( ... )
    execute printf('%%substitute/%s/%s/g', a:1, a:2)
endfunction

Con una función, usted puede fácilmente verificar el número correcto de argumentos:

function! Sub( ... )
    if a:0 != 2
        echo "Need two arguments"
        return
    endif
    ...

La desventaja de una función es que los errores (por ejemplo, el patrón no coincide, el buffer no es modificable) causa un multi-línea, hostil mensaje de error. try...catch tendría que ser utilizada para obtener una buena, una sola línea de mensaje de error.

Bonus: Donde a partir de ahí

  • Como usted está ocultando la :s comando (y la utilizan delimitadores) del usuario, creo que no debería ser necesario que los delimitadores deben ser escapado. Uso escape(a:1, '/') en lugar de a:1 / a:2.
  • Con :help :command-range, usted todavía puede defecto, el comando para trabajar en el buffer completo, sino que también permite a pasar otros rangos.

También considere si el comando realmente tira de su peso. Independientemente de los análisis, los espacios en blanco en los argumentos son problemáticos, una desventaja que el original :s no tiene. La única ventaja que veo es que es un poco más fácil de escribir, pero el mismo también se puede conseguir a través de la asignación(s) que pre-llenar la línea de comandos con una incompleta :s comando, y la posición del cursor a la derecha en el medio.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: