Wie kann ich vim starten und dann einen bestimmten Befehl, der ein \ enthält, über die Befehlszeile ausführen?

8

In meinem habe ~/.vimrcich einen Befehl, der ungefähr so ​​definiert ist:

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

Es dient zum Erstellen von Notendateien, die das aktuelle Datum im Dateinamen enthalten. Die Tastenkombination soll meinen Cursor in der Befehlszeile belassen, damit ich das Thema der Notiz eingeben und drücken kann Return.

Dies funktioniert von innen heraus gut. Ich versuche jedoch auch, einen Terminalbefehl anzugeben, mit dem ich vim öffnen und diesen Befehl dann auslösen kann. Ich habe es versucht:

vim -c '\n'

(Mein Leader ist auf den Standardwert von eingestellt \, den ich lieber nicht ändern möchte.)

Dies funktioniert jedoch nicht - stattdessen wird bei der Verarbeitung der Befehlszeile nur ein Fehler erkannt: E10: \ sollte gefolgt von / ,? oder & . Ich bin mir nicht sicher, ob dies ein Fehler in vim ist oder ob ich etwas falsch mache. Ich habe auch versucht:

vim -c '<Leader>n'

Dies führt jedoch zu folgenden Fehlern : Fehler bei der Verarbeitung der Befehlszeile: E488: Nachgestellte Zeichen: n Drücken Sie die EINGABETASTE oder geben Sie den Befehl ein, um fortzufahren .

Gibt es eine Möglichkeit, das zu erreichen, was ich will?

Andrew Ferrier
quelle

Antworten:

5

Sie können eine Funktion erstellen, die den neuen Eintrag erstellt, und diese Funktion dann als Teil Ihres Mappings verwenden:

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

Das Mapping kann wie von @Carpetsmoker beschrieben aufgerufen werden:

vim -c 'execute "normal \\t"'
Karl Yngve Lervåg
quelle
Karl, ausgezeichnet, danke! Dies behandelt auch die Eingabe des Namens etwas eleganter, was großartig ist, und alles scheint zu funktionieren, einschließlich des Aufrufs des Mappings.
Andrew Ferrier
Kein Problem, ich bin froh, dass es funktioniert.
Karl Yngve Lervåg
7

-cführt im normalen Modus keine Tastenkombinationen aus; Es führt Befehle aus (was Sie normalerweise tun :). Sie müssen also den executeBefehl verwenden, der zu funktionieren scheint:

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

Wir brauchen das Double, \\weil wir einen Shell-Befehl ausgeben (und nicht möchten, dass die Shell dies als Escape-Sequenz interpretiert).

Getestet mit der Tastenkombination:

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

Ich kann nicht :execute "normal <Leader>t"zur Arbeit kommen; den Wert des Erhaltens mapleader ist auch etwas beteiligt , da Sie eine Fehlermeldung erhalten , wenn Sie nicht eingestellt mapleaderzu alles und verwenden Sie die Standardeinstellung \.

Martin Tournoij
quelle
Ja, dein Test scheint auch für mich zu funktionieren. Aber es funktioniert nicht mit meinem nnoremap-Mapping - ich frage mich, ob das daran liegt, dass ich <expr> in meinem Mapping verwende. Untersuchung ...
Andrew Ferrier
Ich habe versucht, meine Zuordnung zu vereinfachen nnoremap <Leader>x ':new ~/Desktop/x.txt', um den <Ausdruck> zu entfernen. Aber vim -c 'execute "normal \\x"'gibt „Fehler erkannt , während Befehlszeile Verarbeitung: E78: Unbekannt Marke“. Irgendwelche Gedanken warum?
Andrew Ferrier
@AndrewFerrier Ja, ich kann es auch nicht mit Ihrem Mapping zum VimEnterLaufen bringen : - / ... Vielleicht ist eine bessere Lösung für dieses Problem die Verwendung des Autocmd oder eines ähnlichen? ... Ich habe momentan keine Zeit, Nachforschungen anzustellen. Wenn heute Abend niemand anderes eine Antwort findet, werde ich sie prüfen (ich werde diese Antwort für die Zeit belassen), weil dies so scheint eine Art, wenn ich auch etwas haben / benutzen möchte :-)
Martin Tournoij
Keine Sorge, keine Eile. Es ist gerade eine Neugier für mich. Vielen Dank für Ihre bisherigen Hinweise.
Andrew Ferrier
2

Wenn Ihr Ziel darin besteht, Mapleader zu verwenden, und Sie es in Ihrer .vimrc neu definiert haben

lass mapleader = ','

das würde nicht funktionieren. Sie können verwenden

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

stattdessen.

Wenn Sie diese Funktionalität jedoch über die Befehlszeile verwenden möchten, ist es besser, die Funktionalität einer Funktion zu kapseln und direkt aufzurufen.

Albfan
quelle