Na przykład :echo strftime(%c)
pokaże aktualny czas na dole, ale jak wstawić ten ciąg czasu do tekstu (zaraz za kursorem)?
Na przykład :echo strftime(%c)
pokaże aktualny czas na dole, ale jak wstawić ten ciąg czasu do tekstu (zaraz za kursorem)?
Odpowiedzi:
Możesz użyć rejestru wyrażeń "=
, z p
(lub P
) w trybie normalnym lub <C-R>
w trybie wstawiania:
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))
:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>
"=
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!
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:
: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ą :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 rodzaju
funct! Exec(command)
redir =>output
silent exec a:command
redir END
return output
endfunct!
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ąć.
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.
set paste
polecenie przed zwróceniem danych wyjściowych i set 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óźniej return output
, ponieważ instrukcja return jest punktem wyjścia z funkcji. Rozwiązałem ten problem jako osobną odpowiedź na tej stronie.
: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ć
:call setline(line('.'), getline(line('.')) . strftime("%c"))
lub
:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))
w zależności od tego, czy chcesz wstawić spację przed datą, czy nie.
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 nopaste
gdziekolwiek.
let @o = output
Składnia ustawia rejestr o
do zawartości zmiennej output
, jak wyjaśniono tutaj: https://stackoverflow.com/a/22738310/1143274
return ''
Linia jest tak, że wartość domyślna zwrot 0
nie zostanie wstawiony do bufora.
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