Wie füge ich mit vim eine neue Zeile ein?

143

Ich muss oft ein paar Sachen in eine neue Zeile in vim einfügen. Was ich normalerweise mache ist:

o<Esc>p

Was eine neue Zeile einfügt und mich in den Einfügemodus versetzt, dann den Einfügemodus beendet und schließlich einfügt.

Drei Tastenanschläge. Nicht sehr effizient. Irgendwelche besseren Ideen?

static_rtti
quelle
7
3 Tastenanschläge sind nicht effizient?
GTD
59
1 oder 2 wäre besser :) Warum vim verwenden, wenn nicht für maximale Effizienz?
static_rtti
2
Es ergibt sich auch eine zusätzliche neue Zeile, wenn der kopierte Inhalt in einer neuen Zeile endet.
Jonathan W.
1
@gtd Ein normaler Editor arbeitet mit <Eingabe> <CV>. Zwei Tastenanschläge.
user4052054
1
@ user4052054 nein, das macht nicht das gleiche, o / o funktioniert wo immer du in der Zeile bist, in einem normalen Editor musst du zuerst zum Anfang oder Ende der Zeile kommen. Wenn Sie eine ganze Zeile kopieren, wird das Ganze nur zu einem Tastendruck, um eine Zeile einzufügen, was beim Codieren viel häufiger vorkommt.
GTD

Antworten:

70

Kurz darauf :help pheißt es:

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

Leider ist es nicht kürzer als Ihre aktuelle Lösung, es sei denn, Sie haben es mit einer Tastaturzuordnung kombiniert, wie in einer anderen Antwort vorgeschlagen. Sie können es beispielsweise einem beliebigen Schlüssel (gerade p) zuordnen :

:nmap p :pu<CR>
Bombe
quelle
2
Ich weiß das und benutze es, aber es ist nicht das, was ich frage, denn manchmal enthält das, was Sie kopieren, einfach keinen LF. Wenn es einen Befehl zum Einfügen in eine neue Zeile gäbe, würde er unabhängig vom Inhalt, den Sie einfügen möchten, funktionieren, sodass Sie nicht darüber nachdenken müssten.
static_rtti
4
Okay, :pu[t]wird der Text in eine neue Zeile nach der aktuellen Zeile eingefügt, :pu[t]!wird der Text in eine neue Zeile vor der aktuellen Zeile eingefügt. Ich werde meine Antwort entsprechend bearbeiten. (Hurra für :help p.)
Bombe
2
Nicht wirklich besser als meine aktuelle Lösung, aber ich denke, es ist die beste Antwort auf meine Frage.
static_rtti
4
Bei gleicher Anzahl von Tastenanschlägen denke ich, dass sich dies effizienter anfühlt. o <Esc> p fühlt sich klobig an, während dies nicht der Fall ist.
Mark Story
1
Sie können den Befehl jedem Schlüssel :nmap p :pu<CR>zuordnen , einschließlich p selbst: Legen Sie ihn in Ihre .vimrc-Datei und los geht's :)
Capi Etheriel
54

Optionen:

1) Verwenden Sie yydiese Option, um die gesamte Zeile (einschließlich des Zeilenendezeichens) zu ziehen. pfügt dann die Zeile in eine neue Zeile nach der aktuellen ein und P( Shift- P) wird über der aktuellen Zeile eingefügt.

2) Machen Sie eine Zuordnung: dann sind es nur ein oder zwei Schlüssel:

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

3) Die Funktionsversion des Mappings (eigentlich unnötig, aber nur der Vollständigkeit halber):

: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
quelle
2
Nun, ich denke ich werde ein Mapping machen. Ich hatte nur gehofft, dass es eine Standardlösung geben könnte: - / Danke für Ihre Antwort!
static_rtti
2
@AI: Die Verwendung von ', p' (',' wird als mein <Leader> zugeordnet) ist meiner Meinung nach die beste Lösung. Sie haben sogar eine benutzerfreundliche Funktion bereitgestellt. :) Toll!
Jemand benutzt Sie immer noch MS-DOS
29

Sie können einen Puffer im Einfügemodus einfügen, <C-R>indem Sie den Namen des einzufügenden Puffers gefolgt vom Namen des Puffers verwenden. Der Standardpuffer ist ", also würden Sie es tun

o<C-R>"

Ich fand, dass ich <C-R>"sehr oft benutze und band das <C-F>in meinem vimrc:

inoremap <C-F> <C-R>"
Soulmerge
quelle
2
Dies ist großartig, da die Einrückung korrekt bleibt, wenn die kopierte Zeile nicht eingerückt wurde.
CornSmith
23

Dies verwendet immer noch drei Tastenanschläge, aber ich finde es einfacher als Esc:

o<Alt-p>

Da Sie sich nach dem Drücken von o im Einfügemodus befinden, können Sie mit dem Alt-Modifikator einen Befehl verwenden, als ob Sie es nicht wären.

Nick
quelle
2
Sehr praktisch, wenn Sie versuchen, den Ruck in die Zeile mit "d $" in einer neuen Zeile zu
schneiden
Entschuldigung, aber dies behält den Einzug nicht bei, sondern wird stattdessen am Anfang der Zeile eingefügt.
Michael Goldshteyn
Kann jemand diese Methode für Mac (no alt) ausarbeiten?
Li Haonan
12

Verwenden dieses Plugins: https://github.com/tpope/vim-unimpaired

]pPasten in der Zeile darunter

