diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4ab4cfa..c40d2fe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,100 +1,66 @@ name: CI on: { push: { branches: [master] } } jobs: - version: - runs-on: ubuntu-latest - outputs: - version: ${{ steps.setup_release.outputs.version }} - steps: - - name: Checkout Code - uses: actions/checkout@v3 - with: { fetch-depth: 0 } - - name: Setup Release - id: setup_release - env: { GITHUB_TOKEN: "${{ github.token }}" } - run: | - export VERSION=`git describe --tags --match "v*" | tail -c +2` - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "Building terminal version $VERSION." - if [[ `git tag --points-at HEAD | head -c 1` == "v" ]]; then - gh release delete -y v$VERSION || true; gh release create -t v$VERSION v$VERSION - gh release delete -y latest || true; gh release create -t latest latest - fi - gh release delete -y continuous || true; gh release create -p -t 'Continuous Release' continuous - - build_linux: - needs: [version] + build_linux_windows: permissions: write-all - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 defaults: { run: { shell: bash } } - container: ghcr.io/lite-xl/lite-xl-build-box:latest steps: - name: Checkout Code uses: actions/checkout@v3 - with: { fetch-depth: 0, submodules: true } + with: { fetch-depth: 0 } + - name: Set Environment Variables + run: | + git config --global user.name "Github Actions" && git config --global user.email "adamdharrison@gmail.com" + echo VERSION=`git describe --tags --abbrev=0 --match "v*" | tail -c +2` >> $GITHUB_ENV + - name: Clone Submodules + run: git submodule update --init --depth=1 - name: Build Linux - run: BIN=libterminal.x86_64-linux.so ./build.sh -O3 -DLIBTERMINAL_VERSION='"'${{ needs.version.outputs.version }}-x86_64-linux'"' - - name: Upload Artifacts - uses: actions/upload-artifact@v3 - with: { name: "Linux", path: "*.so" } - - build_windows: - needs: [version] - permissions: write-all - runs-on: ubuntu-latest - defaults: { run: { shell: bash } } - steps: - - name: Checkout Code - uses: actions/checkout@v3 - with: { fetch-depth: 0, submodules: true } + run: | + BIN=libterminal.x86_64-linux.so ./build.sh -O3 -DLIBTERMINAL_VERSION='"'$VERSION-x86_64-linux'"' - name: Build Windows + run: | + sudo apt-get install mingw-w64 + BIN=libterminal.x86_64-windows.dll CC=x86_64-w64-mingw32-gcc ./build.sh -O3 -DLIBTERMINAL_VERSION='"'$VERSION-x86_64-windows'"' + - name: Create Release(s) env: { GITHUB_TOKEN: "${{ github.token }}" } - run: sudo apt-get install mingw-w64 && BIN=libterminal.x86_64-windows.dll CC=x86_64-w64-mingw32-gcc ./build.sh -O3 -DLIBTERMINAL_VERSION='"'${{ needs.version.outputs.version }}-x86_64-windows'"' - - name: Upload Artifacts - uses: actions/upload-artifact@v3 - with: { name: "Windows", path: "*.dll" } + run: | + if git tag --points-at HEAD | tail -n1 | grep "^v"; then + gh release delete -y v$VERSION || true; + gh release create -t v$VERSION v$VERSION *.so *.dll + gh release delete -y latest || true; + gh release create -t latest latest *.so *.dll + fi + gh release delete -y continuous || true; gh release create -p -t 'Continuous Release' continuous *.so *.dll build_macos: - needs: [version] + permissions: write-all + needs: build_linux_windows runs-on: macos-11 env: CC: clang steps: - name: Checkout Code uses: actions/checkout@v3 - with: { fetch-depth: 0, submodules: true } + with: { fetch-depth: 0 } + - name: Set Environment Variables + run: echo VERSION=`git describe --tags --abbrev=0 --match "v*" | tail -c +2` >> $GITHUB_ENV + - name: Clone Submodules + run: git submodule update --init --depth=1 - name: Build MacOS env: { GITHUB_TOKEN: "${{ github.token }}" } run: | ./build.sh clean - BIN=libterminal.x86_64-darwin.so ./build.sh -O3 -DLIBTERMINAL_VERSION='"'${{ needs.version.outputs.version }}-x86_64-darwin'"' - BIN=libterminal.aarch64-darwin.so CC=clang CFLAGS="-arch arm64" ./build.sh -O3 -DLIBTERMINAL_VERSION='"'${{ needs.version.outputs.version }}-x86_64-darwin'"' - - name: Upload Artifacts - uses: actions/upload-artifact@v3 - with: { name: "MacOS", path: "*.so" } - - - finalize: - needs: [version, build_macos, build_linux, build_windows] - runs-on: ubuntu-latest - steps: - - name: Checkout Code - uses: actions/checkout@v3 - with: { fetch-depth: 0 } - - name: Download Artifacts - uses: actions/download-artifact@v3 - with: { path: "." } - - name: Finalize Tags - env: { GITHUB_TOKEN: "${{ github.token }}" } - run: | - if [[ `git tag --points-at HEAD | head -c 1` == "v" ]]; then - gh release upload v${{ needs.version.outputs.version }} Linux/*.so MacOS/*.so Windows/*.dll - gh release upload latest Linux/*.so MacOS/*.so Windows/*.dll - git branch -f latest HEAD - git tag -f latest - git push -f origin refs/heads/latest - git push -f origin refs/tags/latest - fi - gh release upload continuous Linux/*.so MacOS/*.so Windows/*.dll - git tag -f continuous - git push -f origin refs/tags/continuous + BIN=libterminal.x86_64-darwin.so ./build.sh -O3 -DLIBTERMINAL_VERSION='"'$VERSION-x86_64-darwin'"' + BIN=libterminal.aarch64-darwin.so CC=clang CFLAGS="-arch arm64" ./build.sh -O3 -DLIBTERMINAL_VERSION='"'$VERSION-x86_64-darwin'"' + gh release upload continuous *.so + if git tag --points-at HEAD | tail -n1 | grep "^v"; then + gh release upload v$VERSION *.so + gh release upload latest *.so + git branch -f latest HEAD + git tag -f latest + git push -f origin refs/heads/latest + git push -f origin refs/tags/latest + fi + git tag -f continuous + git push -f origin refs/tags/continuous diff --git a/LICENSE b/LICENSE index 162c6f1..d3b24e2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,5 @@ Copyright (c) 2023 lite-xl Team +Copyright (c) 2023 Pragtical Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -17,4 +18,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/README.md b/README.md index 0ee7e0b..ffe1cd4 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -# lite-xl-terminal +# pragtical-terminal -`lite-xl-terminal` is a (mostly) fully-featured terminal emulator designed to -slot into lite-xl as a plugin for windows (Windows 10+ only), mac and linux. +`pragtical-terminal` is a (mostly) fully-featured terminal emulator designed to +slot into pragtical as a plugin for windows (Windows 10+ only), mac and linux. -![image](https://github.com/adamharrison/lite-xl-terminal/assets/1034518/eb8a72a0-ff61-4b95-b009-364ac2725f70) +![image](https://github.com/adamharrison/lite-xl-terminal/assets/1034518/6b8003da-d4c1-4227-8fc9-3d2b1ae89bf2) ## Description @@ -52,35 +52,35 @@ More shells should work, but are not tested outright. ## Installation -The easiest way to install `lite-xl-terminal` is to use -[`lpm`](https://github.com/lite-xl/lite-xl-plugin-manager), and then run the +The easiest way to install `pragtical-terminal` is to use +[`ppm`](https://github.com/pragtical/plugin-manager), and then run the following command: ``` -lpm install terminal +ppm install terminal ``` -If you want to simply try it out, you can use `lpm`'s `run` command: +If you want to simply try it out, you can use `ppm`'s `run` command: ``` -lpm run terminal +ppm run terminal ``` If you want to grab it directly, and build it from the repo, on Linux, Mac or MSYS on Windows you can do: ``` -git clone --depth=1 https://github.com/adamharrison/lite-xl-terminal.git \ - --recurse-submodules --shallow-submodules && cd lite-xl-terminal && \ - ./build.sh && cp -R plugins/terminal ~/.config/lite-xl/plugins && \ - cp libterminal.so ~/.config/lite-xl/plugins/terminal +git clone --depth=1 https://github.com/pragtical/terminal.git \ + --recurse-submodules --shallow-submodules && cd terminal && \ + ./build.sh && cp -R plugins/terminal ~/.config/pragtical/plugins && \ + cp libterminal.so ~/.config/pragtical/plugins/terminal ``` If you want to install on Windows, but don't have MSYS, you can download -the files directly from our [release](https://github.com/adamharrison/lite-xl-terminal/releases/tag/latest) +the files directly from our [release](https://github.com/pragtical/terminal/releases/tag/latest) page, download `libterminal.x86_64-windows.dll`, as well as the Source Code, and place both the dll, and the `plugins/terminal/init.lua` from the source -code archive into your lite-xl plugins directory as `plugins/terminal/init.lua` +code archive into your pragtical plugins directory as `plugins/terminal/init.lua` and `plugins/terminal/libterminal.x86_64-windows.dll`. ### Stanalone @@ -88,7 +88,7 @@ and `plugins/terminal/libterminal.x86_64-windows.dll`. If you want to use terminal as a standalone terminal, here's a handy script you can use: ``` -LITE_SCALE=1 lpm run terminal --config 'config.plugins.treeview=false config.plugins.workspace=false config.always_show_tabs=false local _,_,x,y = system.get_window_size() system.set_window_size(800, 500, x, y) local TerminalView = require "plugins.terminal".class local old_close = TerminalView.close function TerminalView:close() old_close(self) os.exit(0) end core.add_thread(function() command.perform("terminal:open-tab") local node = core.root_view.root_node:get_node_for_view(core.status_view) node:close_view(core.root_view.root_node, core.status_view) end)' +PRAGTICAL_SCALE=1 ppm run terminal --config 'config.plugins.treeview=false config.plugins.workspace=false config.always_show_tabs=false local _,_,x,y = system.get_window_size() system.set_window_size(800, 500, x, y) local TerminalView = require "plugins.terminal".class local old_close = TerminalView.close function TerminalView:close() old_close(self) os.exit(0) end core.add_thread(function() command.perform("terminal:open-tab") local node = core.root_view.root_node:get_node_for_view(core.status_view) node:close_view(core.root_view.root_node, core.status_view) end)' ``` ## Status @@ -112,4 +112,3 @@ dependencies other than the native OS libraries for each OS. ``` CC=x86_64-w64-mingw32-gcc BIN=libterminal.dll ./build.sh -g ``` - diff --git a/manifest.json b/manifest.json index ba7cc6a..90867fa 100644 --- a/manifest.json +++ b/manifest.json @@ -1,32 +1,25 @@ { - "addons" : [ - { - "description" : "An integrated terminal for lite-xl.", - "files" : [ - { - "arch" : "x86_64-linux", - "checksum" : "eafe4ea692d4dc8276e59d1028b94faf1a811298120941ba3dd5ba8b7eabfb68", - "url" : "https://github.com/adamharrison/lite-xl-terminal/releases/download/v1.01/libterminal.x86_64-linux.so" - }, - { - "arch" : "x86_64-darwin", - "checksum" : "ef07c3c5de7516a20ea1f578f4cf8d52a5c30dd7f65e00ea4515d73ea645fe5e", - "url" : "https://github.com/adamharrison/lite-xl-terminal/releases/download/v1.01/libterminal.x86_64-darwin.so" - }, - { - "arch" : "aarch64-darwin", - "checksum" : "237aaa401238dd02c9b5a161237934de739018b45effe08c8a040577932d50e3", - "url" : "https://github.com/adamharrison/lite-xl-terminal/releases/download/v1.01/libterminal.aarch64-darwin.so" - }, - { - "arch" : "x86_64-windows", - "checksum" : "6a4c486e87a0f339ef93d890075b9666f6f61d634e8d7a620bfae8c290e6ae31", - "url" : "https://github.com/adamharrison/lite-xl-terminal/releases/download/v1.01/libterminal.x86_64-windows.dll" - } - ], - "id" : "terminal", - "path" : "plugins/terminal", - "version" : "1.01" - } - ] + "addons": [{ + "id": "terminal", + "description": "An integrated terminal for pragtical.", + "version": "1.01", + "path": "plugins/terminal", + "files": [{ + "url": "https://github.com/pragtical/terminal/releases/download/latest/libterminal.x86_64-linux.so", + "arch": "x86_64-linux", + "checksum": "SKIP" + }, { + "url": "https://github.com/pragtical/terminal/releases/download/latest/libterminal.x86_64-darwin.so", + "arch": "x86_64-darwin", + "checksum": "SKIP" + }, { + "url": "https://github.com/pragtical/terminal/releases/download/latest/libterminal.aarch64-darwin.so", + "arch": "aarch64-darwin", + "checksum": "SKIP" + }, { + "url": "https://github.com/pragtical/terminal/releases/download/latest/libterminal.x86_64-windows.dll", + "arch": "x86_64-windows", + "checksum": "SKIP" + }] + }] } diff --git a/plugins/terminal/init.lua b/plugins/terminal/init.lua index d55cea6..da47202 100644 --- a/plugins/terminal/init.lua +++ b/plugins/terminal/init.lua @@ -106,6 +106,79 @@ config.plugins.terminal = common.merge({ [245] = { common.color "#8a8a8a" }, [246] = { common.color "#949494" }, [247] = { common.color "#9e9e9e" }, [248] = { common.color "#a8a8a8" }, [249] = { common.color "#b2b2b2" }, [250] = { common.color "#bcbcbc" }, [251] = { common.color "#c6c6c6" }, [252] = { common.color "#d0d0d0" }, [253] = { common.color "#dadada" }, [254] = { common.color "#e4e4e4" }, [255] = { common.color "#eeeeee" } + }, + config_spec = { + name = "Terminal", + { + label = "Shell", + description = "Path to the shell binary.", + path = "shell", + type = "file", + exists = true, + default = default_shell + }, + { + label = "Drawer Height", + description = "Default height of the console drawer.", + path = "drawer_height", + type = "number", + default = 300, + min = 10 + }, + { + label = "Scrollback Limit", + description = "Amount of lines you can emit before we start cutting them off.", + path = "scrollback_limit", + type = "number", + default = 10000 + }, + { + label = "Background Color", + description = "Default background color if not explicitly set by the shell.", + path = "background", + type = "color", + default = { common.color "#000000" }, + }, + { + label = "Foreground Color", + description = "Default foreground color if not explicitly set by the shell.", + path = "text", + type = "color", + default = { common.color "#FFFFFF" }, + }, + { + label = "Font", + description = "The font and fallbacks used on the terminal.", + path = "font", + type = "font", + default = { + fonts = { + { + name = "JetBrains Mono Regular", + path = DATADIR .. "/fonts/JetBrainsMono-Regular.ttf" + } + }, + options = { + size = 15, + antialiasing = "subpixel", + hinting = "slight" + } + } + }, + { + label = "Bold Text in Bright Colors", + description = "Whether to use bright colors for bold text.", + path = "bold_text_in_bright_colors", + type = "toggle", + default = true + }, + { + label = "Debug", + description = "Outputs a terminal.log file of all the output of your shell.", + path = "debug", + type = "toggle", + default = false + } } }, config.plugins.terminal) if not config.plugins.terminal.bold_font then config.plugins.terminal.bold_font = config.plugins.terminal.font:copy(style.code_font:get_size(), { smoothing = true }) end @@ -219,8 +292,8 @@ function TerminalView:set_target_size(axis, value) end function TerminalView:convert_color(int, target, should_bright) - local attributes = int >> 24 - local type = (attributes & 0x7) + local attributes = bit.rshift(int, 24) + local type = bit.band(attributes, 0x7) if type == 0 then if target == "foreground" then return self.options.text, attributes end return self.options.background, attributes @@ -228,11 +301,16 @@ function TerminalView:convert_color(int, target, should_bright) if target == "foreground" then return self.options.background, attributes end return self.options.text, attributes elseif type == 2 then - local index = (int >> 16) & 0xFF - if index < 8 and should_bright and (((attributes >> 3) & 0x1) ~= 0) then index = index + 8 end - return self.options.colors[index], attributes + local index = bit.band(bit.rshift(int, 16), 0xFF) + if index < 8 and should_bright and (bit.band(bit.rshift(attributes, 3), 0x1) ~= 0) then index = index + 8 end + return self.options.colors[tonumber(index)], attributes elseif type == 3 then - return { ((int >> 16) & 0xFF), ((int >> 8) & 0xFF), ((int >> 0) & 0xFF), 255 }, attributes + return { + tonumber(bit.band(bit.rshift(int, 16), 0xFF)), + tonumber(bit.band(bit.rshift(int, 8), 0xFF)), + tonumber(bit.band(bit.rshift(int, 0), 0xFF)), + 255 + }, attributes end return nil end @@ -274,9 +352,10 @@ function TerminalView:draw() local offset = 0 local foreground, background, text_style for i = 1, #line, 2 do - background = self:convert_color(line[i] & 0xFFFFFFFF, "background") - foreground, text_style = self:convert_color(line[i] >> 32, "foreground", self.options.bold_text_in_bright_colors) - local font = (((text_style >> 3) & 0x1) ~= 0) and self.options.bold_font or self.options.font + line[i] = math.tointeger(line[i]) + background = self:convert_color(bit.band(line[i], 0xFFFFFFFF), "background") + foreground, text_style = self:convert_color(bit.rshift(line[i], 32), "foreground", self.options.bold_text_in_bright_colors) + local font = (bit.band(bit.rshift(text_style, 3), 0x1) ~= 0) and self.options.bold_font or self.options.font local text = line[i+1] local length = text:ulen() local valid_utf8 = length ~= nil @@ -652,6 +731,7 @@ end, { command.add(nil, { ["terminal:toggle-drawer"] = function() if not core.terminal_view then + system.chdir(core.root_project().path) core.terminal_view = TerminalView(config.plugins.terminal) core.root_view:get_active_node_default():split("down", core.terminal_view, { y = true }, true) core.set_active_view(core.terminal_view) @@ -802,5 +882,3 @@ end return { class = TerminalView } - - diff --git a/src/libterminal.c b/src/libterminal.c index 3be252d..641026d 100644 --- a/src/libterminal.c +++ b/src/libterminal.c @@ -1238,7 +1238,9 @@ static void output_line(lua_State* L, buffer_char_t* start, buffer_char_t* end, ((uint64_t)style.background.g << 8) | ((uint64_t)style.background.b << 0) ); - lua_pushinteger(L, packed); + char hex_string[24]; + sprintf(hex_string, "%lu", packed); + lua_pushstring(L, hex_string); lua_rawseti(L, -2, ++group); lua_pushlstring(L, text_buffer, last_nonzero_codepoint); if (!overflows && start >= end) {