Comment puis-je démarrer vim puis exécuter une commande particulière qui inclut un \, à partir de la ligne de commande?

8

Dans mon ~/.vimrc, j'ai une commande définie à peu près comme ceci:

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

Il est conçu pour créer des fichiers de notes contenant la date actuelle dans le nom de fichier. La liaison de touches est conçue pour laisser mon curseur sur la ligne de commande afin que je puisse taper le sujet de la note et appuyer sur Return.

Cela fonctionne de l'intérieur de vim fine. Cependant, j'essaie également de spécifier une commande de terminal que je peux utiliser pour ouvrir vim, puis déclencher cette commande. J'ai essayé:

vim -c '\n'

(mon Leader est réglé sur la valeur par défaut de \, que je préférerais ne pas modifier)

Cependant, cela ne fonctionne pas - au lieu de cela, je reçois juste une erreur détectée lors du traitement de la ligne de commande: E10: \ devrait être suivi de /,? ou & . Je ne sais pas si c'est un bug dans vim ou si je fais quelque chose de mal. J'ai aussi essayé:

vim -c '<Leader>n'

Mais cela donne: Erreur détectée lors du traitement de la ligne de commande: E488: Caractères de fin: n Appuyez sur ENTRÉE ou tapez commande pour continuer .

Existe-t-il un moyen de réaliser ce que je veux?

Andrew Ferrier
la source

Réponses:

5

Vous pouvez créer une fonction qui crée la nouvelle entrée, puis utiliser la fonction dans le cadre de votre mappage:

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

Le mappage peut être appelé comme décrit par @Carpetsmoker:

vim -c 'execute "normal \\t"'
Karl Yngve Lervåg
la source
Karl, excellent, merci! Cela gère également la saisie du nom un peu plus élégamment, ce qui est génial, et tout semble fonctionner, y compris l'appel du mappage.
Andrew Ferrier
Pas de problème, je suis content que ça marche.
Karl Yngve Lervåg
7

-cn'exécute pas les raccourcis clavier en mode normal; il exécute des commandes (ce que vous faites normalement avec :). Vous devez donc utiliser la executecommande, qui semble fonctionner:

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

Nous avons besoin du double \\parce que nous émettons une commande shell (et ne voulons pas que le shell l'interprète comme une séquence d'échappement).

Testé avec le raccourci clavier:

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

Je ne peux pas aller :execute "normal <Leader>t"travailler; obtenir la valeur de mapleader est également un peu plus compliqué car vous obtenez une erreur si vous ne définissez mapleaderrien et utilisez la valeur par défaut de \.

Martin Tournoij
la source
Oui, votre test semble également fonctionner pour moi. Mais cela ne fonctionne pas avec mon mappage nnoremap - je me demande si c'est parce que j'utilise <expr> dans mon mappage. Enquête ...
Andrew Ferrier
J'ai essayé de simplifier mon mappage nnoremap <Leader>x ':new ~/Desktop/x.txt'pour supprimer le <expr>. Mais vim -c 'execute "normal \\x"'donne "Erreur détectée lors du traitement de la ligne de commande: E78: Marque inconnue". Des pensées pourquoi?
Andrew Ferrier
@AndrewFerrier Oui, je ne peux pas non plus le faire fonctionner avec votre mappage: - / ... Peut-être qu'une meilleure solution à ce problème est d'utiliser l' VimEnterautocmd ou quelque chose comme ça? ... Je n'ai pas le temps d'enquêter en ce moment, si personne d'autre ne trouve une réponse ce soir, je vais y réfléchir (je laisserai cette réponse pour le moment), car cela semble une sorte si quelque chose que je voudrais avoir / utiliser aussi :-)
Martin Tournoij
pas de soucis, pas de précipitation. C'est juste une curiosité pour moi en ce moment. Merci pour vos conseils jusqu'à présent.
Andrew Ferrier
2

Si votre objectif est d'utiliser mapleader et que vous l'avez redéfini dans votre .vimrc

laissez mapleader = ','

ça ne marcherait pas. Vous pouvez utiliser

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

au lieu.

mais si vous prévoyez d'utiliser cette fonctionnalité à partir de la ligne de commande, il est préférable d'encapsuler la fonctionnalité sur une fonction et de l'appeler directement.

albfan
la source