W trybie normalnym: ( <C-M>tutaj oznacza Control+ Mlub po prostu naciśnij Enter/ Return)
"=strftime('%c')<C-M>p
W trybie wstawiania: ( <C-M>ma takie samo znaczenie jak powyżej, <C-R>oznacza Control+ R)
<C-R>=strftime('%c')<C-M>
Jeśli chcesz wstawić wynik tego samego wyrażenia wiele razy, możesz chcieć zamapować je na klucze w swoim .vimrc: (tutaj <C-M>i <C-R>należy wpisać dosłownie (ciąg pięciu znaków do wydrukowania - Vim przetłumaczy je wewnętrznie))
aby uzyskać wartość zmiennej vim (na przykład opcje sesji): <C-R>=&sessionoptions- wykonuje nawet tabulację wildmode!
Justin M. Keyes
2
: put = strftime ('% c') <CM>
brunch875,
W trybie wstawiania użycie polecenia <c-r>=jest powolne dla polecenia, które może mieć dużo danych wyjściowych, a także może przerwać wcięcie, tak że tekst wyjściowy jest nieczytelny. Na przykład <c-r>=execute('nmap')dane wyjściowe będą zapisywane wiersz po wierszu, co jest bardzo wolne.
datejest poleceniem zewnętrznym i !wywołuje polecenia zewnętrzne, podczas gdy OP prosi o polecenia vim.
Eelvex
@eelvex nie, nie zrobił tego. i! jest poleceniem vim i vi. To jest metoda kanoniczna. Działa również w wielu innych sprawach.
Keith
5
@Keith: yes !to polecenie vi (m), które wywołuje polecenia zewnętrzne . Możesz mieć rację, że OP nie chce wypisywać tylko poleceń vima, ale jeśli tak zrobi, !nie zrobi tego.
Eelvex
11
Te polecenia wstawią wynik w strftime("%c")miejscu, w którym znajduje się kursor:
:exe ":normal i" . strftime("%c")
i
:call feedkeys("i". strftime("%c"))
Istnieją inne sposoby robienia tego, co chcesz (na przykład te z odpowiedzią Mikela ).
Edycja : Jeszcze lepiej, aby wstawić w miejscu, użyj =rejestru, jak opisuje Chris Johnsen
Jeśli chcesz wstawić wynik polecenia vim (w przeciwieństwie do zwracanej wartości wywołania funkcji ), musisz go przechwycić. Odbywa się to za pomocą :redirpolecenia, które pozwala przekierować odpowiednik standardowego wyjścia vima do zmiennej, pliku, rejestru lub innego celu.
:redirjest nieco boleśnie niewygodny w użyciu; Chciałbym napisać funkcję, aby hermetyzować jej funkcjonalność w bardziej wygodny sposób, coś w rodzaju
Po zadeklarowaniu takiej funkcji można użyć rejestru wyrażeń (jak wyjaśnił Chris Johnsen), aby wstawić wynik polecenia w pozycji kursora. Tak więc, z trybu normalnego, naciśnij, i^R=Exec('ls')aby wstawić listę bieżących buforów vima.
Pamiętaj, że polecenie zostanie wykonane w przestrzeni nazw funkcji, więc jeśli używasz zmiennej globalnej, będziesz musiał jawnie ją nazwać, poprzedzając ją znakiem g:. Zauważ również, że Exec(), jak napisano powyżej, dołącza kończącą linię nowego wiersza nawet do wyjścia jednowierszowego. Możesz chcieć dodać wywołanie do substitute()funkcji, aby tego uniknąć.
To działa świetnie. Dodałem set pastepolecenie przed zwróceniem danych wyjściowych i set nopastepo, aby uniknąć wcięcia na klatce schodowej, gdy linie zaczynają się spacjami. Właściwie chciałem zapisać wartość bieżącej opcji wklejania i ją zwrócić, ale nie byłem w stanie tego zrobić.
Juan Lanus,
1
@JuanLanus Nie set nopastepowinno działać później return output, ponieważ instrukcja return jest punktem wyjścia z funkcji. Rozwiązałem ten problem jako osobną odpowiedź na tej stronie.
Jewgienij Siergiejew
4
:call append(line('.'), strftime("%c"))
Umieści go w następnym wierszu, a następnie możesz nacisnąć J( Shift+ J), aby dołączyć go do bieżącej pozycji.
Lub jeśli potrzebujesz tego wszystkiego w jednym poleceniu, możesz to zrobić
Poprawiona @intuitowana odpowiedź, aby uniknąć problemu z wiodącymi białymi znakami i rosnącym wcięciem:
"Examples:
":call Exec('buffers')
"This will include the output of :buffers into the current buffer.
"
"Also try:
":call Exec('ls')
":call Exec('autocmd')
"
funct! Exec(command)
redir =>output
silent exec a:command
redir END
let @o = output
execute "put o"
return ''
endfunct!
To po prostu wstawi w bieżącej lokalizacji do pliku, gdy przejdziesz :call Exec('command')z trybu normalnego. Jak zauważono w komentarzu , oryginalne =Exec('command')podejście Ctrl + R ( Exec(..)zwracanie ciągu) z zwracaniem łańcucha można częściowo poprawić za pomocą set paste, ale nie oferuje możliwości umieszczenia set nopastegdziekolwiek.
Tak to robię. Umieszcza go zaraz za kursorem, ponieważ używa p.
" save previous yank
let reg_save = @@
" save your text to the '@' register
let @@ = strftime('%c')
" paste it after the cursor
exec "normal! p"
" restore previous yank
let @@ = reg_save
Odpowiedzi:
Możesz użyć rejestru wyrażeń
"=
, zp
(lubP
) w trybie normalnym lub<C-R>
w trybie wstawiania:W trybie normalnym:
(
<C-M>
tutaj oznacza Control+ Mlub po prostu naciśnij Enter/ Return)W trybie wstawiania:
(
<C-M>
ma takie samo znaczenie jak powyżej,<C-R>
oznacza Control+ R)Jeśli chcesz wstawić wynik tego samego wyrażenia wiele razy, możesz chcieć zamapować je na klucze w swoim
.vimrc
:(tutaj
<C-M>
i<C-R>
należy wpisać dosłownie (ciąg pięciu znaków do wydrukowania - Vim przetłumaczy je wewnętrznie))źródło
"=
Rejestr. : - /<C-R>=&sessionoptions
- wykonuje nawet tabulację wildmode!<c-r>=
jest powolne dla polecenia, które może mieć dużo danych wyjściowych, a także może przerwać wcięcie, tak że tekst wyjściowy jest nieczytelny. Na przykład<c-r>=execute('nmap')
dane wyjściowe będą zapisywane wiersz po wierszu, co jest bardzo wolne.:r!date +\%c
widzieć
:help :r!
źródło
date
jest poleceniem zewnętrznym i!
wywołuje polecenia zewnętrzne, podczas gdy OP prosi o polecenia vim.!
to polecenie vi (m), które wywołuje polecenia zewnętrzne . Możesz mieć rację, że OP nie chce wypisywać tylko poleceń vima, ale jeśli tak zrobi,!
nie zrobi tego.Te polecenia wstawią wynik w
strftime("%c")
miejscu, w którym znajduje się kursor:i
Istnieją inne sposoby robienia tego, co chcesz (na przykład te z odpowiedzią Mikela ).
Edycja : Jeszcze lepiej, aby wstawić w miejscu, użyj
=
rejestru, jak opisuje Chris Johnsenźródło
Jeśli chcesz wstawić wynik polecenia vim (w przeciwieństwie do zwracanej wartości wywołania funkcji ), musisz go przechwycić. Odbywa się to za pomocą
:redir
polecenia, które pozwala przekierować odpowiednik standardowego wyjścia vima do zmiennej, pliku, rejestru lub innego celu.:redir
jest nieco boleśnie niewygodny w użyciu; Chciałbym napisać funkcję, aby hermetyzować jej funkcjonalność w bardziej wygodny sposób, coś w rodzajuPo zadeklarowaniu takiej funkcji można użyć rejestru wyrażeń (jak wyjaśnił Chris Johnsen), aby wstawić wynik polecenia w pozycji kursora. Tak więc, z trybu normalnego, naciśnij,
i^R=Exec('ls')
aby wstawić listę bieżących buforów vima.Pamiętaj, że polecenie zostanie wykonane w przestrzeni nazw funkcji, więc jeśli używasz zmiennej globalnej, będziesz musiał jawnie ją nazwać, poprzedzając ją znakiem
g:
. Zauważ również, żeExec()
, jak napisano powyżej, dołącza kończącą linię nowego wiersza nawet do wyjścia jednowierszowego. Możesz chcieć dodać wywołanie dosubstitute()
funkcji, aby tego uniknąć.Zobacz także https://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054, aby uzyskać więcej informacji na temat blatowania
redir
i link do powiązane polecenie.źródło
set paste
polecenie przed zwróceniem danych wyjściowych iset nopaste
po, aby uniknąć wcięcia na klatce schodowej, gdy linie zaczynają się spacjami. Właściwie chciałem zapisać wartość bieżącej opcji wklejania i ją zwrócić, ale nie byłem w stanie tego zrobić.set nopaste
powinno działać późniejreturn output
, ponieważ instrukcja return jest punktem wyjścia z funkcji. Rozwiązałem ten problem jako osobną odpowiedź na tej stronie.Umieści go w następnym wierszu, a następnie możesz nacisnąć
J
( Shift+ J), aby dołączyć go do bieżącej pozycji.Lub jeśli potrzebujesz tego wszystkiego w jednym poleceniu, możesz to zrobić
lub
w zależności od tego, czy chcesz wstawić spację przed datą, czy nie.
źródło
Poprawiona @intuitowana odpowiedź, aby uniknąć problemu z wiodącymi białymi znakami i rosnącym wcięciem:
To po prostu wstawi w bieżącej lokalizacji do pliku, gdy przejdziesz
:call Exec('command')
z trybu normalnego. Jak zauważono w komentarzu , oryginalne=Exec('command')
podejście Ctrl + R (Exec(..)
zwracanie ciągu) z zwracaniem łańcucha można częściowo poprawić za pomocąset paste
, ale nie oferuje możliwości umieszczeniaset nopaste
gdziekolwiek.let @o = output
Składnia ustawia rejestro
do zawartości zmiennejoutput
, jak wyjaśniono tutaj: https://stackoverflow.com/a/22738310/1143274return ''
Linia jest tak, że wartość domyślna zwrot0
nie zostanie wstawiony do bufora.źródło
Tak to robię. Umieszcza go zaraz za kursorem, ponieważ używa
p
.źródło