1

そこで、Python 補間を使用して小さな ulti-snips スニペットを作成しました。通常、元に戻すを押すと、スニペットを展開した後、トリガー ワードに戻ります。ただし、この場合、元に戻すを 2 回押す必要があります。私が使っている検索機能だと思います。これについて何か助けていただければ幸いです。検索よりも優れた機能を使用するか、何らかの形で検索 (またはこの問題の原因となるもの) を使用して、元に戻す履歴を汚染しないようにしたいと考えています。スニペットは次のとおりです。

snippet super "Adds a super function for the current function" b
`!p
import vim
# get the class name
line_number = int(vim.eval('search("class .*(", "bn")'))
line = vim.current.buffer[line_number - 1]
class_name = re.findall(r'class\s+(.*?)\s*\(', line)[0]
# get the function signature
line_number = int(vim.eval('search("def.*self.*", "bn")'))
line = vim.current.buffer[line_number - 1]
func = re.findall(r'def\s+(.*):', line)[0]
matches = re.findall(r'(.*)\(self,?\s*(.*)\)', func)
snip.rv = 'super(%s, self).%s(%s)' % (class_name, matches[0][0], matches[0][1])
`
endsnippet
4

1 に答える 1

1

Python でテキストを完全に操作できます。python は vim スクリプトよりも強力です。これが私の例です:

buf = vim.current.buffer
line_number = vim.current.window.cursor[0] - 1 # cursor line start from 1. so minus it
previous_lines = "\n".join(buf[0:line_number])

try:
    class_name = re.findall(r'class\s+(.*?)\s*\(', previous_lines)[-1]
    func_name, func_other_param = re.findall(r'def\s+(.*)\(self,?\s*(.*)?\):', previous_lines)[-1]
    snip.rv = 'super(%s, self).%s(%s)' % (class_name, func_name, func_other_param)
except IndexError as e:
    snip.rv = 'super'    # regex match fail.
于 2015-12-12T03:13:01.687 に答える