mit vim, wenn ich benutze
:r!date
Geben Sie das Datum in die nächste Zeile ein, ähnlich wie bei
:r!pwd
Wie kann ich den Ausgabebefehl unter Cursorposition und nein in eine neue Zeile einfügen?
mit vim, wenn ich benutze
:r!date
Geben Sie das Datum in die nächste Zeile ein, ähnlich wie bei
:r!pwd
Wie kann ich den Ausgabebefehl unter Cursorposition und nein in eine neue Zeile einfügen?
Antworten:
Mit " :read
" fügt Vim die Ausgabe immer in eine neue Zeile ein. Die Lösung ist leider nicht einfach.
Sie können die Ausgabe eines Befehls an der aktuellen Cursorposition einfügen, wenn Sie sich im Einfügemodus befinden, indem Sie drücken und ControlRdann eingeben =system('command')
Enter. Wenn die Ausgabe des Befehls (wie die meisten) eine nachgestellte neue Zeile enthält, die ebenfalls eingefügt wird, wird Ihre Zeile leider unterbrochen.
substitute()
Dies kann durch Hinzufügen eines Aufrufs zum Entfernen von Zeilenumbrüchen behoben werden. Dies macht den Befehl jedoch schwieriger, als es sich lohnt, ihn manuell einzugeben.
Die ultimative Lösung besteht darin, eine Art Mapping zu erstellen, das jedoch noch komplexer wird, da Vim mit dem, was es "Typ Ahead" nennt, umgeht. während Sie etwas tun können wie:
:nmap \e i<c-r>=substitute(system('date'),'[\r\n]*$','','')<cr><esc>
Wenn der Befehl im Mapping "fest verdrahtet" ist, können Sie Folgendes nicht tun:
:nmap \e i<c-r>=substitute(system(input('Command: ')),'[\r\n]*$','','')<cr><esc>
Wo Sie versuchen, den Benutzer zur Ausführung des Befehls aufzufordern, da Vim nur verwirrt wird, piept und in den Einfügemodus wechselt.
Sie müssen den Befehl also zuerst ausführen lassen, ihn in einer Variablen speichern und dann die verarbeitete Ausgabe einfügen. Zu diesem Zeitpunkt wird wahrscheinlich eine Hilfsfunktion benötigt, um zu verhindern, dass das Mapping selbst unhandlich wird. Daher ergibt sich Folgendes:
function InlineCommand()
let l:cmd = input('Command: ')
let l:output = system(l:cmd)
let l:output = substitute(l:output, '[\r\n]*$', '', '')
execute 'normal i' . l:output
endfunction
nmap <silent> \e :call InlineCommand()<CR>
Beachten Sie, dass nmap
Zuordnungen erstellt werden, die nur ausgeführt werden, wenn sie im normalen Modus eingegeben werden.
Übrigens, wenn Sie nur das Datum oder das aktuelle Arbeitsverzeichnis einfügen möchten, ist die erste Antwort, die ich gegeben habe, machbar. Geben Sie einfach den Einfügemodus ein und geben Sie ControlR=strftime('%c')
Enteroder ein ControlR=getcwd()
Enter.
Wenn Sie es in der aktuellen Zeile wollen, versuchen Sie es einfach, aber beachten Sie, dass der alte Inhalt der Zeile gelöscht wird:
:.!date
Wenn Sie die genaue Cursorposition wünschen, können Sie:
:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b
Lange Rede kurzer Sinn: Sie müssen ersetzen, weil Sie ^ @ (Nullzeichen) entfernen möchten, die Sie auch durch .s / \% x00 // g ersetzen können. Dies ist eine kürzere Version mit weniger Rohren:
:exec 'normal i'.substitute(system("date"),"[\n]*$","","")
Sie können auch Tags festlegen, wenn Sie an verschiedenen Punkten in derselben Zeile ersetzen möchten:
In Anbetracht dieser Zeile 1:
1 Date: <datehere> and also <datehere>
Ausführen:
:let a=system("date") | exec ".s/<datehere>/".a."/g" | .s/\%x00//g
Nach ersatz:
1 Date: jue ago 9 02:34:52 ART 2012 and also jue ago 9 02:34:52 ART 2012
Getestet auf Vim 7.2
Sie können diese Art von Dingen in Ihre .vimrc hinzufügen:
" Insert the date in YYYY-MM-DD format inline just before cursor position (normal mode)
nnoremap <Leader>di me:r !date +\%F<CR>A <Esc>0D`ePJx
me
markiert die aktuelle Position.:r !date +\%F<CR>
Setzt das Datum in die nächste Zeile im Format JJJJ-MM-TT (Sie können dies nach Belieben ändern, indem Sie jeweils %
mit die Esc-Taste drücken \
).A <Esc>
Fügt ein Leerzeichen an das Ende der Datumsausgabe an.0D
löscht das Datum, `e
bringt Sie zurück zu der markierten Position und PJx
setzt das Datum vor den Cursor, verbindet die Zeilen (um die leere Zeile darunter zu entfernen) und beendet das nachfolgende Leerzeichen. Ändern Sie die Zuordnung nach Bedarf.Wenn Sie es aus dem Einfügemodus heraus tun möchten, habe ich dieses Juwel heute auf https://vimways.org/2018/the-mapping-business/ gelesen.
inoremap <C-g><C-t> <C-r>=strftime("%F")<CR>
Sie können die Datumsausgabe an Ihre Bedürfnisse anpassen ( man date
kann dabei helfen).
Im normalen Modus (Escape- / Piep-Modus) einfügen
:exec 'normal i'.system("date \| tr '\n' ' '")
um das Datum an der aktuellen Position einzufügen. Wenn Sie diese Zeile mit einem Wagenrücklauf kopieren, wird Umschalt + Einfügen zu Ihrem DateTime-Here-Befehl.
Zusätzlich können Sie mit F12 an einen Befehl binden
:inoremap <F12> <C-r>=system("date \| tr '\n' ' '")<CR>
Dann können Sie das Datum mit der Funktionstaste 12 einfügen, während der Einfügemodus aktiv ist. ich benutze
:inoremap DHRE <C-r>=system("date \| tr '\n' ' '")<CR>
(Ich habe von DHERE gewechselt, nachdem ich festgestellt hatte, dass das Einfügen von ADHERE ausgelöst wurde), weil ich F12 bereits für andere Dinge verwende.
ich benutze
grep -iE "dhere" /usr/share/dict/words
um nach offensichtlichen Kollisionen mit vorhandenen Wörtern zu suchen, die darauf hindeuten, dass Sie relativ sicher sind:
:inoremap PWD <C-r>=system("pwd \| tr '\n' ' '")<CR>
(es sei denn, Sie schreiben eine bestimmte Dokumentation.)