Zeilen werden automatisch neu geschrieben, wenn Markdown in VIM geschrieben wird


10

Sehr oft schreibe ich Abschriften in VIM, und diese Abschriften enthalten Absätze. Um meine Bearbeitung zu erleichtern, richte ich mein Vim so ein, dass eine Zeile mit 80 Zeichen umbrochen wird. Es funktioniert gut, wenn ich einfach weiter tippe, aber das Problem ist, wenn ich etwas korrigieren muss, wird es sehr nervig.

Demo (aus der Wikipedia-Logik erster Ordnung):

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments. In first-order 
theories, predicates are often associated with sets. In interpreted higher-order 
theories, predicates may be interpreted as sets of sets.

So weit, ist es gut. Aber wenn ich den Artikel überarbeite, könnte ich beschließen, etwas in der Mitte hinzuzufügen, sagen wir:

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments,
or in which one or both of predicate quantifiers or function quantifiers are permitted.
In first-order theories, predicates are often associated with sets. In interpreted higher-order
theories, predicates may be interpreted as sets of sets.

Beachten Sie, dass Zeile 3 diejenige ist, die ich einschließen möchte. Wenn ich es in VIM mache, muss ich die Zeilen manuell verbinden und den gesamten Absatz neu wickeln.

Hat jemand eine Idee, wie man VIM dazu bringt, es automatisch zu machen?

Antworten:


6

Noch einfacher: Das aFlag für 'formatoptions'ermöglicht die automatische Formatierung von Absätzen, wenn Text eingefügt oder gelöscht wird. Siehe :help fo-tablefür Details zu 'formatoptions'Flags und :help autoformat.

:set formatoptions+=a

gqund gwformatiert die Linien, über die sich die folgende Bewegung bewegt.

Formatting is done with one of three methods:
                1. If 'formatexpr' is not empty the expression is
                   evaluated.  This can differ for each buffer.
                2. If 'formatprg' is not empty an external program
                   is used.
                3. Otherwise formatting is done internally.

                In the third case the 'textwidth' option controls the
                length of each formatted line

Der Unterschied zwischen den beiden besteht darin, dass gqder Cursor auf der ersten nicht leeren Zeile der zuletzt formatierten Zeile bleibt. gwsetzt den Cursor wieder an die Stelle, an der er begonnen hat.

Sie können den Absatz, in dem sich Ihr Cursor gerade befindet gwap, oder das gesamte Dokument auf einfache Weise manuell umbrechen gggwG, obwohl dies Ihren Cursor dank der führenden Zeile bewegt gg.

Mit einem automatischen Befehl kann die Formatierung automatisch erfolgen. Hier ist ein Beispiel, das den aktuellen Absatz beim Verlassen des Einfügemodus formatiert:

augroup myformatting
    autocmd!
    autocmd InsertLeave * normal gwap<CR>
augroup END

Es gibt andere Autocommand-Trigger, bei denen Sie möglicherweise eine bessere Arbeit für Sie finden. Sie können die Optionen unter erkunden :help autocmd-events. Die relevantesten befinden sich wahrscheinlich unter der Überschrift "verschiedene".


ein Wort: brillant!
Jason Hu

1

Ich würde einen Blick darauf werfen :help 'textwidth'. Während der Eingabe werden automatisch Zeilen unterbrochen. Dies funktioniert jedoch nicht, wenn Sie die Mitte einer Zeile bearbeiten.

Ich persönlich ziehe es vor, wegzulassen textwidth, also habe ich eine Funktion erstellt, die einen Absatz automatisch verbindet und teilt. (Grundsätzlich automatisch auf 80 Zeichen formatieren) Es sieht so aus:

function! ParagraphToEightyChars()
   while (len(getline(".")) > 80)
      normal! 0
      " Find the first white-space character before the 81st character.
      call search('\(\%81v.*\)\@<!\s\(.*\s.\{-}\%81v\)\@!', 'c', line('.'))
      " Replace it with a new line.
      exe "normal! r\<CR>"
      " If the next line has words, join it to avoid weird paragraph breaks.
      if (getline(line('.')+1) =~ '\w')
         normal! J
      endif
   endwhile
   " Trim any accidental trailing whitespace
   :s/\s\+$//e
endfunction

Ich habe dann ein Mapping, um es aufzurufen, wann immer ich es brauche:

nnoremap <silent><A-J> :call ParagraphToEightyChars()<CR>

Diese Funktion eignet sich auch hervorragend formatoptions+=jrzum Formatieren von Kommentaren im Code! Setzen Sie einfach Ihren Cursor auf die erste Zeile, die länger als 80 Zeichen ist, und rufen Sie die Funktion auf.

(Hinweis: Ich habe diese Funktion nicht allgemein für andere Längen als 80 festgelegt, aber ich denke, Sie müssen nur die 80er und 81er ändern, wenn Sie etwas anderes machen möchten.)

Siehe :help 'textwidth'und :help 'formatoptions'für weitere Informationen.


Vielen Dank für Ihr Teilen. Wenn ich Ihr Setup überprüfe, wird es während der Eingabe nicht automatisch formatiert. Richtig? Wenn ja, dann ist es immer noch eine suboptimale Lösung, nein?
Jason Hu

textwidthwird während der Eingabe automatisch formatiert. Meine Funktion wird nicht. Ich ziehe es vor zu kontrollieren, wann vim Dinge einpackt, also funktioniert es für mich. Aber wenn Sie speziell nach einem Formatierer suchen, ja, ja; es passt nicht ganz zu Ihrem Workflow.
Tumbler41

1

Der Vollständigkeit halber möchte ich die Plugin-basierte Option erwähnen.

Wenn Sie so etwas wie ALE verwenden, das das Ausführen Ihrer Puffer durch einen Verschönerer beim Speichern unterstützt, können Sie Prettier das Umwickeln Ihres Codes überlassen.

Ich habe das erreicht, indem ich Folgendes eingegeben habe ~/.vim/ftplugin/markdown.vim:

let b:ale_fixers = ['prettier', 'remove_trailing_lines', 'trim_whitespace']
let b:ale_javascript_prettier_options = '--prose-wrap always'

... und dies einfügen ~/.vimrc:

let g:ale_fix_on_save = 1
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.