¿Cómo puedo iniciar vim y luego ejecutar un comando particular que incluye un \, desde la línea de comando?

8

En mi ~/.vimrc, tengo un comando definido aproximadamente así:

nnoremap <expr> <Leader>n ':new ~/Notes/' . strftime('%F') . '-'

Está diseñado para crear archivos de notas que contienen la fecha actual en el nombre del archivo. La combinación de teclas está diseñada para dejar mi cursor en la línea de comando para que pueda escribir el tema de la nota y presionar Return.

Esto funciona desde dentro de vim bien. Sin embargo, también estoy tratando de especificar un comando de terminal que puedo usar para abrir vim y luego activar este comando. He intentado:

vim -c '\n'

(mi Líder está configurado en el valor predeterminado de \, que preferiría no cambiar)

Sin embargo, esto no funciona; en su lugar, solo se detecta un error al procesar la línea de comando: E10: \ debería ir seguido de /,? o & . No estoy seguro de si esto es un error en vim o si estoy haciendo algo mal. También probé:

vim -c '<Leader>n'

Pero esto da: Error detectado al procesar la línea de comando: E488: Caracteres finales: n Presione ENTER o escriba comando para continuar .

¿Hay alguna manera de lograr lo que quiero?

Andrew Ferrier
fuente

Respuestas:

5

Puede crear una función que cree la nueva entrada y luego usar la función como parte de su mapeo:

nnoremap <leader>t :call NewEntry()<cr>
function! NewEntry()
  let title = expand('~/Notes/') . strftime('%F') . '-' . input("Title: ")
  execute 'edit ' . title
endfunction

La asignación se puede invocar como lo describe @Carpetsmoker:

vim -c 'execute "normal \\t"'
Karl Yngve Lervåg
fuente
Karl, excelente, gracias! Esto también maneja la entrada del nombre un poco más elegante también, lo cual es genial, y todo parece funcionar, incluida la llamada del mapeo.
Andrew Ferrier
No hay problema, estoy feliz de que funcione.
Karl Yngve Lervåg
7

-cno ejecuta combinaciones de teclas en modo normal; ejecuta comandos (lo que normalmente haces con :). Por lo tanto, debe usar el executecomando, que parece funcionar:

$ vim -c 'execute "normal \\t"'

Necesitamos el doble \\porque estamos emitiendo un comando de shell (y no queremos que el shell interprete esto como una secuencia de escape).

Probado con la combinación de teclas:

nnoremap <Leader>t :echo "TEST!"<CR>

No puedo ir :execute "normal <Leader>t"a trabajar; obtener el valor de mapleader también es un poco más complicado, ya que obtiene un error si no configuró mapleadernada y utiliza el valor predeterminado de \.

Martin Tournoij
fuente
Sí, tu prueba también parece funcionar para mí. Pero no funciona con mi mapeo de nnoremap: me pregunto si eso es porque estoy usando <expr> en mi mapeo. Investigando ...
Andrew Ferrier
Intenté simplificar mi mapeo nnoremap <Leader>x ':new ~/Desktop/x.txt'para eliminar el <expr>. Pero vim -c 'execute "normal \\x"'da "Error detectado al procesar la línea de comando: E78: Marca desconocida". ¿Alguna idea de por qué?
Andrew Ferrier
@AndrewFerrier Sí, tampoco puedo hacer que funcione con su mapeo: - / ... ¿Quizás una mejor solución para este problema es usar el VimEnterautocmd o algo así? ... No tengo tiempo para investigar en este momento, si a nadie más se le ocurre una respuesta esta tarde, lo investigaré (dejaré esta respuesta por el momento), porque esto parece una especie de cosa que me gustaría tener / usar también :-)
Martin Tournoij
sin preocupaciones, sin prisas. Es solo una curiosidad para mí en este momento. Gracias por tus consejos hasta ahora.
Andrew Ferrier
2

Si su objetivo es usar mapleader y lo ha redefinido en su .vimrc

let mapleader = ','

Eso no funcionaría. Puedes usar

$ vim -c 'execute "normal ".get(g:,"mapleader","\\")."t"'

en lugar.

pero si planea usar esa funcionalidad desde la línea de comandos, es mejor encapsular la funcionalidad en una función y llamarla directamente.

albfan
fuente