vim r! in Cursorposition

17

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?

Juan Pablo
quelle

Antworten:

16

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 nmapZuordnungen 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.

Heptit
quelle
Wäre es möglich, Befehle zu verketten, um dies zu lösen. : r! date | : - | J oder i \ n \ n ^ [-:.! Date \ n -JJ
Alexx Roche
4

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

Crisboot
quelle
1

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.
  • 0Dlöscht das Datum, `ebringt Sie zurück zu der markierten Position und PJxsetzt 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 datekann dabei helfen).

Tristan Chase
quelle
0

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.)

Alexx Roche
quelle