2010-01-10 4 views
14

Ich habe eine schlechte Angewohnheit, die 'Home' Taste zu verwenden, um zum Anfang einer Zeile zurückzukehren. Als ich vor kurzem begann, vim zu benutzen, bemerkte ich, dass, wenn ich die Home-Taste auf einer gekerbten Linie drücke, sie mich zum Anfang der Linie zurückbringt. In Notepad ++ (dem Editor, den ich verwendet habe), würde es mich direkt nach dem Einzug an den Anfang des Codes in dieser Zeile zurückversetzen.Drücken von "Home" in Vim auf einer eingerückten Zeile

Gibt es eine Möglichkeit, dieses Verhalten in Vim zu replizieren? Normalerweise, wenn ich nach Hause drücke, ist es im Insert-Modus, dass ich (normalerweise) eine Variable dort anlege.

ich set smartindent in meinem vimrc haben, mit set noautoindent als „Tipps“ Seite sagte mir, um sicherzustellen, dass autoindent abzuschalten (obwohl es nicht in erster Linie aktiviert zu sein schien -. Vielleicht ist diese Option Fremd)

Antwort

26

Es gibt zwei übliche Wege zum "Anfang" eine Zeile in Vim zu gehen: gehen

  • (Null) auf die erste Spalte von Text
  • ^ gehen auf das erste Nicht-Leerzeichen auf der Linie

Ich finde, dass mit w ist in der Regel der bequemste Weg für mich, um zum ersten nicht leeren Zeichen in einer Zeile zu gehen, es ist die gleiche Anzahl von Schlüsseln wie ^ und ist e asier zu erreichen. (Natürlich, wenn es keine führenden Leerzeichen in der Leitung sind, drücken Sie nicht w.)

+1

Also keine Möglichkeit, dies im Einfügemodus zu tun? Ich denke, ich sollte mich daran gewöhnen, zwischen den beiden zu wechseln. – Reid

+0

Ich glaube nicht, dass es einen Weg gibt; Ich verwende die Cursorbewegung im Einfügemodus überhaupt nicht. Dieser Artikel könnte hilfreich sein: http://www.viemu.com/a-why-vi-vim.html –

+0

@Reid - Du könntest es wahrscheinlich auf die eine oder andere Weise abbilden (siehe unten) - aber alle Bewegungen sollten wirklich sein im N-Modus gemacht, nicht ich. – Rook

1

Versuchen 0 Pressen (auch :help 0 sehen)

auch, könnte dies helfen:

:imap <C-Home> <esc>0a 
13

Sie Startseite neu zuordnen könnte das gleiche wie ^ (die docs sagen Startseite ‚s zu sein Standardfunktion entspricht den Bewegungsbefehl |):

:map <Home>^ 
:imap <Home> <Esc>^i 

der den Einsatz-Modus Abbildungs ​​äquivalent machen sollte aus Einfügemodus austretendes Drücken von ^ und dann Rückkehr in den Einfügemodus. Ich weiß nichts über die beste Methode, einen Bewegungsbefehl für den Einsatz im Einfügemodus zuzuordnen, also könnte das etwas kaputt machen, aber es scheint zu funktionieren.

Was Ihre Einrückungseinstellungen betrifft, sollten sie keine Auswirkungen auf die Bewegungssteuerung haben, aber ich denke auch, dass Sie sie wahrscheinlich anders einstellen würden. autoindent behält nur Ihre aktuelle Einrückung für neue Zeilen bei. Wenn Sie also 4 Leerzeichen am Anfang einer Zeile platzieren, werden nach dem Drücken der Eingabetaste auch 4 Leerzeichen davor stehen. Ich weiß nicht, warum du das nicht willst, denn es ist ziemlich nützlich in so ziemlich jeder Programmiersprache oder auch nur in Form von Freiform. smartindent implementiert andererseits ein paar hart codierte, leicht C-ische Einrückungsregeln, wie das Einrücken nach einer öffnung {, und das Entdenden nach einem Schließen}, führt aber nicht automatisch einen Einzug von vorherigen Zeilen fort. Die Dokumentation empfiehlt, die automatische Erkennung bei Verwendung von smartindent beizubehalten.

Allerdings ist smartindent nutzlos für Sprachen, die nicht ihre hartcodierten Regeln erfüllen, oder sogar aktiv schädlich (wie wenn es automatisch den Einzug aus jeder Zeile löscht, die mit einem '#' beginnt und eine Präprozessordirektive ist) ist aber falsch für Python-Programmierer, die versuchen, einen eingerückten Kommentar zu schreiben).

Also vim enthält auch einen fortgeschritteneren Einrückungsmodus, Dateityp Einrückung, die flexible Einrückungsregeln auf einer Sprache/Dateityp Basis ermöglicht und ist der bevorzugte Einrückungsmodus für die meisten Menschen (auch für C-ähnliche Sprachen). Wenn Sie den Dateityp-Einzug verwenden, deaktivieren Sie am besten smartindent (andernfalls kann es den Dateityp-Einzug stören, z. B. alle Kommentarzeilen in Spalte 0 in Python-Dateien verschieben).

Persönlich habe ich immer Autoindent auf, verwende Dateityp, wenn verfügbar, und niemals smartindent. Mein .vimrc umfasst:

set autoindent " doesn't interfere with filetype indents, and is useful for text 
if has("autocmd") 
    " Enable file type detection and indentation 
    filetype plugin indent on 
    set nosmartindent 
endif 

Ich stelle mir vor, es gibt etwas, das Sie haben smartindent nur eingeschaltet tun konnte, als Datei des Typs Einrücken für eine Datei des Typs nicht vorhanden ist, wenn Sie bearbeiten, dass viele verschiedene C-ähnliche Sprachen mit nicht Dateityp Einrückung verfügbar.

+1

Sie könnten die Einfügemodus-Karte um ein Zeichen zu verkleinern, indem Sie sagen: 'Imap I' anstelle von '^ i' –

7

Hier ist, was ich in meinem .vimrc habe. Diese Karten Home an den Anfang der Text verschieben, wenn Sie an einer beliebigen Stelle in der Zeile sind, und Spalte 0, wenn Sie am Anfang des Textes sind.

function ExtendedHome() 
    let column = col('.') 
    normal!^
    if column == col('.') 
     normal! 0 
    endif 
endfunction 
noremap <silent> <Home> :call ExtendedHome()<CR> 
inoremap <silent> <Home> <C-O>:call ExtendedHome()<CR> 

Hinweis: ich ein Tastaturlayout bin mit, die Startseite zu Alt Gr Karten + Ein, das, warum ich dies verwenden. Wenn Sie das Brieffeld Ihrer Tastatur verlassen müssen, um Home zu erreichen, sollten Sie stattdessen in den normalen Modus wechseln.

2

Sie können auch _ im Normalmodus verwenden, um zum ersten Nicht-Whitespace-Zeichen der aktuellen Zeile zu wechseln. Sie können auch eine Zählung mit dieser Bewegung verwenden.

_ <underscore>  [count] - 1 lines downward, 
        on the first non-blank character linewise.