Jak wkleić nową linię z vimem?

144

Często muszę wkleić coś do nowej linii w vimie. Zwykle robię to:

o<Esc>p

Który wstawia nowy wiersz i przełącza mnie w tryb wstawiania, potem wychodzi z trybu wstawiania i na koniec wkleja.

Trzy naciśnięcia klawiszy. Niezbyt wydajne. Jakieś lepsze pomysły?

static_rtti
źródło
8
3 naciśnięcia klawiszy nie są wydajne?
gtd
60
1 lub 2 byłoby lepsze :) Po co używać vima, jeśli nie dla maksymalnej wydajności?
static_rtti
2
Powoduje to również dodatkowy znak nowej linii, jeśli skopiowana treść kończy się nowym wierszem.
Jonathan W.
1
@gtd Normalny edytor działa z <Enter> <CV>. Dwa naciśnięcia klawiszy.
user4052054
1
@ user4052054 nie, to nie robi tego samego, o / O działa gdziekolwiek jesteś na linii, w normalnym edytorze musisz najpierw dostać się na początek lub koniec linii. Co więcej, jeśli kopiujesz cały wiersz, całość staje się jednym naciśnięciem klawisza, aby wstawić wiersz, co jest znacznie częstszą propozycją w kodowaniu.
gtd

Odpowiedzi:

71

Wkrótce potem :help pmówi:

:[line]pu[t] [x]    Put the text [from register x] after [line] (default
                    current line).  This always works |linewise|, thus
                    this command can be used to put a yanked block as
                    new lines.

:[line]pu[t]! [x]   Put the text [from register x] before [line]
                    (default current line).

Niestety nie jest krótszy niż twoje obecne rozwiązanie, chyba że połączysz je z jakąś mapą klawiatury, jak zasugerowano w innej odpowiedzi. Na przykład możesz zmapować go na dowolny klawisz (nawet p):

:nmap p :pu<CR>
Bombe
źródło
2
Wiem o tym i używam go, ale nie o to pytam, ponieważ czasami to, co kopiujesz, po prostu nie ma w sobie żadnego LF. Gdyby istniało polecenie „wklej do nowego wiersza”, działałoby niezależnie od treści, którą zamierzasz wkleić, więc nie musiałbyś o tym myśleć.
static_rtti
5
Okay, :pu[t]umieści tekst w nowej linii po bieżącej linii, :pu[t]!umieści tekst w nowej linii przed bieżącą linią. Odpowiednio poprawię odpowiedź. (Brawo za :help p.)
Bombe
2
Niezbyt lepsze niż moje obecne rozwiązanie, ale myślę, że to najlepsza odpowiedź na moje pytanie.
static_rtti
4
Chociaż ta sama liczba naciśnięć klawiszy, wydaje mi się, że jest to bardziej wydajne. o <Esc> p wydaje się niezgrabny, a to nie jest.
Mark Story
2
Możesz :nmap p :pu<CR>
przypisać
55

Opcje:

1) Służy yydo szarpania całej linii (łącznie ze znakiem końca linii). pnastępnie wklei linię w nowej linii po bieżącej i P( Shift-P ) nad bieżącą linią.

2) Utwórz mapowanie: wtedy jest tylko jeden lub dwa klucze:

:nmap ,p o<ESC>p
:nmap <F4> o<ESC>p

3) Wersja funkcji mapowania (naprawdę niepotrzebna, ale tylko dla kompletności):

