Vim Indentation-Mapping: Wie füge ich einen Zeilenumbruch ein, der die Spalte einschließt, in der ich war?

656
Ein

In Vim möchte ich eine Taste binden, durch die eine neue Zeile eingefügt und diese Zeile bis zu der Spalte eingerückt wird, in der sich der Cursor befand. Es ist ein bisschen seltsam, also lassen Sie mich das veranschaulichen:

Beispiel: Vorher und Nachher mit dem Cursor bei |

Vor:

a = str "Hello |World" 

Nach dem:

a = str "Hello  |World" 

Dieses Konzept bezieht sich weder auf die Einstellungen für "copyindent" von vim noch auf die Einstellungen für "preserveindent" (diese Einstellungen beziehen sich auf die ersten Einrückungen der vorherigen Zeile, nicht auf die Spalte des Cursors).

1

2 Antworten auf die Frage

1
garyjohn

Versuchen Sie diese Zuordnung.

:inoremap <F2> <CR><C-R>=repeat(' ',col([line('.')-1,'$'])-col('.'))<CR><C-O>:.retab<CR> 

Wenn Sie F2 eingeben (oder welchen Schlüssel Sie für das Mapping wählen), fügt Vim eine neue Zeile ( <CR>) gefolgt von einer Anzahl Leerzeichen ( <C-R>=repeat(' ',...)) ein, die der Differenz zwischen der Spaltennummer des Endes der vorherigen Zeile ( col([line('.')-1,'$'])) und der aktuellen entspricht Spaltennummer ( col('.')), wird dann in :retabder aktuellen Zeile ausgeführt, um diese Leerzeichen durch Tabulatoren und / oder Leerzeichen entsprechend Ihrer Einstellung von 'expandtab' zu ersetzen.

Bearbeiten

Diese Zuordnung erfordert, dass Sie sich im Einfügemodus befinden. Ich dachte, Sie würden den Kartenschlüssel eingeben, nachdem Sie Hallo und vor World eingegeben haben. Verwenden Sie diese Zuordnung, um zurückzukehren und die neue Zeile im normalen Modus einzufügen.

nnoremap <F2> i<CR><C-R>=repeat(' ',col([line('.')-1,'$'])-col('.'))<CR><Esc>:.retab<CR> 
0
Scott

Ich habe im Moment keinen Zugriff auf eine Kopie von vim(oder sogar vi), um dies zu testen, aber ich versuche etwas Ähnliches

iEnterEsc-Yp:s/./ /gEnterJ

Was es macht:

  • Fügen Sie einen Zeilenumbruch ein (No-Brainer).
  • Gehen Sie zurück zur a = str "HelloZeile und machen Sie eine Kopie davon.
  • Ändern Sie jedes Zeichen in der kopierten Zeile in ein Leerzeichen - Sie sollten jetzt 15 Leerzeichen haben.
  • Verbinden Sie diese Zeile (15 Felder) mit der |World"Zeile, so dass sie jetzt um 15 Felder eingerückt ist.

Möglicherweise müssen Sie ein Leerzeichen löschen (da beim Joinvorgang möglicherweise eines hinzugefügt wird). Wenn sich in der Zeile möglicherweise Registerkarten befinden, möchten Sie möglicherweise Registerkarten hinzufügen, um die Leerzeichen in der Kopie des ersten Teils der Zeile zu erweitern. Sie können auch hinzufügen, um Leerzeichen auf Registerkarten zu komprimieren.!_expandEnter!_unexpandEnter

I had finished writing this before I saw @garyjohn's answer.  And BTW, this might work in `vi`. Scott vor 11 Jahren 0