[pPasten auf der Linie oben

Vorteile:

  • funktioniert mit allen gerissenen Texten (Wort, Zeile, Zeichen usw.)
  • rückt den eingefügten Text so ein, dass er mit dem Einzug des umgebenden Textes übereinstimmt
  • 2 Tastenanschläge statt 3 und viel "einfachere" Tastenanschläge
  • schnell
Croger
quelle
1
Mein Favorit auch. tpope/vim-unimpairedKönnte erwähnenswert sein, dass dies erforderlich ist 😉.
Alextes
1
Ah, ich habe das vor so langer Zeit installiert, dass ich es vergessen habe. Danke für die Erinnerung!
Crogers
9

Persönlich habe ich Enter (CR) wie folgt zugeordnet :

nmap <CR> o<Esc>k

... basierend auf diesem Vim Wikia Artikel.

Auf diese Weise kann ich Zeilenumbrüche direkt aus dem normalen Modus erstellen und dies mit dem Wunsch kombinieren, sie in eine neue Zeile einzufügen.

<CR>jp

Sie könnten auch überspringen k in der obigen nmap, je nachdem , was Funktionen , die Sie von bevorzugten eingeben , so wäre es nur sein <CR>p.

Ich habe auch jj auf Esc abgebildet , was auch in diesem Fall hilfreich wäre. Esc ist viel zu weit von der Startreihe entfernt, als dass es für vim von Bedeutung wäre.

Nicht kürzer als die anderen Lösungen, aber ich denke, es fühlt sich weniger klobig an als einige von ihnen, und es hat auch andere Verwendungszwecke.

Miyalys
quelle
5

Wenn Sie eine ganze Zeile kopieren und dann eine ganze Zeile Yeinfügen, ziehen Sie zunächst die Zeile oder Zeilen, einschließlich Zeilenumbruch, und pfügen Sie sie ein. Sie können auch verwendet werden V, der visuelle ist Linie Modus, im Gegensatz zu Normal vzur visuellen Modus.

Peter
quelle
3
Das Problem ist, manchmal möchten Sie einfach nicht eine ganze Zeile kopieren ... Ich hätte gerne eine Lösung, die funktioniert, egal ob ich zehn Zeilen oder zwei Wörter kopiert habe.
static_rtti
3

Ich habe Mapping inoremap jj <ESC>. So ist es einfach, eine neue Zeile mit ojjund Ojjund dann einzufügen p.

ojjpFügen Sie also eine neue Zeile ein. es hat dann noch einen Schlag, o<esc>paber es ojjpfällt mir leicht.

Natwar Singh
quelle
2

Ich habe eine elegante Lösung dafür gefunden. Wenn Sie das Yank-Register in die Zwischenablage Ihres Betriebssystems einfügen (was sowieso großartig ist), mit

set clipboard+=unnamed

als du tun kannst o<Ctl-v>.

Dies ist nicht nur weniger Striche, sondern verbessert auch beide o<Esc>pund :puweil die Einrückung erhalten bleibt: Beide anderen Optionen beginnen Sie bei Zeichen Null in der neuen Zeile.

Vorsichtsmaßnahme ist, dass dies vom Betriebssystem abhängig sein kann oder nicht. Ich weiß nur, dass es auf der neuesten Version von OS X funktioniert, aber die Zwischenablage ist nur eine von vielen Möglichkeiten, um in die Zwischenablage des Betriebssystems zu gelangen.

Faszination
quelle
1

Wenn Sie auch im Einfügemodus enden möchten, können Sie im Einfügemodus mit einfügen CTRL-R ". https://stackoverflow.com/a/2861909/461834

Immer noch drei Tastenanschläge, aber kein Entkommen, und Sie speichern einen Tastenanschlag, wenn Sie trotzdem mit Einfügen enden möchten.

jtpereyda
quelle
1

Ich verwende die folgende Zuordnung in meiner Neovim-Konfiguration:

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

Eine kleine Erklärung:

  • m`: Setzen Sie eine Markierung an der aktuellen Cursorposition.
  • o<Esc>p: Erstellen Sie eine neue Zeile darunter und fügen Sie den Text in diese Zeile ein
  • O<Esc>P: Erstellen Sie eine neue Zeile darüber und fügen Sie den Text in diese Zeile ein
  • ``: Setzen Sie den Cursor an die ursprüngliche Position

Sehen Sie :h markfür weitere Informationen über Marken in Vim.

jdhao
quelle
1

Wenn Sie im Einfügemodus bleiben möchten, können Sie dies tun o ctrl+o p

  • o - Modus einfügen und zur neuen Zeile wechseln
  • ctrl+o - Führen Sie einen einzelnen Befehl wie im normalen Modus aus
  • p - Einfügen

Es sind drei Tastenanschläge, aber Sie bleiben im Einfügemodus und sind auch o ctrl+oziemlich schnell, so dass ich es persönlich als 2,5 Tastenanschläge behandle.

reconn
quelle
0

Diese Lösung scheint nur dann zuzutreffen, wenn der kopierte Textblock in einer neuen Zeile beginnt (im Gegensatz zum Abrufen eines Textausschnitts irgendwo in einer Zeile). Sie können die Kopie jedoch immer mit dem letzten Zeichen beginnen, das Sie erfassen möchten, und dann navigieren bis zum letzten Zeichen am Zeilenende vor dem Start des gewünschten Kopierblocks. Wenn Sie es dann einfügen möchten, platzieren Sie den Cursor am Ende der Zeile, unter der Ihr Text eingefügt werden soll, und drücken Sie p. Wenn ich die Erklärung nicht vermasselt habe, sollte dies den gewünschten Effekt liefern.

ungebrochenes Kaninchen
quelle