:nmap <F4> :call append(line('.'), @")<CR>

" This one may be a little better (strip the ending new-line before pasting)
:nmap <F4> :call append(line('.'), substitute(@", '\n$', '', ''))<CR>

:help let-register
:help :call
:help append()
:help line()
:help nmap
DrAl
źródło
2
Cóż, chyba zrobię mapowanie. Miałem tylko nadzieję, że może istnieć standardowe rozwiązanie: - / Dzięki za odpowiedź!
static_rtti
2
@AI: Użycie ', p' (',' jest mapowane jako mój <Leader>) jest moim zdaniem najlepszym rozwiązaniem. Zapewniłeś nawet łatwą w użyciu funkcję. :) Świetny!
Ktoś nadal używa ciebie MS-DOS
30

Możesz wkleić bufor w trybie wstawiania, używając, <C-R>a następnie nazwy bufora do wklejenia. Domyślnym buforem jest ", więc możesz to zrobić

o<C-R>"

Odkryłem, że używam <C-R>"bardzo często i związałem to z <C-F>moim vimrc:

inoremap <C-F> <C-R>"
soulmerge
źródło
2
Jest to świetne, ponieważ zachowuje poprawne wcięcie, jeśli skopiowana linia nie jest wcięta.
CornSmith
24

To nadal wymaga trzech naciśnięć klawiszy, ale wydaje mi się łatwiejsze niż Esc:

o<Alt-p>

Ponieważ jesteś w trybie wstawiania po naciśnięciu o, modyfikator Alt pozwoli ci użyć polecenia tak, jakbyś nie był.

Nacięcie
źródło
2
Całkiem wygodny sposób, gdy próbujesz szarpania, przecinasz wewnątrz linii za pomocą „d $” w nowej linii
Serhat Cevikel
Przepraszamy, ale to nie zachowuje wcięcia, zamiast tego wkleja się na początku wiersza.
Michael Goldshteyn
Czy ktoś może opracować tę metodę dla komputerów Mac (bez alt)?
Li haonan
@Lihaonan Twoje pytanie pochodzi sprzed 8 miesięcy, miejmy nadzieję, że widziałeś już stackoverflow.com/q/7501092/5407634
m_mlvx
12

Korzystanie z tej wtyczki: https://github.com/tpope/vim-unimpaired

]ppasty na linii poniżej

[ppasty na powyższej linii

Zalety:

  • działa na całym szarpanym tekście (słowo, linia, znak itp.)
  • wcina wklejony tekst, aby dopasować wcięcie otaczającego go tekstu
  • 2 naciśnięcia klawiszy zamiast 3 i znacznie „łatwiejsze” naciśnięcia
  • szybki
crogers
źródło
1
Mój ulubiony też. Warto wspomnieć, że musisz tpope/vim-unimpairedto zrobić.
alextes
1
ach, zainstalowałem, że tak dawno o tym zapomniałem. dzięki za przypomnienie!
crogers
9

Osobiście zmapowałem Enter (CR) w ten sposób:

nmap <CR> o<Esc>k

... na podstawie tego artykułu Vim Wikia.

W ten sposób mogę tworzyć znaki nowej linii bezpośrednio z trybu normalnego i łącząc to z chęcią wklejenia do nowej linii poniżej, zrobiłbym:

<CR>jp

Możesz także pominąć k w nmap powyżej, w zależności od tego, jaką funkcjonalność wolisz od Enter , więc tak by było <CR>p.

Zmapowałem również jj do Esc , co również pomogłoby w tym przypadku. Esc jest zbyt daleko od rzędu domowego, jak na to, jak ważne jest w vimie.

Nie krótszy niż inne rozwiązania, ale wydaje mi się, że wydaje się mniej niezgrabny niż niektóre z nich, a także ma inne zastosowania.

miyalys
źródło
5

Jeśli kopiujesz całą linię, a następnie wklejasz całą linię, użyj Yw pierwszej kolejności do szarpania linii lub linii, w tym podziału linii, i pwklejania. Możesz także użyć trybu Vwizualnej linii , w przeciwieństwie do zwykłego vtrybu wizualnego.

Piotr
źródło
3
Problem polega na tym, że czasami po prostu nie chcesz kopiować całej linii ... Chciałbym rozwiązania, które działa niezależnie od tego, czy skopiowałem dziesięć wierszy, czy dwa słowa.
static_rtti
3

Mam mapowanie inoremap jj <ESC>. Więc łatwo wstawić nowy wiersz z ojji Ojja następnie p.

więc ojjpwklej nowy wiersz. ma wtedy jeszcze jeden skok, o<esc>pale ojjpjest to dla mnie łatwe.

Natwar Singh
źródło
2

Znalazłem na to eleganckie rozwiązanie. Jeśli umieszczasz rejestr szarpnięcia w schowku systemu operacyjnego (co i tak jest świetne), z rozszerzeniem

set clipboard+=unnamed

niż możesz zrobić o<Ctl-v>.

Poza tym, że jest mniej pociągnięć, poprawia to w obu przypadkach o<Esc>pi :puponieważ zachowuje wcięcia: obie pozostałe opcje rozpoczynają się od znaku zero w nowej linii.

Uwaga: może to zależeć lub nie od systemu operacyjnego. Wiem tylko, że działa na najnowszej wersji OS X, ale schowek to tylko jeden z wielu sposobów na szarpanie w schowku systemu operacyjnego.

enfascination
źródło
1

Jeśli chcesz również zakończyć w trybie wstawiania, możesz wkleić w trybie wstawiania za pomocą CTRL-R ". https://stackoverflow.com/a/2861909/461834

Wciąż trzy naciśnięcia klawiszy, ale bez ucieczki, i zapisujesz naciśnięcie klawisza, jeśli i tak chcesz zakończyć wstawianie.

jtpereyda
źródło
1

Używam następującego mapowania w mojej konfiguracji Neovim:

nnoremap <leader>p m`o<ESC>p``
nnoremap <leader>P m`O<ESC>p``

Małe wyjaśnienie:

  • m`: ustaw znacznik w aktualnej pozycji kursora.
  • o<Esc>p: utwórz nową linię poniżej i wklej tekst w tej linii
  • O<Esc>P: utwórz nową linię powyżej i wklej tekst w tej linii
  • ``: umieść kursor w pierwotnej pozycji

Zobacz, :h markaby uzyskać więcej informacji o znakach w Vimie.

jdhao
źródło
1

Jeśli chcesz pozostać w trybie wstawiania, możesz to zrobić o ctrl+o p

  • o - tryb wstawiania i przejdź do nowej linii
  • ctrl+o - uruchom pojedyncze polecenie jak w normalnym trybie
  • p - wklej

To trzy naciśnięcia klawiszy, ale pozostajesz w trybie wstawiania, a także o ctrl+ojest dość szybki, więc osobiście traktuję to jako naciśnięcie 2,5 klawisza.

podłącz ponownie
źródło
0

To rozwiązanie wydaje się mieć zastosowanie tylko wtedy, gdy blok skopiowanego tekstu zaczyna się w nowym wierszu (w przeciwieństwie do pobierania fragmentu tekstu gdzieś w wierszu), ale zawsze możesz rozpocząć kopiowanie od ostatniego znaku, który chcesz przechwycić, a następnie nawigować do ostatniego znaku na końcu wiersza przed początkiem żądanego bloku kopiowania. Następnie, gdy chcesz go wkleić, umieść kursor na końcu wiersza, pod którym chcesz wkleić tekst i naciśnij p. Jeśli nie schrzaniłem wyjaśnienia, powinno to zapewnić efekt, którego szukasz.

nieprzerwany królik
źródło