2017-06-15 43 views
1

我的心愛的gedit R pluginno longer maintained,而且我上次使用的強制downgrade solution突然停止工作,我上次更新了ubuntu。寫作一直在牆上,我正在探索崇高的文字。我已經安裝了REPL以便將代碼發送到命令行,並且我試圖設置像我習慣的那樣的鍵綁定。製作一個崇高的文字3宏來評估一條線,然後將光標移動到下一行

特別是,我試圖讓CTRL + SHIFT + R將一行代碼發送到控制檯,運行它,然後將光標在編輯器中移動到下一行。這樣我可以多次點擊CTRL + SHIFT + R來逐行運行腳本。 (這與使用CTRL + Enter的Rstudio行爲類似)

使用谷歌搜索,我找到了這個(舊)solution。它不工作,可能是監守它是崇高的文本2更google搜索寫的,我想通了,如何讓它幾乎工作:

//This is a macro for evaluate and move down 
[ 
{"command": "repl_transfer_current", "args": {"scope": "lines"}} 
// {"command": "move", "args": {"mode": "lines", "amount": 1}} 
] 

這裏是我添加到我的默認鍵盤佈局

{ "keys": ["ctrl+shift+r"], "command": "run_macro_file", "args": {"file": "Packages/User/geditlike_lineeval.sublime-macro"}} 

如上所述,崇高的文本將我的代碼行發送到終端並運行它。第二行應該向下發送光標,但它不起作用,並且當我取消註釋時宏會失敗。

我似乎無法找到有關崇高文本命令的文檔。 Here是我能找到的最好的move。我的語法錯了嗎?我該如何做這項工作?

獎金:我怎樣才能使崇高文本運行線,然後跳到到下一個非空非註釋線。這似乎更難 - 我看到很多鍵綁定涉及正則表達式等。

編輯 我的問題是,我錯過了JSON行之間的逗號。和鏈接在該github頁面上的代碼是否工作,如果你在行之間添加逗號。

回答

3

您鏈接到的解決方案應該同時適用於Sublime 2和3(假設提供repl_transfer_current命令的插件適用於兩者),但由於宏格式不正確而無法工作。

[編輯] 由崇高本身提供不把你的微距拍攝時使用的參數的move命令。據推測,如果這對你有效,這也是由一些包提供的。如果是這樣,您可能需要相應地調整下面的示例代碼。 [/編輯]

既然這樣,問題是,在崇高差不多(但不是全部)的配置文件是在JSON格式(略放鬆,允許評論),以及宏代碼上面和概述鏈接的解決方案不是有效的JSON,因爲它中的第一個和第二個命令不以逗號分隔。

類似下面應該工作:

[ 
    {"command": "repl_transfer_current", "args": {"scope": "lines"}}, 
    {"command": "move", "args": {"mode": "lines", "amount": 1}} 
] 

我認爲你鏈接到上面是崇高2崇高的文檔。一個很好的資源是Unofficial Documentation,它還包含list of commands(加上很多其他好東西)。

爲了做這樣的事情,並把它保持,直到它到達的第一個非空白,非註釋行你需要一個簡單的插件

具體那就要向下移動光標向下移動(使用現有的move命令),然後檢查當前行以查看它是空白還是註釋,如果是則再次移動。然後,您可以使用該命令代替宏中的move命令。


對於獎勵標記,下面是一個插件的例子,它做了這樣的事情。它比需要的更冗長,以至於它更具啓發性,並且可能需要額外的調整(R不是我使用/知道的語言之一),但它應該讓你開始。

有關如何工作的更多信息,可以查看API Reference以查看可以在插件中使用的所有內部命令。

要使用此,從菜單中選擇Tools > Developer > New Plugin...,然後替換爲這裏呈現的插件代碼顯示的存根代碼的整體,並與.py擴展名保存(名稱並不重要):

import sublime 
import sublime_plugin 
import re 

# A regex that matches a line that's blank or contains a comment. 
# Adjust as needed 
_r_blank = re.compile("^\s*(#.*)?$") 

class RAdvanceNextCommand(sublime_plugin.TextCommand): 
    def run(self, edit): 
     # Get the count of lines in the buffer so we know when to stop 
     last_line = self.line_at(self.view.size()) 

     while True: 
      # Move to the next line 
      self.view.run_command("move", {"by": "lines", "forward": True}) 

      # Get the current cursor position in the file 
      caret = self.view.sel()[0].begin() 

      # Get the new current line number 
      cur_line = self.line_at(caret) 

      # Get the contents of the current line 
      content = self.view.substr(self.view.line(caret)) 

      # If the current line is the last line, or the contents of 
      # the current line does not match the regex, break out now. 
      if cur_line == last_line or not _r_blank.match(content): 
       break 

     # Jump to the start of the line 
     self.view.run_command("move_to", {"to": "bol"}) 

    # Convert a 0 based offset into the file into a 0 based line in 
    # the file. 
    def line_at(self, point): 
     return self.view.rowcol(point)[0] 

這實現了一個名爲r_advance_next的新命令,它將光標向下移動通過文件,跳過完全是空格或包含行註釋的行(假設我的正則表達式已達到snuff)。在地方

有了這個,您的宏應該是這樣的:

[ 
    {"command": "repl_transfer_current", "args": {"scope": "lines"}}, 
    {"command": "r_advance_next"} 
] 

此外,可以使用一鍵綁定,如以下。既然你提到RStudio使用控制+輸入,這就是我在這裏使用的。此綁定具有應用於其的上下文,以便它僅適用於當前文件是R文件時,以便在不適當時觸發它。

{ "keys": ["ctrl+enter"], "command": "run_macro_file", 
    "args": {"file": "Packages/User/geditlike_lineeval.sublime-macro"}, 
    "context": [ 
    { "key": "selector", "operator": "equal", "operand": "source.r"} 
    ] 
} 

對於BONUS加分,你可以直接從這裏介紹的插件命令,在這種情況下,你並不需要在所有使用宏內運行repl_transfer_current命令,你可以只綁定的關鍵直接從插件的命令。在這種情況下,您可能想要以不同的方式命名類(例如RTransferAndAdvanceCommand或某些類型),以便命令名更有意義。

+0

是的,這是逗號。第一次使用JSON。鑑於JSON基本上沒有作爲語言的功能(從我收集的內容),我該如何編寫一個涉及「while」和「regex」的小程序 - 看起來我需要實現您的建議? –

+0

Sublime中的插件是用Python編寫的(只是配置的東西是JSON,不包括與TextMate兼容的一些XML格式的文件)。我可以提供一個簡單的例子(目前不在計算機上)。 – OdatNurd

+0

示例插件和用法已添加到我的答案中。 – OdatNurd

相關問題