Bewegungsbefehl innerhalb von vim-Funktionen

1079
thequark

Ich möchte die C-Funktion anzeigen, zu der die aktuelle Zeile gehört. Ich möchte kein Plugin verwenden, da ich auf mehreren Betriebssystemen mit unterschiedlichen Maschinenfunktionen und -konfigurationen arbeite. Ich habe die meisten Plugins ausprobiert und es funktioniert aus dem einen oder anderen Grund nicht. Ich muss etwas sehr grundlegendes und minimales schreiben, das mit extrem grundlegenden vim-Funktionen arbeitet.

Aktuelle Lösung:

Ich habe eine Vim-Funktion von einem Kollegen kopiert, der im Wesentlichen nach einem Reg-Ex sucht, der mit dem Anfang eines Funktionsnamens übereinstimmt. Es zeigt den Namen für einige Sekunden auf dem unteren Bildschirm und verschwindet

fun! ShowFuncName() let lnum = line(".") let col = col(".") echohl ModeMsg echo getline(search("^[^ \t#/]\\.*[^:]\s*$", 'bW')) echohl None call search("\\%" . lnum . "l" . "\\%" . col . "c") endfun 

Problem

Das Problem ist, dass diese Sache nicht mit Etiketten funktioniert. Wenn in einer Zeile eine Bezeichnung zwischen der Funktionsdefinition und der aktuellen Zeile vorhanden ist, zeigt das Skript den Namen der Bezeichnung anstelle des Funktionsnamens an.

Ansonsten funktioniert das Skript, weil es in unserer Codebase eine feste Regel ist, die Funktionsdefinition immer von Spalte 1 und geschweiften Klammern ab der zweiten Zeile zu starten.

Vorgeschlagener Fix

Verwenden Sie anstelle der Regex-Suche die Vim-Bewegungstasten. Das ist wie folgt:

  1. Aktuelle Zeile speichern #, Spalte #
  2. Mit den Bewegungstasten '[[' 'zurückspringen, um zur Funktionsdefinition zu gelangen
  3. Die Zeile direkt darüber hat die Funktion C. (Dies wird strikt in Codierrichtlinien durchgesetzt)
  4. Drucken Sie die Zeile
  5. Springen Sie zu der in Schritt 1 gespeicherten Zeile #, Spalte #.

Ich weiß nicht, wie ich den 2. Schritt ausführen soll.

1
Question why can't you just use `[[` to find the function definition and then hit `` to go back to where the cursor was originally? FDinoff vor 10 Jahren 1
Ich mache diese genauen Schritte jedes Mal manuell. Ich möchte diese Schritte automatisieren thequark vor 10 Jahren 0

1 Antwort auf die Frage

3
FDinoff

Ich glaube, dass du das willst

function! ShowFuncName() let cursor_pos = getpos('.') echohl ModeMsg normal! [[k echo getline('.') echohl None call setpos('.', cursor_pos) endfunction 

Der normalBefehl wird [[kim normalen Modus ausgeführt und bewegt den Cursor zur Funktionsdefinition. Dann wird die Zeile gedruckt, in der sich der Cursor befindet.

Die Cursorposition wird an die Position zurückgesetzt, an der sie ursprünglich verwendet wurde, getpos()und setpos()Funktionen.

Danke, es scheint gut zu funktionieren, außer wenn ich die Pfeiltasten vor dem Aufruf der Funktion verschoben habe. In dieser Situation wiederholt die Funktion meinen Bewegungsbefehl, ohne etwas zu zeigen. Schritte: 1. Verschieben Sie zwei Zeilen mit den Pfeiltasten nach unten oder j 2. Rufen Sie ShowFuncName () auf. Ich erwarte, dass der Funktionsname gedruckt wird, aber er wiederholt die in Schritt 1 ausgeführte Bewegung. Wenn ich nach Schritt 1 die Esc-Taste drücke, funktioniert das Skript wie erwartet thequark vor 10 Jahren 0