Come posso avviare vim e quindi eseguire un particolare comando che include un \ dalla riga di comando?


8

Nel mio ~/.vimrc, ho un comando definito approssimativamente in questo modo:

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

È progettato per la creazione di file di note che contengono la data corrente nel nome file. Il keybinding è progettato per lasciare il mio cursore sulla riga di comando in modo da poter digitare l'argomento della nota e premere Return.

Funziona dall'interno di Vim Fine. Tuttavia, sto anche cercando di specificare un comando terminale che posso usare per aprire vim e quindi lanciare questo comando. Ho provato:

vim -c '\n'

(il mio Leader è impostato sul valore predefinito di \, che preferirei non cambiare)

Tuttavia, questo non funziona, invece viene visualizzato l' errore durante l'elaborazione della riga di comando: E10: \ dovrebbe essere seguito da /,? o & . Non sono sicuro se questo è un bug in vim o se sto facendo qualcosa di sbagliato. Ho anche provato:

vim -c '<Leader>n'

Ma questo dà: Errore rilevato durante l'elaborazione della riga di comando: E488: Caratteri finali: n Premere INVIO o digitare comando per continuare .

C'è un modo per ottenere ciò che voglio?

Risposte:


5

È possibile creare una funzione che crei la nuova voce e quindi utilizzare la funzione come parte della mappatura:

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

La mappatura può essere chiamata come descritto da @Carpetsmoker:

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

Karl, eccellente, grazie! Questo gestisce anche l'inserimento del nome in modo un po 'più elegante, il che è fantastico, e tutto sembra funzionare, inclusa la chiamata della mappatura.
Andrew Ferrier,

Nessun problema, sono felice che funzioni.
Karl Yngve Lervåg,

7

-cnon esegue le combinazioni di tasti in modalità normale; esegue i comandi (quello che fai normalmente :). Quindi è necessario utilizzare il executecomando, che sembra funzionare:

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

Abbiamo bisogno del doppio \\perché stiamo emettendo un comando shell (e non vogliamo che la shell lo interpreti come una sequenza di escape).

Testato con il keybind:

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

Non riesco :execute "normal <Leader>t"a lavorare; ottenere il valore di mapleader è anche leggermente più coinvolto poiché si ottiene un errore se non si è impostato mapleadersu nulla e si utilizza l'impostazione predefinita di \.


Sì, il tuo test sembra funzionare anche per me. Ma non funziona con la mia mappatura nnoremap - mi chiedo se è perché sto usando <espr> nella mia mappatura. Indagare ...
Andrew Ferrier,

Ho provato a semplificare il mio mapping nnoremap <Leader>x ':new ~/Desktop/x.txt'per rimuovere <expr>. Ma vim -c 'execute "normal \\x"'fornisce "Errore rilevato durante l'elaborazione della riga di comando: E78: segno sconosciuto". Qualche idea sul perché?
Andrew Ferrier,

@AndrewFerrier Sì, non riesco nemmeno a farlo funzionare con la tua mappatura: - / ... Forse una soluzione migliore per questo problema è usare VimEnterautocmd o qualcosa del genere? ... Non ho tempo di indagare in questo momento, se nessun altro arriva una risposta stasera, esaminerò (lascerò questa risposta per il momento), perché sembra che una specie di cosa che vorrei avere / usare
anch'io

nessuna preoccupazione, nessuna fretta. È solo una curiosità per me in questo momento. Grazie per i tuoi suggerimenti finora.
Andrew Ferrier,

2

Se il tuo obiettivo è usare mapleader e lo hai ridefinito nel tuo .vimrc

let mapleader = ','

non funzionerebbe. Puoi usare

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

anziché.

ma se prevedi di utilizzare quella funzionalità dalla riga di comando, è meglio incapsulare la funzionalità su una funzione e chiamarla direttamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.