2009-08-28 20 views
93

Ich muss oft einige Sachen in eine neue Zeile in vim einfügen. Was ich in der Regel tun ist:Wie Einfügen in eine neue Zeile mit Vim?

o<Esc>p 

die eine neue Zeile einfügt und bringt mich in Einführungsmodus, als Einführungsmodus beendet wird, und schließlich Pasten.

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

+3

3 Tastenanschläge sind nicht effizient? – gtd

+34

1 oder 2 wäre besser :) Warum vim verwenden, wenn nicht für maximale Effizienz? –

Antwort

41

Kurz nach :help p heiß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 nicht kürzer, es ist, als die aktuelle Lösung, wenn Sie es mit etwas Tastatur Karte kombiniert, wie in einer anderen Antwort vorgeschlagen. Zum Beispiel können Sie es auf eine beliebige Taste (auch p) Karte:

:nmap p :pu<CR> 
+1

Ich weiß das, und ich benutze es, aber es ist nicht das, was ich frage, weil manchmal, was du kopierst, nur kein LF darin hat. Wenn es einen Befehl "in eine neue Zeile einfügen" gab, würde es unabhängig von dem Inhalt funktionieren, den Sie einfügen möchten, sodass Sie nicht darüber nachdenken müssen. –

+1

Okay, ': pu [t]' setzt den Text in eine neue Zeile nach der aktuellen Zeile, ': pu [t]!' Setzt den Text in eine neue Zeile vor der aktuellen Zeile. Ich werde meine Antwort entsprechend bearbeiten. (Hooray für ': help p'.) – Bombe

+1

Nicht wirklich besser als meine aktuelle Lösung, aber ich denke, es ist die beste Antwort auf meine Frage. –

2

Wenn Sie eine ganze Zeile sind kopieren dann eine ganze Zeile einzufügen, verwenden Sie Y die Linie oder Linien zu zerren, einschließlich Zeilenumbruch, in der erste Platz, und einfügen. Sie können auch V verwenden, was visueller Zeile Modus ist, im Gegensatz zu einfachem v für visuellen Modus.

+2

Das Problem ist, manchmal wollen Sie einfach nicht kopieren ganze Zeile ... Ich hätte gerne eine Lösung, die funktioniert, ob ich zehn Zeilen oder zwei Wörter kopiert habe. –

34

Optionen:

1) yy über die ganze Zeile (einschließlich der Zeilenende-Zeichen) zerren. wird dann die Zeile in eine neue Zeile nach der aktuellen einfügen und P (Shift - P) wird über der aktuellen Zeile einfügen.

2) Stellen Sie eine Zuordnung: dann ist es nur ein oder zwei Tasten:

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

3) Die Funktion Version des Mappings (unnötig wirklich, 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 
+0

Nun, ich schätze, ich werde ein Mapping machen. Ich habe nur gehofft, dass es eine Standardlösung geben könnte: -/ Danke für Ihre Antwort! –

+1

@AI: Die Verwendung der ', p' (',' ist als meine zugeordnet) ist meiner Meinung nach die beste Lösung. Sie haben sogar eine einfach zu bedienende Funktion zur Verfügung gestellt. :) Groß! –

20

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

o<C-R>" 

ich, dass ich <C-R>" sehr oft und gebunden, dass in meinem vimrc zu <C-F>:

inoremap <C-F> <C-R>" 
+0

Danke, das ist ein nützlicher Tipp. –

+0

das ist für mich die beste Lösung – Santi

7

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

nmap <CR> o<Esc>k 

... basierend auf this Vim Wikia ein Artikel.

So kann ich Zeilenumbrüche direkt vom Normalbetrieb machen, und diese Kombination mit dem Wunsch, zu einem Newline einzufügen unten ich tun würde:

<CR>jp 

Sie könnten auch k in der nmap oben überspringen, Je nachdem, welche Funktionalität Sie bevorzugen, geben Sie ein, also wäre es einfach <CR>p.

Ich habe auch JJ Esc, die auch in diesem Fall helfen würde. Esc ist viel zu weit weg von der Home-Zeile für wie wichtig es in vim ist.

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

2

Ich habe Zuordnung inoremap jj <ESC>. So ist es einfach, neue Zeile mit ojj und Ojj und dann p einzufügen.

so ojjp fügen Sie einen Newline neu hinzu. es hat einen weiteren Strich dann o<esc>p aber ojjp ist einfach für mich.

0

Diese Lösung scheint nur dann zu gelten, wenn der kopierte Textblock in einer neuen Zeile beginnt (anstatt einen Textschnipsel irgendwo innerhalb einer Zeile einzufangen), aber Sie können Ihre Kopie immer mit dem letzten Zeichen beginnen, das Sie möchten greife und navigiere dann zum letzten Zeichen am Zeilenende vor dem Start des gewünschten Kopierblocks. Dann, wenn Sie es einfügen möchten, platzieren Sie den Cursor an das Ende der Zeile, unter der Sie Ihren Text einfügen möchten, und drücken Sie p. Wenn ich die Erklärung nicht vermasselt habe, sollte dies den gewünschten Effekt bieten.

10

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

o<Alt-p>

Da Sie im Einfügemodus sind nach o schlagen, das Alt-Modifikator ermöglicht es Ihnen, einen Befehl zu verwenden, als ob Du warst es nicht.

+0

Ganz handliche Art und Weise, wenn Sie versuchen, das Jank etw, schneiden Sie in der Zeile mit "d $" in einer neuen Zeile –

1

Ich fand eine elegante Lösung dafür. Wenn Sie das yank Register in Ihrem OS Zwischenablage setzen (die ohnehin groß ist), mit

set clipboard+=unnamed 

als Sie o<Ctl-v> zu tun.

Neben weniger Strichen verbessert dies sowohl o<Esc>p als auch :pu, weil es Einrückung bewahrt: beide anderen Optionen starten Sie bei Zeichen Null auf der neuen Zeile.

Vorbehalt ist, dass dies OS-abhängig sein kann oder nicht. Alles, was ich weiß, ist, dass es auf der letzten Version von OS X funktioniert, aber die Zwischenablage ist nur eine von vielen Möglichkeiten, um in die Zwischenablage des Betriebssystems zu gelangen.

1

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

Noch drei Tastenanschläge, aber kein Escape, und Sie speichern einen Tastendruck, wenn Sie trotzdem in Einfügung beenden möchten.

+0

Nizza, danke –

Verwandte Themen