Dies ist eine Vim-Scripting-Frage. Sollte es nicht auf SO sein?
Luc Hermitte
Ich habe hier mehr VIM-Fragen gefunden als in SO, vielleicht weil es nur ein Texteditor ist, der zum Entwickeln von echtem Code verwendet wird. ;-)
Gabriel A. Zorrilla
1
Im Moment gibt es 1813 Fragen mit dem Tag "vim" auf SO und 254 hier.
Luc Hermitte
Antworten:
13
Es gibt viele Möglichkeiten, um fortzufahren.
A- Sie können ein einfaches Skript schreiben, das die Zeilen enthält, die Sie ausführen möchten, und es manuell aufrufen. Ex:
" $HOME/.vim/macros/foo.vim
:v/\S/d_
:update
" EOF
" and from vim
:runtime macros/foo.vim
" or
:so ~/.vim/macros/foo.vim
B- Sie können ein Plugin haben, das etwas enthält, das auslöst, was Sie ausführen möchten. Wenn die Aktion etwas komplex ist, ziehen wir es normalerweise vor, eine Funktion für Wartungszwecke zu definieren.
B.1. Wenn die Funktion kurz genug ist und jedes Mal verwendet wird, wenn Sie vim verwenden, können Sie sie in Ihrem Plugin definieren.
B.1.1. Wenn Sie die Funktion lieber direkt aufrufen möchten (normalerweise nie) :call Foo(), müssen Sie sie öffentlich machen, indem Sie ihr einen Namen geben, der mit einem Großbuchstaben beginnt:
(Diese Lösung verschmutzt den globalen Namespace , außerdem können andere Plugins ihn überschreiben.)
B.1.2 Normalerweise definieren wir entweder eine Zuordnung oder einen Befehl, der die Funktion aufruft. Auf diese Weise kann die Funktion lokal für das aktuelle Skript erstellt werden - der Name beginnt mit s:.
" ~/.vim/plugin/foo.vim
" to call a script-local function from a mapping (defined in the same script!)
" we need to use <sid> instead of s:
nnoremap µ :call <sid>Foo()<cr>
" or the more "professional" way that permits other users to choose another
" trigger for the mapping
nnoremap <Plug>Foo :call <sid>Foo()<cr>
if !hasmapto('<Plug>Foo', 'n')
nmap µ <Plug>Foo
endif
" ~/.vimrc
" this way some users may bind the action to anything else in their .vimrc
" while the default mapping on µ is defined for the all the other users
:nmap <f11> <Plug>Foo
B.2. Wenn die Funktion für sich genommen sehr lang ist oder aufgrund der anderen Funktionen, die sie zur Ausführung ihrer Arbeit benötigt, und / oder wenn die Funktion selten verwendet wird, ziehen wir es vor, sie in einem Autoload-Plugin zu definieren:
" ~/.vim/autoload/yourinitials/foo.vim
" NB: I use my initials (lh) to avoid name clashes on common filenames
function! yourinitials#foo#bar()
....
und der Aufruf der (öffentlichen) Funktion vom Plugin erfolgt unter Verwendung des ... Funktionsnamens:
Wir bieten normalerweise Anti-Inclusion-Schutzfunktionen für Plugins (und ftplugins), jedoch nicht für einfache Skripte oder Autoload-Plugins. Dies liegt daran, dass man möglicherweise verhindern möchte, dass aus der .vimrc-Datei einige Plugins geladen werden. Anmerkung: Das Plugin muTemplate, das ich pflege , enthält Skelette für die verschiedenen Arten von Vim-Skripten.
Möglicherweise möchten wir jedoch irgendwann ein bestimmtes Plugin neu laden, das wir verwalten, um die (neuen) Funktionen, die wir entwickeln, zu verwenden / zu testen / zu optimieren. In diesem Fall ist es wichtig, dass die Definitionen der Funktionen und Befehle mit a !verknüpft werden, damit sie überschrieben werden können.
Willkommen bei Super User! Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen, etwas detaillierter zu gehen und zu erklären, was der Befehl tut.
Antworten:
Es gibt viele Möglichkeiten, um fortzufahren.
A- Sie können ein einfaches Skript schreiben, das die Zeilen enthält, die Sie ausführen möchten, und es manuell aufrufen. Ex:
B- Sie können ein Plugin haben, das etwas enthält, das auslöst, was Sie ausführen möchten. Wenn die Aktion etwas komplex ist, ziehen wir es normalerweise vor, eine Funktion für Wartungszwecke zu definieren.
B.1. Wenn die Funktion kurz genug ist und jedes Mal verwendet wird, wenn Sie vim verwenden, können Sie sie in Ihrem Plugin definieren.
B.1.1. Wenn Sie die Funktion lieber direkt aufrufen möchten (normalerweise nie)
:call Foo()
, müssen Sie sie öffentlich machen, indem Sie ihr einen Namen geben, der mit einem Großbuchstaben beginnt:(Diese Lösung verschmutzt den globalen Namespace , außerdem können andere Plugins ihn überschreiben.)
B.1.2 Normalerweise definieren wir entweder eine Zuordnung oder einen Befehl, der die Funktion aufruft. Auf diese Weise kann die Funktion lokal für das aktuelle Skript erstellt werden - der Name beginnt mit
s:
.Jetzt können Sie entweder einen Befehl definieren:
oder eine Zuordnung:
B.2. Wenn die Funktion für sich genommen sehr lang ist oder aufgrund der anderen Funktionen, die sie zur Ausführung ihrer Arbeit benötigt, und / oder wenn die Funktion selten verwendet wird, ziehen wir es vor, sie in einem Autoload-Plugin zu definieren:
und der Aufruf der (öffentlichen) Funktion vom Plugin erfolgt unter Verwendung des ... Funktionsnamens:
Letzte Anmerkungen:
Wir bieten normalerweise Anti-Inclusion-Schutzfunktionen für Plugins (und ftplugins), jedoch nicht für einfache Skripte oder Autoload-Plugins. Dies liegt daran, dass man möglicherweise verhindern möchte, dass aus der .vimrc-Datei einige Plugins geladen werden. Anmerkung: Das Plugin muTemplate, das ich pflege , enthält Skelette für die verschiedenen Arten von Vim-Skripten.
Möglicherweise möchten wir jedoch irgendwann ein bestimmtes Plugin neu laden, das wir verwalten, um die (neuen) Funktionen, die wir entwickeln, zu verwenden / zu testen / zu optimieren. In diesem Fall ist es wichtig, dass die Definitionen der Funktionen und Befehle mit a
!
verknüpft werden, damit sie überschrieben werden können.quelle
quelle